Subversion Repositories SmartDukaan

Rev

Rev 3013 | Rev 3116 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3013 Rev 3100
Line -... Line 1...
-
 
1
<%@page import="com.google.appengine.api.datastore.FetchOptions"%>
-
 
2
<%@page import="java.util.ArrayList"%>
-
 
3
<%@page import="in.shop2020.model.Item"%>
-
 
4
<%@page import="in.shop2020.server.ItemRepository"%>
1
<%@page import="java.util.Map"%>
5
<%@page import="java.util.Map"%>
2
<%@page import="java.util.HashMap"%>
6
<%@page import="java.util.HashMap"%>
3
<%@page import="java.util.Calendar"%>
7
<%@page import="java.util.Calendar"%>
4
<%@page import="java.util.Date"%>
8
<%@page import="java.util.Date"%>
5
<%@page import="java.util.TimeZone"%>
9
<%@page import="java.util.TimeZone"%>
Line 22... Line 26...
22
  <body>
26
  <body>
23
<%
27
<%
24
    SimpleDateFormat iSdf = new SimpleDateFormat("yyyyMMdd");
28
    SimpleDateFormat iSdf = new SimpleDateFormat("yyyyMMdd");
25
	Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("IST"));
29
	Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("IST"));
26
	String dateStr = request.getParameter("date");
30
	String dateStr = request.getParameter("date");
-
 
31
	ItemRepository itemRepository = new ItemRepository();
-
 
32
	List<Item> items = itemRepository.getAll();
-
 
33
	Map<Long, Item> itemsMap = new HashMap<Long, Item>();
-
 
34
	Map<Long, Item> itemsCatalogIdMap = new HashMap<Long, Item>();
-
 
35
	Map<String, Item> itemsNameMap = new HashMap<String, Item>();
-
 
36
	Map<Long, Map<String, Long>> itemsResultMap = new HashMap<Long, Map<String, Long>>();
-
 
37
	for (Item item : items) {
-
 
38
	    itemsMap.put(item.getId(), item);
-
 
39
	    itemsCatalogIdMap.put(item.getCatalogId(), item);
-
 
40
	    itemsNameMap.put(item.getName().trim(), item);
-
 
41
	}
27
    if (dateStr != null && !dateStr.isEmpty()) {
42
    if (dateStr != null && !dateStr.isEmpty()) {
28
        cal.setTime(iSdf.parse(dateStr));
43
        cal.setTime(iSdf.parse(dateStr));
29
    }
44
    }
30
    else {
45
    else {
31
        dateStr = iSdf.format(cal.getTime());
46
        dateStr = iSdf.format(cal.getTime());
Line 47... Line 62...
47
    Query query = new Query("DataLog");
62
    Query query = new Query("DataLog");
48
    query.addFilter("eventType", Query.FilterOperator.EQUAL, "PRODUCT_VIEW");
63
    query.addFilter("eventType", Query.FilterOperator.EQUAL, "PRODUCT_VIEW");
49
    query.addFilter("date", Query.FilterOperator.GREATER_THAN_OR_EQUAL, fromDate);
64
    query.addFilter("date", Query.FilterOperator.GREATER_THAN_OR_EQUAL, fromDate);
50
    query.addFilter("date", Query.FilterOperator.LESS_THAN, toDate);
65
    query.addFilter("date", Query.FilterOperator.LESS_THAN, toDate);
51
    PreparedQuery pq = datastore.prepare(query);
66
    PreparedQuery pq = datastore.prepare(query);
52
    Map<String, Long> prodViewCountMap = new HashMap<String, Long>();
-
 
53
    for (Entity result : pq.asIterable()) {
67
    for (Entity result : pq.asIterable()) {
54
        if (prodViewCountMap.containsKey((String)result.getProperty("productName"))) {
68
        Long catalogItemId = (Long)result.getProperty("itemId");
-
 
69
        if(catalogItemId == null) {
55
            Long count = prodViewCountMap.get((String)result.getProperty("productName"));
70
            String name = (String)result.getProperty("productName");
-
 
71
            if (itemsNameMap.containsKey(name.trim())) {
-
 
72
                catalogItemId = itemsNameMap.get(name.trim()).getCatalogId();
-
 
73
            }
-
 
74
        }
-
 
75
        if (itemsResultMap.containsKey(catalogItemId)) {
-
 
76
            Map<String, Long> itemMap = itemsResultMap.get(catalogItemId);
-
 
77
            if (itemMap.containsKey("ViewCount")) {
-
 
78
                Long count = itemMap.get("ViewCount");
56
            prodViewCountMap.put((String)result.getProperty("productName"), ++count);
79
                itemMap.put("ViewCount", ++count);
-
 
80
            }
-
 
81
            else {
-
 
82
                itemMap.put("ViewCount", 1l);
-
 
83
            }
57
        }
84
        }
58
        else {
85
        else {
-
 
86
            Map<String, Long> itemMap = new HashMap<String, Long>();
-
 
87
            itemMap.put("ViewCount", 1l);
59
            prodViewCountMap.put((String)result.getProperty("productName"), 1L);
88
            itemsResultMap.put(catalogItemId, itemMap);
60
        }
89
        }
61
    }
90
    }
62
    
91
    
63
    query = new Query("DataLog");
92
    query = new Query("DataLog");
64
    query.addFilter("eventType", Query.FilterOperator.EQUAL, "ADD_TO_CART");
93
    query.addFilter("eventType", Query.FilterOperator.EQUAL, "ADD_TO_CART");
65
    query.addFilter("date", Query.FilterOperator.GREATER_THAN_OR_EQUAL, fromDate);
94
    query.addFilter("date", Query.FilterOperator.GREATER_THAN_OR_EQUAL, fromDate);
66
    query.addFilter("date", Query.FilterOperator.LESS_THAN, toDate);
95
    query.addFilter("date", Query.FilterOperator.LESS_THAN, toDate);
67
    pq = datastore.prepare(query);
96
    pq = datastore.prepare(query);
68
    Map<Long, Long> prodAddToCartCountMap = new HashMap<Long, Long>();
-
 
69
    for (Entity result : pq.asIterable()) {
97
    for (Entity result : pq.asIterable()) {
70
        for (Long itemId : (List<Long>)result.getProperty("itemIds")) {
98
        for (Long itemId : (List<Long>)result.getProperty("itemIds")) {
-
 
99
            Long catalogItemId = itemsMap.get(itemId).getCatalogId();
71
            if (prodAddToCartCountMap.containsKey(itemId)) {
100
            if (itemsResultMap.containsKey(catalogItemId)) {
-
 
101
                Map<String, Long> itemMap = itemsResultMap.get(catalogItemId);
-
 
102
                if (itemMap.containsKey("AddToCartCount")) {
72
                Long count = prodAddToCartCountMap.get(itemId);
103
                    Long count = itemMap.get("AddToCartCount");
73
                prodAddToCartCountMap.put(itemId, ++count);
104
                    itemMap.put("AddToCartCount", ++count);
-
 
105
                }
-
 
106
                else {
-
 
107
                    itemMap.put("AddToCartCount", 1l);
-
 
108
                }
74
            }
109
            }
75
            else {
110
            else {
-
 
111
                Map<String, Long> itemMap = new HashMap<String, Long>();
76
                prodAddToCartCountMap.put(itemId, 1L);
112
                itemMap.put("AddToCartCount", 1l);
-
 
113
                itemsResultMap.put(catalogItemId, itemMap);
77
            }
114
            }
78
        }
115
        }
79
    }
116
    }
80
    
117
    
81
    query = new Query("DataLog");
118
    query = new Query("DataLog");
82
    query.addFilter("eventType", Query.FilterOperator.EQUAL, "DELETE_FROM_CART");
119
    query.addFilter("eventType", Query.FilterOperator.EQUAL, "DELETE_FROM_CART");
83
    query.addFilter("date", Query.FilterOperator.GREATER_THAN_OR_EQUAL, fromDate);
120
    query.addFilter("date", Query.FilterOperator.GREATER_THAN_OR_EQUAL, fromDate);
84
    query.addFilter("date", Query.FilterOperator.LESS_THAN, toDate);
121
    query.addFilter("date", Query.FilterOperator.LESS_THAN, toDate);
85
    pq = datastore.prepare(query);
122
    pq = datastore.prepare(query);
86
    Map<Long, Long> prodDeleteFromCartCountMap = new HashMap<Long, Long>();
-
 
87
    for (Entity result : pq.asIterable()) {
123
    for (Entity result : pq.asIterable()) {
88
        for (Long itemId : (List<Long>)result.getProperty("itemIds")) {
124
        for (Long itemId : (List<Long>)result.getProperty("itemIds")) {
-
 
125
            Long catalogItemId = itemsMap.get(itemId).getCatalogId();
89
            if (prodDeleteFromCartCountMap.containsKey(itemId)) {
126
            if (itemsResultMap.containsKey(catalogItemId)) {
-
 
127
                Map<String, Long> itemMap = itemsResultMap.get(catalogItemId);
-
 
128
                if (itemMap.containsKey("DeleteFromCartCount")) {
90
                Long count = prodDeleteFromCartCountMap.get(itemId);
129
                    Long count = itemMap.get("DeleteFromCartCount");
91
                prodDeleteFromCartCountMap.put(itemId, ++count);
130
                    itemMap.put("DeleteFromCartCount", ++count);
-
 
131
                }
-
 
132
                else {
-
 
133
                    itemMap.put("DeleteFromCartCount", 1l);
-
 
134
                }
92
            }
135
            }
93
            else {
136
            else {
-
 
137
                Map<String, Long> itemMap = new HashMap<String, Long>();
94
                prodDeleteFromCartCountMap.put(itemId, 1L);
138
                itemMap.put("DeleteFromCartCount", 1l);
-
 
139
                itemsResultMap.put(catalogItemId, itemMap);
95
            }
140
            }
96
        }
141
        }
97
    }
142
    }
98
    
143
    
99
    query = new Query("DataLog");
144
    query = new Query("DataLog");
100
    query.addFilter("eventType", Query.FilterOperator.EQUAL, "RESEARCH_ADD");
145
    query.addFilter("eventType", Query.FilterOperator.EQUAL, "RESEARCH_ADD");
101
    query.addFilter("date", Query.FilterOperator.GREATER_THAN_OR_EQUAL, fromDate);
146
    query.addFilter("date", Query.FilterOperator.GREATER_THAN_OR_EQUAL, fromDate);
102
    query.addFilter("date", Query.FilterOperator.LESS_THAN, toDate);
147
    query.addFilter("date", Query.FilterOperator.LESS_THAN, toDate);
103
    pq = datastore.prepare(query);
148
    pq = datastore.prepare(query);
104
    Map<Long, Long> prodResearchAddCountMap = new HashMap<Long, Long>();
-
 
105
    for (Entity result : pq.asIterable()) {
149
    for (Entity result : pq.asIterable()) {
106
        for (Long itemId : (List<Long>)result.getProperty("itemIds")) {
150
        for (Long catalogItemId : (List<Long>)result.getProperty("itemIds")) {
107
            if (prodResearchAddCountMap.containsKey(itemId)) {
151
            if (itemsResultMap.containsKey(catalogItemId)) {
-
 
152
                Map<String, Long> itemMap = itemsResultMap.get(catalogItemId);
-
 
153
                if (itemMap.containsKey("AddToResearchCount")) {
108
                Long count = prodResearchAddCountMap.get(itemId);
154
                    Long count = itemMap.get("AddToResearchCount");
109
                prodResearchAddCountMap.put(itemId, ++count);
155
                    itemMap.put("AddToResearchCount", ++count);
-
 
156
                }
-
 
157
                else {
-
 
158
                    itemMap.put("AddToResearchCount", 1l);
-
 
159
                }
110
            }
160
            }
111
            else {
161
            else {
-
 
162
                Map<String, Long> itemMap = new HashMap<String, Long>();
112
                prodResearchAddCountMap.put(itemId, 1l);
163
                itemMap.put("AddToResearchCount", 1l);
-
 
164
                itemsResultMap.put(catalogItemId, itemMap);
113
            }
165
            }
114
        }
166
        }
115
    }
167
    }
116
    
168
    
117
    query = new Query("DataLog");
169
    query = new Query("DataLog");
118
    query.addFilter("eventType", Query.FilterOperator.EQUAL, "RESEARCH_DELETE");
170
    query.addFilter("eventType", Query.FilterOperator.EQUAL, "RESEARCH_DELETE");
119
    query.addFilter("date", Query.FilterOperator.GREATER_THAN_OR_EQUAL, fromDate);
171
    query.addFilter("date", Query.FilterOperator.GREATER_THAN_OR_EQUAL, fromDate);
120
    query.addFilter("date", Query.FilterOperator.LESS_THAN, toDate);
172
    query.addFilter("date", Query.FilterOperator.LESS_THAN, toDate);
121
    pq = datastore.prepare(query);
173
    pq = datastore.prepare(query);
122
    Map<Long, Long> prodResearchDeleteCountMap = new HashMap<Long, Long>();
-
 
123
    for (Entity result : pq.asIterable()) {
174
    for (Entity result : pq.asIterable()) {
124
        for (Long itemId : (List<Long>)result.getProperty("itemIds")) {
175
        for (Long catalogItemId : (List<Long>)result.getProperty("itemIds")) {
125
            if (prodResearchDeleteCountMap.containsKey(itemId)) {
176
            if (itemsResultMap.containsKey(catalogItemId)) {
-
 
177
                Map<String, Long> itemMap = itemsResultMap.get(catalogItemId);
-
 
178
                if (itemMap.containsKey("ResearchDeleteCount")) {
126
                Long count = prodResearchDeleteCountMap.get(itemId);
179
                    Long count = itemMap.get("ResearchDeleteCount");
127
                prodResearchDeleteCountMap.put(itemId, ++count);
180
                    itemMap.put("ResearchDeleteCount", ++count);
-
 
181
                }
-
 
182
                else {
-
 
183
                    itemMap.put("ResearchDeleteCount", 1l);
-
 
184
                }
128
            }
185
            }
129
            else {
186
            else {
-
 
187
                Map<String, Long> itemMap = new HashMap<String, Long>();
130
                prodResearchDeleteCountMap.put(itemId, 1L);
188
                itemMap.put("ResearchDeleteCount", 1l);
-
 
189
                itemsResultMap.put(catalogItemId, itemMap);
131
            }
190
            }
132
        }
191
        }
133
    }
192
    }
134
%>
193
%>
135
    <form id="frmProductActivity" name="frmProductActivity" method="post" action="/jsp/product-activity.jsp">
194
    <form id="frmProductActivity" name="frmProductActivity" method="post" action="/jsp/product-activity.jsp">
136
      <label>Date(YYYYMMDD) : </label> <input type="text" name="date" id="date" value="<%= dateStr %>"/>
195
      <label>Date(YYYYMMDD) : </label> <input type="text" name="date" id="date" value="<%= dateStr %>"/>
137
      <input type="submit" name="submit" id="submit" value="Submit"/><br/>
196
      <input type="submit" name="submit" id="submit" value="Submit"/><br/>
138
    </form>
197
    </form>
139
    <table cellpadding="0" cellspacing="0" border="0" class="display" id="parent">
-
 
140
    <tr>
-
 
141
    <td colspan="2">
-
 
142
	<table cellpadding="0" cellspacing="0" border="0" class="display"
198
	<table cellpadding="0" cellspacing="0" border="0" class="display"
143
		id="prodView">
199
		id="prodFunnel">
144
		<thead>
200
		<thead>
145
			<tr>
201
			<tr>
146
				<th>Product</th>
202
				<th>Product</th>
147
				<th>ViewCount</th>
203
				<th>View</th>
-
 
204
				<th>AddToCart</th>
-
 
205
				<th>DeleteFromCart</th>
-
 
206
				<th>AddToResearch</th>
-
 
207
				<th>DeleteFromResearch</th>
148
			</tr>
208
			</tr>
149
		</thead>
209
		</thead>
150
		<tbody>
210
		<tbody>
151
 
211
 
152
<%
212
<%
153
    for (Entry entry : prodViewCountMap.entrySet()) {
213
    for (Entry entry : itemsResultMap.entrySet()) {
-
 
214
        Long catalogItemId = (Long)entry.getKey();
-
 
215
        Map<String, Long> itemMap = (Map<String, Long>)entry.getValue();
154
%>
216
%>
155
			<tr>
217
			<tr>
-
 
218
				<td><%=itemsCatalogIdMap.get(catalogItemId)==null? catalogItemId : itemsCatalogIdMap.get(catalogItemId).getName()%></td>
156
				<td><%= entry.getKey()%></td>
219
				<td><%=itemMap.get("ViewCount")==null? 0 : itemMap.get("ViewCount")%></td>
157
				<td><%=entry.getValue()%></td>
220
				<td><%=itemMap.get("AddToCartCount")==null? 0 : itemMap.get("AddToCartCount")%></td>
-
 
221
                <td><%=itemMap.get("DeleteFromCartCount")==null? 0 : itemMap.get("DeleteFromCartCount")%></td>
-
 
222
                <td><%=itemMap.get("AddToResearchCount")==null? 0 : itemMap.get("AddToResearchCount")%></td>
-
 
223
                <td><%=itemMap.get("DeleteFromCartCount")==null? 0 : itemMap.get("DeleteFromCartCount")%></td>
158
			</tr>
224
			</tr>
159
<%
225
<%
160
    }
226
    }
161
%>
227
%>
162
		</tbody>
228
		</tbody>
163
	</table>
229
	</table>
164
	</td>
-
 
165
	<td>
-
 
166
	<table cellpadding="0" cellspacing="0" border="0" class="display"
-
 
167
        id="prodCartAdd">
-
 
168
        <thead>
-
 
169
            <tr>
-
 
170
                <th>Product</th>
-
 
171
                <th>Cart Add</th>
-
 
172
            </tr>
-
 
173
        </thead>
-
 
174
        <tbody>
-
 
175
 
-
 
176
<%
-
 
177
    for (Entry entry : prodAddToCartCountMap.entrySet()) {
-
 
178
%>
-
 
179
            <tr>
-
 
180
                <td><%= entry.getKey()%></td>
-
 
181
                <td><%=entry.getValue()%></td>
-
 
182
            </tr>
-
 
183
<%
-
 
184
    }
-
 
185
%>
-
 
186
        </tbody>
-
 
187
    </table>
-
 
188
    </td>
-
 
189
    </tr>
-
 
190
    <tr>
-
 
191
    <td>
-
 
192
    <table cellpadding="0" cellspacing="0" border="0" class="display"
-
 
193
        id="prodDeletedFromCart">
-
 
194
        <thead>
-
 
195
            <tr>
-
 
196
                <th>Product</th>
-
 
197
                <th>Cart Delete</th>
-
 
198
            </tr>
-
 
199
        </thead>
-
 
200
        <tbody>
-
 
201
 
-
 
202
<%
-
 
203
    for (Entry entry : prodDeleteFromCartCountMap.entrySet()) {
-
 
204
%>
-
 
205
            <tr>
-
 
206
                <td><%= entry.getKey()%></td>
-
 
207
                <td><%=entry.getValue()%></td>
-
 
208
            </tr>
-
 
209
<%
-
 
210
    }
-
 
211
%>
-
 
212
        </tbody>
-
 
213
    </table>
-
 
214
    </td>
-
 
215
    <td>
-
 
216
    <table cellpadding="0" cellspacing="0" border="0" class="display"
-
 
217
        id="prodResearchAdd">
-
 
218
        <thead>
-
 
219
            <tr>
-
 
220
                <th>Product</th>
-
 
221
                <th>Research Add</th>
-
 
222
            </tr>
-
 
223
        </thead>
-
 
224
        <tbody>
-
 
225
 
-
 
226
<%
-
 
227
    for (Entry entry : prodResearchAddCountMap.entrySet()) {
-
 
228
%>
-
 
229
            <tr>
-
 
230
                <td><%= entry.getKey()%></td>
-
 
231
                <td><%=entry.getValue()%></td>
-
 
232
            </tr>
-
 
233
<%
-
 
234
    }
-
 
235
%>
-
 
236
        </tbody>
-
 
237
    </table>
-
 
238
    </td>
-
 
239
    <td>
-
 
240
    <table cellpadding="0" cellspacing="0" border="0" class="display"
-
 
241
        id="prodResearchDelete">
-
 
242
        <thead>
-
 
243
            <tr>
-
 
244
                <th>Product</th>
-
 
245
                <th>Research Delete</th>
-
 
246
            </tr>
-
 
247
        </thead>
-
 
248
        <tbody>
-
 
249
 
-
 
250
<%
-
 
251
    for (Entry entry : prodResearchDeleteCountMap.entrySet()) {
-
 
252
%>
-
 
253
            <tr>
-
 
254
                <td><%= entry.getKey()%></td>
-
 
255
                <td><%=entry.getValue()%></td>
-
 
256
            </tr>
-
 
257
<%
-
 
258
    }
-
 
259
%>
-
 
260
        </tbody>
-
 
261
    </table>
-
 
262
    </td>
-
 
263
    </tr>
-
 
264
    </table>
-
 
265
    
230
    
266
    <script type="text/javascript" language="javascript" src="/DataTables/media/js/jquery.js"></script>
231
    <script type="text/javascript" language="javascript" src="/DataTables/media/js/jquery.js"></script>
267
    <script type="text/javascript" language="javascript" src="/DataTables/media/js/jquery.dataTables.min.js"></script>
232
    <script type="text/javascript" language="javascript" src="/DataTables/media/js/jquery.dataTables.min.js"></script>
268
    <script type="text/javascript" charset="utf-8" src="/DataTables/extras/TableTools/media/js/ZeroClipboard.js"></script>
233
    <script type="text/javascript" charset="utf-8" src="/DataTables/extras/TableTools/media/js/ZeroClipboard.js"></script>
269
    <script type="text/javascript" charset="utf-8" src="/DataTables/extras/TableTools/media/js/TableTools.js"></script>
234
    <script type="text/javascript" charset="utf-8" src="/DataTables/extras/TableTools/media/js/TableTools.js"></script>
270
    <script type="text/javascript" charset="utf-8">
235
    <script type="text/javascript" charset="utf-8">
271
        $(document).ready(function() {
236
        $(document).ready(function() {
272
            $('#prodView').dataTable({
237
            $('#prodFunnel').dataTable({
273
            	"iDisplayLength": 10,
-
 
274
                "bProcessing": true,
-
 
275
                "aaSorting": [[1,'desc']],
-
 
276
                "aLengthMenu": [[5, 10, 25,-1], [5, 10, 25, "All"]]
-
 
277
            });
-
 
278
        } );
-
 
279
        $(document).ready(function() {
-
 
280
            $('#prodCartAdd').dataTable({
-
 
281
            	"iDisplayLength": 10,
-
 
282
                "bProcessing": true,
-
 
283
                "aaSorting": [[1,'desc']],
-
 
284
                "aLengthMenu": [[5, 10, 25,-1], [5, 10, 25, "All"]]
-
 
285
            });
-
 
286
        } );
-
 
287
        $(document).ready(function() {
-
 
288
            $('#prodDeletedFromCart').dataTable({
-
 
289
            	"iDisplayLength": 10,
-
 
290
                "bProcessing": true,
-
 
291
                "aaSorting": [[1,'desc']],
-
 
292
                "aLengthMenu": [[5, 10, 25,-1], [5, 10, 25, "All"]]
-
 
293
            });
-
 
294
        } );
-
 
295
        $(document).ready(function() {
-
 
296
            $('#prodResearchAdd').dataTable({
-
 
297
            	"iDisplayLength": 10,
-
 
298
                "bProcessing": true,
-
 
299
                "aaSorting": [[1,'desc']],
-
 
300
                "aLengthMenu": [[5, 10, 25,-1], [5, 10, 25, "All"]]
-
 
301
            });
-
 
302
        } );
-
 
303
        $(document).ready(function() {
-
 
304
            $('#prodResearchDelete').dataTable({
-
 
305
            	"iDisplayLength": 10,
238
            	"iDisplayLength": 15,
306
                "bProcessing": true,
239
                "bProcessing": true,
307
                "aaSorting": [[1,'desc']],
240
                "aaSorting": [[1,'desc']],
-
 
241
                "sDom": 'T<"clear">lfrtip',
-
 
242
                "oTableTools": {
-
 
243
                    "sSwfPath": "/DataTables/extras/TableTools/media/swf/copy_cvs_xls_pdf.swf"
-
 
244
                },
308
                "aLengthMenu": [[5, 10, 25,-1], [5, 10, 25, "All"]]
245
                "aLengthMenu": [[10, 15, 25, 50, 100, -1], [10, 15, 25, 50, 100, "All"]]
309
            });
246
            });
310
        } );
247
        } );
311
    </script>
248
    </script>
312
  </body>
249
  </body>
313
</html>
250
</html>
314
251