Index: /ipk/source.sh4/network_xupnpd/CONTROL/control
===================================================================
--- /ipk/source.sh4/network_xupnpd/CONTROL/control	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/CONTROL/control	(revision 27875)
@@ -0,0 +1,7 @@
+Package: titan-plugin-network-xupnpd
+Version: 1.0
+Description: xupnpd Medien Server (upnp)
+Section: network
+Architecture: sh4
+Titanname: xupnpd
+Showname: xupnpd
Index: /ipk/source.sh4/network_xupnpd/CONTROL/postinst
===================================================================
--- /ipk/source.sh4/network_xupnpd/CONTROL/postinst	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/CONTROL/postinst	(revision 27875)
@@ -0,0 +1,8 @@
+#!/bin/sh
+INSTDIR="$1"
+PLUGINDIR="$INSTDIR/usr/local/share/titan/plugins/xupnpd"
+
+echo INSTDIR $INSTDIR
+echo PLUGINDIR $PLUGINDIR
+
+exit 0
Index: /ipk/source.sh4/network_xupnpd/CONTROL/postrm
===================================================================
--- /ipk/source.sh4/network_xupnpd/CONTROL/postrm	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/CONTROL/postrm	(revision 27875)
@@ -0,0 +1,7 @@
+#!/bin/sh
+INSTDIR="$1"
+PLUGINDIR="$INSTDIR/usr/local/share/titan/plugins/xupnpd"
+
+rm -rf "$PLUGINDIR" >/dev/null 2>&1
+
+exit 0
Index: /ipk/source.sh4/network_xupnpd/CONTROL/preinst
===================================================================
--- /ipk/source.sh4/network_xupnpd/CONTROL/preinst	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/CONTROL/preinst	(revision 27875)
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+exit 0
Index: /ipk/source.sh4/network_xupnpd/CONTROL/prerm
===================================================================
--- /ipk/source.sh4/network_xupnpd/CONTROL/prerm	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/CONTROL/prerm	(revision 27875)
@@ -0,0 +1,6 @@
+#!/bin/sh
+INSTDIR="$1"
+
+echo prerm INSTDIR $INSTDIR
+
+exit 0
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/ag_videos.m3u
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/ag_videos.m3u	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/ag_videos.m3u	(revision 27875)
@@ -0,0 +1,101 @@
+#EXTM3U name="AG - New" type=mp4 plugin=ag
+#EXTINF:0,Watch Dogs
+http://www.ag.ru/games/watch-dogs/videos/trailer-4/
+#EXTINF:0,Kanobu Channel
+http://www.ag.ru/games/kanobu-channel/videos/trailer-13/
+#EXTINF:0,Dragon's Dogma: Dark Arisen
+http://www.ag.ru/games/dragons-dogma-dark-arisen/videos/trailer-6/
+#EXTINF:0,GRID 2
+http://www.ag.ru/games/grid-2/videos/trailer-7/
+#EXTINF:0,Spider Solitaire
+http://www.ag.ru/games/spider-solitaire/videos/trailer-1/
+#EXTINF:0,Time Tribe, The
+http://www.ag.ru/games/time-tribe-the/videos/trailer-1/
+#EXTINF:0,Flip the Cats
+http://www.ag.ru/games/flip-the-cats/videos/trailer-1/
+#EXTINF:0,Метро 2033: Луч надежды
+http://www.ag.ru/games/metro-last-light/videos/trailer-14/
+#EXTINF:0,Метро 2033: Луч надежды
+http://www.ag.ru/games/metro-last-light/videos/trailer-13/
+#EXTINF:0,Valley Without Wind 2, A
+http://www.ag.ru/games/a-valley-without-wind-2/videos/trailer-1/
+#EXTINF:0,Metal Gear Rising: Revengeance
+http://www.ag.ru/games/metal-gear-rising-revengeance/videos/trailer-27/
+#EXTINF:0,Gears of War: Judgment
+http://www.ag.ru/games/gears-of-war-judgment/videos/trailer-12/
+#EXTINF:0,Dungeon Lore
+http://www.ag.ru/games/dungeon-lore/videos/trailer-1/
+#EXTINF:0,Метро 2033: Луч надежды
+http://www.ag.ru/games/metro-last-light/videos/trailer-12/
+#EXTINF:0,Kanobu Channel
+http://www.ag.ru/games/kanobu-channel/videos/trailer-12/
+#EXTINF:0,AG Tech Channel
+http://www.ag.ru/games/ag-tech-channel/videos/trailer-31/
+#EXTINF:0,AG Tech Channel
+http://www.ag.ru/games/ag-tech-channel/videos/trailer-30/
+#EXTINF:0,PlanetSide 2
+http://www.ag.ru/games/planetside-2/videos/developer-diaries/
+#EXTINF:0,Kanobu Channel
+http://www.ag.ru/games/kanobu-channel/videos/trailer-11/
+#EXTINF:0,Ashes Cricket 2013
+http://www.ag.ru/games/ashes-cricket-2013/videos/developer-diaries-2/
+#EXTINF:0,Ashes Cricket 2013
+http://www.ag.ru/games/ashes-cricket-2013/videos/developer-diaries-1/
+#EXTINF:0,Iconoclasts, The
+http://www.ag.ru/games/iconoclasts-the/videos/trailer-1/
+#EXTINF:0,Red Rusher
+http://www.ag.ru/games/red-rusher/videos/trailer-1/
+#EXTINF:0,Senran Kagura Shinovi Versus
+http://www.ag.ru/games/senran-kagura-shinovi-versus/videos/trailer-6/
+#EXTINF:0,Luigi's Mansion: Dark Moon
+http://www.ag.ru/games/luigis-mansion-dark-moon/videos/trailer-5/
+#EXTINF:0,Sprinkfield
+http://www.ag.ru/games/sprinkfield/videos/trailer-1/
+#EXTINF:0,Briquid
+http://www.ag.ru/games/briquid/videos/trailer-1/
+#EXTINF:0,Kerbal Space Program
+http://www.ag.ru/games/kerbal-space-program/videos/trailer-1/
+#EXTINF:0,Puddle THD
+http://www.ag.ru/games/puddle-thd/videos/trailer-1/
+#EXTINF:0,Halo 4: Majestic Map Pack
+http://www.ag.ru/games/halo-4-majestic-map-pack/videos/developer-diaries-1/
+#EXTINF:0,Hotline Miami
+http://www.ag.ru/games/hotline-miami/videos/trailer-6/
+#EXTINF:0,BioShock Infinite
+http://www.ag.ru/games/bioshock-infinite/videos/trailer-23/
+#EXTINF:0,Murdered: Soul Suspect
+http://www.ag.ru/games/murdered-soul-suspect/videos/teaser/
+#EXTINF:0,Assassin's Creed 3: The Tyranny ...
+http://www.ag.ru/games/assassins-creed-3-the-tyranny-of-king-washington-the-infamy-dlya/videos/trailer-3/
+#EXTINF:0,Last Phoenix, The
+http://www.ag.ru/games/last-phoenix-the/videos/trailer-1/
+#EXTINF:0,Gunstringer: Dead Man Running, The
+http://www.ag.ru/games/gunstringer-dead-man-running-the/videos/trailer-1/
+#EXTINF:0,Kinect Sesame Street TV
+http://www.ag.ru/games/kinectsesamestreettv/videos/trailer-1/
+#EXTINF:0,Extreme Road Trip 2
+http://www.ag.ru/games/extreme-road-trip-2/videos/trailer-1/
+#EXTINF:0,Rayman Legends
+http://www.ag.ru/games/rayman-legends/videos/trailer-10/
+#EXTINF:0,Senran Kagura Shinovi Versus
+http://www.ag.ru/games/senran-kagura-shinovi-versus/videos/trailer-5/
+#EXTINF:0,Soul Sacrifice
+http://www.ag.ru/games/soul-sacrifice/videos/trailer-11/
+#EXTINF:0,Metal Gear Rising: Revengeance
+http://www.ag.ru/games/metal-gear-rising-revengeance/videos/trailer-26/
+#EXTINF:0,Toukiden
+http://www.ag.ru/games/toukiden/videos/trailer-2/
+#EXTINF:0,AG Tech Channel
+http://www.ag.ru/games/ag-tech-channel/videos/trailer-29/
+#EXTINF:0,Army of TWO: The Devil's Cartel
+http://www.ag.ru/games/army-of-two-the-devils-cartel/videos/trailer-10/
+#EXTINF:0,Army of TWO: The Devil's Cartel
+http://www.ag.ru/games/army-of-two-the-devils-cartel/videos/trailer-9/
+#EXTINF:0,God Eater 2
+http://www.ag.ru/games/god-eater-2/videos/trailer-5/
+#EXTINF:0,Ultima Forever: Quest for the Avatar
+http://www.ag.ru/games/ultima-forever-quest-for-the-avatar/videos/trailer-1/
+#EXTINF:0,March of the Eagles
+http://www.ag.ru/games/march-of-the-eagles/videos/trailer-5/
+#EXTINF:0,Pokemon Mystery Dungeon: Gates t...
+http://www.ag.ru/games/pokemon-mystery-dungeon-gates-to-infinity/videos/trailer-2/
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/bf.m3u
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/bf.m3u	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/bf.m3u	(revision 27875)
@@ -0,0 +1,73 @@
+#EXTM3U name="Battlefield theme songs" type=mp4 plugin=youtube
+
+#EXTINF:0,Battlefield 1942 Theme Song
+http://www.youtube.com/watch?v=Gylo7Ak6z3Y
+
+#EXTINF:0,Battlefield 2 Theme Song
+http://www.youtube.com/watch?v=pE6MJweDscQ
+
+#EXTINF:0,Battlefield 2142 Theme Song
+http://www.youtube.com/watch?v=lnlA2rCHJHY
+
+#EXTINF:0,Battlefield 2142 Rock Theme Song
+http://www.youtube.com/watch?v=2MgNMJum7gM&feature=related
+
+#EXTINF:0,Battlefield 1943 Theme Song
+http://www.youtube.com/watch?v=nEGD-tQQqbA
+
+#EXTINF:0,Battlefield Bad Company Piano Theme Song
+http://www.youtube.com/watch?v=TqGjnljiq7s
+
+#EXTINF:0,Battlefield Bad Company Theme Song
+http://www.youtube.com/watch?v=BVjCZZWnKBA
+
+#EXTINF:0,Battlefield Bad Company Orchestral Version
+http://www.youtube.com/watch?v=s5HqlYBowvg&feature=related
+
+#EXTINF:0,Battlefield 3 Theme Song
+http://www.youtube.com/watch?v=QiDa2BHI5PY
+
+#EXTINF:0,Battlefield 3 - Theme Song 2
+http://www.youtube.com/watch?v=xU3JCyk37g0
+
+#EXTINF:0,Battlefield Theme Play Symphony
+http://www.youtube.com/watch?v=Ti8O5RbsQxg
+
+#EXTINF:0,BattleField Theme Play Symphony 2009
+http://www.youtube.com/watch?v=iTEJdcQWja8&feature=related
+
+#EXTINF:0,Battlefield Theme Intrumental
+http://www.youtube.com/watch?v=7T8U9fptF44&feature=related
+
+#EXTINF:0,Battlefield by school orchestra
+http://www.youtube.com/watch?v=ykrxpDruI-M&feature=related
+
+#EXTINF:0,Awesome Battlefield Cover On Guitar
+http://www.youtube.com/watch?v=fdaVvVDMLhM&feature=related
+
+#EXTINF:0,Battlefield theme on Piano
+http://www.youtube.com/watch?v=j69hQd09-4g&feature=related
+
+#EXTINF:0,Battlefield theme on guitar
+http://www.youtube.com/watch?v=9sLaI_1U1UQ&feature=related
+
+#EXTINF:0,Battlefield - Remo Baldi
+http://www.youtube.com/watch?v=XHszJVyPXVM
+
+#EXTINF:0,Battlefield 3 DUBSTEP remix
+http://www.youtube.com/watch?v=8rKKAPG8xMg
+
+#EXTINF:0,Battlefield 3 DUBSTEP remix 2
+http://www.youtube.com/watch?v=hG2YItGcheE
+
+#EXTINF:0,Battlefield 3 Official Theme Song
+http://www.youtube.com/watch?v=_stjXQ9QDeU&feature=related
+
+#EXTINF:0,Battlefield Theme NATO remix
+http://www.youtube.com/watch?v=xJCs2DEOkQI&feature=related
+
+#EXTINF:0,Battlefield 1942 theme drum & bass remix
+http://www.youtube.com/watch?v=KKGI6_pFfHY&feature=related
+
+#EXTINF:0,Battlefield Theme Remix By Heals
+http://www.youtube.com/watch?v=CL7m04zMYG0
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/bf3epic.m3u
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/bf3epic.m3u	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/bf3epic.m3u	(revision 27875)
@@ -0,0 +1,27 @@
+#EXTM3U name="Only in Battlefield" type=mp4 plugin=youtube
+#EXTINF:0,Battlefield 3 Today: The Experience - Back To Karkand Jet Stunts | Edited by Benzla
+http://www.youtube.com/watch?v=hPowtIx5DQg&feature=player_embedded
+#EXTINF:0,Only in Battlefield 3 - TonyTheTuba
+http://www.youtube.com/watch?v=4hQPBRQ_-RE&feature=player_embedded
+#EXTINF:0,RendeZook (Only in Battlefield 3 Edit)
+http://www.youtube.com/watch?v=5FFXQvvjL4U&feature=player_embedded
+#EXTINF:0,Battlefield 3 Dual Jet Efficiency
+http://www.youtube.com/watch?v=w307eRTStgs&feature=player_embedded
+#EXTINF:0,Battlefield 3 - The Rush
+http://www.youtube.com/watch?v=qaMtX8epacE&feature=player_embedded
+#EXTINF:0,Only in Battlefield - imMonkeyGOD's entry
+http://www.youtube.com/watch?v=t3P9aoUCCb8&feature=player_embedded
+#EXTINF:0,Battlefield 3 gulf of oman F35 hit and run
+http://www.youtube.com/watch?v=ux5MYEBFIpw&feature=player_embedded
+#EXTINF:0,Only In Battlefield 3: C4-You on The Battlefield. Community Video Challenge
+http://www.youtube.com/watch?v=gflontg-k1o&feature=player_embedded
+#EXTINF:0,ONLY IN BATTLEFIELD 3 CONTEST JET VS SNIPER
+http://www.youtube.com/watch?v=6F5XwCdk88E&feature=player_embedded
+#EXTINF:0,Battlefield Friends: First Flight
+http://www.youtube.com/watch?feature=player_embedded&v=UwnqaOrTNE0
+#EXTINF:0,Close Enough
+http://www.youtube.com/watch?v=x7nYTM5ypkE&list=FLLEFr-POY7tJu5BGxHkeAdg&index=3&feature=plpp_video
+#EXTINF:0,BATTLEFIELD 3 - ROAD RAGE
+http://www.youtube.com/watch?v=xf8J3C9KPpw&feature=related
+#EXTINF:0,Wookie Justice Force Episode One
+http://www.youtube.com/watch?v=nXKQuuc7PVQ&list=UUaupSIOToYMVsMygUA8lvwQ&index=19&feature=plcp
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/bouquets.bundesliga.tv.m3u
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/bouquets.bundesliga.tv.m3u	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/bouquets.bundesliga.tv.m3u	(revision 27875)
@@ -0,0 +1,30 @@
+#EXTM3U name="Bundesliga" plugin=generic dlna_extras=mpeg_ts
+#EXTVLCOPT--http-reconnect=true
+#EXTINF:-1,Sky Bundesliga HD 1
+http://127.0.0.1:22222/105%2c4303683596
+#EXTINF:-1,Sky Bundesliga HD 2
+http://127.0.0.1:22222/267%2c4303683590
+#EXTINF:-1,Sky Bundesliga HD 3
+http://127.0.0.1:22222/277%2c4303683597
+#EXTINF:-1,Sky Bundesliga HD 4
+http://127.0.0.1:22222/287%2c4303683596
+#EXTINF:-1,Sky Bundesliga 1
+http://127.0.0.1:22222/223%2c4303683588
+#EXTINF:-1,Sky Bundesliga 2
+http://127.0.0.1:22222/262%2c4303683586
+#EXTINF:-1,Sky Bundesliga 3
+http://127.0.0.1:22222/272%2c4303683587
+#EXTINF:-1,Sky Bundesliga 4
+http://127.0.0.1:22222/282%2c4303683587
+#EXTINF:-1,Sky Bundesliga 5
+http://127.0.0.1:22222/292%2c4303683587
+#EXTINF:-1,Sky Bundesliga 6
+http://127.0.0.1:22222/302%2c4303683587
+#EXTINF:-1,Sky Bundesliga 7
+http://127.0.0.1:22222/312%2c4303683585
+#EXTINF:-1,Sky Bundesliga 8
+http://127.0.0.1:22222/322%2c4303683585
+#EXTINF:-1,Sky Bundesliga 9
+http://127.0.0.1:22222/332%2c4303683585
+#EXTINF:-1,Sky Bundesliga 10
+http://127.0.0.1:22222/252%2c4303683586
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/bouquets.doku.tv.m3u
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/bouquets.doku.tv.m3u	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/bouquets.doku.tv.m3u	(revision 27875)
@@ -0,0 +1,18 @@
+#EXTM3U name="Doku" plugin=generic dlna_extras=mpeg_ts
+#EXTVLCOPT--http-reconnect=true
+#EXTINF:-1,Animal Planet
+http://127.0.0.1:22222/19116%2c4950261951
+#EXTINF:-1,Biography Channel
+http://127.0.0.1:22222/25104%2c4950261891
+#EXTINF:-1,Discovery HD
+http://127.0.0.1:22222/130%2c4303683590
+#EXTINF:-1,HISTORY
+http://127.0.0.1:22222/13102%2c4950261891
+#EXTINF:-1,Nat Geo Wild HD
+http://127.0.0.1:22222/118%2c4303683596
+#EXTINF:-1,NatGeo HD
+http://127.0.0.1:22222/112%2c4303683597
+#EXTINF:-1,PLANET HD
+http://127.0.0.1:22222/44104%2c4950262191
+#EXTINF:-1,Spiegel TV Wissen HD
+http://127.0.0.1:22222/25115%2c4950262201
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/bouquets.film.tv.m3u
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/bouquets.film.tv.m3u	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/bouquets.film.tv.m3u	(revision 27875)
@@ -0,0 +1,18 @@
+#EXTM3U name="Film" plugin=generic dlna_extras=mpeg_ts
+#EXTVLCOPT--http-reconnect=true
+#EXTINF:-1,Sky Cinema HD
+http://127.0.0.1:22222/131%2c4303683590
+#EXTINF:-1,Sky Cinema
+http://127.0.0.1:22222/10%2c4303683586
+#EXTINF:-1,Sky Cinema +1
+http://127.0.0.1:22222/11%2c4303683586
+#EXTINF:-1,Sky Cinema +24
+http://127.0.0.1:22222/43%2c4303683586
+#EXTINF:-1,Sky Action
+http://127.0.0.1:22222/9%2c4303683586
+#EXTINF:-1,Sky Hits HD
+http://127.0.0.1:22222/107%2c4303683596
+#EXTINF:-1,TNT Film HD
+http://127.0.0.1:22222/21108%2c4950262171
+#EXTINF:-1,MGM
+http://127.0.0.1:22222/515%2c4303683587
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/bouquets.freetv.tv.m3u
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/bouquets.freetv.tv.m3u	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/bouquets.freetv.tv.m3u	(revision 27875)
@@ -0,0 +1,32 @@
+#EXTM3U name="FreeTV" plugin=generic dlna_extras=mpeg_ts
+#EXTVLCOPT--http-reconnect=true
+#EXTINF:-1,Das Erste HD
+http://127.0.0.1:22222/11100%2c7046497307
+#EXTINF:-1,ZDF HD
+http://127.0.0.1:22222/11110%2c4301653047
+#EXTINF:-1,arte HD
+http://127.0.0.1:22222/17113%2c4950262161
+#EXTINF:-1,Einsfestival
+http://127.0.0.1:22222/28722%2c7046497307
+#EXTINF:-1,zdf_neo
+http://127.0.0.1:22222/28014%2c4301653047
+#EXTINF:-1,zdf.kultur
+http://127.0.0.1:22222/28016%2c4301653047
+#EXTINF:-1,ZDFinfo
+http://127.0.0.1:22222/28011%2c4301653047
+#EXTINF:-1,3sat
+http://127.0.0.1:22222/28007%2c4301653047
+#EXTINF:-1,WDR Köln
+http://127.0.0.1:22222/28111%2c7046497357
+#EXTINF:-1,rbb Berlin
+http://127.0.0.1:22222/28206%2c7046497329
+#EXTINF:-1,MDR Sachsen
+http://127.0.0.1:22222/28228%2c7046497329
+#EXTINF:-1,Bayerisches FS Süd
+http://127.0.0.1:22222/28107%2c7046497357
+#EXTINF:-1,hr-fernsehen
+http://127.0.0.1:22222/28108%2c7046497357
+#EXTINF:-1,SWR Fernsehen BW
+http://127.0.0.1:22222/28113%2c7046497357
+#EXTINF:-1,NDR FS HH
+http://127.0.0.1:22222/28225%2c7046497329
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/bouquets.serien.tv.m3u
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/bouquets.serien.tv.m3u	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/bouquets.serien.tv.m3u	(revision 27875)
@@ -0,0 +1,14 @@
+#EXTM3U name="Serien" plugin=generic dlna_extras=mpeg_ts
+#EXTVLCOPT--http-reconnect=true
+#EXTINF:-1,RTL Crime
+http://127.0.0.1:22222/27%2c4303683588
+#EXTINF:-1,13TH STREET HD
+http://127.0.0.1:22222/25113%2c4950262171
+#EXTINF:-1,Fox HD
+http://127.0.0.1:22222/124%2c4303683590
+#EXTINF:-1,Sky Atlantic HD
+http://127.0.0.1:22222/110%2c4303683597
+#EXTINF:-1,SyFy HD
+http://127.0.0.1:22222/27114%2c4950262171
+#EXTINF:-1,TNT Serie HD
+http://127.0.0.1:22222/123%2c4303683590
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/bouquets.sport.tv.m3u
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/bouquets.sport.tv.m3u	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/bouquets.sport.tv.m3u	(revision 27875)
@@ -0,0 +1,60 @@
+#EXTM3U name="Sport" plugin=generic dlna_extras=mpeg_ts
+#EXTVLCOPT--http-reconnect=true
+#EXTINF:-1,Sky Sport HD 1
+http://127.0.0.1:22222/129%2c4303683590
+#EXTINF:-1,Sky Sport HD 2
+http://127.0.0.1:22222/114%2c4303683597
+#EXTINF:-1,Sky Sport HD 3
+http://127.0.0.1:22222/268%2c4303683590
+#EXTINF:-1,Sky Sport HD 4
+http://127.0.0.1:22222/278%2c4303683597
+#EXTINF:-1,Sky Sport HD 5
+http://127.0.0.1:22222/288%2c4303683596
+#EXTINF:-1,Sky Sport 1
+http://127.0.0.1:22222/221%2c4303683587
+#EXTINF:-1,Sky Sport 2
+http://127.0.0.1:22222/222%2c4303683587
+#EXTINF:-1,Sky Sport 3
+http://127.0.0.1:22222/263%2c4303683586
+#EXTINF:-1,Sky Sport 4
+http://127.0.0.1:22222/273%2c4303683587
+#EXTINF:-1,Sky Sport 5
+http://127.0.0.1:22222/283%2c4303683587
+#EXTINF:-1,Sky Sport 6
+http://127.0.0.1:22222/293%2c4303683587
+#EXTINF:-1,Sky Sport 7
+http://127.0.0.1:22222/303%2c4303683587
+#EXTINF:-1,Sky Sport 8
+http://127.0.0.1:22222/313%2c4303683585
+#EXTINF:-1,Sky Sport 9
+http://127.0.0.1:22222/323%2c4303683585
+#EXTINF:-1,Sky Sport 10
+http://127.0.0.1:22222/333%2c4303683585
+#EXTINF:-1,Sky Sport 11
+http://127.0.0.1:22222/253%2c4303683586
+#EXTINF:-1,Sky Sport Austria
+http://127.0.0.1:22222/30%2c4303683585
+#EXTINF:-1,Sport 1 US
+http://127.0.0.1:22222/14108%2c4950261901
+#EXTINF:-1,Sport1 HD
+http://127.0.0.1:22222/20118%2c4950262171
+#EXTINF:-1,Sport1+ HD
+http://127.0.0.1:22222/17114%2c4950262181
+#EXTINF:-1,sportdigital
+http://127.0.0.1:22222/25111%2c4950261891
+#EXTINF:-1,Eurosport HD
+http://127.0.0.1:22222/132%2c4303683596
+#EXTINF:-1,EUROSPORT
+http://127.0.0.1:22222/11107%2c4950261951
+#EXTINF:-1,EUROSPORT 2
+http://127.0.0.1:22222/14110%2c4950261901
+#EXTINF:-1,Auto Motor und Sport TV HD
+http://127.0.0.1:22222/25114%2c4950262201
+#EXTINF:-1,Extreme Sports
+http://127.0.0.1:22222/15102%2c4950261911
+#EXTINF:-1,Eurosport360HD 1
+http://127.0.0.1:22222/270%2c4303683590
+#EXTINF:-1,Eurosport360HD 2
+http://127.0.0.1:22222/280%2c4303683597
+#EXTINF:-1,Eurosport360HD 3
+http://127.0.0.1:22222/290%2c4303683596
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/example/butovocom_iptv.m3u
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/example/butovocom_iptv.m3u	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/example/butovocom_iptv.m3u	(revision 27875)
@@ -0,0 +1,223 @@
+﻿#EXTM3U
+#EXTINF:0,Эфирный: Первый
+udp://@234.5.2.1:20000
+#EXTINF:0,Эфирный: Россия
+udp://@234.5.2.2:20000
+#EXTINF:0,Эфирный: ТВЦ
+udp://@234.5.2.3:20000
+#EXTINF:0,Эфирный: НТВ
+udp://@234.5.2.4:20000
+#EXTINF:0,Эфирный: Культура
+udp://@234.5.2.5:20000
+#EXTINF:0,Эфирный: Россия2
+udp://@234.5.2.6:20000
+#EXTINF:0,Эфирный: Домашний
+udp://@234.5.2.9:20000
+#EXTINF:0,Эфирный: СТС
+udp://@234.5.2.10:20000
+#EXTINF:0,Эфирный: РЕН-ТВ
+udp://@234.5.2.8:20000
+#EXTINF:0,Эфирный: ТНТ
+udp://@234.5.2.12:20000
+#EXTINF:0,Эфирный: ДТВ
+udp://@234.5.2.11:20000
+#EXTINF:0,Эфирный: ТВ3
+udp://@234.5.2.14:20000
+#EXTINF:0,Эфирный: 7ТВ
+udp://@234.5.2.13:20000
+#EXTINF:0,Эфирный: МУЗ ТВ
+udp://@234.5.2.7:20000
+#EXTINF:0,Эфирный: MTV
+udp://@234.5.2.15:20000
+#EXTINF:0,Эфирный: Столица
+udp://@234.5.2.17:20000
+#EXTINF:0,Эфирный: 3 Канал
+udp://@234.5.2.125:20000
+#EXTINF:0,Эфирный: 5 Канал
+udp://@234.5.2.123:20000
+#EXTINF:0,Детям: 2x2
+udp://@234.5.2.41:20000
+#EXTINF:0,Детям: Cartoon Network
+udp://@234.5.2.58:1234
+#EXTINF:0,Детям: Nickelodeon
+udp://@234.5.2.85:20000
+#EXTINF:0,Детям: Disney Channel
+udp://@234.5.2.65:20000
+#EXTINF:0,Детям: Карусель
+udp://@234.5.2.124:20000
+#EXTINF:0,Детям: Детский Мир/ТелеКлуб
+udp://@234.5.2.88:20000
+#EXTINF:0,Детям: Теленяня
+udp://@234.5.2.71:20000
+#EXTINF:0,Кино: Universal
+udp://@234.5.2.111:20000
+#EXTINF:0,Кино: DIVA
+udp://@234.5.2.89:20000
+#EXTINF:0,Кино: Zone Romantica
+udp://@234.5.2.69:20000
+#EXTINF:0,Кино: Наше кино
+udp://@234.5.2.37:1234
+#EXTINF:0,Кино: Дом Кино
+udp://@234.5.2.72:20000
+#EXTINF:0,Doc: Animal Planet
+udp://@234.5.2.66:20000
+#EXTINF:0,Doc: Discovery Channel
+udp://@234.5.2.64:20000
+#EXTINF:0,Doc: Discovery World
+udp://@234.5.2.61:1234
+#EXTINF:0,Doc: Discovery Science
+udp://@234.5.2.62:1234
+#EXTINF:0,Doc: Discovery TLC
+udp://@234.5.2.67:20000
+#EXTINF:0,Музыка: Mezzo
+udp://@234.5.2.68:20000
+#EXTINF:0,Музыка: MCM TOP
+udp://@234.5.2.59:1234
+#EXTINF:0,Музыка: A-ONE
+udp://@234.5.2.51:20000
+#EXTINF:0,Музыка: Bridge TV
+udp://@234.5.2.53:20000
+#EXTINF:0,Музыка: Vh-1 Russia
+udp://@234.5.2.110:20000
+#EXTINF:0,Музыка: MTV-Dance
+udp://@234.5.2.60:1234
+#EXTINF:0,Музыка: MTV-Hits
+udp://@234.5.2.108:20000
+#EXTINF:0,Музыка: Music BOX
+udp://@234.5.2.81:20000
+#EXTINF:0,Музыка: Mezzo
+udp://@234.5.2.68:20000
+#EXTINF:0,Музыка: Шансон ТВ
+udp://@234.5.2.76:20000
+#EXTINF:0,Музыка: Музыка Первого
+udp://@234.5.2.73:20000
+#EXTINF:0,Музыка: RU TV
+udp://@234.5.2.120:20000
+#EXTINF:0,Мода и стиль: World Fashion
+udp://@234.5.2.84:20000
+#EXTINF:0,Мода и стиль: Style TV
+udp://@234.5.2.135:20000
+#EXTINF:0,Мода и стиль: Fashion TV
+udp://@234.5.2.50:20000
+#EXTINF:0,Развлечения: НСТ
+udp://@234.5.2.78:20000
+#EXTINF:0,Развлечения: ТТС
+udp://@234.5.2.143:20000
+#EXTINF:0,Развлечения: TV Club
+udp://@234.5.2.42:20000
+#EXTINF:0,Развлечения: TopShopTv
+udp://@234.5.2.100:20000
+#EXTINF:0,Развлечения: TopShopTv
+udp://@234.5.2.146:20000
+#EXTINF:0,Развлечения: Где и кто
+udp://@234.5.2.43:20000
+#EXTINF:0,Развлечения: BTB
+udp://@234.5.2.114:20000
+#EXTINF:0,Развлечения: Amazing Life
+udp://@234.5.2.102:20000
+#EXTINF:0,Развлечения: O2TV
+udp://@234.5.2.122:20000
+#EXTINF:0,Развлечения: Telecafe
+udp://@234.5.2.70:20000
+#EXTINF:0,Развлечения: Время
+udp://@234.5.2.74:20000
+#EXTINF:0,Спорт: Eurosport (HDTV 1024*576i)
+udp://@234.5.2.100:20000
+#EXTINF:0,Спорт: Eurosport2 (HDTV 1024*576i)
+udp://@234.5.2.101:20000
+#EXTINF:0,Спорт: Спорт1 (HDTV 1024*576i)
+udp://@234.5.2.54:20000
+#EXTINF:0,Спорт: Спорт (HDTV 1024*576i)
+udp://@234.5.2.30:1234
+#EXTINF:0,Спорт: Спорт плюс (HDTV 1024*576i)
+udp://@234.5.2.36:1234
+#EXTINF:0,Спорт: Наш футбол (HDTV 1024*576i)
+udp://@234.5.2.35:1234
+#EXTINF:0,Спорт: Футбол (HDTV 1024*576i)
+udp://@234.5.2.31:1234
+#EXTINF:0,Спорт: Футбол2 (HDTV 1024*576i)
+udp://@234.5.2.34:1234
+#EXTINF:0,Спорт: Теннис (HDTV 1024*576i)
+udp://@234.5.2.32:1234
+#EXTINF:0,Спорт: Баскетбол (HDTV 1024*576i)
+udp://@234.5.2.33:1234
+#EXTINF:0,Спорт: Русский Extreme
+udp://@234.5.2.109:20000
+#EXTINF:0,Спорт: Extreme Sports Channel
+udp://@234.5.2.75:1234
+#EXTINF:0,Новости: Первый Метео
+udp://@234.5.2.127:20000
+#EXTINF:0,Новости: Россия 24
+udp://@234.5.2.131:20000
+#EXTINF:0,Новости: Euronews
+udp://@234.5.2.16:1234
+#EXTINF:0,Новости: РБК
+udp://@234.5.2.104:20000
+#EXTINF:0,Новости: Про Деньги
+udp://@234.5.2.55:20000
+#EXTINF:0,Новости: Эксперт
+udp://@234.5.2.115:20000
+#EXTINF:0,Новости: Russia Today
+udp://@234.5.2.87:20000
+#EXTINF:0,Новости: BBC
+udp://@234.5.2.86:20000
+#EXTINF:0,Новости: Bloomberg
+udp://@234.5.2.83:20000
+#EXTINF:0,Новости: CNBC
+udp://@234.5.2.112:20000
+#EXTINF:0,Новости: ?
+udp://@234.5.2.116:20000
+#EXTINF:0,Новости: CNN International
+udp://@234.5.2.63:1234
+#EXTINF:0,Новости: CCTV9
+udp://@234.5.2.128:20000
+#EXTINF:0,Новости: Russian AlYaum
+udp://@234.5.2.126:20000
+#EXTINF:0,Новости: Al Jazeera english
+udp://@234.5.2.129:20000
+#EXTINF:0,Мир: Москва ТВ
+udp://@234.5.2.120:20000
+#EXTINF:0,Мир: Mир
+udp://@234.5.2.121:20000
+#EXTINF:0,Мир: Союз
+udp://@234.5.2.52:20000
+#EXTINF:0,Мир: Агро ТВ
+udp://@234.5.2.105:20000
+#EXTINF:0,Мир: Ностальгия
+udp://@234.5.2.79:1234
+#EXTINF:0,Мир: РТР-планета
+udp://@234.5.2.132:20000
+#EXTINF:0,Мир: НТК
+udp://@234.5.2.130:20000
+#EXTINF:0,Мир: ТНВ Татарстан
+udp://@234.5.2.141:20000
+#EXTINF:0,Мир: Восьмой
+udp://@234.5.2.138:20000
+#EXTINF:0,Мир: 9
+udp://@234.5.2.46:20000
+#EXTINF:0,Мир: ТРО союз
+udp://@234.5.2.142:20000
+#EXTINF:0,Мир: sarafan
+udp://@234.5.2.49:20000
+#EXTINF:0,Мир: sarafan
+udp://@234.5.2.145:20000
+#EXTINF:0,Мир: K+
+udp://@234.5.2.144:20000
+#EXTINF:0,Мир: English club TV
+udp://@234.5.2.55:20000
+#EXTINF:0,Мир: RTG TV
+udp://@234.5.2.80:20000
+#EXTINF:0,Мир: TV5MONDE
+udp://@234.5.2.82:20000
+#EXTINF:0,Мир: tv.ARM.ru
+udp://@234.5.2.137:20000
+#EXTINF:0,Мир: AZ TV
+udp://@234.5.2.133:20000
+#EXTINF:0,Мир: РЖД
+udp://@234.5.2.140:20000
+#EXTINF:0,Мир: Время
+udp://@234.5.2.74:20000
+#EXTINF:0,FULL HD 1080i: HD1 / EXQI Sport
+udp://@234.5.2.92:20000
+#EXTINF:0,FULL HD 1080i: LUXE TV HD
+udp://@234.5.2.136:20000
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/example/example.m3u
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/example/example.m3u	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/example/example.m3u	(revision 27875)
@@ -0,0 +1,211 @@
+#EXTM3U
+#EXTINF:0 logo=http://butovo.com/iptv/iskra_channels_files/perviy00.jpg type=mpeg dlna_extras=mpeg_ps_pal ,Эфирный: Первый
+http://192.168.1.1:4022/udp/234.5.2.1:20000
+#EXTINF:0,Эфирный: Россия
+http://192.168.1.1:4022/udp/234.5.2.2:20000
+#EXTINF:0,Эфирный: ТВЦ
+http://192.168.1.1:4022/udp/234.5.2.3:20000
+#EXTINF:0,Эфирный: НТВ
+http://192.168.1.1:4022/udp/234.5.2.4:20000
+#EXTINF:0,Эфирный: Культура
+http://192.168.1.1:4022/udp/234.5.2.5:20000
+#EXTINF:0,Эфирный: Россия2
+http://192.168.1.1:4022/udp/234.5.2.6:20000
+#EXTINF:0,Эфирный: Спорт1 (HDTV 1024*576i)
+http://192.168.1.1:4022/udp/234.5.2.18:20000
+#EXTINF:0,Эфирный: Домашний
+http://192.168.1.1:4022/udp/234.5.2.9:20000
+#EXTINF:0,Эфирный: СТС
+http://192.168.1.1:4022/udp/234.5.2.10:20000
+#EXTINF:0,Эфирный: РЕН-ТВ
+http://192.168.1.1:4022/udp/234.5.2.8:20000
+#EXTINF:0,Эфирный: ТНТ
+http://192.168.1.1:4022/udp/234.5.2.12:20000
+#EXTINF:0,Эфирный: ДТВ
+http://192.168.1.1:4022/udp/234.5.2.11:20000
+#EXTINF:0,Эфирный: ТВ3
+http://192.168.1.1:4022/udp/234.5.2.14:20000
+#EXTINF:0,Эфирный: 7ТВ
+http://192.168.1.1:4022/udp/234.5.2.13:20000
+#EXTINF:0,Эфирный: МУЗ ТВ
+http://192.168.1.1:4022/udp/234.5.2.7:20000
+#EXTINF:0,Эфирный: MTV
+http://192.168.1.1:4022/udp/234.5.2.15:20000
+#EXTINF:0,Эфирный: Столица
+http://192.168.1.1:4022/udp/234.5.2.17:20000
+#EXTINF:0,Эфирный: Euronews
+http://192.168.1.1:4022/udp/234.5.2.16:20000
+#EXTINF:0,Эфирный: 3 Канал
+http://192.168.1.1:4022/udp/234.5.2.125:20000
+#EXTINF:0,Эфирный: 5 Канал
+http://192.168.1.1:4022/udp/234.5.2.123:20000
+#EXTINF:0,Детям: 2x2
+http://192.168.1.1:4022/udp/234.5.2.41:20000
+#EXTINF:0,Детям: Cartoon Network
+http://192.168.1.1:4022/udp/234.5.2.58:20000
+#EXTINF:0,Детям: Nickelodeon
+http://192.168.1.1:4022/udp/234.5.2.85:20000
+#EXTINF:0,Детям: Disney Channel
+http://192.168.1.1:4022/udp/234.5.2.65:20000
+#EXTINF:0,Детям: Бибигон
+http://192.168.1.1:4022/udp/234.5.2.124:20000
+#EXTINF:0,Детям: Детский Мир/ТелеКлуб
+http://192.168.1.1:4022/udp/234.5.2.88:20000
+#EXTINF:0,Детям: Первый Игровой
+http://192.168.1.1:4022/udp/234.5.2.139:20000
+#EXTINF:0,Детям: Gameland TV
+http://192.168.1.1:4022/udp/234.5.2.134:20000
+#EXTINF:0,Детям: Теленяня
+http://192.168.1.1:4022/udp/234.5.2.71:20000
+#EXTINF:0,Кино: Hallmark
+http://192.168.1.1:4022/udp/234.5.2.89:20000
+#EXTINF:0,Doc: Universal
+http://192.168.1.1:4022/udp/234.5.2.111:20000
+#EXTINF:0,Кино: Zone Romantica
+http://192.168.1.1:4022/udp/234.5.2.69:20000
+#EXTINF:0,Кино: Дом Кино
+http://192.168.1.1:4022/udp/234.5.2.72:20000
+#EXTINF:0,Doc: Animal Planet
+http://192.168.1.1:4022/udp/234.5.2.66:20000
+#EXTINF:0,Doc: Discovery Channel
+http://192.168.1.1:4022/udp/234.5.2.64:20000
+#EXTINF:0,Doc: Discovery World
+http://192.168.1.1:4022/udp/234.5.2.61:20000
+#EXTINF:0,Doc: Discovery Science
+http://192.168.1.1:4022/udp/234.5.2.62:20000
+#EXTINF:0,Doc: Discovery Travel&Living
+http://192.168.1.1:4022/udp/234.5.2.67:20000
+#EXTINF:0,Музыка: C Music
+http://192.168.1.1:4022/udp/234.5.2.54:20000
+#EXTINF:0,Музыка: Mezzo
+http://192.168.1.1:4022/udp/234.5.2.68:20000
+#EXTINF:0,Музыка: MCM TOP
+http://192.168.1.1:4022/udp/234.5.2.59:20000
+#EXTINF:0,Музыка: A-ONE
+http://192.168.1.1:4022/udp/234.5.2.51:20000
+#EXTINF:0,Музыка: Bridge TV
+http://192.168.1.1:4022/udp/234.5.2.53:20000
+#EXTINF:0,Музыка: Vh-1 Russia
+http://192.168.1.1:4022/udp/234.5.2.110:20000
+#EXTINF:0,Музыка: MTV-Dance
+http://192.168.1.1:4022/udp/234.5.2.60:20000
+#EXTINF:0,Музыка: MTV-Hits
+http://192.168.1.1:4022/udp/234.5.2.108:20000
+#EXTINF:0,Музыка: Music BOX
+http://192.168.1.1:4022/udp/234.5.2.23:20000
+#EXTINF:0,Музыка: RUTV
+http://192.168.1.1:4022/udp/234.5.2.120:20000
+#EXTINF:0,Музыка: Biz TV UA
+http://192.168.1.1:4022/udp/234.5.2.130:20000
+#EXTINF:0,Музыка: Шансон ТВ
+http://192.168.1.1:4022/udp/234.5.2.76:20000
+#EXTINF:0,Музыка: Музыка Первого
+http://192.168.1.1:4022/udp/234.5.2.73:20000
+#EXTINF:0,Мода и стиль: StyleTV
+http://192.168.1.1:4022/udp/234.5.2.135:20000
+#EXTINF:0,Мода и стиль: Fashion TV
+http://192.168.1.1:4022/udp/234.5.2.50:20000
+#EXTINF:0,Мода и стиль: World Fashion
+http://192.168.1.1:4022/udp/234.5.2.84:20000
+#EXTINF:0,Мода и стиль: Luxe TV (HDTV 1024*576i)
+http://192.168.1.1:4022/udp/234.5.2.137:20000
+#EXTINF:0,Развлечения: НСТ
+http://192.168.1.1:4022/udp/234.5.2.78:20000
+#EXTINF:0,Развлечения: ТТС
+http://192.168.1.1:4022/udp/234.5.2.143:20000
+#EXTINF:0,Развлечения: BTB
+http://192.168.1.1:4022/udp/234.5.2.114:20000
+#EXTINF:0,Развлечения: Amazing Life
+http://192.168.1.1:4022/udp/234.5.2.102:20000
+#EXTINF:0,Развлечения: O2TV
+http://192.168.1.1:4022/udp/234.5.2.122:20000
+#EXTINF:0,Развлечения: Telecafe
+http://192.168.1.1:4022/udp/234.5.2.70:20000
+#EXTINF:0,Развлечения: Время
+http://192.168.1.1:4022/udp/234.5.2.74:20000
+#EXTINF:0,Спорт: Eurosport (HDTV 1024*576i)
+http://192.168.1.1:4022/udp/234.5.2.100:20000
+#EXTINF:0,Спорт: Eurosport2 (HDTV 1024*576i)
+http://192.168.1.1:4022/udp/234.5.2.101:20000
+#EXTINF:0,Спорт: Спорт1 (HDTV 1024*576i)
+http://192.168.1.1:4022/udp/234.5.2.18:20000
+#EXTINF:0,Спорт: Спорт
+http://192.168.1.1:4022/udp/234.5.2.155:20000
+#EXTINF:0,Спорт: Теннис (HDTV 1024*576i)
+http://192.168.1.1:4022/udp/234.5.2.150:20000
+#EXTINF:0,Спорт: Баскетбол (HDTV 1024*576i)
+http://192.168.1.1:4022/udp/234.5.2.151:20000
+#EXTINF:0,Спорт: Наш футбол
+http://192.168.1.1:4022/udp/234.5.2.153:20000
+#EXTINF:0,Спорт: Футбол (HDTV 1024*576i)
+http://192.168.1.1:4022/udp/234.5.2.154:20000
+#EXTINF:0,Спорт: Русский Extreme
+http://192.168.1.1:4022/udp/234.5.2.109:20000
+#EXTINF:0,Спорт: Extreme Sports Channel
+http://192.168.1.1:4022/udp/234.5.2.75:20000
+#EXTINF:0,Новости: Первый Метео
+http://192.168.1.1:4022/udp/234.5.2.127:20000
+#EXTINF:0,Новости: Вести
+http://192.168.1.1:4022/udp/234.5.2.131:20000
+#EXTINF:0,Новости: РБК
+http://192.168.1.1:4022/udp/234.5.2.104:20000
+#EXTINF:0,Новости: Эксперт
+http://192.168.1.1:4022/udp/234.5.2.115:20000
+#EXTINF:0,Новости: EuroNews
+http://192.168.1.1:4022/udp/234.5.2.16:20000
+#EXTINF:0,Новости: Russia Today
+http://192.168.1.1:4022/udp/234.5.2.87:20000
+#EXTINF:0,Новости: BBC
+http://192.168.1.1:4022/udp/234.5.2.86:20000
+#EXTINF:0,Новости: Bloomberg
+http://192.168.1.1:4022/udp/234.5.2.83:20000
+#EXTINF:0,Новости: CNBC
+http://192.168.1.1:4022/udp/234.5.2.112:20000
+#EXTINF:0,Новости: ?
+http://192.168.1.1:4022/udp/234.5.2.116:20000
+#EXTINF:0,Новости: CNN International
+http://192.168.1.1:4022/udp/234.5.2.63:20000
+#EXTINF:0,Новости: CCTV9
+http://192.168.1.1:4022/udp/234.5.2.128:20000
+#EXTINF:0,Новости: Russian AlYaum
+http://192.168.1.1:4022/udp/234.5.2.126:20000
+#EXTINF:0,Новости: Al Jazeera english
+http://192.168.1.1:4022/udp/234.5.2.129:20000
+#EXTINF:0,Мир: Mир
+http://192.168.1.1:4022/udp/234.5.2.121:20000
+#EXTINF:0,Мир: Союз
+http://192.168.1.1:4022/udp/234.5.2.52:20000
+#EXTINF:0,Мир: Агро ТВ
+http://192.168.1.1:4022/udp/234.5.2.105:20000
+#EXTINF:0,Мир: Ностальгия
+http://192.168.1.1:4022/udp/234.5.2.79:20000
+#EXTINF:0,Мир: РТР-планета
+http://192.168.1.1:4022/udp/234.5.2.132:20000
+#EXTINF:0,Мир: ТНВ Татарстан
+http://192.168.1.1:4022/udp/234.5.2.141:20000
+#EXTINF:0,Мир: ТРО союз
+http://192.168.1.1:4022/udp/234.5.2.142:20000
+#EXTINF:0,Мир: sarafan
+http://192.168.1.1:4022/udp/234.5.2.145:20000
+#EXTINF:0,Мир: K+
+http://192.168.1.1:4022/udp/234.5.2.144:20000
+#EXTINF:0,Мир: English club TV
+http://192.168.1.1:4022/udp/234.5.2.55:20000
+#EXTINF:0,Мир: RTG TV
+http://192.168.1.1:4022/udp/234.5.2.80:20000
+#EXTINF:0,Мир: TV5MONDE
+http://192.168.1.1:4022/udp/234.5.2.82:20000
+#EXTINF:0,Мир: AZ TV
+http://192.168.1.1:4022/udp/234.5.2.133:20000
+#EXTINF:0,Мир: ?
+http://192.168.1.1:4022/udp/234.5.2.90:20000
+#EXTINF:0,Мир: ?
+http://192.168.1.1:4022/udp/234.5.2.106:20000
+#EXTINF:0,Мир: РЖД
+http://192.168.1.1:4022/udp/234.5.2.140:20000
+#EXTINF:0,Мир: Время
+http://192.168.1.1:4022/udp/234.5.2.74:20000
+#EXTINF:0,FULL HD 1080i: HD1 / EXQI Sport
+http://192.168.1.1:4022/udp/234.5.2.92:20000
+#EXTINF:0,FULL HD 1080i: LUXE TV HD
+http://192.168.1.1:4022/udp/234.5.2.136:20000
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/example/iskra.m3u
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/example/iskra.m3u	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/example/iskra.m3u	(revision 27875)
@@ -0,0 +1,112 @@
+﻿#EXTM3U url-tvg="http://www.teleguide.info/download/new3/jtv.zip" m3uautoload=1 cache=500 deinterlace=4
+#EXTINF:-1 tvg-name="Первый_канал" tvg-logo="Первый канал" group-title="Эфирные каналы" ,Первый канал
+udp://@233.34.28.1:1001
+#EXTINF:-1 tvg-name="Россия_1" tvg-logo="Россия 1" ,Россия 1
+udp://@233.34.28.2:1001
+#EXTINF:-1 tvg-name="ТВЦ" tvg-logo="ТВ Центр" ,ТВ Центр
+udp://@233.34.28.3:1001
+#EXTINF:-1 tvg-name="НТВ" tvg-logo="НТВ" ,НТВ
+udp://@233.34.28.4:1001
+#EXTINF:-1 tvg-name="Россия_Культура" tvg-logo="Россия К" ,Россия К
+udp://@233.34.28.5:1001
+#EXTINF:-1 tvg-name="Россия_2_(Спорт)" tvg-logo="Россия 2" ,Россия 2
+udp://@233.34.28.6:1001
+#EXTINF:-1 tvg-name="Спорт_1" tvg-logo="Спорт1" ,Спорт 1
+udp://@233.34.28.31:1001
+#EXTINF:-1 tvg-name="Столица" tvg-logo="Столица" ,Столица
+udp://@233.34.28.30:1001
+#EXTINF:-1 tvg-name="Россия_24" tvg-logo="Россия 24" ,Россия 24
+udp://@239.255.10.46:5500
+#EXTINF:-1 tvg-name="EuroNews" tvg-logo="Euronews" ,Euronews
+udp://@233.34.28.29:1001
+#EXTINF:-1 tvg-name="СТС" tvg-logo="СТС" ,СТС
+udp://@233.34.28.10:1001
+#EXTINF:-1 tvg-name="Домашний" tvg-logo="Домашний" ,Домашний
+udp://@233.34.28.9:1001
+#EXTINF:-1 tvg-name="РЕН_ТВ" tvg-logo="РЕН-ТВ" ,РЕН-ТВ
+udp://@233.34.28.8:1001
+#EXTINF:-1 tvg-name="ТНТ" tvg-logo="ТНТ" ,ТНТ
+udp://@233.34.28.12:1001
+#EXTINF:-1 tvg-name="ДТВ" tvg-logo="ДТВ" ,ДТВ
+udp://@233.34.28.11:1001
+#EXTINF:-1 tvg-name="Пятый_Канал" tvg-logo="Пятый" ,Пятый
+udp://@239.255.10.62:5500
+#EXTINF:-1 tvg-name="Канал_2x2" tvg-logo="2x2" ,2x2
+udp://@239.255.10.41:5500
+#EXTINF:-1 tvg-name="MTV-Russia" tvg-logo="MTV-Russia" ,MTV Россия
+udp://@233.34.28.28:1001
+#EXTINF:-1 tvg-name="Муз_ТВ" tvg-logo="МузТВ" ,МузТВ
+udp://@233.34.28.7:1001
+#EXTINF:-1 tvg-name="ТВ-3" tvg-logo="ТВ3" ,ТВ3
+udp://@233.34.28.27:1001
+#EXTINF:-1 tvg-name="7_ТВ" tvg-logo="7 ТВ" ,7 ТВ
+udp://@233.34.28.26:1001
+#EXTINF:-1 tvg-name="Карусель" tvg-logo="Карусель" ,Карусель
+udp://@239.255.10.25:5500
+#EXTINF:-1 tvg-name="Радость_моя" tvg-logo="Радость моя" ,Радость моя
+udp://@239.255.10.97:5500
+
+#EXTINF:-1 tvg-name="ТДК" tvg-logo="ТДК" group-title="Спутниковые каналы" ,Телевизионный Дамский Клуб
+udp://@239.255.10.84:5500
+#EXTINF:-1 tvg-name="РБК" tvg-logo="РБК" ,РБК
+udp://@239.255.10.52:5500
+#EXTINF:-1 tvg-name="Amazing_Life_(Удивительная_жизнь)" tvg-logo="Amazing Life" ,Amazing Life
+udp://@239.255.10.8:5500
+#EXTINF:-1 tvg-name="Первый_игровой" tvg-logo="Первый Игровой" ,Первый Игровой
+udp://@239.255.10.39:5500
+#EXTINF:-1 tvg-name="МИР" tvg-logo="Мир" ,Мир
+udp://@239.255.10.89:5500
+#EXTINF:-1 tvg-name="ТРО" tvg-logo="ТРО Союз" ,ТРО
+udp://@239.255.10.53:5500
+#EXTINF:-1 tvg-name="Союз" tvg-logo="Союз" ,Союз
+udp://@239.255.10.77:5500
+#EXTINF:-1 tvg-name="О2ТВ" tvg-logo="О2ТВ" ,О2ТВ
+udp://@239.255.10.78:5500
+#EXTINF:-1 tvg-name="Bridge_TV" tvg-logo="BridgeTV" ,BridgeTV
+udp://@239.255.10.61:5500
+#EXTINF:-1 tvg-name="A-ONE" tvg-logo="A-One" ,A ONE
+udp://@239.255.10.33:5500
+#EXTINF:-1 tvg-name="Music_Box_RU" tvg-logo="Music Box RU" ,Music Box Ru
+udp://@239.255.10.16:5500
+#EXTINF:-1 tvg-name="Music_Box_TV" tvg-logo="MusicBoxTV" ,MusicBoxTV
+udp://@239.255.10.87:5500
+#EXTINF:-1 tvg-name="Юмор Box" tvg-logo="Юмор Box" ,Юмор Box
+udp://@239.255.10.110:5500
+#EXTINF:-1 tvg-name="Мать_и_Дитя" tvg-logo="Мать и дитя" ,Мать и дитя
+udp://@239.255.10.114:5500
+#EXTINF:-1 tvg-name="Улыбка_ребенка" tvg-logo="Улыбка Ребенка" ,Улыбка Ребенка
+udp://@239.255.10.122:5500
+#EXTINF:-1 tvg-name="Первый_образовательный" tvg-logo="Первый образовательный" ,Первый образовательный
+udp://@239.255.10.117:5500
+#EXTINF:-1 tvg-name="Styletv" tvg-logo="Styletv" ,Styletv
+udp://@239.255.10.118:5500
+#EXTINF:-1 tvg-name="ТТС" tvg-logo="ТТС" ,ТТС
+udp://@239.255.10.119:5500
+#EXTINF:-1 tvg-name="Домашний_магазин" tvg-logo="Домашний магазин" ,Домашний магазин
+udp://@239.255.10.116:5500
+#EXTINF:-1 tvg-name="Подмосковье" tvg-logo="Подмосковье" ,Подмосковье
+udp://@239.255.10.120:5500
+#EXTINF:-1 tvg-name="8_канал_(Беларусь)" tvg-logo="8 канал" ,8 канал
+udp://@239.255.10.136:5500
+#EXTINF:-1 tvg-name="TVARM" tvg-logo="TVARM" ,TVARM.RU
+udp://@239.255.10.85:5500
+#EXTINF:-1 tvg-name="Татарстан_-_Новый_Век" tvg-logo="Татарстан" ,Татарстан Новый Век
+udp://@239.255.10.134:5500
+#EXTINF:-1 tvg-name="Russia_Today" tvg-logo="Russia Today" ,Russia Today
+udp://@239.255.10.121:5500
+#EXTINF:-1 tvg-name="Bloomberg" tvg-logo="Bloomberg" ,Bloomberg
+udp://@239.255.10.135:5500
+#EXTINF:-1 tvg-name="BBC_World" tvg-logo="BBC World" ,BBC World
+udp://@239.255.10.6:5500
+#EXTINF:-1 tvg-name="NHK_World" tvg-logo="NHK World" ,NHK World
+udp://@239.255.10.124:5500
+#EXTINF:-1 tvg-name="CCTV-Русский" tvg-logo="Cctv4" ,CCTV
+udp://@239.255.10.129:5500
+#EXTINF:-1 tvg-name="Deutsche_Welle" tvg-logo="Deutsche Welle" ,Deutsche Welle
+udp://@239.255.10.17:5500
+#EXTINF:-1 tvg-name="TV5" tvg-logo="TV5" ,TV5 Monde
+udp://@239.255.10.44:5500
+#EXTINF:-1 tvg-name="France_24" tvg-logo="France 24" ,France 24
+udp://@239.255.10.45:5500
+#EXTINF:-1 tvg-name="3D Test" tvg-logo="3D Test" ,3D Test
+udp://@239.255.10.9:5500
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/example/mozhay.m3u
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/example/mozhay.m3u	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/example/mozhay.m3u	(revision 27875)
@@ -0,0 +1,253 @@
+
+#EXTM3U url-tvg="http://mozhay.tv/jtv.zip"  m3uautoload=1 cache=500 deinterlace=1 tvg-shift=0
+
+#EXTINF:0 tvg-name="Первый_канал" group-title="Основные",Первый канал
+http://001.mozhay.tv
+#EXTINF:0 tvg-name="Россия_1" group-title="Основные",Россия 1
+http://002.mozhay.tv
+#EXTINF:0 tvg-name="ТВЦ" group-title="Основные",ТВЦ
+http://003.mozhay.tv
+#EXTINF:0 tvg-name="НТВ" group-title="Основные",НТВ
+http://004.mozhay.tv
+#EXTINF:0 tvg-name="Пятый_Канал" group-title="Основные",Пятый Канал
+http://017.mozhay.tv
+#EXTINF:0 tvg-name="Россия_Культура" group-title="Основные",Россия К
+http://005.mozhay.tv
+#EXTINF:0 tvg-name="7_ТВ" group-title="Основные",7 ТВ
+http://007.mozhay.tv
+#EXTINF:0 tvg-name="8_канал_(Беларусь)" group-title="Основные",8 Канал
+http://173.mozhay.tv
+#EXTINF:0 tvg-name="СТС" group-title="Основные",СТС
+http://010.mozhay.tv
+#EXTINF:0 tvg-name="ТНТ" group-title="Основные",ТНТ
+http://012.mozhay.tv
+#EXTINF:0 tvg-name="Домашний" group-title="Основные",Домашний
+http://013.mozhay.tv
+#EXTINF:0 tvg-name="РЕН_ТВ" group-title="Основные",РЕН
+http://011.mozhay.tv
+#EXTINF:0 tvg-name="ДТВ" group-title="Основные",ДТВ
+http://014.mozhay.tv
+#EXTINF:0 tvg-name="ТВ-3" group-title="Основные",ТВ3
+http://015.mozhay.tv
+#EXTINF:0 tvg-name="Звезда" group-title="Основные",Звезда
+http://016.mozhay.tv
+#EXTINF:0 tvg-name="Россия_2_(Спорт)" group-title="Основные",Россия 2
+http://006.mozhay.tv
+#EXTINF:0 tvg-name="Канал_2x2" group-title="Основные",2x2
+http://020.mozhay.tv
+#EXTINF:0 tvg-name="Комеди_ТВ" group-title="Основные",Комеди ТВ
+http://99.mozhay.tv
+
+#EXTINF:0 tvg-name="Первый_канал" tvg-shift=-4 group-title="Основные (Сдвиг времени)",Первый канал +4
+http://167.mozhay.tv
+#EXTINF:0 tvg-name="СТС" tvg-shift=-2 group-title="Основные (Сдвиг времени)",СТС +2
+http://141.mozhay.tv
+#EXTINF:0 tvg-name="РЕН_ТВ" tvg-logo="РЕН" tvg-shift=-2 group-title="Основные (Сдвиг времени)",РЕН +2
+http://143.mozhay.tv
+#EXTINF:0 tvg-name="ДТВ" tvg-logo="ДТВ" tvg-shift=-7 group-title="Основные (Сдвиг времени)",ДТВ +7
+http://140.mozhay.tv
+
+#EXTINF:0 tvg-name="TV1000" group-title="Кино",TV 1000
+http://054.mozhay.tv
+#EXTINF:0 tvg-name="TV_1000_Action" tvg-logo="TV 1000" group-title="Кино",TV 1000 Action
+http://055.mozhay.tv
+#EXTINF:0 tvg-name="ТВ-1000_Русское_кино" group-title="Кино",TV 1000 Русское кино
+http://056.mozhay.tv
+#EXTINF:0 tvg-name="TV_XXI_(TV21)" group-title="Кино",TVXXI
+http://057.mozhay.tv
+#EXTINF:0 tvg-name="Феникс_Кино" group-title="Кино",Феникс+ Кино
+http://053.mozhay.tv
+#EXTINF:0 tvg-name="Еврокино" group-title="Кино",Еврокино
+http://061.mozhay.tv
+#EXTINF:0 tvg-name="Русский_Иллюзион" group-title="Кино",Русский Иллюзион
+http://062.mozhay.tv
+#EXTINF:0 tvg-name="Иллюзион__" group-title="Кино",Иллюзион +
+http://063.mozhay.tv
+#EXTINF:0 tvg-name="Ретро_ТВ" group-title="Кино",Ретро ТВ
+http://121.mozhay.tv
+#EXTINF:0 tvg-name="Universal_Channel" group-title="Кино",Universal Channel
+http://050.mozhay.tv
+#EXTINF:0 tvg-name="Set" group-title="Кино",SET
+http://051.mozhay.tv
+#EXTINF:0 tvg-name="AXN_Sci-fi" group-title="Кино",AXN Sci-Fi
+http://052.mozhay.tv
+#EXTINF:0 tvg-name="Настоящее_Страшное_ТВ" group-title="Кино",НСТ Страшное
+http://060.mozhay.tv
+#EXTINF:0 tvg-name="Настоящее_смешное_телевидение_(НСТ)" group-title="Кино",НСТ Смешное
+http://067.mozhay.tv
+
+#EXTINF:0 tvg-name="РТР_Планета" group-title="Региональные",РТР Планета
+http://027.mozhay.tv
+#EXTINF:0 tvg-name="МИР" group-title="Региональные",Мир
+http://021.mozhay.tv
+#EXTINF:0 tvg-name="МИР" tvg-shift=-2  group-title="Региональные",Мир -2
+http://142.mozhay.tv
+#EXTINF:0 tvg-name="Татарстан_-_Новый_Век" group-title="Региональные",Татарстан
+http://160.mozhay.tv
+#EXTINF:0 tvg-name="ТРО" group-title="Региональные",ТРО Союз
+http://161.mozhay.tv
+#EXTINF:0 tvg-name="Беларусь_ТВ" group-title="Региональные",Беларусь ТВ
+http://168.mozhay.tv
+#EXTINF:0 tvg-name="ТВ-Центр-Международное" group-title="Региональные",ТВ-Центр-Международное
+http://169.mozhay.tv
+#EXTINF:0 tvg-name="НТК" group-title="Региональные",НТК Орбита
+http://174.mozhay.tv
+#EXTINF:0 tvg-name="ВТВ_(Беларусь)" group-title="Региональные",ВТВ_(Беларусь)
+http://87.mozhay.tv
+#EXTINF:0 group-title="Региональные",ТБН
+http://182.mozhay.tv
+#EXTINF:0 group-title="Региональные",INT
+http://162.mozhay.tv
+#EXTINF:0 group-title="Региональные",Пик
+http://180.mozhay.tv
+#EXTINF:0 group-title="Региональные",Az TV (Азербайджан)
+http://170.mozhay.tv
+#EXTINF:0 group-title="Региональные",C1 (Азербайджан)
+http://171.mozhay.tv
+#EXTINF:0 group-title="Региональные",K+ (Казахстан)
+http://178.mozhay.tv
+#EXTINF:0 tvg-name="Arirang_TV" group-title="Региональные",Arirang (Корея)
+http://179.mozhay.tv
+#EXTINF:0 tvg-name="Fashion_TV" group-title="Региональные",Fashion TV (Англ.)
+http://80.mozhay.tv
+
+#EXTINF:0 tvg-name="Моя_Планета" group-title="Познавательные",Моя планета
+http://126.mozhay.tv
+#EXTINF:0 tvg-name="Discovery" group-title="Познавательные",Discovery
+http://100.mozhay.tv
+#EXTINF:0 tvg-name="National_Geographic" group-title="Познавательные",National Geographic
+http://111.mozhay.tv
+#EXTINF:0 tvg-name="Animal_Planet" group-title="Познавательные",Animal Planet
+http://112.mozhay.tv
+#EXTINF:0 tvg-name="Viasat_Nature_CEE" group-title="Познавательные",Viasat Nature
+http://101.mozhay.tv
+#EXTINF:0 tvg-name="Viasat_Explorer" group-title="Познавательные",Viasat_Explorer
+http://102.mozhay.tv
+#EXTINF:0 tvg-name="Viasat_History" group-title="Познавательные",Viasat History
+http://103.mozhay.tv
+#EXTINF:0 tvg-name="Da_Vinci" group-title="Познавательные",Da Vinci Learning
+http://104.mozhay.tv
+#EXTINF:0 tvg-name="Fox_Crime" group-title="Познавательные",FOX Crime
+http://064.mozhay.tv
+#EXTINF:0 tvg-name="Fox_Life" group-title="Познавательные",FOX Life
+http://065.mozhay.tv
+#EXTINF:0 tvg-name="24_Техно" group-title="Познавательные",24 Техно
+http://105.mozhay.tv
+#EXTINF:0 tvg-name="Зоопарк" group-title="Познавательные",ZooПАРК
+http://106.mozhay.tv
+#EXTINF:0 tvg-name="Драйв_ТВ" group-title="Познавательные",Драйв
+http://122.mozhay.tv
+#EXTINF:0 tvg-name="Охота_и_рыбалка" group-title="Познавательные",Охота и рыбалка
+http://123.mozhay.tv
+#EXTINF:0 tvg-name="Усадьба" group-title="Познавательные",Усадьба ТВ
+http://125.mozhay.tv
+#EXTINF:0 tvg-name="Домашние_животные" group-title="Познавательные",Домашние Животные
+http://107.mozhay.tv
+#EXTINF:0 tvg-name="Психология21" group-title="Познавательные",Психология 21
+http://108.mozhay.tv
+#EXTINF:0 tvg-name="Загородная_жизнь" group-title="Познавательные",Загородная жизнь
+http://110.mozhay.tv
+#EXTINF:0 group-title="Познавательные",Мужской
+http://120.mozhay.tv
+#EXTINF:0 tvg-name="Вопросы_и_ответы" group-title="Познавательные",Вопросы и ответы
+http://109.mozhay.tv
+#EXTINF:0 tvg-name="Здоровое_Телевидение" group-title="Познавательные",Здоровое Телевидение
+http://124.mozhay.tv
+#EXTINF:0 tvg-name="Сарафан_ТВ" group-title="Познавательные",Сарафан ТВ
+http://066.mozhay.tv
+#EXTINF:0 tvg-name="Живи" group-title="Познавательные",Живи
+http://85.mozhay.tv
+#EXTINF:0 tvg-name="Телекафе" group-title="Познавательные",Телекафе
+http://86.mozhay.tv
+
+#EXTINF:0 tvg-name="Спорт_1" group-title="Спортивные",Спорт 1
+http://041.mozhay.tv
+#EXTINF:0 tvg-name="Eurosport" group-title="Спортивные",Eurosport
+http://042.mozhay.tv
+#EXTINF:0 tvg-name="Eurosport_2" group-title="Спортивные",Eurosport 2
+http://043.mozhay.tv
+#EXTINF:0 tvg-name="Viasat_Sport" group-title="Спортивные",Viasat Sport
+http://040.mozhay.tv
+#EXTINF:0 tvg-name="Русский_Экстрим" group-title="Спортивные",Русский Экстрим
+http://037.mozhay.tv
+#EXTINF:0 tvg-name="КХЛ-ТВ" group-title="Спортивные",КХЛ
+http://036.mozhay.tv
+
+#EXTINF:0 tvg-name="Карусель" group-title="Детские",Карусель
+http://074.mozhay.tv
+#EXTINF:0 tvg-name="Disney_Channel" group-title="Детские",Disney Channel
+http://075.mozhay.tv
+#EXTINF:0 tvg-name="Nickelodeon" group-title="Детские",Nickelodeon
+http://076.mozhay.tv
+#EXTINF:0 tvg-name="Детский_канал" group-title="Детские",Детский канал
+http://077.mozhay.tv
+#EXTINF:0 tvg-name="Мультимания" group-title="Детские",Мультимания
+http://64.mozhay.tv
+#EXTINF:0 tvg-name="Улыбка_ребенка" group-title="Детские",Улыбка ребенка
+http://66.mozhay.tv
+#EXTINF:0 tvg-name="Tiji" group-title="Детские",TiJi
+http://69.mozhay.tv
+#EXTINF:0 tvg-name="Gulli" group-title="Детские",Gulli
+http://70.mozhay.tv
+
+#EXTINF:0 tvg-name="MTV-Russia" group-title="Музыкальные",MTV-Russia
+http://81.mozhay.tv
+#EXTINF:0 tvg-name="MTV-Russia" tvg-shift=-2 group-title="Музыкальные",MTV-Russia +2
+http://82.mozhay.tv
+#EXTINF:0 tvg-name="Муз_ТВ" group-title="Музыкальные",Муз_ТВ
+http://88.mozhay.tv
+#EXTINF:0 tvg-name="A-ONE" group-title="Музыкальные",A-ONE
+http://83.mozhay.tv
+#EXTINF:0 tvg-name="Музыка_Первого" group-title="Музыкальные",Музыка Первого
+http://84.mozhay.tv
+#EXTINF:0 group-title="Музыкальные",Europa Plus TV
+http://90.mozhay.tv
+#EXTINF:0 tvg-name="Шансон_ТВ" group-title="Музыкальные",Шансон_ТВ
+http://89.mozhay.tv
+
+#EXTINF:0 tvg-name="Россия_24" group-title="Новостные",Россия 24
+http://030.mozhay.tv
+#EXTINF:0 tvg-name="EuroNews" group-title="Новостные",Euronews
+http://034.mozhay.tv
+#EXTINF:0 tvg-name="Эксперт_ТВ" group-title="Новостные",Эксперт ТВ
+http://026.mozhay.tv
+#EXTINF:0 tvg-name="РБК" group-title="Новостные",РБК
+http://024.mozhay.tv
+#EXTINF:0 tvg-name="Russia_Today" group-title="Новостные",Russia Today (Англ.)
+http://025.mozhay.tv
+#EXTINF:0 tvg-logo="Russia Today" group-title="Новостные",RTD (Англ.)
+http://045.mozhay.tv
+#EXTINF:0 tvg-name="BBC_World" group-title="Новостные",BBC World (Англ.)
+http://033.mozhay.tv
+#EXTINF:0 group-title="Новостные",PressTV (Англ.)
+http://181.mozhay.tv
+#EXTINF:0 group-title="Новостные",NHK World (Англ.)
+http://035.mozhay.tv
+#EXTINF:0 group-title="Новостные",Al Jazeera (Англ.)
+http://032.mozhay.tv
+
+#EXTINF:0 group-title="Магазин на диване",TV Club
+http://127.mozhay.tv
+#EXTINF:0 group-title="Магазин на диване",TV Club+
+http://152.mozhay.tv
+#EXTINF:0 group-title="Магазин на диване",Домашний Магазин
+http://150.mozhay.tv
+#EXTINF:0 group-title="Магазин на диване",TV SALE
+http://151.mozhay.tv
+#EXTINF:0 group-title="Магазин на диване",Italia Channel 912 (Италия)
+http://176.mozhay.tv
+
+#EXTINF:0 group-title="На арабском",RTR Arab
+http://031.mozhay.tv
+#EXTINF:0 group-title="На арабском",Arab Sport
+http://044.mozhay.tv
+#EXTINF:0 group-title="На арабском",ARAB 1
+http://113.mozhay.tv
+#EXTINF:0 group-title="На арабском",ARAB 2
+http://114.mozhay.tv
+#EXTINF:0 group-title="На арабском",qqwdghr
+http://175.mozhay.tv
+#EXTINF:0 group-title="На арабском",TVRi
+http://177.mozhay.tv
+#EXTINF:0 group-title="На арабском",Hod Hod TV
+http://65.mozhay.tv
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/example/service.m3u
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/example/service.m3u	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/example/service.m3u	(revision 27875)
@@ -0,0 +1,5 @@
+#EXTM3U
+#EXTINF:0 event=reload ,Reload
+file://./localmedia/test.mpeg
+#EXTINF:0 event=update_feeds ,Update feeds
+file://./localmedia/test.mpeg
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/gametrailers_ps3.m3u
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/gametrailers_ps3.m3u	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/gametrailers_ps3.m3u	(revision 27875)
@@ -0,0 +1,21 @@
+#EXTM3U name="GT - PS3" type=mp4 plugin=gametrailers
+#EXTINF:0 logo=http://3.images.gametrailers.com/image_root/vid_thumbs/2013/02_feb_2013/feb_20/gt_ps4_destiny_feed_fix_1280x720_3500_h32.jpg ,Destiny Playstation 4 Presentation
+http://www.gametrailers.com/videos/1mum9c/destiny-playstation-4-presentation
+#EXTINF:0 logo=http://3.images.gametrailers.com/image_root/vid_thumbs/2013/02_feb_2013/feb_20/t_watchdogs_ps4event_gp_1280x720_3500_h32.jpg ,Watch Dogs PS4 Open World Gameplay Walkthrough
+http://www.gametrailers.com/videos/ypffue/watch-dogs-ps4-open-world-gameplay-walkthrough
+#EXTINF:0 logo=http://2.images.gametrailers.com/image_root/vid_thumbs/2013/02_feb_2013/feb_20/gt_ps4_blizzard_int.jpg ,Diablo III PlayStation 4 Blizzard Interview (Stream)
+http://www.gametrailers.com/videos/lzlxjc/diablo-iii-playstation-4-blizzard-interview--stream-
+#EXTINF:0 logo=http://1.images.gametrailers.com/image_root/vid_thumbs/2013/02_feb_2013/feb_20/gt_ps4_postshow_int_watchdogs.jpg ,Watch Dogs PS4 Event: Post-Show Interview (Stream)
+http://www.gametrailers.com/videos/ezxpr9/watch-dogs-ps4-event--post-show-interview--stream-
+#EXTINF:0 logo=http://4.images.gametrailers.com/image_root/vid_thumbs/2013/02_feb_2013/feb_20/gt_ps4_watchdogs.jpg ,Watch Dogs PS4 Event Presentation and Gameplay
+http://www.gametrailers.com/videos/frpzg7/watch-dogs-ps4-event-presentation-and-gameplay
+#EXTINF:0 logo=http://4.images.gametrailers.com/image_root/vid_thumbs/2013/02_feb_2013/feb_20/gt_ps4_diablo3_announcement.jpg ,Diablo III PS4 Diablo 3 Announcement
+http://www.gametrailers.com/videos/nbya3s/diablo-iii-ps4-diablo-3-announcement
+#EXTINF:0 logo=http://3.images.gametrailers.com/image_root/vid_thumbs/2013/02_feb_2013/feb_20/t_dmc_bloodypalace_trailer.jpg ,DmC: Devil May Cry Bloody Palace Trailer
+http://www.gametrailers.com/videos/yhoaq3/dmc--devil-may-cry-bloody-palace-trailer
+#EXTINF:0 logo=http://2.images.gametrailers.com/image_root/vid_thumbs/2013/02_feb_2013/feb_20/t_capcomarcadecabinet_1987pack.jpg ,Capcom Arcade Cabinet 1987 Pack Trailer
+http://www.gametrailers.com/videos/iu7cur/capcom-arcade-cabinet-1987-pack-trailer
+#EXTINF:0 logo=http://1.images.gametrailers.com/image_root/vid_thumbs/2013/02_feb_2013/feb_20/t_murderedsoulsuspect_teaser.jpg ,Murdered: Soul Suspect Debut Teaser
+http://www.gametrailers.com/videos/0urb95/murdered--soul-suspect-debut-teaser
+#EXTINF:0 logo=http://2.images.gametrailers.com/image_root/vid_thumbs/2013/02_feb_2013/feb_20/t_guardiansofmiddleearth_snaga.jpg ,Guardians of Middle Earth Snaga, The Ravenous Trailer
+http://www.gametrailers.com/videos/xr7z4d/guardians-of-middle-earth-snaga--the-ravenous-trailer
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/giantbomb_all.m3u
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/giantbomb_all.m3u	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/giantbomb_all.m3u	(revision 27875)
@@ -0,0 +1,17 @@
+#EXTM3U name="giantbomb_all" type=mp4 plugin=giantbomb
+#EXTINF:0 logo=http://static.giantbomb.com/uploads/screen_medium/2/23546/2432073-ds.jpg,Quick Look Road Show: Grid 2
+http://www.giantbomb.com/videos/quick-look-road-show-grid-2/2300-7041/
+#EXTINF:0 logo=http://static.giantbomb.com/uploads/screen_medium/2/23546/2433276-es.jpg,Quick Look: Angelica Weaver: Catch Me When You Can
+http://www.giantbomb.com/videos/quick-look-angelica-weaver-catch-me-when-you-can/2300-7049/
+#EXTINF:0 logo=http://static.giantbomb.com/uploads/screen_medium/0/31/2433570-vf_tnt_021413.jpg,Thursday Night Throwdown: 02/14/13
+http://www.giantbomb.com/videos/thursday-night-throwdown-02-14-13/2300-7051/
+#EXTINF:0 logo=http://static.giantbomb.com/uploads/screen_medium/2/23546/2434543-gs.jpg,Quick Look: Metal Gear Rising: Revengeance
+http://www.giantbomb.com/videos/quick-look-metal-gear-rising-revengeance/2300-7053/
+#EXTINF:0 logo=http://static.giantbomb.com/uploads/screen_medium/2/23546/2434917-hs.jpg,Unprofessional Fridays: 02/15/13
+http://www.giantbomb.com/videos/unprofessional-fridays-02-15-13/2300-7054/
+#EXTINF:0 logo=http://static.giantbomb.com/uploads/screen_medium/0/26/2435336-videothumb.png,A Grown Man In His Underwear Tells You About Destiny
+http://www.giantbomb.com/videos/a-grown-man-in-his-underwear-tells-you-about-desti/2300-7055/
+#EXTINF:0 logo=http://static.giantbomb.com/uploads/screen_medium/2/23546/2438646-as.jpg,Quick Look: Crysis 3
+http://www.giantbomb.com/videos/quick-look-crysis-3/2300-7059/
+#EXTINF:0 logo=http://static.giantbomb.com/uploads/screen_medium/0/31/2440126-vf_ps4_streama.jpg,Meet the Future of PlayStation with Us
+http://www.giantbomb.com/videos/meet-the-future-of-playstation-with-us/2300-7066/
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/ivi_new.m3u
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/ivi_new.m3u	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/ivi_new.m3u	(revision 27875)
@@ -0,0 +1,201 @@
+#EXTM3U name="new" type=mp4 plugin=ivi
+#EXTINF:0 logo=http://thumbs.ivi.ru/f11.vcp.digitalaccess.ru/contents/f/0/f53b87090881d2eaec376e68ae5e94.jpg/147x225/ ,Время любить (2012)
+http://www.ivi.ru/watch/vremya_lyubit
+#EXTINF:0 logo=http://thumbs.ivi.ru/f12.vcp.digitalaccess.ru/contents/5/8/c728d1896ff9c384108597d5bd7368.jpg/147x225/ ,1812
+http://www.ivi.ru/watch/1812
+#EXTINF:0 logo=http://thumbs.ivi.ru/f12.vcp.digitalaccess.ru/contents/6/5/d55c27a9d7ca75ffcc2dd1a0a4e34e.jpg/147x225/ ,Ящик Пандоры (2011)
+http://www.ivi.ru/watch/yaschik_pandoryi
+#EXTINF:0 logo=http://thumbs.ivi.ru/f11.vcp.digitalaccess.ru/contents/8/4/1eef99dbb64d3ca1509e0896edfa51.jpg/147x225/ ,Маша в законе
+http://www.ivi.ru/watch/masha_v_zakone
+#EXTINF:0 logo=http://thumbs.ivi.ru/f31.vcp.digitalaccess.ru/contents/a/8/208a12aeaa89b0d945fc8a5bd66fbb.jpg/147x225/ ,Ангел в сердце
+http://www.ivi.ru/watch/angel_v_serdtse
+#EXTINF:0 logo=http://thumbs.ivi.ru/f35.vcp.digitalaccess.ru/contents/b/0/7d7d3b51154307d36e362316279d38.jpg/147x225/ ,Разрыв
+http://www.ivi.ru/watch/razryiv
+#EXTINF:0 logo=http://thumbs.ivi.ru/f27.vcp.digitalaccess.ru/contents/3/2/e2125961d674ccef7c3250173f8a66.jpg/147x225/ ,Жизнь и судьба
+http://www.ivi.ru/watch/zhizn_i_sudba
+#EXTINF:0 logo=http://thumbs.ivi.ru/f26.vcp.digitalaccess.ru/contents/c/2/8413fd81e7f1960c797453c81909ee.jpg/147x225/ ,Кремень
+http://www.ivi.ru/watch/kremen
+#EXTINF:0 logo=http://thumbs.ivi.ru/f36.vcp.digitalaccess.ru/contents/a/5/3ea42da1480ce042b1fea0358ec9d2.jpg/147x225/ ,Трофеи Авалона
+http://www.ivi.ru/watch/trofei_avalona
+#EXTINF:0 logo=http://thumbs.ivi.ru/f32.vcp.digitalaccess.ru/contents/c/1/3416136487bcb9c170203cb888f102.jpg/147x225/ ,Кухня
+http://www.ivi.ru/watch/kuhnya_2012
+#EXTINF:0 logo=http://thumbs.ivi.ru/f27.vcp.digitalaccess.ru/contents/d/2/0c6f265280056409a598e0ba53d61f.jpg/147x225/ ,Отключка
+http://www.ivi.ru/watch/otklyuchka
+#EXTINF:0 logo=http://thumbs.ivi.ru/f25.vcp.digitalaccess.ru/contents/8/6/6db3f5c8b68116736107420fdc2f43.jpg/147x225/ ,Хороший коп
+http://www.ivi.ru/watch/horoshiy_kop
+#EXTINF:0 logo=http://thumbs.ivi.ru/f26.vcp.digitalaccess.ru/contents/6/c/e92f518affa5d2b7d82c39e976df69.jpg/147x225/ ,Магический Париж 4
+http://www.ivi.ru/watch/magicheskiy_parizh_4
+#EXTINF:0 logo=http://thumbs.ivi.ru/f33.vcp.digitalaccess.ru/contents/8/e/760374a48cf11e189333f8a737a098.jpg/147x225/ ,Все о собаках
+http://www.ivi.ru/watch/vse_o_sobakah
+#EXTINF:0 logo=http://thumbs.ivi.ru/f32.vcp.digitalaccess.ru/contents/6/b/80ebe2fef9d6d39e4f07c149ac044a.jpg/147x225/ ,Титаник (Titanic)
+http://www.ivi.ru/watch/titanik_titanic
+#EXTINF:0 logo=http://thumbs.ivi.ru/f35.vcp.digitalaccess.ru/contents/c/d/a523e32d1e99f7aa837ed28f7ded8c.jpg/147x225/ ,Полосатое счастье
+http://www.ivi.ru/watch/polosatoe_schastye
+#EXTINF:0 logo=http://thumbs.ivi.ru/f27.vcp.digitalaccess.ru/contents/d/3/87ef94cab24ed3198a015653c2d079.jpg/147x225/ ,Команда Че
+http://www.ivi.ru/watch/komanda_che
+#EXTINF:0 logo=http://thumbs.ivi.ru/f1.vcp.digitalaccess.ru/contents/8/9/c43fa0d0d477e7050a66c13f78f2e2.jpg/147x225/ ,Приказано женить
+http://www.ivi.ru/watch/prikazano_zhenit
+#EXTINF:0 logo=http://thumbs.ivi.ru/f28.vcp.digitalaccess.ru/contents/1/2/29b244ac35e73f01d84202bbdbc037.jpg/147x225/ ,Луч на повороте
+http://www.ivi.ru/watch/luch_na_povorote
+#EXTINF:0 logo=http://thumbs.ivi.ru/f34.vcp.digitalaccess.ru/contents/6/2/92444cab31bc51948f43221e36b8d2.jpg/147x225/ ,Найденыш 3
+http://www.ivi.ru/watch/naydenysh_3
+#EXTINF:0 logo=http://thumbs.ivi.ru/f34.vcp.digitalaccess.ru/contents/9/9/ccaf2b4213bcf9c5174a03a52a1e53.jpg/147x225/ ,Военная разведка: Северный фронт
+http://www.ivi.ru/watch/voennaya_razvedka_severnyi_front
+#EXTINF:0 logo=http://thumbs.ivi.ru/f1.vcp.digitalaccess.ru/contents/8/d/022ac06ae7772985d873bb30d5cc6a.jpg/147x225/ ,Башня. Новые люди
+http://www.ivi.ru/watch/bashnya_novye_ludi
+#EXTINF:0 logo=http://thumbs.ivi.ru/f27.vcp.digitalaccess.ru/contents/b/5/8077974d1744f4d7c5c52949e5808d.jpg/147x225/ ,Дежурный ангел
+http://www.ivi.ru/watch/dezhurnyi_angel
+#EXTINF:0 logo=http://thumbs.ivi.ru/f27.vcp.digitalaccess.ru/contents/6/f/00e1038f3f7f2f636e6444eb3391f8.jpg/147x225/ ,Ласточкино гнездо
+http://www.ivi.ru/watch/lastochkino_gnezdo
+#EXTINF:0 logo=http://thumbs.ivi.ru/f36.vcp.digitalaccess.ru/contents/2/a/a477822fe2ececb4046ceb76f09315.jpg/147x225/ ,Мы с Ростова
+http://www.ivi.ru/watch/my_s_rostova
+#EXTINF:0 logo=http://thumbs.ivi.ru/f1.vcp.digitalaccess.ru/contents/7/f/6f3cb090c851805e6b446ac5252f7f.jpg/147x225/ ,Быть Сержем Марковичем!
+http://www.ivi.ru/watch/byt_serzhem_markovichem
+#EXTINF:0 logo=http://thumbs.ivi.ru/f28.vcp.digitalaccess.ru/contents/4/8/7bcd58a71b087a472f76f650e6c67d.jpg/147x225/ ,Машины сказки
+http://www.ivi.ru/watch/mashiny_skazki
+#EXTINF:0 logo=http://thumbs.ivi.ru/f1.vcp.digitalaccess.ru/contents/1/3/054a4d774b1a923eacb4abf46b7c06.jpg/147x225/ ,За дело!
+http://www.ivi.ru/watch/za_delo
+#EXTINF:0 logo=http://thumbs.ivi.ru/f1.vcp.digitalaccess.ru/contents/8/b/861a42cd596ba467f04b35745b6f72.jpg/147x225/ ,Геймеры
+http://www.ivi.ru/watch/geymery
+#EXTINF:0 logo=http://thumbs.ivi.ru/f36.vcp.digitalaccess.ru/contents/1/d/51ec6bdd34a92ec0a48a863d076155.jpg/147x225/ ,Байки Митяя
+http://www.ivi.ru/watch/bayki_mityaya
+#EXTINF:0 logo=http://thumbs.ivi.ru/f27.vcp.digitalaccess.ru/contents/7/e/feb0b7f9ec75104fa2f2fb59bdc44a.jpg/147x225/ ,Дневник доктора Зайцевой
+http://www.ivi.ru/watch/dnevnik_doktora_zaytsevoy
+#EXTINF:0 logo=http://thumbs.ivi.ru/f10.vcp.digitalaccess.ru/contents/c/1/eb84f65756f2f4313faa41f9f320e1.jpg/147x225/ ,Жила-была любовь
+http://www.ivi.ru/watch/99873
+#EXTINF:0 logo=http://thumbs.ivi.ru/f36.vcp.digitalaccess.ru/contents/d/3/2948c77ff1d39e65be65c60cafeda1.jpg/147x225/ ,Миллионер
+http://www.ivi.ru/watch/99805
+#EXTINF:0 logo=http://thumbs.ivi.ru/f29.vcp.digitalaccess.ru/contents/d/4/74846df877edea9f059cb1f08429d7.jpg/147x225/ ,Последняя роль Риты
+http://www.ivi.ru/watch/99804
+#EXTINF:0 logo=http://thumbs.ivi.ru/f14.vcp.digitalaccess.ru/contents/c/e/57d4b587521414a0dd7aa4909e1947.jpg/147x225/ ,Невеста моего друга
+http://www.ivi.ru/watch/99773
+#EXTINF:0 logo=http://thumbs.ivi.ru/f24.vcp.digitalaccess.ru/contents/2/a/2f5bf2a15c9efa375952f3847cc113.jpg/147x225/ ,Солнцеворот
+http://www.ivi.ru/watch/99772
+#EXTINF:0 logo=http://thumbs.ivi.ru/f14.vcp.digitalaccess.ru/contents/e/a/a751066d36ee5b70a1045a0f84a4d3.jpg/147x225/ ,Мечты из пластилина
+http://www.ivi.ru/watch/99753
+#EXTINF:0 logo=http://thumbs.ivi.ru/f15.vcp.digitalaccess.ru/contents/c/c/a38540ff214179763b3333219d8130.jpg/147x225/ ,Большая ржака!
+http://www.ivi.ru/watch/99481
+#EXTINF:0 logo=http://thumbs.ivi.ru/f16.vcp.digitalaccess.ru/contents/a/9/2ce621da74f5cc809a5864172807fa.jpg/147x225/ ,На Байкал 2: На абордаж
+http://www.ivi.ru/watch/99408
+#EXTINF:0 logo=http://thumbs.ivi.ru/f11.vcp.digitalaccess.ru/contents/1/6/52656c51b7e9d897090b7ebab7fda4.jpg/147x225/ ,Однажды со мной
+http://www.ivi.ru/watch/98501
+#EXTINF:0 logo=http://thumbs.ivi.ru/f31.vcp.digitalaccess.ru/contents/b/8/44c8f49f7bf52b2f9eeb77ccef70a4.jpg/147x225/ ,Храбрый плавник
+http://www.ivi.ru/watch/98414
+#EXTINF:0 logo=http://thumbs.ivi.ru/f11.vcp.digitalaccess.ru/contents/4/4/681faa8b5c85dcf43b3178c5124ed6.jpg/147x225/ ,Билет на Vegas
+http://www.ivi.ru/watch/98400
+#EXTINF:0 logo=http://thumbs.ivi.ru/f2.vcp.digitalaccess.ru/contents/e/6/a252a939b63fc283612c82686a9125.jpg/147x225/ ,Шлюха
+http://www.ivi.ru/watch/98355
+#EXTINF:0 logo=http://thumbs.ivi.ru/f1.vcp.digitalaccess.ru/contents/1/6/fa6512f78ff1fa615ba8d4c35503f7.jpg/147x225/ ,Вождь разнокожих
+http://www.ivi.ru/watch/98354
+#EXTINF:0 logo=http://thumbs.ivi.ru/f31.vcp.digitalaccess.ru/contents/1/f/eaf9e619e890474662e8ee9fbbe35b.jpg/147x225/ ,Любовь с акцентом
+http://www.ivi.ru/watch/98353
+#EXTINF:0 logo=http://thumbs.ivi.ru/f16.vcp.digitalaccess.ru/contents/9/4/6fceda88b23d8cf8afc01ab481d313.jpg/147x225/ ,1812: Уланская баллада
+http://www.ivi.ru/watch/98352
+#EXTINF:0 logo=http://thumbs.ivi.ru/f32.vcp.digitalaccess.ru/contents/f/a/a44eec651d9971884b1ce21f3f2853.jpg/147x225/ ,Римские приключения
+http://www.ivi.ru/watch/98350
+#EXTINF:0 logo=http://thumbs.ivi.ru/f16.vcp.digitalaccess.ru/contents/6/c/a9a554928dca311cd9279d4abca8ab.jpg/147x225/ ,Пираньи 3DD
+http://www.ivi.ru/watch/98349
+#EXTINF:0 logo=http://thumbs.ivi.ru/f11.vcp.digitalaccess.ru/contents/d/9/87d8ea500f2fc942053306c666c4cf.jpg/147x225/ ,Судья Дредд
+http://www.ivi.ru/watch/98348
+#EXTINF:0 logo=http://thumbs.ivi.ru/f15.vcp.digitalaccess.ru/contents/f/a/e82c5360c5ad768b0e3872ce00c860.jpg/147x225/ ,Заложница 2
+http://www.ivi.ru/watch/98347
+#EXTINF:0 logo=http://thumbs.ivi.ru/f2.vcp.digitalaccess.ru/contents/d/2/a215883c44a9b2bc2334d5a28ab306.jpg/147x225/ ,Нико 2
+http://www.ivi.ru/watch/98336
+#EXTINF:0 logo=http://thumbs.ivi.ru/f2.vcp.digitalaccess.ru/contents/5/e/e713dbc21e8c6073339ac34d85c11c.jpg/147x225/ ,Руби Спаркс
+http://www.ivi.ru/watch/97985
+#EXTINF:0 logo=http://thumbs.ivi.ru/f6.vcp.digitalaccess.ru/contents/1/e/a570e27bf0b5c445cac4f4e940e88c.jpg/147x225/ ,Монстры на каникулах
+http://www.ivi.ru/watch/97983
+#EXTINF:0 logo=http://thumbs.ivi.ru/f11.vcp.digitalaccess.ru/contents/3/6/60c37350c9f6bdb1a9f7156caf7e9e.jpg/147x225/ ,Робот и Фрэнк
+http://www.ivi.ru/watch/97982
+#EXTINF:0 logo=http://thumbs.ivi.ru/f15.vcp.digitalaccess.ru/contents/b/1/54f4fa96d217294a96750b9f9e01d4.jpg/147x225/ ,Шпион
+http://www.ivi.ru/watch/97696
+#EXTINF:0 logo=http://thumbs.ivi.ru/f34.vcp.digitalaccess.ru/contents/5/0/01879ff69e154e5e2217c626d416c1.jpg/147x225/ ,Рука Нефертити
+http://www.ivi.ru/watch/97409
+#EXTINF:0 logo=http://thumbs.ivi.ru/f15.vcp.digitalaccess.ru/contents/4/9/ca40efd8f52c35bf5206bcf902ab84.jpg/147x225/ ,Феи: Тайна зимнего леса
+http://www.ivi.ru/watch/96724
+#EXTINF:0 logo=http://thumbs.ivi.ru/f26.vcp.digitalaccess.ru/contents/f/a/2d50b0c54e419ffcbc3a35c53b9937.jpg/147x225/ ,Бригада: Наследник
+http://www.ivi.ru/watch/96328
+#EXTINF:0 logo=http://thumbs.ivi.ru/f16.vcp.digitalaccess.ru/contents/8/7/d9eef630ebbe553c9d3e8a29f9f9fd.jpg/147x225/ ,Снежная королева
+http://www.ivi.ru/watch/96326
+#EXTINF:0 logo=http://thumbs.ivi.ru/f2.vcp.digitalaccess.ru/contents/5/d/e31c1bf5d1a9f7c8125f5a46954edc.jpg/147x225/ ,Я тоже хочу
+http://www.ivi.ru/watch/96324
+#EXTINF:0 logo=http://thumbs.ivi.ru/f1.vcp.digitalaccess.ru/contents/5/b/3d4d2bfb71cdd35b2ff68a5876894d.jpg/147x225/ ,Игра на выживание
+http://www.ivi.ru/watch/96304
+#EXTINF:0 logo=http://thumbs.ivi.ru/f28.vcp.digitalaccess.ru/contents/2/2/1b4cbc33ab825c96f86501ef71b3e7.jpg/147x225/ ,Дети сексу не помеха
+http://www.ivi.ru/watch/96301
+#EXTINF:0 logo=http://thumbs.ivi.ru/f28.vcp.digitalaccess.ru/contents/f/b/f7961ec8180859654bb0e813a152e8.jpg/147x225/ ,Ищу друга на конец света
+http://www.ivi.ru/watch/96300
+#EXTINF:0 logo=http://thumbs.ivi.ru/f25.vcp.digitalaccess.ru/contents/c/b/8d62386a9120934b10a44d074a5f92.jpg/147x225/ ,Двигай время!
+http://www.ivi.ru/watch/96167
+#EXTINF:0 logo=http://thumbs.ivi.ru/f2.vcp.digitalaccess.ru/contents/5/2/5371dbe0d8311ba1cba5fda7f0a67f.jpg/147x225/ ,Франкенвини
+http://www.ivi.ru/watch/96121
+#EXTINF:0 logo=http://thumbs.ivi.ru/f26.vcp.digitalaccess.ru/contents/b/b/e352bf5477511117c684a5fb461336.jpg/147x225/ ,Эволюция Борна
+http://www.ivi.ru/watch/96117
+#EXTINF:0 logo=http://thumbs.ivi.ru/f25.vcp.digitalaccess.ru/contents/0/a/ed9ea3939ab616ff60c426e7c2e740.jpg/147x225/ ,Толстяк на ринге
+http://www.ivi.ru/watch/96098
+#EXTINF:0 logo=http://thumbs.ivi.ru/f1.vcp.digitalaccess.ru/contents/e/1/1afaa7781ca2de347083d17a3b8f4a.jpg/147x225/ ,Явление
+http://www.ivi.ru/watch/96089
+#EXTINF:0 logo=http://thumbs.ivi.ru/f32.vcp.digitalaccess.ru/contents/f/e/e0c74070b538b26628014ef5aa30e3.jpg/147x225/ ,Операция «Арго»
+http://www.ivi.ru/watch/96088
+#EXTINF:0 logo=http://thumbs.ivi.ru/f31.vcp.digitalaccess.ru/contents/2/c/de8563bd6e8928ac2e12b2aa063266.jpg/147x225/ ,Грязная кампания за честные выборы
+http://www.ivi.ru/watch/96087
+#EXTINF:0 logo=http://thumbs.ivi.ru/f24.vcp.digitalaccess.ru/contents/0/a/168e585b8a81516e9b67ec55cc07ca.jpg/147x225/ ,Странная жизнь Тимоти Грина
+http://www.ivi.ru/watch/96058
+#EXTINF:0 logo=http://thumbs.ivi.ru/f28.vcp.digitalaccess.ru/contents/3/d/cb2dced25a386b1cdd20e08d9998d8.jpg/147x225/ ,Искатели приключений
+http://www.ivi.ru/watch/95899
+#EXTINF:0 logo=http://thumbs.ivi.ru/f16.vcp.digitalaccess.ru/contents/e/f/bc8eaa09172b5cc83e54519f6cfc2f.jpg/147x225/ ,Параллельные миры
+http://www.ivi.ru/watch/95898
+#EXTINF:0 logo=http://thumbs.ivi.ru/f33.vcp.digitalaccess.ru/contents/3/5/080572a12cab263972a1ae3cbb2fc9.jpg/147x225/ ,Болт и Блип спешат на помощь
+http://www.ivi.ru/watch/95897
+#EXTINF:0 logo=http://thumbs.ivi.ru/f32.vcp.digitalaccess.ru/contents/3/4/b5d6bf6e60587d9521889a47602606.jpg/147x225/ ,Апартаменты 1303
+http://www.ivi.ru/watch/95896
+#EXTINF:0 logo=http://thumbs.ivi.ru/f32.vcp.digitalaccess.ru/contents/0/a/64d93657df3fc740a193f744406571.jpg/147x225/ ,Марко Макако
+http://www.ivi.ru/watch/95895
+#EXTINF:0 logo=http://thumbs.ivi.ru/f32.vcp.digitalaccess.ru/contents/9/b/0cb33d87f9795be77ff15831c93ce0.jpg/147x225/ ,Атомный Иван
+http://www.ivi.ru/watch/95272
+#EXTINF:0 logo=http://thumbs.ivi.ru/f36.vcp.digitalaccess.ru/contents/6/8/9e30f9e0ddf66c78db4bd844df84a9.jpg/147x225/ ,Код доступа «София»
+http://www.ivi.ru/watch/95096
+#EXTINF:0 logo=http://thumbs.ivi.ru/f16.vcp.digitalaccess.ru/contents/7/9/026d62deb8e4ae19e63b5a693adc19.jpg/147x225/ ,Храбрая сердцем
+http://www.ivi.ru/watch/94693
+#EXTINF:0 logo=http://thumbs.ivi.ru/f15.vcp.digitalaccess.ru/contents/d/7/43277a4a922db7d8ee1a66d083deb0.jpg/147x225/ ,Мужчина с гарантией
+http://www.ivi.ru/watch/94612
+#EXTINF:0 logo=http://thumbs.ivi.ru/f2.vcp.digitalaccess.ru/contents/2/b/64d0121227168fa5a44d3bfaff344b.jpg/147x225/ ,Вишенка на новогоднем торте
+http://www.ivi.ru/watch/94604
+#EXTINF:0 logo=http://thumbs.ivi.ru/f32.vcp.digitalaccess.ru/contents/4/2/ffa8f691491908dad00c47e1c358be.jpg/147x225/ ,О чем говорят французские мужчины
+http://www.ivi.ru/watch/94603
+#EXTINF:0 logo=http://thumbs.ivi.ru/f15.vcp.digitalaccess.ru/contents/7/8/9d0be0a05dc23622e4baf77996b2b3.jpg/147x225/ ,Корпорация «Святые моторы»
+http://www.ivi.ru/watch/94600
+#EXTINF:0 logo=http://thumbs.ivi.ru/f2.vcp.digitalaccess.ru/contents/1/4/6f046449715b105e11e95a581c8dc0.jpg/147x225/ ,Доля ангелов
+http://www.ivi.ru/watch/94597
+#EXTINF:0 logo=http://thumbs.ivi.ru/f2.vcp.digitalaccess.ru/contents/b/b/539656fafeca80b5ccac6d6365ad1b.jpg/147x225/ ,Присутствие великолепия
+http://www.ivi.ru/watch/94441
+#EXTINF:0 logo=http://thumbs.ivi.ru/f28.vcp.digitalaccess.ru/contents/9/c/31fce4204143d4d9e6ebe2919273f9.jpg/147x225/ ,Темный рыцарь: Возрождение легенды
+http://www.ivi.ru/watch/94109
+#EXTINF:0 logo=http://thumbs.ivi.ru/f2.vcp.digitalaccess.ru/contents/b/2/0614ec0c611f21a103149a27a55f8d.jpg/147x225/ ,Короли рулетки
+http://www.ivi.ru/watch/94097
+#EXTINF:0 logo=http://thumbs.ivi.ru/f28.vcp.digitalaccess.ru/contents/9/b/9bc0d74bdf4f84dc0c3b1dede4a1f8.jpg/147x225/ ,Реальность
+http://www.ivi.ru/watch/94096
+#EXTINF:0 logo=http://thumbs.ivi.ru/f26.vcp.digitalaccess.ru/contents/4/3/477d21c274b79c4e33425ca50f1739.jpg/147x225/ ,Проклятье 3D (2D версия)
+http://www.ivi.ru/watch/94011
+#EXTINF:0 logo=http://thumbs.ivi.ru/f25.vcp.digitalaccess.ru/contents/8/4/5fab746dfeb6db991c909e3db14bdb.jpg/147x225/ ,Флика 3
+http://www.ivi.ru/watch/93977
+#EXTINF:0 logo=http://thumbs.ivi.ru/f31.vcp.digitalaccess.ru/contents/5/d/ef9f2275b47202e7a3b71838f76591.jpg/147x225/ ,Ночь тамплиера
+http://www.ivi.ru/watch/93967
+#EXTINF:0 logo=http://thumbs.ivi.ru/f27.vcp.digitalaccess.ru/contents/2/c/faae39df64938e8763e858eedd47f0.jpg/147x225/ ,Помощники
+http://www.ivi.ru/watch/93942
+#EXTINF:0 logo=http://thumbs.ivi.ru/f1.vcp.digitalaccess.ru/contents/d/a/e1de5a4556b712a926834d5ae12c62.jpg/147x225/ ,Мужчина с гарантией. Фильм о фильме
+http://www.ivi.ru/watch/93821
+#EXTINF:0 logo=http://thumbs.ivi.ru/f2.vcp.digitalaccess.ru/contents/e/9/a8e3c6a58933896cca3c23f02aca1e.jpg/147x225/ ,Паранормальное явление 4
+http://www.ivi.ru/watch/93746
+#EXTINF:0 logo=http://thumbs.ivi.ru/f34.vcp.digitalaccess.ru/contents/1/0/bed453f61921a1f3394a25087ff895.jpg/147x225/ ,Солдаты удачи
+http://www.ivi.ru/watch/93732
+#EXTINF:0 logo=http://thumbs.ivi.ru/f2.vcp.digitalaccess.ru/contents/0/b/e33db6629687a4ea5a292fce473588.jpg/147x225/ ,Кококо
+http://www.ivi.ru/watch/93652
+#EXTINF:0 logo=http://thumbs.ivi.ru/f35.vcp.digitalaccess.ru/contents/0/a/3ef47839ba62a03676ba7be5d4cb43.jpg/147x225/ ,Ржевский против Наполеона
+http://www.ivi.ru/watch/93645
+#EXTINF:0 logo=http://thumbs.ivi.ru/f32.vcp.digitalaccess.ru/contents/b/4/ea0e7f2a5425971b17df528440ee5a.jpg/147x225/ ,8 первых свиданий
+http://www.ivi.ru/watch/93644
+#EXTINF:0 logo=http://thumbs.ivi.ru/f6.vcp.digitalaccess.ru/contents/0/0/5ed7c55bfd706f114d4ece1db3e05d.jpg/147x225/ ,Особо опасны
+http://www.ivi.ru/watch/93636
+#EXTINF:0 logo=http://thumbs.ivi.ru/f15.vcp.digitalaccess.ru/contents/0/f/0afea124f46276824733d5c22a0380.jpg/147x225/ ,Паранорман, или Как приручить зомби
+http://www.ivi.ru/watch/93633
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/vimeo_channel_hd.m3u
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/vimeo_channel_hd.m3u	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/vimeo_channel_hd.m3u	(revision 27875)
@@ -0,0 +1,41 @@
+#EXTM3U name="Vimeo HD Channel" type=mp4 plugin=vimeo
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/306/128/306128460_200.jpg ,Prie Dieu
+http://vimeo.com/36864714
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/216/238/216238910_200.jpg ,PROTECT IP / SOPA Breaks The Internet
+http://vimeo.com/31100268
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/228/452/228452084_200.jpg ,O NIGHT DIVINE
+http://vimeo.com/33635713
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/212/592/212592910_200.jpg ,Mobius
+http://vimeo.com/31525127
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/152/410/152410199_200.jpg ,After - Moby
+http://vimeo.com/23407587
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/164/190/164190212_200.jpg ,OFFF Barcelona 2011 Main Titles
+http://vimeo.com/24982650
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/144/600/144600813_200.jpg ,Manchester Orchestra - "Simple Math"
+http://vimeo.com/22379296
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/136/375/136375440_200.jpg ,Blinky™
+http://vimeo.com/21216091
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/120/757/120757251_200.jpg ,The Story Beyond the Still - All Chapters - FINAL COLLABORATIVE FILM
+http://vimeo.com/19096657
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/119/426/119426758_200.jpg ,The Story Beyond The Still "Corridors" - Behind the Scenes
+http://vimeo.com/18914172
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/326/307/326307731_200.jpg ,UNDERCITY
+http://vimeo.com/18280328
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/964/213/96421373_200.jpg ,The LightLine of Gotham
+http://vimeo.com/15887314
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/375/404/37540408_200.jpg ,Last Minutes with ODEN
+http://vimeo.com/8191217
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/819/560/81956031_200.jpg ,DARK SIDE OF THE LENS
+http://vimeo.com/14074949
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/884/017/88401708_200.jpg ,Umbra (HD - 2010)
+http://vimeo.com/14844291
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/880/915/88091560_200.jpg ,STASIS
+http://vimeo.com/14795455
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/881/648/88164821_200.jpg ,Chapter 7: Exit Interview
+http://vimeo.com/14434107
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/508/629/50862952_200.jpg ,Descendants
+http://vimeo.com/8642276
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/700/790/70079038_200.jpg ,Chapter 5: Miracle
+http://vimeo.com/12475071
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/297/909/297909619_200.jpg ,Canon's The Story Beyond the Still - "Allison" | Chapter 4 Winner, Sundance 2011 Premiere
+http://vimeo.com/11434588
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/vimeo_channel_hdxs.m3u
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/vimeo_channel_hdxs.m3u	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/vimeo_channel_hdxs.m3u	(revision 27875)
@@ -0,0 +1,55 @@
+#EXTM3U name="Vimeo Xtreme sports" type=mp4 plugin=vimeo
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/411/465/411465389_200.jpg ,Ep1 Mission Antarctic
+http://vimeo.com/58777201
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/394/626/394626022_200.jpg ,Anti trailer White Noise BONUS EDIT
+http://vimeo.com/53933281
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/380/888/380888654_200.jpg ,Paul Guschlbauer - Preparing for Red Bull X-Alps 2013
+http://vimeo.com/55050732
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/391/595/391595527_200.jpg ,2012 recap part 1
+http://vimeo.com/56507323
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/387/063/387063593_200.jpg ,BrOADER TV ep.162: Andrej Marincic's Baywatch
+http://vimeo.com/55898263
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/383/612/383612338_200.jpg ,Tenerife task2 part2
+http://vimeo.com/55424575
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/374/881/374881166_200.jpg ,WHITE NOISE - FULL Movie
+http://vimeo.com/54230904
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/365/751/365751138_200.jpg ,WHITE NOISE teaser
+http://vimeo.com/52428312
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/366/278/366278651_200.jpg ,BrOADER TV ep.161: 45-Degrees on Stubai
+http://vimeo.com/52956613
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/337/460/337460085_200.jpg ,Dark Summer
+http://vimeo.com/48921089
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/349/151/349151990_200.jpg ,BrOADER TV ep.160: MOREBOARDS Stubai Premiere 2012
+http://vimeo.com/50637434
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/238/099/238099087_200.jpg ,Pedal-Driven: The Official Trailer
+http://vimeo.com/15471635
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/345/209/345209185_200.jpg ,Book of the mountains - Trailer
+http://vimeo.com/50080339
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/343/600/343600640_200.jpg ,BrOADER TV ep.159: MOREBOARDS Stubai Premiere 2012 - OFFICIAL TEASER
+http://vimeo.com/49757679
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/343/599/343599125_200.jpg ,BrOADER TV ep.158: MOREBOARDS Stubai Premiere 2012 - Early Bird Teaser
+http://vimeo.com/49751018
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/341/496/341496476_200.jpg ,b-day & d-bag
+http://vimeo.com/49481574
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/342/693/342693085_200.jpg ,BrOADER TV ep.157: Andrej Marincic
+http://vimeo.com/49667181
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/333/680/333680286_200.jpg ,World Cup Sun Valley task 2 part 2 THE flight or "Reservations for a party at 4 klicks"
+http://vimeo.com/48132894
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/326/176/326176931_200.jpg ,PUSH THE BUTTON OF FUN - Video Competition
+http://vimeo.com/46822625
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/319/514/319514264_200.jpg ,Proximity Flying - Les 2 Alpes - 8m²
+http://vimeo.com/45904787
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/306/611/306611868_200.jpg ,Skaize
+http://vimeo.com/44149928
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/304/289/304289932_200.jpg ,It´sontvinternet presents "FRAMED" official teaser 2012
+http://vimeo.com/43832273
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/287/053/287053838_200.jpg ,"The Gnar Bar" With A Kite Promo
+http://vimeo.com/41446202
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/282/222/282222099_200.jpg ,Rivella Rocket Air 2012 - Highlights
+http://vimeo.com/40738749
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/141/194/141194209_200.jpg ,PROJEKT ROAM: Chasing Gravity-Episode 1
+http://vimeo.com/21899753
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/269/430/269430908_200.jpg ,LIKE A BIRD ON THE BEACH, Donegal - Ireland / 14Ep.
+http://vimeo.com/38531002
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/266/077/266077718_200.jpg ,Adrenalin games 4D 2012 snowboard report
+http://vimeo.com/37850595
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/vimeo_channel_mtb.m3u
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/vimeo_channel_mtb.m3u	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/vimeo_channel_mtb.m3u	(revision 27875)
@@ -0,0 +1,43 @@
+#EXTM3U name="Vimeo MTB Channel" type=mp4 plugin=vimeo
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/406/647/406647447_200.jpg ,Red Bull Four By Three Episode 4
+http://vimeo.com/58591911
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/337/460/337460085_200.jpg ,Dark Summer
+http://vimeo.com/48921089
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/348/539/348539979_200.jpg ,Red Bull Four By Three Trailer
+http://vimeo.com/50557592
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/238/099/238099087_200.jpg ,Pedal-Driven: The Official Trailer
+http://vimeo.com/15471635
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/316/319/316319231_200.jpg ,GT Atherton Launch 2012
+http://vimeo.com/45484023
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/255/422/255422448_200.jpg ,Graham Aggassiz Profile
+http://vimeo.com/37197293
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/247/382/247382238_200.jpg ,Freeride Entertainment Demo Reel KWA Mix
+http://vimeo.com/36102077
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/279/397/2793974_200.jpg ,"BOOTLEG" see the full version http://vimeo.com/5701809
+http://vimeo.com/3383453
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/229/329/229329100_200.jpg ,Specialized Hunter Lone Wolf
+http://vimeo.com/33751891
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/218/502/218502102_200.jpg ,Coming Home - Tobias Woggon
+http://vimeo.com/32306765
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/214/174/214174314_200.jpg ,INTO THIN AIR
+http://vimeo.com/31503776
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/214/061/214061529_200.jpg ,Mad Hatters do Mont Ventoux
+http://vimeo.com/31735101
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/202/130/202130719_200.jpg ,3 Minute Gaps iTunes Release
+http://vimeo.com/30118953
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/198/509/198509283_200.jpg ,Giant Maestro Suspension
+http://vimeo.com/29621679
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/198/183/198183736_200.jpg ,Contour Roam
+http://vimeo.com/29570475
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/184/137/184137955_200.jpg ,TNT Flowtrail
+http://vimeo.com/27694953
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/182/864/182864448_200.jpg ,RICHIE SCHLEY & MANFRED STROMBERG ENJOY THE FASCINATION OF ENDURO RIDING / ROTWILD E1 AT LAGO DI GARDA
+http://vimeo.com/27526405
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/169/633/169633324_200.jpg ,2012 Kona Entourage
+http://vimeo.com/25737439
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/163/184/163184064_200.jpg ,NWD Greatest Hits Trailer
+http://vimeo.com/24788253
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/145/958/145958563_200.jpg ,Vienna Air King 2011
+http://vimeo.com/22562897
+#EXTINF:0 logo=http://b.vimeocdn.com/ts/126/072/126072299_200.jpg ,Lettenbach on 29 inch
+http://vimeo.com/19826777
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/youtube_channel_top_rated.m3u
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/youtube_channel_top_rated.m3u	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/playlists/youtube_channel_top_rated.m3u	(revision 27875)
@@ -0,0 +1,201 @@
+#EXTM3U name="YouTube Top Rated" type=mp4 plugin=youtube
+#EXTINF:0 logo=http://i.ytimg.com/vi/dMH0bHeiRNg/0.jpg ,Evolution of Dance - By Judson Laipply
+http://www.youtube.com/watch?v=dMH0bHeiRNg&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/kXYiU_JCYtU/0.jpg ,Linkin Park - Numb
+http://www.youtube.com/watch?v=kXYiU_JCYtU&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/Tx1XIm6q4r4/0.jpg ,Potter Puppet Pals: The Mysterious Ticking Noise
+http://www.youtube.com/watch?v=Tx1XIm6q4r4&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/EwTZ2xpQwpA/0.jpg ,"Chocolate Rain" Original Song by Tay Zonday
+http://www.youtube.com/watch?v=EwTZ2xpQwpA&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/_OBlgSz8sSM/0.jpg ,Charlie bit my finger - again !
+http://www.youtube.com/watch?v=_OBlgSz8sSM&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/Qit3ALTelOo/0.jpg ,The Mean Kitty Song
+http://www.youtube.com/watch?v=Qit3ALTelOo&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/1uwOL4rB-go/0.jpg ,Jeff Dunham - Achmed the Dead Terrorist
+http://www.youtube.com/watch?v=1uwOL4rB-go&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/EkHTsc9PU2A/0.jpg ,Jason Mraz - I'm Yours (Live On Earth Single Video)
+http://www.youtube.com/watch?v=EkHTsc9PU2A&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/4pXfHLUlZf4/0.jpg ,Jizz In My Pants
+http://www.youtube.com/watch?v=4pXfHLUlZf4&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/NisCkxU544c/0.jpg ,Like A Boss (ft. Seth Rogen) - Uncensored Version
+http://www.youtube.com/watch?v=NisCkxU544c&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/ysSxxIqKNN0/0.jpg ,Linkin Park - "New Divide"
+http://www.youtube.com/watch?v=ysSxxIqKNN0&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/VuNIsY6JdUw/0.jpg ,Taylor Swift - You Belong With Me
+http://www.youtube.com/watch?v=VuNIsY6JdUw&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/hTWKbfoikeg/0.jpg ,Nirvana - Smells Like Teen Spirit
+http://www.youtube.com/watch?v=hTWKbfoikeg&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/1wYNFfgrXTI/0.jpg ,Eminem - When I'm Gone
+http://www.youtube.com/watch?v=1wYNFfgrXTI&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/M11SvDtPBhA/0.jpg ,Miley Cyrus - Party In The U.S.A.
+http://www.youtube.com/watch?v=M11SvDtPBhA&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/CSvFpBOe8eY/0.jpg ,System Of A Down - Chop Suey!
+http://www.youtube.com/watch?v=CSvFpBOe8eY&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/0UjsXo9l6I8/0.jpg ,"Empire State of Mind" Jay Z | Alicia Keys [OFFICIAL VIDEO]
+http://www.youtube.com/watch?v=0UjsXo9l6I8&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/qrO4YZeyl0I/0.jpg ,Lady Gaga - Bad Romance
+http://www.youtube.com/watch?v=qrO4YZeyl0I&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/CHVhwcOg6y8/0.jpg ,Justin Bieber - One Time
+http://www.youtube.com/watch?v=CHVhwcOg6y8&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/lgT1AidzRWM/0.jpg ,Eminem - Beautiful
+http://www.youtube.com/watch?v=lgT1AidzRWM&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/8SbUC-UaAxE/0.jpg ,Guns N' Roses - November Rain
+http://www.youtube.com/watch?v=8SbUC-UaAxE&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/Glny4jSciVI/0.jpg ,We Are The World 25 For Haiti - Official Video
+http://www.youtube.com/watch?v=Glny4jSciVI&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/kffacxfA7G4/0.jpg ,Justin Bieber - Baby ft. Ludacris
+http://www.youtube.com/watch?v=kffacxfA7G4&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/8aRor905cCw/0.jpg ,Travie McCoy: Billionaire ft. Bruno Mars [OFFICIAL VIDEO]
+http://www.youtube.com/watch?v=8aRor905cCw&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/_Z5-P9v3F8w/0.jpg ,Justin Bieber - Never Say Never ft. Jaden Smith
+http://www.youtube.com/watch?v=_Z5-P9v3F8w&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/pRpeEdMmmQ0/0.jpg ,Waka Waka (This Time for Africa) (The Official 2010 FIFA ...
+http://www.youtube.com/watch?v=pRpeEdMmmQ0&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/j5-yKhDd64s/0.jpg ,Eminem - Not Afraid
+http://www.youtube.com/watch?v=j5-yKhDd64s&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/SOI4OF7iIr4/0.jpg ,Justin Bieber - Somebody To Love Remix ft. Usher
+http://www.youtube.com/watch?v=SOI4OF7iIr4&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/kn6-c223DUU/0.jpg ,B.o.B - Airplanes ft. Hayley Williams of Paramore [OFFICIAL VIDEO]
+http://www.youtube.com/watch?v=kn6-c223DUU&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/hMtZfW2z9dw/0.jpg ,BED INTRUDER SONG!!! (now on iTunes)
+http://www.youtube.com/watch?v=hMtZfW2z9dw&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/uelHwf8o7_U/0.jpg ,Eminem - Love The Way You Lie ft. Rihanna
+http://www.youtube.com/watch?v=uelHwf8o7_U&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/7zp1TbLFPp8/0.jpg ,Don Omar - Danza Kuduro ft. Lucenzo
+http://www.youtube.com/watch?v=7zp1TbLFPp8&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/LjhCEhWiKXk/0.jpg ,Bruno Mars - Just The Way You Are [OFFICIAL VIDEO]
+http://www.youtube.com/watch?v=LjhCEhWiKXk&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/8v_4O44sfjM/0.jpg ,Christina Perri - Jar of Hearts (Official Music Video)
+http://www.youtube.com/watch?v=8v_4O44sfjM&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/N6O2ncUKvlg/0.jpg ,Nelly - Just A Dream
+http://www.youtube.com/watch?v=N6O2ncUKvlg&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/KV2ssT8lzj8/0.jpg ,Eminem - No Love (Explicit Version) ft. Lil Wayne
+http://www.youtube.com/watch?v=KV2ssT8lzj8&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/UePtoxDhJSw/0.jpg ,Wiz Khalifa - Black And Yellow [Official Music Video]
+http://www.youtube.com/watch?v=UePtoxDhJSw&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/pa14VNsdSYM/0.jpg ,Rihanna - Only Girl (In The World)
+http://www.youtube.com/watch?v=pa14VNsdSYM&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/WSeNSzJ2-Jw/0.jpg ,SKRILLEX - Scary Monsters And Nice Sprites
+http://www.youtube.com/watch?v=WSeNSzJ2-Jw&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/QGJuMBdaqIw/0.jpg ,Katy Perry - Firework
+http://www.youtube.com/watch?v=QGJuMBdaqIw&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/U0CGsw6h60k/0.jpg ,Rihanna - What's My Name? ft. Drake
+http://www.youtube.com/watch?v=U0CGsw6h60k&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/a2RA0vsZXf8/0.jpg ,"Just A Dream" by Nelly - Sam Tsui & Christina Grimmie
+http://www.youtube.com/watch?v=a2RA0vsZXf8&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/SR6iYWJxHqs/0.jpg ,Bruno Mars - Grenade [OFFICIAL VIDEO]
+http://www.youtube.com/watch?v=SR6iYWJxHqs&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/JwQZQygg3Lk/0.jpg ,The Black Eyed Peas - The Time (Dirty Bit)
+http://www.youtube.com/watch?v=JwQZQygg3Lk&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/lAhHNCfA7NI/0.jpg ,Alexandra Stan - Mr Saxobeat (Official Video)
+http://www.youtube.com/watch?v=lAhHNCfA7NI&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/o9tJW9MDs2M/0.jpg ,Justin Bieber - Pray
+http://www.youtube.com/watch?v=o9tJW9MDs2M&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/rYEDA3JcQqw/0.jpg ,Adele - Rolling In The Deep
+http://www.youtube.com/watch?v=rYEDA3JcQqw&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/lQlIhraqL7o/0.jpg ,I Just Had Sex (feat. Akon)
+http://www.youtube.com/watch?v=lQlIhraqL7o&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/tQmEd_UeeIk/0.jpg ,Avril Lavigne - What The Hell
+http://www.youtube.com/watch?v=tQmEd_UeeIk&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/qMxX-QOV9tI/0.jpg ,Jessie J - Price Tag ft. B.o.B.
+http://www.youtube.com/watch?v=qMxX-QOV9tI&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/SDTZ7iX4vTQ/0.jpg ,Foster The People - Pumped Up Kicks
+http://www.youtube.com/watch?v=SDTZ7iX4vTQ&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/qemWRToNYJY/0.jpg ,Adele performing Someone Like You | BRIT Awards 2011
+http://www.youtube.com/watch?v=qemWRToNYJY&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/xG0wi1m-89o/0.jpg ,Maria Aragon - Born This Way (Cover) by Lady Gaga
+http://www.youtube.com/watch?v=xG0wi1m-89o&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/FlsBObg-1BQ/0.jpg ,Adele - Set Fire to the Rain Lyrics
+http://www.youtube.com/watch?v=FlsBObg-1BQ&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/VA770wpLX-Q/0.jpg ,Dr. Dre - I Need A Doctor (Explicit) ft. Eminem, Skylar Grey
+http://www.youtube.com/watch?v=VA770wpLX-Q&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/k2rDbRUDkds/0.jpg ,"TNT" - A Minecraft Parody of Taio Cruz's Dynamite - Crafted Using Note Blocks
+http://www.youtube.com/watch?v=k2rDbRUDkds&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/wV1FrqwZyKw/0.jpg ,Lady Gaga - Born This Way
+http://www.youtube.com/watch?v=wV1FrqwZyKw&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/t4H_Zoh7G5A/0.jpg ,Jennifer Lopez - On The Floor ft. Pitbull
+http://www.youtube.com/watch?v=t4H_Zoh7G5A&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/BzE1mX4Px0I/0.jpg ,Selena Gomez & The Scene - Who Says
+http://www.youtube.com/watch?v=BzE1mX4Px0I&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/KQ6zr6kCPj8/0.jpg ,LMFAO - Party Rock Anthem ft. Lauren Bennett, GoonRock
+http://www.youtube.com/watch?v=KQ6zr6kCPj8&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/8gyLR4NfMiI/0.jpg ,Chris Brown - Look At Me Now ft. Lil Wayne, Busta Rhymes
+http://www.youtube.com/watch?v=8gyLR4NfMiI&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/OrTyD7rjBpw/0.jpg ,The Black Eyed Peas - Just Can't Get Enough
+http://www.youtube.com/watch?v=OrTyD7rjBpw&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/zzfQwXEqYaI/0.jpg ,Rebecca Black "Friday" (Brock's Dub)
+http://www.youtube.com/watch?v=zzfQwXEqYaI&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/t5Sd5c4o9UM/0.jpg ,Katy Perry - E.T. ft. Kanye West
+http://www.youtube.com/watch?v=t5Sd5c4o9UM&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/QH2-TGUlwu4/0.jpg ,Nyan Cat [original]
+http://www.youtube.com/watch?v=QH2-TGUlwu4&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/khCokQt--l4/0.jpg ,Look At Me Now - Chris Brown ft. Lil Wayne, Busta Rhymes (Cover by @KarminMusic)
+http://www.youtube.com/watch?v=khCokQt--l4&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/fLexgOxsZu0/0.jpg ,Bruno Mars - The Lazy Song [OFFICIAL VIDEO]
+http://www.youtube.com/watch?v=fLexgOxsZu0&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/nGeKSiCQkPw/0.jpg ,Ultimate Dog Tease
+http://www.youtube.com/watch?v=nGeKSiCQkPw&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/wagn8Wrmzuc/0.jpg ,Lady Gaga - Judas
+http://www.youtube.com/watch?v=wagn8Wrmzuc&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/4JipHEz53sU/0.jpg ,Nicki Minaj - Super Bass
+http://www.youtube.com/watch?v=4JipHEz53sU&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/EPo5wWmKEaI/0.jpg ,Pitbull - Give Me Everything ft. Ne-Yo, Afrojack, Nayer
+http://www.youtube.com/watch?v=EPo5wWmKEaI&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/GI6CfKcMhjY/0.jpg ,Jack Sparrow (feat. Michael Bolton)
+http://www.youtube.com/watch?v=GI6CfKcMhjY&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/VBmMU_iwe6U/0.jpg ,Beyoncé - Run The World (Girls)
+http://www.youtube.com/watch?v=VBmMU_iwe6U&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/xfeys7Jfnx8/0.jpg ,Nice Guys
+http://www.youtube.com/watch?v=xfeys7Jfnx8&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/sEhy-RXkNo0/0.jpg ,Rihanna - Man Down
+http://www.youtube.com/watch?v=sEhy-RXkNo0&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/KlyXNRrsk4A/0.jpg ,Katy Perry - Last Friday Night (T.G.I.F.)
+http://www.youtube.com/watch?v=KlyXNRrsk4A&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/tZ46Ot4_lLo/0.jpg ,Homeless Boy Steals The Talent Show
+http://www.youtube.com/watch?v=tZ46Ot4_lLo&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/EEuQU6a90Pc/0.jpg ,Chris Brown - Next To You ft. Justin Bieber
+http://www.youtube.com/watch?v=EEuQU6a90Pc&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/T-sxSd1uwoU/0.jpg ,Britney Spears - I Wanna Go
+http://www.youtube.com/watch?v=T-sxSd1uwoU&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/EgT_us6AsDg/0.jpg ,Selena Gomez & The Scene - Love You Like A Love Song
+http://www.youtube.com/watch?v=EgT_us6AsDg&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/JByDbPn6A1o/0.jpg ,Eminem - Space Bound
+http://www.youtube.com/watch?v=JByDbPn6A1o&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/p4kVWCSzfK4/0.jpg ,David Guetta - Where Them Girls At ft. Nicki Minaj, Flo Rida
+http://www.youtube.com/watch?v=p4kVWCSzfK4&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/8UVNT4wvIGY/0.jpg ,Gotye - Somebody That I Used To Know (feat. Kimbra) - official video
+http://www.youtube.com/watch?v=8UVNT4wvIGY&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/r_8ydghbGSg/0.jpg ,Demi Lovato - Skyscraper
+http://www.youtube.com/watch?v=r_8ydghbGSg&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/2OxWD85Ngz4/0.jpg ,Rebecca Black - My Moment - Official Music Video
+http://www.youtube.com/watch?v=2OxWD85Ngz4&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/SmM0653YvXU/0.jpg ,Pitbull - Rain Over Me ft. Marc Anthony
+http://www.youtube.com/watch?v=SmM0653YvXU&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/hcm55lU9knw/0.jpg ,Michel Teló - Ai Se Eu Te Pego - Oficial (Assim você me mata)
+http://www.youtube.com/watch?v=hcm55lU9knw&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/iEPTlhBmwRg/0.jpg ,Maroon 5 - Moves Like Jagger ft. Christina Aguilera
+http://www.youtube.com/watch?v=iEPTlhBmwRg&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/T3E9Wjbq44E/0.jpg ,Gym Class Heroes: Stereo Hearts ft. Adam Levine [OFFICIAL VIDEO]
+http://www.youtube.com/watch?v=T3E9Wjbq44E&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/2cXDgFwE13g/0.jpg ,First Of The Year (Equinox) - Skrillex [OFFICIAL]
+http://www.youtube.com/watch?v=2cXDgFwE13g&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/QJO3ROT-A4E/0.jpg ,One Direction - What Makes You Beautiful
+http://www.youtube.com/watch?v=QJO3ROT-A4E&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/cPJUBQd-PNM/0.jpg ,"Revenge" - A Minecraft Parody of Usher's DJ Got Us Fallin' in Love - Crafted Using Noteblocks
+http://www.youtube.com/watch?v=cPJUBQd-PNM&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/VT1-sitWRtY/0.jpg ,Avril Lavigne - Wish You Were Here
+http://www.youtube.com/watch?v=VT1-sitWRtY&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/LXO-jKksQkM/0.jpg ,PUMPED UP KICKS|DUBSTEP
+http://www.youtube.com/watch?v=LXO-jKksQkM&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/hLQl3WQQoQ0/0.jpg ,Adele - Someone Like You
+http://www.youtube.com/watch?v=hLQl3WQQoQ0&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/jUe8uoKdHao/0.jpg ,David Guetta - Without You ft. Usher
+http://www.youtube.com/watch?v=jUe8uoKdHao&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/LUjn3RpkcKY/0.jpg ,Justin Bieber - Mistletoe
+http://www.youtube.com/watch?v=LUjn3RpkcKY&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/1G4isv_Fylg/0.jpg ,Coldplay - Paradise
+http://www.youtube.com/watch?v=1G4isv_Fylg&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/tg00YEETFzg/0.jpg ,Rihanna - We Found Love ft. Calvin Harris
+http://www.youtube.com/watch?v=tg00YEETFzg&feature=youtube_gdata
+#EXTINF:0 logo=http://i.ytimg.com/vi/3OnnDqH6Wj8/0.jpg ,Flo Rida - Good Feeling [Official Video]
+http://www.youtube.com/watch?v=3OnnDqH6Wj8&feature=youtube_gdata
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/skel/skel.lua
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/skel/skel.lua	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/skel/skel.lua	(revision 27875)
@@ -0,0 +1,40 @@
+-- Copyright (C) 2011-2013 Anton Burdinuk
+-- clark15b@gmail.com
+-- https://tsdemuxer.googlecode.com/svn/trunk/xupnpd
+
+-- skeleton
+
+cfg.skel_option1=123
+cfg.skel_option2='test'
+
+function skel_updatefeed(feed,friendly_name)
+    return true
+end
+
+function skel_sendurl(url,range)
+end
+
+plugins['skel']={}
+plugins.skel.disabled=true      -- comment for enable
+plugins.skel.name="Skeleton"
+plugins.skel.desc="Skeleton description for UI"
+plugins.skel.sendurl=skel_sendurl
+plugins.skel.updatefeed=skel_updatefeed
+
+plugins.skel.ui_config_vars=
+{
+    { "input",  "skel_option1", "int" },
+    { "select", "skel_option2" }
+}
+
+plugins.skel.ui_actons=
+{
+    ['skel_ui']      = { 'xupnpd - skeleton ui action', skel_ui_action }        -- 'http://127.0.0.1:4044/ui/skel_ui' for call
+}
+
+-- now you can use ${skel_option1} and ${skel_option3} in UI HTML tamplates
+plugins.skel.ui_vars=
+{
+    { "skel_option1", cfg.skel_option1 },
+    { "skel_option3", function() return 'value' end }
+}
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/staff/xupnpd_18plus.lua
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/staff/xupnpd_18plus.lua	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/staff/xupnpd_18plus.lua	(revision 27875)
@@ -0,0 +1,136 @@
+-- ******************************
+-- Attention!!! Adult only      *
+-- 18+                          *
+-- ******************************
+
+cfg.user_age=0
+cfg.youporn_max_pages=3
+
+youporn_category=
+{
+    ['top_rated']='/top_rated/', ['most_viewed']='/most_viewed/', ['amateur']='/category/1/amateur/', ['anal']='/category/2/anal/',
+    ['asian']='/category/3/asian/', ['bbw']='/category/4/bbw/', ['big_butt']='/category/6/big-butt/', ['big_tits']='/category/7/big-tits/',
+    ['bisexual']='/category/5/bisexual/', ['blonde']='/category/51/blonde/', ['blowjob']='/category/9/blowjob/',
+    ['brunette']='/category/52/brunette/', ['coed']='/category/10/coed/', ['compilation']='/category/11/compilation/',
+    ['couples']='/category/12/couples/', ['creampie']='/category/13/creampie/', ['cumshots']='/category/37/cumshots/',
+    ['cunnilingus']='/category/15/cunnilingus/', ['dp']='/category/16/dp/', ['ebony']='/category/8/ebony/',
+    ['european']='/category/48/european/', ['facial']='/category/17/facial/', ['fantasy']='/category/42/fantasy/',
+    ['fetish']='/category/18/fetish/', ['fingering']='/category/62/fingering/', ['funny']='/category/19/funny/',
+    ['gay']='/category/20/gay/', ['german']='/category/58/german/', ['gonzo']='/category/50/gonzo/',
+    ['group_sex']='/category/21/group-sex/', ['hairy']='/category/46/hairy/', ['handjob']='/category/22/handjob/',
+    ['hentai']='/category/23/hentai/', ['instructional']='/category/24/instructional/', ['interracial']='/category/25/interracial/',
+    ['interview']='/category/41/interview/', ['kissing']='/category/40/kissing/', ['latina']='/category/49/latina/',
+    ['lesbian']='/category/26/lesbian/', ['milf']='/category/29/milf/', ['masturbate']='/category/55/masturbate/',
+    ['mature']='/category/28/mature/', ['pov']='/category/36/pov/', ['panties']='/category/56/panties/',
+    ['pantyhose']='/category/57/pantyhose/', ['public']='/category/30/public/', ['redhead']='/category/53/redhead/',
+    ['rimming']='/category/43/rimming/', ['romantic']='/category/61/romantic/', ['shaved']='/category/54/shaved/',
+    ['shemale']='/category/31/shemale/', ['solo_male']='/category/60/solo-male/', ['solo_girl']='/category/27/solo-girl/',
+    ['squirting']='/category/39/squirting/', ['strt_sex']='/category/47/strt-sex/', ['swallow']='/category/59/swallow/',
+    ['teen']='/category/32/teen/', ['threesome']='/category/38/threesome/', ['vintage']='/category/33/vintage/',
+    ['voyeur']='/category/34/voyeur/', ['webcam']='/category/35/webcam/', ['3d']='/category/63/3d/'
+}
+
+function youporn_updatefeed(feed,friendly_name)
+    local rc=false
+
+    local ff=youporn_category[feed]
+
+    if not ff then return false end
+
+    local feed_name='youporn_'..string.gsub(feed,'/','_')
+    local feed_m3u_path=cfg.feeds_path..feed_name..'.m3u'
+    local tmp_m3u_path=cfg.tmp_path..feed_name..'.m3u'
+    local feed_url='http://www.youporn.com'..ff..'?'
+
+    local dfd=io.open(tmp_m3u_path,'w+')
+
+    if dfd then
+        dfd:write('#EXTM3U name=\"',friendly_name or feed_name,'\" type=mp4 plugin=youporn\n')
+
+        local page=1
+
+        while(page<=cfg.youporn_max_pages) do
+            local url=feed_url..'&page='..page
+
+            if cfg.debug>0 then print('YouPorn try url '..url) end
+
+            local feed_data=http.download(url)
+
+            if feed_data then
+                local n=0
+
+                for urn,logo,name in string.gmatch(feed_data,'.-<a href="(/watch/.-)">%s*<img src="(.-)" alt="(.-)".-') do
+                    local m=string.find(urn,'?',1,true)
+                    if m then urn=urn:sub(1,m-1) end
+
+                    dfd:write('#EXTINF:0 logo=',logo,' ,',name,'\n','http://www.youporn.com',urn,'\n')
+                    n=n+1
+                end                 
+
+                if n<1 then page=cfg.youporn_max_pages end
+
+                feed_data=nil
+            end
+
+            page=page+1
+        end
+
+        dfd:close()
+
+        if util.md5(tmp_m3u_path)~=util.md5(feed_m3u_path) then
+            if os.execute(string.format('mv %s %s',tmp_m3u_path,feed_m3u_path))==0 then
+                if cfg.debug>0 then print('YouPorn feed \''..feed_name..'\' updated') end
+                rc=true
+            end
+        else
+            util.unlink(tmp_m3u_path)
+        end
+    end
+
+    return rc
+end
+
+function youporn_sendurl(youporn_url,range)
+
+    local url=nil
+
+    if plugin_sendurl_from_cache(youporn_url,range) then return end
+
+    local clip_page=http.download(youporn_url)
+    if clip_page then
+        url=string.match(clip_page,'.+<a href="(http://.-)">MP4 %- For Windows 7, Mac and iPad</a>.+')
+        clip_page=nil
+
+        if url then url=string.gsub(url,'&amp;','&') end
+
+    else
+        if cfg.debug>0 then print('Clip is not found') end
+    end
+
+    if url then
+        if cfg.debug>0 then print('Real URL: '..url) end
+
+        plugin_sendurl(youporn_url,url,range)
+    else
+        if cfg.debug>0 then print('Real URL is not found') end
+
+        plugin_sendfile('www/corrupted.mp4')
+    end
+end
+
+plugins['youporn']={}
+plugins.youporn.disabled=true
+plugins.youporn.name="YouPorn"
+plugins.youporn.sendurl=youporn_sendurl
+plugins.youporn.updatefeed=youporn_updatefeed
+
+function youporn_desc()
+    local t={}
+    for i,j in pairs(youporn_category) do
+        t[table.maxn(t)+1]=i
+    end
+    return table.concat(t,',')
+end
+
+plugins.youporn.desc=youporn_desc()
+if cfg.user_age<18 then plugins.youporn.disabled=true end
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/staff/xupnpd_ex.lua
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/staff/xupnpd_ex.lua	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/staff/xupnpd_ex.lua	(revision 27875)
@@ -0,0 +1,89 @@
+-- Copyright (C) 2012 
+--- Uses PARAMETER of [url]http://www.ex.ua/view/PARAMETER?r=23775[/url] on [url]http://www.ex.ua/ru/video[/url]
+-- <guid isPermaLink="false">PARAMETER</guid> on [url]http://www.ex.ua/rss/23775[/url]
+--
+-- 23775   - ВИДЕО (раздел)
+-- 70538   - НАШЕ  (подраздел)
+-- v=1,0   - показывать списком, новое вначале
+-- p=1     - страница 2
+-- per=100 - 100 позиций на странице
+-- [url]http://www.ex.ua/view/70538?r=23775&v=1,0&per=100&p=1[/url]
+--
+-- config example
+-- feeds = 
+-- {
+--     { "ex", "2", "Зарубежное" },
+--     { "ex", "70538", "Наше" },
+-- }
+-- pages num from 0
+cfg.ex_max_pages=10
+cfg.debug=1
+
+function ex_updatefeed(feed,friendly_name)
+local rc=false
+local feed_url='http://www.ex.ua/view/'..feed..'?r=23775&v=1,0&per=100'
+local feed_name='ex_'..string.gsub(feed,'/','_')
+local feed_m3u_path=cfg.feeds_path..feed_name..'.m3u'
+local tmp_m3u_path=cfg.tmp_path..feed_name..'.m3u'
+local page=0
+local scroll=true
+if feed_url then
+  local dfd=io.open(tmp_m3u_path,'w+')
+    if dfd then
+      dfd:write('#EXTM3U name=\"',friendly_name or feed_name,'\" plugin=ex\n')
+     --dfd:write('#EXTM3U name=\"',friendly_name or feed_name,'\" plugin=generic dlna_extras=mp4_avc_sd_ac3\n')
+     --dfd:write('#EXTM3U name=\"',friendly_name or feed_name,'\" type=mp4 plugin=ex\n')
+local page=0
+    while(page<cfg.ex_max_pages) do
+    local url=feed_url..'&p='..page
+    if cfg.debug>0 then print('EX.UA try url '..url) end
+    local feed_data
+    feed_data=http.download(url)
+    if feed_data then
+      for urn1,urn2,logo,name in string.gmatch(feed_data,'<tr><td><a href=\'/view/(.-)\?r=(.-)\'><img src=\'(.-)\' width=.-alt=\'(.-)\'>') do
+          local chapter=1
+          local url_spec='http://www.ex.ua/playlist/'..urn1..'.m3u'
+          local feed_data_spec=http.download(url_spec)
+          if feed_data_spec then
+            for urs in string.gmatch(feed_data_spec,'http://www.ex.ua/get/(%d*)') do
+          --dfd:write('#EXTINF:0 logo=',logo,' ,',name,' (chapter-',chapter,')','\n','http://www.ex.ua/get/',urs,'\n')
+            dfd:write('#EXTINF:0 ,',name,' (chapter-',chapter,')','\n','http://www.ex.ua/get/',urs,'\n')
+              if cfg.debug>0 then print('EX.UA find urs '..urs..' name '..name) end
+           chapter=chapter+1
+                  end
+          end
+          feed_data_spec=nil                                                                                                                                                                                                                                                                                                             end
+          feed_data=nil
+       end
+          page=page+1
+      end
+dfd:close()
+  if util.md5(tmp_m3u_path)~=util.md5(feed_m3u_path) then
+     if os.execute(string.format('mv %s %s',tmp_m3u_path,feed_m3u_path))==0 then
+       if cfg.debug>0 then print('EX.UA feed \''..feed_name..'\' updated') end
+         rc=true
+       end
+       else
+       util.unlink(tmp_m3u_path)
+       end
+     end
+  end
+return rc
+end
+
+function ex_sendurl(ex_url,range)
+local rc,location
+location=ex_url
+  for i=1,5,1 do
+    rc,location=http.sendurl(location,1,range)
+    if not location then
+      break
+    else
+    if cfg.debug>0 then print('Redirect #'..i..' to: '..location) end
+    end
+  end
+end
+
+plugins['ex']={}
+plugins.ex.sendurl=ex_sendurl
+plugins.ex.updatefeed=ex_updatefeed
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/staff/xupnpd_mango.lua
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/staff/xupnpd_mango.lua	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/staff/xupnpd_mango.lua	(revision 27875)
@@ -0,0 +1,73 @@
+-- Playlist example
+-- #EXTM3U name="Mango" type=mp4 plugin=mango
+-- #EXTINF:0,Test
+-- http://XX.XX.XX.XX:YYYY/mango_Premium/mp4:oosaravelli_1280.mp4/chunklist.m3u8?wowzasessionid=????????????
+
+
+function mango_updatefeed(feed,friendly_name)
+    return false
+end
+
+-- send '\r\n' before data
+function mango_sendurl(mango_url,range)
+
+    local urls=mango_get_video_urls(mango_url)
+
+    local url_base=get_url_base(mango_url)
+
+    if urls==nil then
+        if cfg.debug>0 then print('mango clip '..mango_id..' is not found') end
+
+        plugin_sendfile('www/corrupted.mp4')
+    else
+
+        for i,url in ipairs(urls) do
+
+            local full_url=url_base..url
+
+            if cfg.debug>0 then print('mango send URL: '..full_url) end
+
+            http.sendurl(full_url)
+        end
+    end
+
+end
+
+function get_url_base(url)
+    local t={}
+    local idx=1
+
+    for s in string.gmatch(url,'(.-/)') do
+        t[idx]=s
+        idx=idx+1
+    end
+
+    return table.concat(t)
+end
+
+function mango_get_video_urls(mango_url)
+
+    local urls={}
+
+    local clip_m3u=plugin_download(mango_url)
+
+    local idx=1
+
+    if clip_m3u then
+        for url in string.gmatch(clip_m3u,"(.-)\r?\n") do
+            if url and url~='' and url:sub(1,1)~='#' then
+                urls[idx]=url
+                idx=idx+1
+            end
+        end
+    end
+
+    return urls
+
+end
+
+plugins['mango']={}
+plugins.mango.name="Mango"
+plugins.mango.desc=""
+plugins.mango.sendurl=mango_sendurl
+plugins.mango.updatefeed=mango_updatefeed
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/staff/xupnpd_minaev.lua
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/staff/xupnpd_minaev.lua	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/staff/xupnpd_minaev.lua	(revision 27875)
@@ -0,0 +1,81 @@
+-- Copyright (C) 2011-2012 Anton Burdinuk
+-- clark15b@gmail.com
+-- https://tsdemuxer.googlecode.com/svn/trunk/xupnpd
+
+-- feed: archive
+function minaev_updatefeed(feed,friendly_name)
+    local rc=false
+
+    local feed_url='http://www.minaevlive.ru/'..feed..'/'
+    local feed_name='minaev_'..string.gsub(feed,'/','_')
+    local feed_m3u_path=cfg.feeds_path..feed_name..'.m3u'
+    local tmp_m3u_path=cfg.tmp_path..feed_name..'.m3u'
+
+    local feed_data=http.download(feed_url)
+
+    if feed_data then
+        local dfd=io.open(tmp_m3u_path,'w+')
+        if dfd then
+            dfd:write('#EXTM3U name=\"',friendly_name or feed_name,'\" type=mp4 plugin=minaev\n')
+
+            local pattern=string.format('<h2>%%s*<a href="(/%s/%%w+/)">(.-)</a>%%s*</h2>',feed)
+
+            for u,name in string.gmatch(feed_data,pattern) do
+                local url=string.format('http://www.minaevlive.ru%s',u)
+                dfd:write('#EXTINF:0,',name,'\n',url,'\n')
+            end
+
+            dfd:close()
+
+            if util.md5(tmp_m3u_path)~=util.md5(feed_m3u_path) then
+                if os.execute(string.format('mv %s %s',tmp_m3u_path,feed_m3u_path))==0 then
+                    if cfg.debug>0 then print('MinaevLive feed \''..feed_name..'\' updated') end
+                    rc=true
+                end
+            else
+                util.unlink(tmp_m3u_path)
+            end
+        end
+
+        feed_data=nil
+    end
+
+    return rc
+end
+
+function minaev_sendurl(minaev_url,range)
+    local url=nil
+
+    if plugin_sendurl_from_cache(minaev_url,range) then return end
+
+    local clip_page=http.download(minaev_url)
+
+    if clip_page then
+--http://media.russia.ru/minaevlive/120/sd.mp4
+--http://media.russia.ru/minaevlive/120/hd720p.mp4
+        local u=string.match(clip_page,'.+<source src="(http://media.russia.ru/minaevlive/%w+/)%w+.mp4.+"')
+
+        if u then
+            url=u..'sd.mp4'
+        end
+    end
+
+    if url then
+        if cfg.debug>0 then print('MinaevLive Real URL: '..url) end
+
+        plugin_sendurl(minaev_url,url,range)
+    else
+        if cfg.debug>0 then print('MinaevLive clip is not found') end
+
+        plugin_sendfile('www/corrupted.mp4')
+    end
+end
+
+plugins['minaev']={}
+plugins.minaev.name="MinaevLive"
+plugins.minaev.desc="archive"
+plugins.minaev.sendurl=minaev_sendurl
+plugins.minaev.updatefeed=minaev_updatefeed
+
+--minaev_updatefeed('archive')
+--minaev_sendurl('http://www.minaevlive.ru/archive/link5bd88f9b/','')
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/staff/xupnpd_orttv.lua
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/staff/xupnpd_orttv.lua	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/staff/xupnpd_orttv.lua	(revision 27875)
@@ -0,0 +1,85 @@
+-- smorygo.philipp at gmail.com
+-- Licensed under GNU GPL version 2 
+-- https://www.gnu.org/licenses/gpl-2.0.html
+
+-- Uses 'si' parameter of http://www.1tv.ru/sprojects/si=5685
+-- config example
+-- feeds = 
+-- {
+--     { "orttv", "5685", "Пусть говорят" },
+-- }
+function orttv_updatefeed(feed,friendly_name)
+    local rc=false
+
+    local feed_url='http://phism.ru/1tv_proxy.php?si='..feed
+    local feed_name='1tv_'..string.gsub(feed,'/','_')
+    local feed_m3u_path=cfg.feeds_path..feed_name..'.m3u'
+    local tmp_m3u_path=cfg.tmp_path..feed_name..'.m3u'
+
+    local feed_data=http.download(feed_url)
+
+    if feed_data then
+        local dfd=io.open(tmp_m3u_path,'w+')
+        if dfd then
+            dfd:write('#EXTM3U name=\"',friendly_name or feed_name,'\" type=mp4 plugin=orttv\n')
+
+            local pattern=string.format('<div class="img"><a href="/sprojects_edition/si=%s&amp;fi=[0-9]-"><img src="(.-)" width.-<h3><a href="(/sprojects_edition/si=%s&amp;fi=[0-9]-)">(.-)</a></h3>',feed,feed)
+	    for logo,u,name in string.gmatch(feed_data,pattern) do
+		local url=string.format('http://www.1tv.ru%s',u)
+		url = url:gsub("&amp;", "&")
+		url = url:gsub("si=", "si")
+		url = url:gsub("&fi=", "/fi")
+		dfd:write('#EXTINF:0 logo=',logo,',',name,'\n',url,'\n')
+            end
+
+            dfd:close()
+
+            if util.md5(tmp_m3u_path)~=util.md5(feed_m3u_path) then
+                if os.execute(string.format('mv %s %s',tmp_m3u_path,feed_m3u_path))==0 then
+                    if cfg.debug>0 then print('1tv.ru feed \''..feed_name..'\' updated') end
+                    rc=true
+                end
+            else
+                util.unlink(tmp_m3u_path)
+            end
+        end
+
+        feed_data=nil
+    end
+
+    return rc
+end
+
+function orttv_sendurl(orttv_url,range)
+    local url=nil
+
+    if plugin_sendurl_from_cache(orttv_url,range) then return end
+
+    local clip_page=http.download(orttv_url)
+
+    if clip_page then
+	local mp4_pattern=string.format("'file': '(.+mp4)'")
+        for file_name in string.gmatch(clip_page,mp4_pattern) do
+		url=file_name
+		break
+	end
+    end
+
+    if url then
+        if cfg.debug>0 then print('1tv.ru Real URL: '..url) end
+
+        plugin_sendurl(orttv_url,url,range)
+    else
+        if cfg.debug>0 then print('1tv.ru clip is not found') end
+
+        plugin_sendfile('www/corrupted.mp4')
+    end
+end
+
+plugins['orttv']={}
+plugins.orttv.name="1tv"
+plugins.orttv.desc="'<b>si</b>' parameter from 1tv.ru url<br/>example: http://www.1tv.ru/sprojects/si=<b>5685</b>"
+plugins.orttv.sendurl=orttv_sendurl
+plugins.orttv.updatefeed=orttv_updatefeed
+
+--orttv_updatefeed("5685")
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/xupnpd_ag.lua
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/xupnpd_ag.lua	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/xupnpd_ag.lua	(revision 27875)
@@ -0,0 +1,110 @@
+-- Copyright (C) 2011-2013 Anton Burdinuk
+-- clark15b@gmail.com
+-- https://tsdemuxer.googlecode.com/svn/trunk/xupnpd
+
+-- 720pd        - 720p 60fps
+-- 720p         - 720p
+-- 400pd        - 400p 60fps
+-- 400p         - 400p
+-- 200p         - 200p
+cfg.ag_fmt='400p'
+
+-- videos, videos/top100pop, videos/top100best, videos/selected_by_ag
+function ag_updatefeed(feed,friendly_name)
+    local rc=false
+
+    local feed_url='http://www.ag.ru/files/'..feed
+    local feed_name='ag_'..string.gsub(feed,'/','_')
+    local feed_m3u_path=cfg.feeds_path..feed_name..'.m3u'
+    local tmp_m3u_path=cfg.tmp_path..feed_name..'.m3u'
+
+    local feed_data=http.download(feed_url)
+
+    if feed_data then
+        local dfd=io.open(tmp_m3u_path,'w+')
+        if dfd then
+            dfd:write('#EXTM3U name=\"',friendly_name or feed_name,'\" type=mp4 plugin=ag\n')
+
+            for game,id,name in string.gmatch(feed_data,'href=/games/([%w_%-]+)/videos#([%w_%-]+)>(.-)</a>') do
+                local url=string.format('http://www.ag.ru/games/%s/videos/%s/',game,id)
+                dfd:write('#EXTINF:0,',util.win1251toUTF8(name),'\n',url,'\n')
+            end
+
+            dfd:close()
+
+            if util.md5(tmp_m3u_path)~=util.md5(feed_m3u_path) then
+                if os.execute(string.format('mv %s %s',tmp_m3u_path,feed_m3u_path))==0 then
+                    if cfg.debug>0 then print('AG feed \''..feed_name..'\' updated') end
+                    rc=true
+                end
+            else
+                util.unlink(tmp_m3u_path)
+            end
+        end
+
+        feed_data=nil
+    end
+
+    return rc
+end
+
+function ag_sendurl(ag_url,range)
+
+    local url=nil
+
+    if plugin_sendurl_from_cache(ag_url,range) then return end
+
+    local clip_page=plugin_download(ag_url)
+
+    if clip_page then
+        local playlist_id=string.match(clip_page,'/playlist/(%w+)%.json')
+        clip_page=nil
+
+        if playlist_id then
+
+            clip_page=plugin_download(string.format('http://www.ag.ru/playlist/%s.json',playlist_id))
+
+            if clip_page then
+                local o=json.decode(clip_page)
+                clip_page=nil
+
+                local url_200p=nil
+
+                if o and o['resolutionswitcherplugin.streams'] then
+                    for i,j in ipairs(o['resolutionswitcherplugin.streams']) do
+                        if j.id==cfg.ag_fmt then url=j.file break elseif j.id=='200p' then url_200p=j.file end
+                    end
+                end
+
+                if not url then url=url_200p end
+
+            end
+        end
+    else
+        if cfg.debug>0 then print('AG clip is not found') end
+    end
+
+    if url then
+        if cfg.debug>0 then print('AG Real URL: '..url) end
+
+        plugin_sendurl(ag_url,url,range)
+    else
+        if cfg.debug>0 then print('AG Real URL is not found') end
+
+        plugin_sendfile('www/corrupted.mp4')
+    end
+end
+
+plugins['ag']={}
+plugins.ag.name="AG.ru"
+plugins.ag.desc="<i>channel</i>"..
+"<br/><b>AG.ru channels</b>: videos, videos/top100pop, videos/top100best, videos/selected_by_ag"
+plugins.ag.sendurl=ag_sendurl
+plugins.ag.updatefeed=ag_updatefeed
+
+plugins.ag.ui_config_vars=
+{
+    { "select", "ag_fmt" },
+}
+
+--ag_updatefeed('videos')
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/xupnpd_arjlover.lua
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/xupnpd_arjlover.lua	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/xupnpd_arjlover.lua	(revision 27875)
@@ -0,0 +1,67 @@
+-- Copyright (C) 2011-2013 Anton Burdinuk
+-- clark15b@gmail.com
+-- https://tsdemuxer.googlecode.com/svn/trunk/xupnpd
+
+-- multiki, film, filmiki
+function arjlover_updatefeed(feed,friendly_name)
+    local rc=false
+
+    local feed_url=string.format('http://%s.arjlover.net/%s/',feed,feed)
+    local feed_name='arjlover_'..string.gsub(feed,'/','_')
+    local feed_m3u_path=cfg.feeds_path..feed_name..'.m3u'
+    local tmp_m3u_path=cfg.tmp_path..feed_name..'.m3u'
+
+    local feed_data=http.download(feed_url)
+
+    if feed_data then
+        local dfd=io.open(tmp_m3u_path,'w+')
+        if dfd then
+            dfd:write('#EXTM3U name=\"',friendly_name or feed_name,'\" type=avi plugin=arjlover\n')
+
+            local base=string.format('http://%s.arjlover.net',feed)
+            local pattern=string.format('<td.-href="/info/.-.html" >(.-)</a></td>.-<td><a href="(/%s/.-)"',feed)
+
+            for name,url in string.gmatch(feed_data,pattern) do
+                local t='' if string.find(url,'%.mpg$') then t=' type=mpeg' end
+                dfd:write('#EXTINF:0',t,',',util.win1251toUTF8(name),'\n',base,url,'\n')
+            end
+
+            dfd:close()
+
+            if util.md5(tmp_m3u_path)~=util.md5(feed_m3u_path) then
+                if os.execute(string.format('mv %s %s',tmp_m3u_path,feed_m3u_path))==0 then
+                    if cfg.debug>0 then print('arjlover feed \''..feed_name..'\' updated') end
+                    rc=true
+                end
+            else
+                util.unlink(tmp_m3u_path)
+            end
+        end
+
+        feed_data=nil
+    end
+
+    return rc
+end
+
+function arjlover_strip_url(url)
+    local n=string.find(url,'#')
+    if not n then return url end
+    return string.sub(url,0,n-1)
+end
+
+function arjlover_sendurl(arjlover_url,range)
+    if plugin_sendurl_from_cache(arjlover_url,range) then return end
+
+    plugin_sendurl(arjlover_url,arjlover_url,range)
+end
+
+plugins['arjlover']={}
+plugins.arjlover.name="arjlover.net"
+plugins.arjlover.desc="multiki, film, filmiki"
+plugins.arjlover.sendurl=arjlover_sendurl
+plugins.arjlover.updatefeed=arjlover_updatefeed
+
+--arjlover_updatefeed('multiki')
+--arjlover_updatefeed('film')
+--arjlover_updatefeed('filmiki')
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/xupnpd_dreambox.lua
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/xupnpd_dreambox.lua	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/xupnpd_dreambox.lua	(revision 27875)
@@ -0,0 +1,247 @@
+-- Plugin for converting channels lists from DVB receivers based on Enigma2
+-- Copyright (C) 2012 Igor Drach
+-- leaigor@gmail.com
+
+
+function dreambox_url_encode(str)
+  if (str) then
+    str = string.gsub (str, " ", "%%20")
+    str = string.gsub (str, "\"", "%%22")
+  end
+  return str
+end
+
+function xml_to_tables(file,label,started)
+--    print("label=",label)
+    local xmltable={}
+    repeat
+	local string=file:read()
+	if string then
+--	    print("string="..string)
+	    local n,m,i,field,j=string.find(string,"<(%w+)>(.*)<%/(%w+)>")
+--	    print(i,field,j)
+	    if i==j and field and started then
+--		print("add to table",i,field)
+--		table.insert(xmltable,{i,field})
+		xmltable[i]=field
+--		table.insert(xmltable,{"value",{i,field}})
+	    else
+		local i,j,field=string.find(string,"<(%w+)>")
+--		print(field)
+		if field then
+		    if  started or not label then
+--		    print("start "..field)
+--			local insertedtable=xml_to_tables(file,field,true)
+--			print("insertedtable=",insertedtable)
+			local insertedvalue={}
+			insertedvalue[field]=xml_to_tables(file,field,true)
+			table.insert(xmltable,insertedvalue)
+		    elseif label==field then
+			label=field
+			started=true
+		    end
+		else
+		    local i,j,field=string.find(string,"<%/(%w+)>")
+		    if field==label and field  then
+--		    print("close "..field)
+--			print("table=",xmltable)
+--			dreambox_table_print(xmltable)
+			return xmltable
+		    end
+		end
+	    end
+	end
+    until not string
+--  return xmltable
+end
+
+function dreambox_table_print (tt, indent, done)
+  done = done or {}
+  indent = indent or 0
+  if type(tt) == "table" then
+    for key, value in pairs (tt) do
+      io.write(string.rep (" ", indent)) -- indent it
+      if type (value) == "table" and not done [value] then
+        done [value] = true
+        io.write(string.format("[%s] => table\n", tostring (key)));
+        io.write(string.rep (" ", indent+4)) -- indent it
+        io.write("(\n");
+        dreambox_table_print (value, indent + 7, done)
+        io.write(string.rep (" ", indent+4)) -- indent it
+        io.write(")\n");
+      else
+        io.write(string.format("[%s] => %s\n",
+            tostring (key), tostring(value)))
+      end
+    end
+  else
+    io.write(tt .. "\n")
+  end
+end
+
+
+function dreambox_updatefeed(feed,friendly_name)
+    local rc=false
+    local feedspath=cfg.feeds_path
+    if not friendly_name then
+	friendly_name=feed
+    end
+    local wget="wget -q -O- "
+    local dreambox_url='http://'..feed..'/web/'
+--local dreambox_m3u_url='http://'..feed..'/web/stream.m3u?ref='
+    local bouquets={}
+    print(wget..dreambox_url.."getservices")
+    local xmlbouquetsfile=io.popen(wget..dreambox_url.."getservices")
+    bouquets=xml_to_tables(xmlbouquetsfile,"e2servicelist")
+    xmlbouquetsfile:close()
+    if bouquets then
+        local bindex
+        local bouquett={}
+        local bouquet={}
+        for bindex,bouquett in pairs(bouquets) do
+	    bouquet=bouquett["e2service"]
+	    if bouquet then
+		local bouquetname=bouquet["e2servicename"]
+		local bouquetreference=bouquet["e2servicereference"]
+		local cindex
+		local channelt={}
+		local channel={}
+		print(wget..dreambox_url_encode(dreambox_url.."getservices?sRef="..bouquetreference))
+		local xmlbouquetfile=io.popen(wget..dreambox_url_encode(dreambox_url.."getservices?sRef="..bouquetreference))
+	        bouquet=xml_to_tables(xmlbouquetfile,"e2servicelist")
+	        xmlbouquetfile:close()
+	        if bouquet then
+	    	    local m3ufilename=cfg.tmp_path.."dreambox_"..friendly_name.."_bouquet"..bindex..".m3u"
+		    print(m3ufilename)
+	    	    local m3ufile=io.open(m3ufilename,"w")
+		    m3ufile:write("#EXTM3U name=\""..bouquetname.."\" plugin=dreambox type=ts\n")
+		    for cindex,channelt in pairs(bouquet) do
+			channel=channelt["e2service"]
+			local channelname=channel["e2servicename"]
+			local channelreference=channel["e2servicereference"]
+			m3ufile:write("#EXTINF:0,"..channelname.."\n")
+			m3ufile:write(dreambox_url.."stream.m3u?ref="..channelreference.."\n")
+		    end
+		    m3ufile:close()
+		    os.execute(string.format('mv %s %s',m3ufilename,feedspath))
+		    rc=true
+		end
+	    end
+	end
+	local m3ufilename=cfg.tmp_path.."dreambox_"..friendly_name.."_controls"..".m3u"
+	local m3ufile=io.open(m3ufilename,"w")
+	m3ufile:write("#EXTM3U name=\"Управление\" plugin=dreambox type=ts\n")
+	m3ufile:write("#EXTINF:0,1-Текущий канал\n")
+	m3ufile:write(dreambox_url.."command=current\n")
+	m3ufile:write("#EXTINF:0,2-Проснуться + Текущий канал\n")
+	m3ufile:write(dreambox_url.."command=on\n")
+	m3ufile:write("#EXTINF:0,3-Заснуть\n")
+	m3ufile:write(dreambox_url.."command=off\n")
+	m3ufile:close()
+	os.execute(string.format('mv %s %s',m3ufilename,feedspath))
+    end
+return rc
+end
+
+
+function dreambox_sendurl(dreambox_url,range)
+    print("range=",range)
+    local url
+    local file
+    local wget="wget -q -O- "
+    local wgetn="wget -q -O /dev/null "
+    local i,j,urlbase=string.find(dreambox_url,"(.+/web/).+")
+    if urlbase then
+	print("BaseURL=",urlbase)
+    end
+    local i,j,command=string.find(dreambox_url,".+command=(%w+)")
+    local standby={}
+    file=io.popen(wget..urlbase..'powerstate')
+    standby=xml_to_tables(file,"e2powerstate")
+    file:close()
+    print("standby=",standby["e2instandby"])
+--    dreambox_table_print(standby)
+    if command then
+	print(command)
+	if command=="on" then
+	    if standby["e2instandby"]=='true' then
+		print(wget..urlbase..'remotecontrol?command=116')
+		file=io.popen(wget..urlbase..'remotecontrol?command=116')
+		file:read()
+		file:close()
+	    end
+        end
+    end
+    if standby["e2instandby"]=='false' and command~="on" and command~="current" then
+	print(wget..urlbase..'powerstate?newstate=0')
+	file=io.popen(wget..urlbase..'powerstate?newstate=0')
+	file:read()
+	file:close()
+    end
+    local currentservices={}
+    local currentstreamservices={}
+
+    print(wget..urlbase.."streamsubservices")
+    file=io.popen(wget..urlbase.."streamsubservices")
+    currentstreamservices=xml_to_tables(file,"e2servicelist")
+    file:close()
+--    dreambox_table_print(currentstreamservices)
+
+    print(wget..urlbase.."subservices")
+    file=io.popen(wget..urlbase.."subservices")
+    currentservices=xml_to_tables(file,"e2servicelist")
+    file:close()
+--    dreambox_table_print(currentservices)
+
+    local index
+    local currentservice={}
+    local service={}
+    local streamservice={}
+    local busy=true
+    for index,currentservice in pairs(currentstreamservices) do
+	service=currentservice["e2service"]
+	print("service=",service["e2servicereference"])
+      if not url then
+	if service["e2servicereference"]=="N/A" and not command then
+		busy=false
+		url='wget -q -O- '..dreambox_url
+	elseif service["e2servicereference"]~="N/A" then
+	    url='wget -q -O- '..urlbase.."stream.m3u?ref="..service["e2servicereference"]
+	end
+      end
+    end    
+    for index,currentservice in pairs(currentservices) do
+	service=currentservice["e2service"]
+	print("service=",service["e2servicereference"])
+      if not url then
+	if service["e2servicereference"]=="N/A" and not command then
+		busy=false
+		url='wget -q -O- '..dreambox_url
+	elseif service["e2servicereference"]~="N/A" then
+	    url='wget -q -O- '..urlbase.."stream.m3u?ref="..service["e2servicereference"]
+	end
+      end
+    end    
+
+    print("busy=",busy)
+    if url then
+	file=io.popen(url)
+	file:read()
+	file:read()
+	url=file:read()
+    	file:close()
+    	print("url=",url)
+	plugin_sendurl(dreambox_url,url,range)
+    else
+	plugin_sendfile('www/corrupted.mp4')
+    end
+end
+
+--dreambox_updatefeed("10.36.40.5","dreambox1")
+--dreambox_sendurl("http://10.36.40.5/web/stream.m3u?ref=1:0:1:BBB:CB:FFFF:1682DF6:0:0:0:",0)
+
+plugins['dreambox']={}
+plugins.dreambox.name="DreamBox"
+plugins.dreambox.desc="IP address (example: <i>192.168.0.1</i>)"
+plugins.dreambox.updatefeed=dreambox_updatefeed
+plugins.dreambox.sendurl=dreambox_sendurl
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/xupnpd_gametrailers.lua
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/xupnpd_gametrailers.lua	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/xupnpd_gametrailers.lua	(revision 27875)
@@ -0,0 +1,119 @@
+-- Copyright (C) 2012-2013 Anton Burdinuk
+-- clark15b@gmail.com
+-- https://tsdemuxer.googlecode.com/svn/trunk/xupnpd
+
+cfg.gametrailers_video_count=100
+
+gametrailers_feeds=
+{
+    ['trailers']        = 'http://www.gametrailers.com/videos-trailers/feed',
+    ['reviews']         = 'http://www.gametrailers.com/reviews/feed',
+    ['shows']           = 'http://www.gametrailers.com/shows/feed',
+    ['xbox']            = 'http://www.gametrailers.com/xbox-360/feed',
+    ['ps3']             = 'http://www.gametrailers.com/ps3/feed',
+    ['wiiu']            = 'http://www.gametrailers.com/wii-u/feed',
+    ['pc']              = 'http://www.gametrailers.com/pc/feed',
+    ['vita']            = 'http://www.gametrailers.com/vita/feed',
+    ['3ds']             = 'http://www.gametrailers.com/3ds/feed'
+}
+
+function gametrailers_updatefeed(feed,friendly_name)
+    local rc=false
+
+    local feed_name='gametrailers_'..string.gsub(feed,'/','_')
+    local feed_m3u_path=cfg.feeds_path..feed_name..'.m3u'
+    local tmp_m3u_path=cfg.tmp_path..feed_name..'.m3u'
+
+    local feed_url=gametrailers_feeds[feed]
+
+    if not feed_url then return false end
+
+    if cfg.debug>0 then print('Game Trailers try url '..feed_url) end
+
+    local x=rss_merge(rss_parse_feed(feed_url,'url="([%w:/._%-]+)?.-"'),rss_parse_m3u(feed_m3u_path),cfg.gametrailers_video_count)
+
+--    local x=gametrailers_rss_parse_feed(feed_url)
+
+    if x then
+        local dfd=io.open(tmp_m3u_path,'w+')
+        if dfd then
+            dfd:write('#EXTM3U name=\"',friendly_name or feed_name,'\" type=mp4 plugin=gametrailers\n')
+
+            for i,j in ipairs(x) do
+                if j.logo then
+                    dfd:write('#EXTINF:0 logo=',j.logo,' ,',j.title,'\n',j.link,'\n')
+                else
+                    dfd:write('#EXTINF:0 ,',j.title,'\n',j.link,'\n')
+                end
+            end
+            dfd:close()
+
+            if util.md5(tmp_m3u_path)~=util.md5(feed_m3u_path) then
+                if os.execute(string.format('mv %s %s',tmp_m3u_path,feed_m3u_path))==0 then
+                    if cfg.debug>0 then print('GameTrailers feed \''..feed_name..'\' updated') end
+                    rc=true
+                end
+            else
+                util.unlink(tmp_m3u_path)
+            end
+        end
+    end
+
+    return rc
+end
+
+function gametrailers_sendurl(gametrailers_url,range)
+
+    local url=nil
+
+    if plugin_sendurl_from_cache(gametrailers_url,range) then return end
+
+    local clip_page=http.download(gametrailers_url)
+
+    if clip_page then
+        local itemMgid,token=string.match(clip_page,'data%-video="([%w%.:%-]+)"%s*data%-token="(%w+)"')
+
+        clip_page=nil
+
+        if itemMgid and token then
+            local u=string.format('http://www.gametrailers.com/feeds/video_download/%s/%s',itemMgid,token)
+
+            clip_page=http.download(u)
+
+            if clip_page then
+                local x=json.decode(clip_page)
+
+                clip_page=nil
+
+                if x and x.url then url=x.url end
+            end
+        end
+
+
+    end
+
+    if url then
+        if cfg.debug>0 then print('GameTrailers clip real URL: '..url) end
+
+        plugin_sendurl(gametrailers_url,url,range)
+    else
+        if cfg.debug>0 then print('GameTrailers clip real URL is not found') end
+
+        plugin_sendfile('www/corrupted.mp4')
+    end
+end
+
+plugins['gametrailers']={}
+plugins.gametrailers.name="GameTrailers"
+plugins.gametrailers.desc="<i>feed</i>"..
+"<br/><b>GameTrailers feeds</b>: trailers, reviews, shows, xbox, ps3, wiiu, pc, vita, 3ds"
+
+plugins.gametrailers.sendurl=gametrailers_sendurl
+plugins.gametrailers.updatefeed=gametrailers_updatefeed
+
+plugins.gametrailers.ui_config_vars=
+{
+    { "input",  "gametrailers_video_count", "int" }
+}
+
+--gametrailers_updatefeed('ps3')
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/xupnpd_generic.lua
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/xupnpd_generic.lua	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/xupnpd_generic.lua	(revision 27875)
@@ -0,0 +1,47 @@
+-- Copyright (C) 2011-2013 Anton Burdinuk
+-- clark15b@gmail.com
+-- https://tsdemuxer.googlecode.com/svn/trunk/xupnpd
+
+function generic_updatefeed(feed,friendly_name)
+
+    local feed_name=string.match(feed,'.+/(.+).m3u$')
+    local feed_path=cfg.feeds_path..feed_name..'.m3u'
+    local tmp_path=cfg.tmp_path..feed_name..'.m3u'
+
+    if http.download(feed,tmp_path)<=0 then
+        return false
+    end
+
+    if util.md5(tmp_path)~=util.md5(feed_path) then
+        if os.execute(string.format('mv %s %s',tmp_path,feed_path))==0 then
+            if cfg.debug>0 then print('feed \''..feed_name..'\' updated') end
+            return true
+        end
+    else
+        util.unlink(tmp_path)
+    end
+
+    return false
+end
+
+function generic_sendurl(generic_url,range)
+    local rc,location
+
+    location=generic_url
+
+    for i=1,5,1 do
+        rc,location=http.sendurl(location,1,range)
+
+        if not location then
+            break
+        else
+            if cfg.debug>0 then print('Redirect #'..i..' to: '..location) end
+        end
+    end
+end
+
+plugins['generic']={}
+plugins.generic.name="Generic"
+plugins.generic.desc="<i>m3u_url</i>"
+plugins.generic.sendurl=generic_sendurl
+plugins.generic.updatefeed=generic_updatefeed
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/xupnpd_giantbomb.lua
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/xupnpd_giantbomb.lua	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/xupnpd_giantbomb.lua	(revision 27875)
@@ -0,0 +1,94 @@
+-- Copyright (C) 2012 I. Sokolov, 2013 Anton Burdinuk
+-- happy.neko@gmail.com
+-- Licensed under GNU GPL version 2 
+-- https://www.gnu.org/licenses/gpl-2.0.html
+
+-- config example:
+--feeds=
+--{
+--    { "giantbomb", "all", "Gaint Bomb - All Videos" },
+--    { "giantbomb", "quicklook", "Gaint Bomb - QuickLooks" },
+--    { "giantbomb", "review", "Gaint Bomb - Reviews" },
+--    { "giantbomb", "feature", "Gaint Bomb - Features" },
+--    { "giantbomb", "trailer", "Gaint Bomb - Trailers" },
+--    { "giantbomb", "event", "Gaint Bomb - Events" },
+--    { "giantbomb", "endurance", "Gaint Bomb - Endurance Run" },
+--    { "giantbomb", "tang", "Gaint Bomb - TANG" }
+--}
+
+gb_videos_url='http://www.giantbomb.com/videos'
+gb_domain_url='http://www.giantbomb.com'
+gb_video_types={ ['all']='popular/', ['quicklook']='quick-looks/', ['review']='reviews/', ['feature']='features/',
+                 ['trailer']='trailers/', ['event']='events/', ['endurance']='endurance-run/', ['tang']='tang/' }
+
+function gb_updatefeed(feed,friendly_name)
+    local rc=false
+
+    local feed_name='giantbomb_'..string.gsub(feed,'/','_')
+    local feed_m3u_path=cfg.feeds_path..feed_name..'.m3u'
+    local tmp_m3u_path=cfg.tmp_path..feed_name..'.m3u'
+
+    local feed_url=nil
+    local tfeed=split_string(feed,'/')
+    if gb_video_types[tfeed[1]] then
+        feed_url=gb_videos_url..'/'..gb_video_types[tfeed[1]]
+    else
+        feed_url=gb_videos_url..'/'
+    end
+
+    local feed_data=http.download(feed_url)
+    if feed_data then
+        local dfd=io.open(tmp_m3u_path,'w+')
+        if dfd then
+            dfd:write('#EXTM3U name=\"',friendly_name or feed_name,'\" type=mp4 plugin=giantbomb\n')
+            for link,logo,title in string.gmatch(feed_data, '<li>%s*<a href="(/videos/[%w%-/]+)">.-<img src="(http://static%.giantbomb%.com/uploads/screen_medium/[%w/%.%-_]+)"%s*/>.- class="title">(.-)</h3>' ) do
+                dfd:write('#EXTINF:0 logo=',logo,',',title,'\n',gb_domain_url..link,'\n')
+            end
+            dfd:close()
+            feed_data=nil
+
+            if util.md5(tmp_m3u_path)~=util.md5(feed_m3u_path) then
+                if os.execute(string.format('mv %s %s',tmp_m3u_path,feed_m3u_path))==0 then
+                    if cfg.debug>0 then print('Giant Bomb feed \''..feed_name..'\' updated') end
+                    rc=true
+                end
+            else
+                util.unlink(tmp_m3u_path)
+            end
+        end
+    end
+
+    return rc
+end
+
+function gb_sendurl(gb_page_url,range)
+    local url=nil
+    if plugin_sendurl_from_cache(gb_page_url,range) then return end
+
+    local clip_page=http.download(gb_page_url)
+    if clip_page then
+        local youtube_id=string.match(clip_page,'youtube%.com/embed/([%w%-_]+)"')
+        clip_page=nil
+        if youtube_id then
+            url=plugins.youtube.getvideourl('http://www.youtube.com/watch?v='..youtube_id..'&feature=youtube_gdata')
+            if url then
+                if cfg.debug>0 then print('Giant Bomb Real URL: '..url) end
+                plugin_sendurl(gb_page_url,url,range)
+            end
+        end
+    end
+
+    if not url then
+        if cfg.debug>0 then print('Giant Bomb clip is not found') end
+
+        plugin_sendfile('www/corrupted.mp4')
+    end
+
+end
+
+plugins['giantbomb']={}
+plugins.giantbomb.name="Giant Bomb"
+plugins.giantbomb.desc="<i>channel</i>"..
+"<br/><b>Giant Bomb channels</b>: all, quicklook, review, feature, trailer, event, endurance, tang"
+plugins.giantbomb.sendurl=gb_sendurl
+plugins.giantbomb.updatefeed=gb_updatefeed
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/xupnpd_ivi.lua
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/xupnpd_ivi.lua	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/xupnpd_ivi.lua	(revision 27875)
@@ -0,0 +1,164 @@
+-- Copyright (C) 2011-2013 Anton Burdinuk
+-- clark15b@gmail.com
+-- https://tsdemuxer.googlecode.com/svn/trunk/xupnpd
+
+-- MP4-lo
+-- MP4-hi
+cfg.ivi_fmt='MP4-hi'
+cfg.ivi_video_count=100
+
+-- genre:
+-- arthouse, boeviki, voennye, detective, detskiy, documentary, drama, comedy, korotkometrazhki, melodramy, zolotaya_klassika, adventures, sovetskoe_kino, thriller, horror, fantastika, erotika
+function ivi_updatefeed(feed,friendly_name)
+    local rc=false
+
+    local feed_url=nil
+    local scroll=false
+    local feed_name='ivi_'..string.gsub(feed,'/','_')
+    local feed_m3u_path=cfg.feeds_path..feed_name..'.m3u'
+    local tmp_m3u_path=cfg.tmp_path..feed_name..'.m3u'
+
+    local tfeed=split_string(feed,'/')
+
+    if table.maxn(tfeed)>1 then
+        if tfeed[1]=='genre' then
+            feed_url='http://www.ivi.ru/videos/all/movies/'..tfeed[2]..'/by_year/?'
+            scroll=true
+        else
+            feed_url=string.format('http://www.ivi.ru/watch/%s/%s',tfeed[1],tfeed[2])
+        end
+    else
+        if tfeed[1]=='new' then
+            local year=tonumber(os.date('%Y'))
+            feed_url='http://www.ivi.ru/videos/all/all/all/by_year/?year_from='..(year-1)..'&year_to='..year
+            scroll=true
+        else
+            feed_url='http://www.ivi.ru/watch/'..tfeed[1]
+        end
+    end
+
+    if feed_url then
+        local dfd=io.open(tmp_m3u_path,'w+')
+
+        if dfd then
+            dfd:write('#EXTM3U name=\"',friendly_name or feed_name,'\" type=mp4 plugin=ivi\n')
+
+            local count=0
+
+            while(count<cfg.ivi_video_count) do
+                local url=nil
+
+                if scroll and count~=0 then url=feed_url..'&offset='..count else url=feed_url end
+
+                if cfg.debug>0 then print('IVI try url '..url) end
+
+                local feed_data=http.download(url)
+
+                if feed_data then
+                    if not scroll then
+                        for urn,logo,name in string.gmatch(feed_data,'<li>%s*<span class="image">%s*<a href="/watch/([%w_%-/]+)">%s*<img src="(.-)">%s*</a>%s*</span>%s*<strong>%s*<a href=".-">(.-)</a>%s*</strong>%s*</li>') do
+                            dfd:write('#EXTINF:0 logo=',logo,' ,',name,'\n','http://www.ivi.ru/watch/',urn,'\n')
+                        end
+                    else
+                        local n=0
+
+                        for id,logo,name in string.gmatch(feed_data,'<a href="/watch/([%w_%-/]+)"%s*>%s*<img src="(.-)" alt="(.-)"%s*/>') do
+                            dfd:write('#EXTINF:0 logo=',logo,' ,',name,'\n','http://www.ivi.ru/watch/',id,'\n')
+                            n=n+1
+                        end
+
+                        if n<1 then scroll=false else count=count+n end
+                    end
+
+                    feed_data=nil
+                end
+
+                if not scroll then break end
+            end
+
+            dfd:close()
+
+            if util.md5(tmp_m3u_path)~=util.md5(feed_m3u_path) then
+                if os.execute(string.format('mv %s %s',tmp_m3u_path,feed_m3u_path))==0 then
+                    if cfg.debug>0 then print('IVI feed \''..feed_name..'\' updated') end
+                    rc=true
+                end
+            else
+                util.unlink(tmp_m3u_path)
+            end
+
+        end
+    end
+
+    return rc
+end
+
+function ivi_sendurl(ivi_url,range)
+    local url=nil
+
+    if plugin_sendurl_from_cache(ivi_url,range) then return end
+
+    local ivi_id=string.match(ivi_url,'/?id=(%d+)$')
+
+    if not ivi_id then
+        ivi_id=string.match(ivi_url,'/(%d+)$')
+    end
+
+    if not ivi_id then
+        if cfg.debug>0 then print('Invalid IVI URL format, example - http://www.ivi.ru/video/view/?id=12345 or http://www.ivi.ru/watch/12345') end
+        return
+    end
+
+    local clip_page=http.download('http://api.digitalaccess.ru/api/json',nil,
+        string.format('{"method":"da.content.get","params":["%s",{"_domain":"www.ivi.ru","site":"1","test":1,"_url":"%s"}]}',ivi_id or '',ivi_url))
+
+    if clip_page then
+        local x=json.decode(clip_page)
+
+        clip_page=nil
+
+        if x.result and x.result.files then
+            local url_lo=nil
+            for i,j in ipairs(x.result.files) do
+                if j.content_format==cfg.ivi_fmt then
+                    url=j.url
+                    break
+                elseif j.content_format=='MP4-lo' then
+                    url_lo=j.url
+                end
+            end
+            if not url then url=url_lo end
+        end
+    else
+        if cfg.debug>0 then print('IVI clip '..ivi_id..' is not found') end
+    end
+
+    if url then
+        if cfg.debug>0 then print('IVI Real URL: '..url) end
+
+        plugin_sendurl(ivi_url,url,range)
+    else
+        if cfg.debug>0 then print('IVI Real URL is not found') end
+
+        plugin_sendfile('www/corrupted.mp4')
+    end
+end
+
+plugins['ivi']={}
+plugins.ivi.name="ivi.ru"
+plugins.ivi.desc="new, <i>serial_name</i> or <i>serial_name</i>/<i>season</i> or genre/<i>genre</i>"..
+"<br/><b>genres</b>: arthouse, boeviki, voennye, detective, detskiy, documentary, drama, comedy, korotkometrazhki, melodramy, zolotaya_klassika, adventures, sovetskoe_kino, thriller, horror, fantastika, performance, erotika"..
+"<br/><b>example</b>: new, luntik, luntik/season2, genre/horror"
+plugins.ivi.sendurl=ivi_sendurl
+plugins.ivi.updatefeed=ivi_updatefeed
+
+plugins.ivi.ui_config_vars=
+{
+    { "select", "ivi_fmt" },
+    { "input", "ivi_video_count", "int" }
+}
+
+--ivi_updatefeed('luntik','Лунтик')
+--ivi_updatefeed('luntik/season2','Лунтик')
+--ivi_updatefeed('genre/horror','Horrors')
+--ivi_updatefeed('new','new')
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/xupnpd_netstreamsat.lua
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/xupnpd_netstreamsat.lua	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/xupnpd_netstreamsat.lua	(revision 27875)
@@ -0,0 +1,103 @@
+-- Plugin for Netstreamsat
+-- Copyright (C) 2012-2013 Mario Stephan
+-- mstephan@shared-files.de
+
+-- #EXTM3U name="Live TV" type=mpeg plugin=netstreamsat dlna_extras=mpeg_ts
+-- #EXTINF:0,Das Erste
+-- http://netstreamsat/stream/nameDasErste
+-- #EXTINF:0,ZDF
+-- http://netstreamsat/stream/nameZDF
+-- #EXTINF:0,RTL Television
+-- http://netstreamsat/stream/nameRTLTelevision
+-- #EXTINF:0,SAT.1
+-- http://netstreamsat/stream/nameSat1
+
+
+function read_url()
+  local f = io.open('last_url')
+  if f == nil then
+  	io.close()
+	return '',os.time(),''
+  end
+  local u = f:read("*all")
+  t={} ; i=1
+  for str in string.gmatch(u, "[^%s]+") do
+	t[i] = str
+	i = i + 1
+  end
+
+  f:close()
+  return t[1],t[2],t[3]
+
+end
+
+function save_url(url, stream )
+  local f = io.open('last_url', 'w')
+  	f:write(url, "\n")
+  	f:write(stream, "\n")
+  	f:write(os.time())
+  	f:close()
+end
+
+
+function netstreamsat_updatefeed(feed,friendly_name)
+    return true
+end
+
+
+function netstreamsat_sendurl(netstreamsat_url,range)
+	
+	local urlbase=string.match(netstreamsat_url,"(http://.-)/.-")
+	if urlbase==nil then
+		urlbase="http://netstreamsat"
+	end
+	local stream=""
+	local switch=""
+    
+    local l_url, l_stream, l_time = read_url()
+	
+	if l_url == netstreamsat_url and l_time+15 > os.time() then
+		-- re-use of last known stream
+		stream = l_stream
+	else
+		-- select a free tuner    
+		local status = http.download(urlbase.."/status")
+		local tuner1 = string.match(status,'.*Tuner 1.-Channel Number <b>(.-)</b>,.-')
+		local tuner2 = string.match(status,'.*Tuner 2.-Channel Number <b>(.-)</b>,.-')
+		
+		if tuner1==nil then
+			tuner1="not available"
+		end
+		if tuner2==nil then
+			tuner2="not available"
+		end
+		
+		print("Status Tuner1: "..tuner1:gsub('0','streaming'):gsub('-1','free'))
+		print("Status Tuner2: "..tuner2:gsub('0','streaming'):gsub('-1','free'))
+		
+		-- switch channel
+		if tuner1=="-1" or tuner2=="not available" then                                                                                               
+		   stream=urlbase..":10001"
+		   switch=netstreamsat_url:gsub('/stream/','/stream/tuner1/')
+		else                                                                                                                          
+		   stream=urlbase..":10002"
+		   switch=netstreamsat_url:gsub('/stream/','/stream/tuner2/')
+		end 	
+		
+		print('switch device to new channel: '..switch)
+		local s = http.download(switch)
+	end
+	
+	
+	print('send this stream: '..stream)
+	save_url(netstreamsat_url, stream)
+	plugin_sendurl(netstreamsat_url,stream,range)
+  
+end
+
+plugins['netstreamsat']={}
+plugins.netstreamsat.name="NetstreamSat"
+plugins.netstreamsat.desc="NetstreamSat via upnp"
+plugins.netstreamsat.updatefeed=netstreamsat_updatefeed
+plugins.netstreamsat.sendurl=netstreamsat_sendurl
+
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/xupnpd_titan.lua
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/xupnpd_titan.lua	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/xupnpd_titan.lua	(revision 27875)
@@ -0,0 +1,174 @@
+-- Plugin for converting channels lists from coolstream receivers
+-- Author focus.cst@gmail.com
+-- License GPL v2
+-- Copyright (C) 2013 CoolStream International Ltd
+
+-- flag to test as plain script, without xupnpd - cfg not defined in this case
+local cst_test =  false
+
+if not cfg then
+cfg={}
+cfg.tmp_path='/tmp/'
+cfg.feeds_path='/tmp/'
+cfg.debug=1
+cst_test = true
+end
+
+function cst_debug(level, msg)
+	if cfg.debug>level then
+		print(msg)
+	end
+end
+
+function cst_get_bouquets(file)
+	local btable={}
+	repeat
+		local string=file:read()
+		if string then
+			cst_debug(1, "########## bouquet="..string)
+			local num = string.match(string, "%d+");
+			if num then
+				local len = string.len(num);
+				local name = string.sub(string, len+1);
+				btable[num] = name
+				cst_debug(1, "num="..num.." name="..btable[num]);
+			end
+			--break; -- one bouquet
+		end
+	until not string
+	return btable
+end
+
+function cst_get_channels(file)
+	local ctable={}
+	repeat
+		local string=file:read()
+		idx = 1;
+		if string then
+			cst_debug(1, "########## channel="..string)
+			local num = string.match(string, "%d+");
+			if num then
+				local len = string.len(num);
+				local rest = string.sub(string, len+1);
+				local id = string.match(rest, "%x+ ");
+				len = string.len(id);
+				local name = string.sub(rest, len+2);
+				cst_debug(1, "num="..num.." id="..id.." name="..name)
+				if id and name then
+					table.insert(ctable, {id, name});
+					idx = idx + 1;
+				end
+			end
+		end
+ 	until not string	
+	return ctable
+end
+
+-- all bouquets
+-- local burl = "getbouquets"
+-- only favorites
+local burl = "getbouquets?fav=true"
+
+-- without epg
+-- local curl = "getbouquet?bouquet="
+-- with epg
+local curl = "getbouquet?epg=true&bouquet="
+
+function cst_updatefeed(feed,friendly_name)
+	local rc=false
+	local feedspath = cfg.feeds_path
+	if not friendly_name then
+		friendly_name = feed
+	end
+	local wget = "wget -q -O- "
+	local cst_url = 'http://'..feed..'/control/'
+
+	cst_debug(0, wget..cst_url..burl)
+	local bouquetsfile = io.popen(wget..cst_url..burl)
+	local bouquets = cst_get_bouquets(bouquetsfile)
+	bouquetsfile:close()
+
+	if not bouquets then
+		return rc
+	end
+	local bindex
+	local bouquett = {}
+	for bindex,bouquett in pairs(bouquets) do
+		local cindex
+		local channelt = {}
+		cst_debug(0,wget.."\""..cst_url..curl..bindex.."\"")
+		local xmlbouquetfile = io.popen(wget.."\""..cst_url..curl..bindex.."\"")
+		local bouquet = cst_get_channels(xmlbouquetfile)
+	        xmlbouquetfile:close()
+		if bouquet then
+	    		local m3ufilename = cfg.tmp_path.."cst_"..friendly_name.."_bouquet_"..bindex..".m3u"
+			cst_debug(0, m3ufilename)
+	    		local m3ufile = io.open(m3ufilename,"w")
+			m3ufile:write("#EXTM3U name=\""..bouquett.." ("..friendly_name..")\" plugin=coolstream type=ts\n")
+			for cindex,channelt in pairs(bouquet) do
+				local id = channelt[1];
+				local name = channelt[2];
+				m3ufile:write("#EXTINF:0,"..name.."\n")
+				-- m3ufile:write(cst_url.."zapto?"..id.."\n")
+				m3ufile:write("http://"..feed..":31339/id="..id.."\n")
+			end
+			m3ufile:close()
+			os.execute(string.format('mv %s %s',m3ufilename,feedspath))
+			rc=true
+		end
+	end
+	return rc
+end
+
+function cst_read_url(url)
+	local wget = "wget -q -O- "
+	local turl = wget..url
+	cst_debug(0, turl)
+	local file = io.popen(turl)
+	local string = file:read()
+	file:close()
+	return string
+end
+
+function cst_zapto(urlbase,id)
+	local zap = urlbase.."/control/zapto?"..id;
+	cst_read_url(zap)
+end
+
+function cst_sendurl(cst_url,range)
+	local i,j,baseurl = string.find(cst_url,"(.+):.+")
+	cst_debug(0, "cst_sendurl: url="..cst_url.." baseurl="..baseurl)
+
+	i,j,id = string.find(cst_url,".*id=(.+)")
+	local surl = baseurl.."/control/standby"
+	local standby = cst_read_url(surl)
+
+	if standby then
+		cst_debug(0, "standby="..standby)
+
+		-- wakeup from standby
+		if string.find(standby,"on") then
+			cst_read_url(surl.."?off")
+		end
+	end
+	-- zap to channel
+	cst_zapto(baseurl,id)
+
+	if not cst_test then
+		plugin_sendurl(cst_url,cst_url,range)
+	end
+end
+
+if cst_test then
+cst_updatefeed("172.16.1.20","tank")
+-- cst_updatefeed("172.16.1.10","tank")
+-- cst_sendurl("http://172.16.1.20:31339/id=c1f000010070277a", 0)
+end
+
+if not cst_test then
+plugins['coolstream']={}
+plugins.coolstream.name="CoolStream"
+plugins.coolstream.desc="IP address (example: <i>192.168.0.1</i>)"
+plugins.coolstream.updatefeed=cst_updatefeed
+plugins.coolstream.sendurl=cst_sendurl
+end
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/xupnpd_vimeo.lua
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/xupnpd_vimeo.lua	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/xupnpd_vimeo.lua	(revision 27875)
@@ -0,0 +1,120 @@
+-- Copyright (C) 2011-2013 Anton Burdinuk
+-- clark15b@gmail.com
+-- https://tsdemuxer.googlecode.com/svn/trunk/xupnpd
+
+cfg.vimeo_video_count=100
+
+function vimeo_parse_feed(feed_url)
+    local t={}
+
+    local feed_data=http.download(feed_url)
+
+    if feed_data then
+        local x=json.decode(feed_data)
+
+        feed_data=nil
+
+        if x then
+            local idx=1
+            for i,j in ipairs(x) do
+                t[idx]={ ['title']=j.title, ['link']=j.url, ['logo']=j.thumbnail_medium }
+                idx=idx+1
+            end
+        end
+    end
+
+    return t
+end
+
+-- username, channel/channelname, group/groupname, album/album_id
+function vimeo_updatefeed(feed,friendly_name)
+    local rc=false
+
+    local feed_url='http://vimeo.com/api/v2/'..feed..'/videos.json'
+    local feed_name='vimeo_'..string.gsub(feed,'/','_')
+    local feed_m3u_path=cfg.feeds_path..feed_name..'.m3u'
+    local tmp_m3u_path=cfg.tmp_path..feed_name..'.m3u'
+
+    local x=rss_merge(vimeo_parse_feed(feed_url),rss_parse_m3u(feed_m3u_path),cfg.vimeo_video_count)
+
+--    local x=vimeo_parse_feed(feed_url)
+
+    if x then
+        local dfd=io.open(tmp_m3u_path,'w+')
+        if dfd then
+            dfd:write('#EXTM3U name=\"',friendly_name or feed_name,'\" type=mp4 plugin=vimeo\n')
+
+            for i,j in ipairs(x) do
+                if j.logo then
+                    dfd:write('#EXTINF:0 logo=',j.logo,' ,',j.title,'\n',j.link,'\n')
+                else
+                    dfd:write('#EXTINF:0 ,',j.title,'\n',j.link,'\n')
+                end
+            end
+            dfd:close()
+
+            if util.md5(tmp_m3u_path)~=util.md5(feed_m3u_path) then
+                if os.execute(string.format('mv %s %s',tmp_m3u_path,feed_m3u_path))==0 then
+                    if cfg.debug>0 then print('Vimeo feed \''..feed_name..'\' updated') end
+                    rc=true
+                end
+            else
+                util.unlink(tmp_m3u_path)
+            end
+        end
+    end
+
+    return rc
+end
+
+-- send '\r\n' before data
+function vimeo_sendurl(vimeo_url,range)
+
+    if plugin_sendurl_from_cache(vimeo_url,range) then return end
+
+    local url=vimeo_get_video_url(vimeo_url)
+
+    if url==nil then
+        if cfg.debug>0 then print('Vimeo clip '..vimeo_url..' is not found') end
+
+        plugin_sendfile('www/corrupted.mp4')
+    else
+        if cfg.debug>0 then print('Vimeo Real URL: '..url) end
+
+        plugin_sendurl(vimeo_url,url,range)
+    end
+
+end
+
+function vimeo_get_video_url(vimeo_url)
+
+    local url=nil
+
+    local vimeo_id=string.match(vimeo_url,'.+/(%w+)$')
+
+    local clip_page=plugin_download(vimeo_url)
+
+    if clip_page then
+        local ts,sig=string.match(clip_page,'"timestamp":(%w+),"signature":"(%w+)",')
+        clip_page=nil
+
+        if sig and ts then
+            url=string.format('http://player.vimeo.com/play_redirect?clip_id=%s&sig=%s&time=%s&quality=hd&codecs=H264&type=moogaloop_local&embed_location=',vimeo_id,sig,ts)
+        end
+    end
+
+    return url
+
+end
+
+plugins['vimeo']={}
+plugins.vimeo.name="Vimeo"
+plugins.vimeo.desc="<i>username</i>, channel/<i>channelname</i>, group/<i>groupname</i>, album/<i>album_id</i>"
+plugins.vimeo.sendurl=vimeo_sendurl
+plugins.vimeo.updatefeed=vimeo_updatefeed
+plugins.vimeo.getvideourl=vimeo_get_video_url
+
+plugins.vimeo.ui_config_vars=
+{
+    { "input",  "vimeo_video_count", "int" }
+}
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/xupnpd_vkontakte.lua
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/xupnpd_vkontakte.lua	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/xupnpd_vkontakte.lua	(revision 27875)
@@ -0,0 +1,546 @@
+-- Copyright (C) 2011-2012 I. Sokolov
+-- happy.neko@gmail.com
+-- Licensed under GNU GPL version 2 
+-- https://www.gnu.org/licenses/gpl-2.0.html
+
+-- config example:
+--feeds=
+--{
+--    { "vkontakte", "my", "VK - Videos from my page" },
+--    { "vkontakte", "group/group_id", "VK - Videos from group" },
+--    { "vkontakte", "group/group_id/album_id", "VK - Videos from group's album" },
+--    { "vkontakte", "user/user_id", "VK - Videos from user" },
+--    { "vkontakte", "user/user_id/album_id", "VK - Videos from user's album" },
+--    { "vkontakte", "search/searchstring", "VK - Search videos" },
+--    { "vkontakte", "search_hd/searchstring", "VK - Search only HD videos" }
+--}
+
+-- Workaround for private videos and groups
+cfg.vk_private_workaround=true
+-- How many videos to pull from the feed (max 200)
+cfg.vk_video_count=100
+
+vk_app_id='2432090'
+vk_app_scope='groups,friends,video,offline,nohttps'
+vk_api_server='http://api.vk.com'
+vk_api_request_video_get='/method/video.get?width=160'
+vk_api_request_video_add='/method/video.add?'
+vk_api_request_video_delete='/method/video.delete?'
+vk_api_request_video_search='/method/video.search?'
+vk_api_request_get_user_info='/method/getProfiles?'
+vk_api_request_get_user_groups='/method/groups.get?'
+vk_api_request_get_user_friends='/method/friends.get?'
+
+max_video_title_length=120
+private_or_disabled_video_matcher='(position:absolute; top:50%%; text%-align:center;)'
+-- ffmpeg -loop_input -f image2 -i vk-flash-format-only.png -r 25 -vframes 25 -an -vcodec libx264 -crf 32 -threads 0 vk-flash-format-only.mp4
+error_file_private_video='www/vk-private-video.mp4'
+error_file_video_flash_format_only='www/vk-flash-format-only.mp4'
+
+
+function vk_updatefeed(feed,friendly_name)
+    local rc=false
+
+    if not vk_is_signed_in() then
+        return false -- TODO show nice please sign-in message
+    end
+
+    local feed_name='vk_'..string.gsub(feed,'[/%s]','_')
+    local feed_m3u_path=cfg.feeds_path..feed_name..'.m3u'
+    local tmp_m3u_path=cfg.tmp_path..feed_name..'.m3u'
+
+    local feed_url=nil
+    local vk_api_request=nil
+    local tfeed=split_string(feed,'/')
+
+    local logo_label="thumb"
+    if tfeed[1]=='group' then
+        if tfeed[3] then
+            feed_url=vk_api_format_url(vk_api_request_video_get,{['count']=cfg.vk_video_count,['gid']=tfeed[2],['aid']=tfeed[3]})
+        else
+            feed_url=vk_api_format_url(vk_api_request_video_get,{['count']=cfg.vk_video_count,['gid']=tfeed[2]})
+        end     
+        logo_label="image"
+    elseif tfeed[1]=='user' then
+        if tfeed[3] then
+            feed_url=vk_api_format_url(vk_api_request_video_get,{['count']=cfg.vk_video_count,['uid']=tfeed[2],['aid']=tfeed[3]})
+        else
+            feed_url=vk_api_format_url(vk_api_request_video_get,{['count']=cfg.vk_video_count,['uid']=tfeed[2]})
+        end     
+        logo_label="image"
+    elseif tfeed[1]=='search' then
+        feed_url=vk_api_format_url(vk_api_request_video_search,
+            {['count']=cfg.vk_video_count, ['sort']=get_sort_order(tfeed[2]), ['q']=tfeed[3] })
+    elseif tfeed[1]=='search_hd' then
+        feed_url=vk_api_format_url(vk_api_request_video_search,
+            {['count']=cfg.vk_video_count, ['hd']='1', ['sort']=get_sort_order(tfeed[2]), ['q']='"'..tfeed[3]..'"' })
+    else
+        -- my
+        feed_url=vk_api_format_url(vk_api_request_video_get,{['count']=cfg.vk_video_count,['uid']=cfg.vk_api_user_id})
+        logo_label="image"
+    end
+
+    local feed_data=http.download(feed_url)
+    if feed_data then
+        local x=json.decode(feed_data)
+        feed_data=nil
+
+        if vk_check_response_for_errors(x) then
+            return false
+        end
+
+        if x and x.response then
+            local dfd=io.open(tmp_m3u_path,'w+')
+            if dfd then
+                dfd:write('#EXTM3U name=\"',friendly_name or feed_name,'\" type=mp4 plugin=vkontakte\n')
+
+                for i,j in pairs(x.response) do
+                    if type(j) == 'table' then
+                        dfd:write('#EXTINF:0 logo=',string.gsub(j[logo_label],"vkontakte%.ru/","vk.com/"),',',string.sub(unescape_html_string(j.title),1,max_video_title_length),'\n',string.gsub(j.player,"vkontakte%.ru/","vk.com/"),'\n')
+                    end
+                end
+                dfd:close()
+
+                if util.md5(tmp_m3u_path)~=util.md5(feed_m3u_path) then
+                    if os.execute(string.format('mv %s %s',tmp_m3u_path,feed_m3u_path))==0 then
+                        if cfg.debug>0 then print('VK feed \''..feed_name..'\' updated') end
+                        rc=true
+                    end
+                else
+                    util.unlink(tmp_m3u_path)
+                end
+            end
+        end
+    end
+
+    return rc
+end
+
+function vk_sendurl(vk_page_url,range)
+    local url=nil
+
+    if plugin_sendurl_from_cache(vk_page_url,range) then return end
+
+    local clip_page=http.download(vk_page_url)
+
+    if clip_page and string.match(clip_page, private_or_disabled_video_matcher) then
+		if cfg.debug>0 then 
+			print('VK external player page '..vk_page_url..' is protected by privacy settings or disabled')
+		end
+		if cfg.vk_private_workaround then
+            if cfg.debug>0 then 
+				print('Trying workaround for private videos...')
+			end
+			local private_player_page=nil
+	        local oid=string.match(vk_page_url,"oid=([%-%d]+)")
+	        local vid=string.match(vk_page_url,"%Aid=(%d+)")
+			local added_vid = vk_video_add(vid, oid)
+			if added_vid then private_player_page=vk_video_get_external_player_page(added_vid, cfg.vk_api_user_id)	end
+			if private_player_page then
+			    clip_page=http.download(private_player_page)
+				if added_vid then vk_video_delete(added_vid, cfg.vk_api_user_id) end
+			else
+				if added_vid then vk_video_delete(added_vid, cfg.vk_api_user_id) end
+            	if cfg.debug>0 then 
+					print('Workaround for private videos failed')
+				end
+				clip_page=nil
+				plugin_sendfile(error_file_private_video)
+				return
+			end
+		else
+			clip_page=nil
+			plugin_sendfile(error_file_private_video)
+			return
+		end
+	end
+
+    if clip_page then
+        local host=string.match(clip_page,"video_host%s*=%s*'(.-)'")
+        local uid=string.match(clip_page,"uid%s*=%s*'(%w-)'")
+        local vtag=string.match(clip_page,"vtag%s*=%s*'([%w%-_]-)'")
+        local no_flv=string.match(clip_page,"video_no_flv%s*=%s*(%d-)%D")
+        local max_hd=string.match(clip_page,"video_max_hd%s*=%s*'(%d-)'")	
+        url=vk_video_get_direct_download_link(host, uid, vtag, no_flv, max_hd)
+    else
+        if cfg.debug>0 then print('VK external player page '..vk_page_url..' can not be downloaded or private') end
+    end
+	clip_page=nil
+
+    if url then		
+        if cfg.debug>0 then print('VK Clip download URL: '..url) end
+		if url == error_file_video_flash_format_only then
+			plugin_sendfile(error_file_video_flash_format_only)
+		else
+	        plugin_sendurl(vk_page_url,url,range)
+		end
+    else
+        if cfg.debug>0 then print('VK Clip real URL is not found') end
+    end
+end
+
+function vk_api_format_url(base_url, params, params_noencode)
+    local url=nil
+    if string.sub(base_url, -1) == '?' then
+        url=vk_api_server..base_url..'access_token='..cfg.vk_api_access_token
+    else
+        url=vk_api_server..base_url..'&access_token='..cfg.vk_api_access_token
+    end
+    if params then
+        for key,value in pairs(params) do
+            url=url..'&'..key..'='..util.urlencode(value)
+        end    
+    end
+    if params_noencode then
+        for key,value in pairs(params_noencode) do
+            url=url..'&'..key..'='..value
+        end    
+    end
+
+    local params_for_sig=nil
+    if string.sub(base_url, -1) == '?' then
+        params_for_sig=base_url..'access_token='..cfg.vk_api_access_token
+    else
+        params_for_sig=base_url..'&access_token='..cfg.vk_api_access_token
+    end    
+    if params then
+        for key,value in pairs(params) do
+            params_for_sig=params_for_sig..'&'..key..'='..value
+        end    
+    end
+    if params_noencode then
+        for key,value in pairs(params_noencode) do
+            params_for_sig=params_for_sig..'&'..key..'='..value
+        end    
+    end
+    url=url..'&sig='..vk_api_request_signature(params_for_sig, cfg.vk_api_secret)
+    if cfg.debug>0 then print('VK API request URL '..url) end
+    return url
+end
+
+function vk_api_request_signature(request, secret)
+    return(util.md5_string_hash(request..secret))
+end
+
+function unescape_html_string(str)
+    if str then
+        result = string.gsub(str, "&quot;", '"')
+        result = string.gsub(result, "&apos;", "'")
+        result = string.gsub(result, "&amp;", '&')
+        result = string.gsub(result, "&lt;", '<')
+        result = string.gsub(result, "&gt;", '>')
+        return result
+    else
+        return nil
+    end
+end
+
+function vk_is_signed_in()
+    if cfg.vk_api_access_token and cfg.vk_api_secret and cfg.vk_api_user_id then
+        return true
+    else
+        return false
+    end
+end
+
+function vk_check_response_for_errors(response)
+    if response and type(response) == "table" and response.error and type(response.error) == "table" then
+        if cfg.debug>0 then 
+            print('VK API response error code '..response.error.error_code..': '..response.error.error_msg)
+        end
+        return response.error.error_code
+    elseif not response then
+        return "NO RESPONSE"
+    else
+        return nil
+    end
+end
+
+function vk_get_name()
+    if vk_is_signed_in() then
+        local url=vk_api_format_url(vk_api_request_get_user_info, 
+            {['uids']=cfg.vk_api_user_id, ['fields']='first_name,last_name'})
+        local data=http.download(url)
+        if data then
+            local response=json.decode(data)
+            data=nil
+            if vk_check_response_for_errors(response) then
+                return nil
+            else
+                return response.response[1].first_name.." "..response.response[1].last_name
+            end
+        else
+            return nil
+        end
+    else
+        return nil
+    end
+end
+
+function vk_get_groups()
+    if vk_is_signed_in() then
+        local url=vk_api_format_url(vk_api_request_get_user_groups, {['extended']='1'})
+        local data=http.download(url)
+        if data then
+            local response=json.decode(data)
+            data=nil
+            if vk_check_response_for_errors(response) then
+                return nil
+            elseif response and response.response then
+                local groups={}
+                for i,value in pairs(response.response) do
+                    if type(value) == 'table' then
+                        groups[value.gid]=value.name
+                    end
+                end
+                return groups
+            else
+                return nil
+            end
+        else
+            return nil
+        end
+    else
+        return nil
+    end
+end
+
+function vk_get_friends()
+    if vk_is_signed_in() then
+        local url=vk_api_format_url(vk_api_request_get_user_friends, {['fields']='uid,first_name,last_name'})
+        local data=http.download(url)
+        if data then
+            local response=json.decode(data)
+            data=nil
+            if vk_check_response_for_errors(response) then
+                return nil
+            elseif response and response.response then
+                local friends={}
+                for i,value in pairs(response.response) do
+                    if type(value) == 'table' then
+                        friends[value.uid]=value.first_name..'  '..value.last_name
+                    end
+                end
+                return friends
+            else
+                return nil
+            end
+        else
+            return nil
+        end
+    else
+        return nil
+    end
+end
+
+function vk_video_add(vid, oid)
+    if vk_is_signed_in() then
+        local url=vk_api_format_url(vk_api_request_video_add, {['vid']=vid,['oid']=oid})
+        local data=http.download(url)
+        if data then
+            local response=json.decode(data)
+            data=nil
+            if vk_check_response_for_errors(response) then
+                return nil
+            elseif response and response.response then
+                local added_vid = response.response
+                if cfg.debug>0 then 
+                	print('VK API video.add: succesfully added video (vid='..vid..', oid='..oid..') to my page with new vid='..vid)
+                end
+                return added_vid
+            else
+                return nil
+            end
+        else
+            return nil
+        end
+    else
+        return nil
+    end
+end
+
+function vk_video_delete(vid, oid)
+    if vk_is_signed_in() then
+        local url=vk_api_format_url(vk_api_request_video_delete, {['vid']=vid,['oid']=oid})
+        local data=http.download(url)
+        if data then
+            local response=json.decode(data)
+            data=nil
+            if vk_check_response_for_errors(response) then
+                return nil
+            elseif response and response.response then
+                if cfg.debug>0 then 
+                	print('VK API video.delete: succesfully deleted video (vid='..vid..', oid='..oid..') from my page')
+                end
+                return response.response
+            else
+                return nil
+            end
+        else
+            return nil
+        end
+    else
+        return nil
+    end
+end
+
+function vk_video_get_external_player_page(vid, oid)
+    if vk_is_signed_in() then
+        local url=vk_api_format_url(vk_api_request_video_get, {['videos']=oid..'_'..vid})
+        local data=http.download(url)
+        if data then
+            local response=json.decode(data)
+            data=nil
+            if vk_check_response_for_errors(response) then
+                return nil
+            elseif response and response.response then                
+                local player_url = string.gsub(response.response[2].player,"vkontakte%.ru/","vk.com/")
+                if cfg.debug>0 then
+                	print('VK API video.get: external player page for video (vid='..vid..', oid='..oid..') is '..player_url)
+                end
+                return player_url
+            else
+                return nil
+            end
+        else
+            return nil
+        end
+    else
+        return nil
+    end
+end
+
+function vk_video_get_direct_download_link(host, uid, vtag, no_flv, max_hd)
+    if (host and not string.match(host, '/$')) then
+        host=host..'/'
+    end
+    if (host and uid and vtag and max_hd) then
+        if tonumber(max_hd)>=3 then
+            return host..'u'..uid..'/videos/'..vtag..'.'..'720.mp4'
+        end
+        if tonumber(max_hd)>=2 then
+            return host..'u'..uid..'/videos/'..vtag..'.'..'480.mp4'
+        end
+        if tonumber(max_hd)>=1 then
+            return host..'u'..uid..'/videos/'..vtag..'.'..'360.mp4'
+        end
+        if (tonumber(max_hd)>=0 and tonumber(no_flv)==1) then
+            return host..'u'..uid..'/videos/'..vtag..'.'..'240.mp4'
+        end
+        return error_file_video_flash_format_only
+    end
+    return error_file_video_flash_format_only
+end
+
+function get_sort_order(label)
+    if label=="length" then
+        return 1
+    elseif label=="rel" then
+        return 2
+    else
+        return 0
+    end
+end
+
+function vk_api_request_auth(redirect_url)
+    return 'http://oauth.vk.com/authorize?client_id='..vk_app_id..'&scope='..vk_app_scope..'&response_type=token&redirect_uri='..util.urlencode(redirect_url..'/ui/vk_landing')
+end
+
+function ui_vk_landing()
+    http.send("<script>location.href = document.URL.replace('vk_landing', 'vk_update').replace('#', '?');</script>")
+end
+
+function ui_vk_update()
+    local f=io.open(cfg.config_path..'vkontakte.lua','w')
+    if f then
+        if ui_args.access_token and ui_args.secret and ui_args.user_id then
+            f:write('cfg.vk_api_access_token="',ui_args.access_token,'"\ncfg.vk_api_secret="',ui_args.secret,
+                '"\ncfg.vk_api_user_id="',ui_args.user_id,'"\n')
+            http.send('<h3>VKontakte sign-in OK</h3>')
+        else
+            f:write('cfg.vk_api_access_token=""\ncfg.vk_api_secret=""\ncfg.vk_api_user_id=""\n')
+            http.send('<h3>VKontakte sign-in FAILED</h3>')
+            http.send('Error: '..util.urldecode(ui_args.error)..'<br />Error description: '..util.urldecode(ui_args.error_description)..'<br />')
+        end
+        f:close()
+        core.sendevent('config')
+    else
+        http.send('<h3>Error opening config file</h3>')
+    end
+    http.send('<br/><a class="btn btn-info" href="/ui/config">Back</a>')
+end
+
+function ui_vk_status()
+    http.send('<h3>VKontakte Status</h3>')
+    local vk_name=plugins.vkontakte.vk_get_name()
+    if vk_name then
+        http.send('You are signed as <b>'..vk_name..'</b> - <a href="'..plugins.vkontakte.vk_api_request_auth(www_location)..'">sign-in as another user</a>.')
+        http.send('<h4>Groups</h4>')
+        http.send('<table class="table"><tr><th>group name</th><th>feed data</th></tr>')
+        local vk_groups=plugins.vkontakte.vk_get_groups()
+        if vk_groups then
+            for group_id,group_name in pairs(vk_groups) do
+                http.send(string.format('<tr><td><a href="http://vk.com/club%s">%s</a></td><td>group&#47;%s</td></tr>',group_id,group_name,group_id))
+            end
+        end
+        http.send('</table>')
+        http.send('<h4>Firiends</h4>')
+        http.send('<table class="table"><tr><th>friend name</th><th>feed data</th></tr>')
+        local vk_friends=plugins.vkontakte.vk_get_friends()
+        if vk_friends then
+            for user_id,user_name in pairs(vk_friends) do
+                http.send(string.format('<tr><td><a href="http://vk.com/id%s">%s</a></td><td>user&#47;%s</td></tr>',user_id,user_name,user_id))
+            end
+        end
+        http.send('</table>')
+    else
+        http.send('You are not signed in - ')
+        http.send('<a href="'..plugins.vkontakte.vk_api_request_auth(www_location)..'">sign-in</a>.')
+    end
+
+    http.send('<br/><br/><a class="btn btn-primary" href="/ui/vk_status">Refresh</a>')
+end
+
+
+plugins['vkontakte']={}
+plugins.vkontakte.name="VKontakte"
+plugins.vkontakte.desc="my, group/<i>group_id</i>, group/<i>group_id</i>/<i>album_id</i>, user/<i>user_id</i>, user/<i>user_id</i>/<i>album_id</i>, search/<i>search_order</i>/<i>search_string</i>, search_hd/<i>search_order</i>/<i>search_string</i>"..
+"<br/>(<a onclick='window.open(this.href,\'newwin\',\'width=450,scrollbars=yes,toolbar=no,menubar=no\'); return false;' href='/ui/vk_status'>view groups, friends and plugin help</a>)"
+
+plugins.vkontakte.sendurl=vk_sendurl
+plugins.vkontakte.updatefeed=vk_updatefeed
+plugins.vkontakte.vk_api_request_auth=vk_api_request_auth
+plugins.vkontakte.vk_get_name=vk_get_name
+plugins.vkontakte.vk_get_groups=vk_get_groups
+plugins.vkontakte.vk_get_friends=vk_get_friends
+
+plugins.vkontakte.ui_actons=
+{
+    ['vk_landing']      = { 'xupnpd - vkontakte sign-in redirect', ui_vk_landing },
+    ['vk_update']       = { 'xupnpd - vkontakte sign-in result', ui_vk_update },
+    ['vk_status']       = { 'xupnpd - vkontakte status', ui_vk_status }
+}
+
+plugins.vkontakte.ui_vars=
+{
+    { "vk_auth_link",
+        function()
+            local s
+
+            local vk_name=plugins.vkontakte.vk_get_name()
+            if vk_name then
+                s='You are signed as <b>'..vk_name..'</b><br/> <a href="'..plugins.vkontakte.vk_api_request_auth(www_location)..'">sign-in as another user</a><br/>'
+            else
+                s='You are not signed in - <a href="'..plugins.vkontakte.vk_api_request_auth(www_location)..'">sign-in</a><br/>'
+            end
+
+            return s..' <a onclick="window.open(this.href,\'newwin\',\'width=450,scrollbars=yes,toolbar=no,menubar=no\'); return false;" href="/ui/vk_status">status and help</a>'
+        end
+    }
+}
+
+plugins.vkontakte.ui_config_vars=
+{
+    { "select", "vk_private_workaround", "bool" },
+    { "input", "vk_video_count", "int" }
+}
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/xupnpd_youtube.lua
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/xupnpd_youtube.lua	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/plugins/xupnpd_youtube.lua	(revision 27875)
@@ -0,0 +1,261 @@
+-- Copyright (C) 2011-2013 Anton Burdinuk
+-- clark15b@gmail.com
+-- https://tsdemuxer.googlecode.com/svn/trunk/xupnpd
+
+-- 18 - 360p  (MP4,h.264/AVC)
+-- 22 - 720p  (MP4,h.264/AVC) hd
+-- 37 - 1080p (MP4,h.264/AVC) hd
+-- 82 - 360p  (MP4,h.264/AVC)    stereo3d
+-- 83 - 480p  (MP4,h.264/AVC) hq stereo3d
+-- 84 - 720p  (MP4,h.264/AVC) hd stereo3d
+-- 85 - 1080p (MP4,h.264/AVC) hd stereo3d
+
+cfg.youtube_fmt=22
+cfg.youtube_region='*'
+cfg.youtube_video_count=100
+
+youtube_api_url='http://gdata.youtube.com/feeds/mobile/'
+
+function youtube_find_playlist(user,playlist)
+    if string.sub(playlist,1,3)=='id:' then
+        return string.sub(playlist,4)
+    end
+
+    local start_index=1
+    local max_results=50
+
+    while(true) do
+        local feed_data=http.download(youtube_api_url..'users/'..user..'/playlists?alt=json&start-index='..start_index..'&max-results='..max_results)
+
+        if not feed_data then break end
+
+        local x=json.decode(feed_data)
+        feed_data=nil
+
+        if not x or not x.feed or not x.feed.entry then break end
+
+        for i,j in ipairs(x.feed.entry) do
+            if j.title['$t']==playlist then
+                return string.match(j.id['$t'],'.+/([^/]+)$')
+            end
+        end
+        start_index=start_index+max_results
+    end
+
+    return nil
+end
+
+-- username, favorites/username, playlist/username/playlistname, playlist/username/id:playlistid, channel/channelname, search/searchstring
+-- channels: top_rated, top_favorites, most_viewed, most_recent, recently_featured
+function youtube_updatefeed(feed,friendly_name)
+    local rc=false
+
+    local feed_url=nil
+    local feed_urn=nil
+
+    local tfeed=split_string(feed,'/')
+
+    local feed_name='youtube_'..string.lower(string.gsub(feed,"[/ :\'\"]",'_'))
+
+    if tfeed[1]=='channel' then
+        local region=''
+        if cfg.youtube_region and cfg.youtube_region~='*' then region=cfg.youtube_region..'/' end
+        feed_urn='standardfeeds/'..region..tfeed[2]..'?alt=json'
+    elseif tfeed[1]=='favorites' then
+        feed_urn='users/'..tfeed[2]..'/favorites'..'?alt=json'
+    elseif tfeed[1]=='playlist' then
+        local playlist_id=youtube_find_playlist(tfeed[2],tfeed[3])
+
+        if not playlist_id then return false end
+
+        feed_urn='playlists/'..playlist_id..'?alt=json'
+
+    elseif tfeed[1]=='search' then
+        feed_urn='videos?vq='..util.urlencode(tfeed[2])..'&alt=json'
+    else
+        feed_urn='users/'..tfeed[1]..'/uploads?orderby=published&alt=json'
+    end
+
+    local feed_m3u_path=cfg.feeds_path..feed_name..'.m3u'
+    local tmp_m3u_path=cfg.tmp_path..feed_name..'.m3u'
+
+    local dfd=io.open(tmp_m3u_path,'w+')
+
+    if dfd then
+        dfd:write('#EXTM3U name=\"',friendly_name or feed_name,'\" type=mp4 plugin=youtube\n')
+
+        local start_index=1
+        local max_results=50
+        local count=0
+
+        while(count<cfg.youtube_video_count) do
+
+            local url=youtube_api_url..feed_urn..'&start-index='..start_index..'&max-results='..max_results
+
+            if cfg.debug>0 then print('YouTube try url '..url) end
+
+            local feed_data=http.download(url)
+
+            if not feed_data then break end
+
+            local x=json.decode(feed_data)
+
+            feed_data=nil
+
+            if not x or not x.feed or not x.feed.entry then break end
+
+            local n=0
+
+            for i,j in ipairs(x.feed.entry) do
+                local title=j.title['$t']
+
+                local url=nil
+                for ii,jj in ipairs(j.link) do
+                    if jj['type']=='text/html' then url=jj.href break end
+                end
+
+                local logo=nil
+
+                local thumb=j['media$group']['media$thumbnail']
+
+                if thumb and thumb[1] then
+                    logo=thumb[1].url
+                end
+
+                if logo and title and url then
+                    dfd:write('#EXTINF:0 logo=',logo,' ,',title,'\n',url,'\n')
+
+                    n=n+1
+                end
+
+            end
+
+            if n<1 then break else count=count+n end
+
+            start_index=start_index+max_results
+        end
+
+        dfd:close()
+
+        if util.md5(tmp_m3u_path)~=util.md5(feed_m3u_path) then
+            if os.execute(string.format('mv %s %s',tmp_m3u_path,feed_m3u_path))==0 then
+                if cfg.debug>0 then print('YouTube feed \''..feed_name..'\' updated') end
+                rc=true
+            end
+        else
+            util.unlink(tmp_m3u_path)
+        end
+    end
+
+    return rc
+end
+
+function youtube_sendurl(youtube_url,range)
+    local url=nil
+    if plugin_sendurl_from_cache(youtube_url,range) then return end
+
+    url=youtube_get_video_url(youtube_url)
+    if url then
+        if cfg.debug>0 then print('YouTube Real URL: '..url) end
+
+        plugin_sendurl(youtube_url,url,range)
+    else
+        if cfg.debug>0 then print('YouTube clip is not found') end
+
+        plugin_sendfile('www/corrupted.mp4')
+    end
+end
+
+function youtube_get_best_fmt(urls,fmt)
+    if fmt>81 and fmt<86 then -- 3d
+        local i=fmt while(i>81) do
+            if urls[i] then return urls[i] end
+            i=i-1
+        end
+
+        local t={ [82]=18, [83]=18, [84]=22, [85]=37 }
+
+        fmt=t[fmt]
+    end
+
+    local t={ 37,22,18 }
+    local t2={ [18]=true, [22]=true, [37]=true }
+
+    for i=1,3,1 do
+        local u=urls[ t[i] ]
+
+        if u and t2[fmt] and t[i]<=fmt then return u end
+    end
+
+    return urls[18]
+end
+
+function youtube_get_video_url(youtube_url)
+    local url=nil
+
+    local clip_page=plugin_download(youtube_url)
+    if clip_page then
+        local s=json.decode(string.match(clip_page,'ytplayer.config%s*=%s*({.-});'))
+
+        clip_page=nil
+
+        local stream_map=nil
+
+-- s.args.adaptive_fmts
+-- itag 137: 1080p
+-- itag 136: 720p
+-- itag 135: 480p
+-- itag 134: 360p
+-- itag 133: 240p
+-- itag 160: 144
+
+        if s.args then stream_map=s.args.url_encoded_fmt_stream_map end
+
+        local fmt=string.match(youtube_url,'&fmt=(%w+)$')
+
+        if not fmt then fmt=cfg.youtube_fmt end
+
+        if stream_map then
+            local urls={}
+
+            for i in string.gmatch(stream_map,'([^,]+)') do
+                local item={}
+                for j in string.gmatch(i,'([^&]+)') do
+                    local name,value=string.match(j,'(%w+)=(.+)')
+                    if name then
+                        --print(name,util.urldecode(value))
+                        item[name]=util.urldecode(value)
+                    end
+                end
+
+                urls[tonumber(item['itag'])]=item['url']..'&signature='..(item['sig'] or item['s'])
+
+                --print('\n')
+            end
+
+            url=youtube_get_best_fmt(urls,tonumber(fmt))
+        end
+
+        return url
+    else
+        if cfg.debug>0 then print('YouTube clip is not found') end
+        return nil
+    end
+end
+
+plugins['youtube']={}
+plugins.youtube.name="YouTube"
+plugins.youtube.desc="<i>username</i>, favorites/<i>username</i>, playlist/<i>username</i>/<i>playlistname</i>, playlist/<i>username</i>/id:<i>playlistid</i>, channel/<i>channelname</i>, search/<i>search_string</i>"..
+"<br/><b>YouTube channels</b>: top_rated, top_favorites, most_viewed, most_recent, recently_featured"
+plugins.youtube.sendurl=youtube_sendurl
+plugins.youtube.updatefeed=youtube_updatefeed
+plugins.youtube.getvideourl=youtube_get_video_url
+
+plugins.youtube.ui_config_vars=
+{
+    { "select", "youtube_fmt", "int" },
+    { "select", "youtube_region" },
+    { "input",  "youtube_video_count", "int" }
+}
+
+--youtube_updatefeed('channel/top_rated','')
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/profiles/bravia.lua
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/profiles/bravia.lua	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/profiles/bravia.lua	(revision 27875)
@@ -0,0 +1,34 @@
+profiles['BRAVIA']=
+{
+    ['desc']='Sony BRAVIA',
+
+--X-AV-Physical-Unit-Info: pa="BRAVIA KDL-22EX553";
+--X-AV-Client-Info: av=5.0; cn="Sony Corporation"; mn="BRAVIA KDL-22EX553"; mv="1.7";
+--User-Agent: UPnP/1.0 DLNADOC/1.50
+
+    ['match']=function(user_agent,req)
+        local s = req['x-av-client-info'] 
+        if s and string.find(s,'BRAVIA ',1,true) then 
+            return true 
+        else 
+            return false 
+            end 
+        end,
+
+    ['options']=
+    {
+        ['upnp_albumart'] = 1, -- 1: <res>direct url<res> OR 3: <res protocolInfo="http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN">http://127.0.0.1:4044/logo?s=0%2F1%2F14%2F33</res>
+        ['dlna_headers']=true,
+        ['dlna_extras']=true
+    },
+
+    ['mime_types']=
+    {
+        -- video streams
+        ['xvid']   =  { upnp_type.video, upnp_class.video,  'video/avi',        upnp_proto.avi,         dlna_org_extras.none},
+        ['divx']   =  { upnp_type.video, upnp_class.video,  'video/avi',        upnp_proto.avi,         dlna_org_extras.none},
+        ['avi']    =  { upnp_type.video, upnp_class.video,  'video/avi',        upnp_proto.avi,         dlna_org_extras.none},
+        ['mpeg']   =  { upnp_type.video, upnp_class.video,  'video/mpeg',       upnp_proto.mpeg,        dlna_org_extras.none},
+        ['mpg']    =  { upnp_type.video, upnp_class.video,  'video/mpeg',       upnp_proto.mpeg,        dlna_org_extras.none}
+    }
+}
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/profiles/lg.lua
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/profiles/lg.lua	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/profiles/lg.lua	(revision 27875)
@@ -0,0 +1,71 @@
+lg_dlna_org_extras='DLNA.ORG_OP=01;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000'
+
+profiles['LG']=
+{
+    ['desc']='LG TV',
+
+    -- Linux/2.6.31-1.0 UPnP/1.0 DLNADOC/1.50 INTEL_NMPR/2.0 LGE_DLNA_SDK/1.5.0
+    -- Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1; LG_UA; AD_LOGON=LGE.NET; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648; LG_UA; AD_LOGON=LGE.NET; LG NetCast.TV-2010)
+    ['match']=function(user_agent)
+                if string.find(user_agent,'LGE_DLNA_SDK',1,true) or string.find(user_agent,'LG NetCast',1,true)
+                    then return true
+                else
+                    return false
+                end
+            end,
+
+    ['options']=
+    {
+        ['content_disp']=true
+    },
+
+    ['replace_mime_types']=true,
+
+    ['mime_types']=
+    {
+        ['ogm']   = { upnp_type.video,  upnp_class.video,  'video/ogg',             'http-get:*:video/ogg:',            lg_dlna_org_extras },
+        ['oga']   = { upnp_type.audio,  upnp_class.audio,  'audio/ogg',             'http-get:*:audio/ogg:',            lg_dlna_org_extras },
+        ['aac']   = { upnp_type.audio,  upnp_class.audio,  'audio/x-aac',           upnp_proto.aac,                     lg_dlna_org_extras },
+        ['asx']   = { upnp_type.video,  upnp_class.video,  'video/x-ms-asf',        upnp_proto.asf,                     lg_dlna_org_extras },
+        ['mka']   = { upnp_type.audio,  upnp_class.audio,  'audio/x-matroska',      upnp_proto.mka,                     lg_dlna_org_extras },
+        ['avi']   = { upnp_type.video,  upnp_class.video,  'video/x-mpeg',          'http-get:*:video/x-mpeg:',         lg_dlna_org_extras },
+        ['m2ts']  = { upnp_type.video,  upnp_class.video,  'video/x-matroska',      upnp_proto.mkv,                     lg_dlna_org_extras },
+        ['txt']   = { upnp_type.video,  upnp_class.video,  'video/subtitle',        'http-get:*:video/subtitle:',       lg_dlna_org_extras },
+        ['mpe']   = { upnp_type.video,  upnp_class.video,  'video/mpeg',            upnp_proto.mpeg,                    lg_dlna_org_extras },
+        ['m3u']   = { upnp_type.audio,  upnp_class.audio,  'audio/x-mpegurl',       'http-get:*:audio/x-mpegurl:',      lg_dlna_org_extras },
+        ['3gp']   = { upnp_type.video,  upnp_class.video,  'video/3gpp',            upnp_proto['3gp'],                  lg_dlna_org_extras },
+        ['mp2p']  = { upnp_type.video,  upnp_class.video,  'video/x-matroska',      upnp_proto.mkv,                     lg_dlna_org_extras },
+        ['srt']   = { upnp_type.video,  upnp_class.video,  'video/subtitle',        'http-get:*:video/subtitle:',       lg_dlna_org_extras },
+        ['wvx']   = { upnp_type.video,  upnp_class.video,  'video/x-ms-wvx',        'http-get:*:video/x-ms-wvx:',       lg_dlna_org_extras },
+        ['trp']   = { upnp_type.video,  upnp_class.video,  'video/x-msvideo',       'http-get:*:video/x-msvideo:',      lg_dlna_org_extras },
+        ['flv']   = { upnp_type.video,  upnp_class.video,  'video/x-flv',           upnp_proto.flv,                     lg_dlna_org_extras },
+        ['ogv']   = { upnp_type.video,  upnp_class.video,  'video/ogg',             'http-get:*:video/ogg:',            lg_dlna_org_extras },
+        ['mpg']   = { upnp_type.video,  upnp_class.video,  'video/x-mpeg',          'http-get:*:video/x-mpeg:',         lg_dlna_org_extras },
+        ['mkv']   = { upnp_type.video,  upnp_class.video,  'video/x-mkv',           'http-get:*:video/x-mkv:',          lg_dlna_org_extras },
+        ['divx']  = { upnp_type.video,  upnp_class.video,  'video/x-msvideo',       'http-get:*:video/x-msvideo:',      lg_dlna_org_extras },
+        ['mp3']   = { upnp_type.audio,  upnp_class.audio,  'audio/mpeg',            upnp_proto.mp3,                     lg_dlna_org_extras },
+        ['wmv']   = { upnp_type.video,  upnp_class.video,  'video/x-ms-wmv',        upnp_proto.wmv,                     lg_dlna_org_extras },
+        ['asf']   = { upnp_type.video,  upnp_class.video,  'video/x-ms-asf',        upnp_proto.asf,                     lg_dlna_org_extras },
+        ['wm']    = { upnp_type.video,  upnp_class.video,  'video/x-ms-wm',         'http-get:*:video/x-ms-wm:',        lg_dlna_org_extras },
+        ['wax']   = { upnp_type.audio,  upnp_class.audio,  'audio/x-ms-wax',        'http-get:*:audio/x-ms-wax:',       lg_dlna_org_extras },
+        ['wma']   = { upnp_type.audio,  upnp_class.audio,  'audio/x-ms-wma',        upnp_proto.wma,                     lg_dlna_org_extras },
+        ['sub']   = { upnp_type.video,  upnp_class.video,  'video/subtitle',        'http-get:*:video/subtitle:',       lg_dlna_org_extras },
+        ['ts']    = { upnp_type.video,  upnp_class.video,  'video/x-matroska',      upnp_proto.mkv,                     lg_dlna_org_extras },
+        ['vob']   = { upnp_type.video,  upnp_class.video,  'video/mpeg',            upnp_proto.mpeg,                    lg_dlna_org_extras },
+        ['mpeg']  = { upnp_type.video,  upnp_class.video,  'video/x-mpeg',          'http-get:*:video/x-mpeg:',         lg_dlna_org_extras },
+        ['mp2t']  = { upnp_type.video,  upnp_class.video,  'video/x-matroska',      upnp_proto.mkv,                     lg_dlna_org_extras },
+        ['wmx']   = { upnp_type.video,  upnp_class.video,  'video/x-ms-wmx',        'http-get:*:video/x-ms-wmx:',       lg_dlna_org_extras },
+        ['ogg']   = { upnp_type.audio,  upnp_class.audio,  'audio/ogg',             'http-get:*:audio/ogg:',            lg_dlna_org_extras },
+        ['m4a']   = { upnp_type.audio,  upnp_class.audio,  'audio/mp4',             'http-get:*:audio/mp4:',            lg_dlna_org_extras },
+        ['m4v']   = { upnp_type.video,  upnp_class.video,  'video/mp4',             upnp_proto.mp4,                     lg_dlna_org_extras },
+        ['mp4']   = { upnp_type.video,  upnp_class.video,  'video/mpeg',            upnp_proto.mpeg,                    lg_dlna_org_extras },
+        ['mpeg2'] = { upnp_type.video,  upnp_class.video,  'video/x-mpeg',          'http-get:*:video/x-mpeg:',         lg_dlna_org_extras },
+        ['tp']    = { upnp_type.video,  upnp_class.video,  'video/x-msvideo',       'http-get:*:video/x-msvideo:',      lg_dlna_org_extras },
+        ['pls']   = { upnp_type.audio,  upnp_class.audio,  'audio/x-scpls',         'http-get:*:audio/x-scpls:',        lg_dlna_org_extras },
+        ['mpeg1'] = { upnp_type.video,  upnp_class.video,  'video/x-mpeg',          'http-get:*:video/x-mpeg:',         lg_dlna_org_extras },
+        ['ac3']   = { upnp_type.audio,  upnp_class.audio,  'audio/x-ac3',           upnp_proto.ac3,                     lg_dlna_org_extras },
+        ['mov']   = { upnp_type.video,  upnp_class.video,  'video/x-quicktime',     'http-get:*:video/x-quicktime:',    lg_dlna_org_extras }
+    }
+}
+
+profiles['LG'].mime_types['mpeg']=profiles['LG'].mime_types['avi']
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/profiles/samsung.lua
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/profiles/samsung.lua	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/profiles/samsung.lua	(revision 27875)
@@ -0,0 +1,32 @@
+sec_dlna_org_extras_none='*;DLNA.ORG_OP=00;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000'
+
+profiles['Samsung-AllShare']=
+{
+    ['desc']='Samsung AllShare uPnP/DLNA',
+
+    -- SEC_HHP_[TV]UE32ES6757/1.0 DLNADOC/1.50
+    ['match']=function(user_agent) if string.find(user_agent,'SEC_HHP_',1,true) then return true else return false end end,
+
+    ['options']=
+    {
+        ['upnp_feature_list']=
+            '<?xml version="1.0" encoding="utf-8"?>'..
+            '<Features xmlns="urn:schemas-upnp-org:av:avs" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" '..
+            'xsi:schemaLocation="urn:schemas-upnp-org:av:avs http://www.upnp.org/schemas/av/avs.xsd">'..
+            '<Feature name="samsung.com_BASICVIEW" version="1">'..
+            '<container id="1" type="object.item.audioItem"/>'..
+            '<container id="2" type="object.item.videoItem"/>'..
+            '<container id="3" type="object.item.imageItem"/>'..
+            '</Feature>'..
+            '</Features>',
+
+        ['upnp_albumart']=3,     -- <res protocolInfo="http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN">http://127.0.0.1:4044/logo?s=0%2F1%2F14%2F33</res>
+        ['sec_extras']=true
+    },
+
+    ['mime_types']=
+    {
+        ['mp4']    = { upnp_type.video, upnp_class.video, 'video/mp4',       upnp_proto.mp4,   sec_dlna_org_extras_none },
+        ['mkv']    = { upnp_type.video, upnp_class.video, 'video/x-mkv',     upnp_proto.mkv,   sec_dlna_org_extras_none }
+    }
+}
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/profiles/skel/skel.lua
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/profiles/skel/skel.lua	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/profiles/skel/skel.lua	(revision 27875)
@@ -0,0 +1,52 @@
+-- Copyright (C) 2011-2012 Anton Burdinuk
+-- clark15b@gmail.com
+-- https://tsdemuxer.googlecode.com/svn/trunk/xupnpd
+
+-- skeleton
+
+profiles['Skeleton']=
+{
+    -- comment this for enable
+    ['disabled']=true,
+
+    -- device description
+    ['desc']='Skeleton for example',
+
+    -- function which identifies device by User-Agent HTTP header (must return true or false)
+    ['match']=function(user_agent)
+                if string.find(user_agent,'User-Agent of Device',1,true) then
+                    return true
+                else
+                    return false
+                end
+            end,
+
+    -- any option from 'cfg' namespace, cfg.dlna_headers for example; expect description in '-- options for profiles' of xupnpd_main.lua
+    ['options']=
+    {
+        ['dev_desc_xml']='/dev.xml',                            -- UPnP Device Description XML (/dev.xml, /wmc.xml)
+        ['upnp_container']='object.container',                  -- UPnP class for containers (object.container, object.container.storageFolder)
+        ['upnp_artist']=false,                                  -- send <upnp:artist> / <upnp:actor> in SOAP response
+        ['upnp_feature_list']='',                               -- X_GetFeatureList response body (XML)
+        ['upnp_albumart']=0,                                    -- 0: <upnp:albumArtURI>direct url</upnp:albumArtURI>, 1: <res>direct url<res>, 2: <upnp:albumArtURI>local url</upnp:
+        ['dlna_headers']=true,                                  -- send TransferMode.DLNA.ORG and ContentFeatures.DLNA.ORG in HTTP response
+        ['dlna_extras']=true,                                   -- DLNA extras in headers and SOAP
+        ['cfg.content_disp']=false,                             -- send Content-Disposition when streaming
+        ['soap_length']=true,                                   -- send Content-Length in SOAP response
+        ['cfg.wdtv']=false,                                     -- WDTV Live compatible mode
+        ['cfg.sec_extras']=false                                -- Samsung extras
+--      ...
+    },
+
+    -- replace mime={} or join with mime_types={}
+    ['replace_mime_types']=true
+
+    -- any exist in mime={} or new file type, expect xupnpd_mime.lua
+    ['mime_types']=
+    {
+        ['avi']    = { upnp_type.video, upnp_class.video, 'video/avi',       upnp_proto.avi,   dlna_org_extras.divx5 },
+        ['asf']    = { upnp_type.video, upnp_class.video, 'video/x-ms-asf',  upnp_proto.asf,   dlna_org_extras.asf_mpeg4_sp }
+--      ...
+    }
+}
+
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/profiles/vlc-1_0_6.lua
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/profiles/vlc-1_0_6.lua	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/profiles/vlc-1_0_6.lua	(revision 27875)
@@ -0,0 +1,24 @@
+-- for VLC 1.0.6
+
+profiles['VLC-1.0.6']=
+{
+    ['desc']='VideoLAN Player 1.0.6',
+
+    -- Linux/2.6.32-42-generic, UPnP/1.0, Portable SDK for UPnP devices/1.6.6
+    -- VLC media player - version 1.0.6 Goldeneye - (c) 1996-2010 the VideoLAN team
+    -- Linux/3.2.0-4-686-pae, UPnP/1.0, Portable SDK for UPnP devices/1.6.17" 
+    ['match']=function(user_agent)
+                if string.find(user_agent,'UPnP devices/1.6.',1,true) or string.find(user_agent,'VideoLAN',1,true) then
+                    return true
+                else
+                    return false
+                end
+            end,
+
+    ['options']=
+    {
+        ['soap_length']=false
+    },
+
+    ['mime_types']={}
+}
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/profiles/wdtv.lua
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/profiles/wdtv.lua	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/profiles/wdtv.lua	(revision 27875)
@@ -0,0 +1,16 @@
+profiles['WDTV-Live']=
+{
+    ['disabled']=true,
+
+    ['desc']='WD TV Live',
+
+    -- INTEL_NMPR/2.1 DLNADOC/1.50 Intel MicroStack/1.0.1423
+    ['match']=function(user_agent) if string.find(user_agent,'MicroStack/1.0.1423',1,true) then return true else return false end end,
+
+    ['options']=
+    {
+        ['wdtv']=true
+    },
+
+    ['mime_types']={}
+}
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/profiles/wmp.lua
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/profiles/wmp.lua	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/profiles/wmp.lua	(revision 27875)
@@ -0,0 +1,22 @@
+profiles['MediaPlayer']=
+{
+    ['desc']='Windows Media Player',
+
+    -- Microsoft-Windows/6.1 UPnP/1.0 Windows-Media-Player-DMS/12.0.7601.17514 DLNADOC/1.50
+    -- Microsoft-Windows/6.1 UPnP/1.0 Windows-Media-Player/12.0.7601.17514 DLNADOC/1.50 (MS-DeviceCaps/1024)
+    -- NSPlayer/12.00.7601.17514 WMFSDK/12.00.7601.17514
+    ['match']=function(user_agent)
+                if string.find(user_agent,'Windows-Media-Player',1,true) or string.find(user_agent,'NSPlayer',1,true) then
+                    return true
+                else
+                    return false
+                end
+            end,
+
+    ['options']=
+    {
+        ['upnp_artist']=true
+    },
+
+    ['mime_types']={}
+}
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/profiles/xbox360.lua
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/profiles/xbox360.lua	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/profiles/xbox360.lua	(revision 27875)
@@ -0,0 +1,17 @@
+profiles['Xbox360']=
+{
+    ['desc']='Microsoft Xbox 360',
+
+    -- Xbox/2.0.12611.0 UPnP/1.0 Xbox/2.0.12611.0
+    ['match']=function(user_agent) if string.find(user_agent,'Xbox',1,true) then return true else return false end end,
+
+    ['options']=
+    {
+        ['dev_desc_xml']='/wmc.xml',
+        ['dlna_extras']=true,
+        ['upnp_container']='object.container.storageFolder',
+        ['upnp_artist']=true
+    },
+
+    ['mime_types']={}
+}
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/ui/api.txt
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/ui/api.txt	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/ui/api.txt	(revision 27875)
@@ -0,0 +1,56 @@
+wget -q -O - 'http://127.0.0.1:4044/ui/api?action=add_feed&plugin=youtube&feed=thelonelyisland&name=The+Lonely+Island'
+OK
+
+wget -q -O - 'http://127.0.0.1:4044/ui/api?action=feeds'
+1;Vimeo HD Channel
+2;HD Xtreme sports
+3;Mountain Bike Channel
+4;YouTube Top Rated
+5;GT - PS3 - Review
+6;GT - PS3 - Preview
+7;GT - PS3 - Gameplay
+8;GiantBomb - All
+9;AG - New
+10;IVI - New
+11;The Lonely Island
+
+wget -q -O - 'http://127.0.0.1:4044/ui/api?action=remove_feed&id=11'
+OK
+
+wget -q -O - 'http://127.0.0.1:4044/ui/api?action=save_feeds'
+OK
+
+wget -q -O - 'http://127.0.0.1:4044/ui/api?action=update_feeds'
+OK
+
+wget -q -O - 'http://127.0.0.1:4044/ui/api?action=reload'
+OK
+
+wget -q -O - 'http://127.0.0.1:4044/ui/api?action=status'
+22578;127.0.0.1 Battlefield 1943 Theme Song
+
+wget -q -O - 'http://127.0.0.1:4044/ui/api?action=kill&pid=22578'
+OK
+
+wget -q -O - 'http://127.0.0.1:4044/ui/api?action=playlists'
+1;Mozhay.tv
+2;AG - New
+3;Battlefield theme songs
+4;GT - PS3 - Gameplay
+5;GT - PS3 - Preview
+6;GT - PS3 - Review
+7;GiantBomb - All
+8;IVI - New
+9;Vimeo HD Channel
+10;HD Xtreme sports
+11;Mountain Bike Channel
+12;YouTube Top Rated
+
+wget -q -O - 'http://127.0.0.1:4044/ui/api?action=playlist&id=12'
+1;http://i.ytimg.com/vi/KQ6zr6kCPj8/1.jpg;LMFAO - Party Rock Anthem ft. Lauren Bennett, GoonRock
+2;http://i.ytimg.com/vi/kffacxfA7G4/1.jpg;Justin Bieber - Baby ft. Ludacris
+3;http://i.ytimg.com/vi/j5-yKhDd64s/1.jpg;Eminem - Not Afraid
+4;http://i.ytimg.com/vi/uelHwf8o7_U/1.jpg;Eminem - Love The Way You Lie ft. Rihanna
+5;http://i.ytimg.com/vi/fLexgOxsZu0/1.jpg;Bruno Mars - The Lazy Song [Official Video]
+6;http://i.ytimg.com/vi/rYEDA3JcQqw/1.jpg;Adele - Rolling In The Deep
+7;http://i.ytimg.com/vi/t4H_Zoh7G5A/1.jpg;Jennifer Lopez - On The Floor ft. Pitbull
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/ui/bootstrap.min.css
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/ui/bootstrap.min.css	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/ui/bootstrap.min.css	(revision 27875)
@@ -0,0 +1,9 @@
+/*!
+ * Bootstrap v2.2.1
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover{color:#005580;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}.text-warning{color:#c09853}a.text-warning:hover{color:#a47e3c}.text-error{color:#b94a48}a.text-error:hover{color:#953b39}.text-info{color:#3a87ad}a.text-info:hover{color:#2d6987}.text-success{color:#468847}a.text-success:hover{color:#356635}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:25px}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal;cursor:pointer}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:20px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info>label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{margin-bottom:5px;font-size:0;white-space:nowrap}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn,.input-append select+.btn-group .btn,.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child,.table-bordered tfoot:last-child tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child,.table-bordered tfoot:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9}.table-hover tbody tr:hover td,.table-hover tbody tr:hover th{background-color:#f5f5f5}table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success td{background-color:#dff0d8}.table tbody tr.error td{background-color:#f2dede}.table tbody tr.warning td{background-color:#fcf8e3}.table tbody tr.info td{background-color:#d9edf7}.table-hover tbody tr.success:hover td{background-color:#d0e9c6}.table-hover tbody tr.error:hover td{background-color:#ebcccc}.table-hover tbody tr.warning:hover td{background-color:#faf2cc}.table-hover tbody tr.info:hover td{background-color:#c4e3f3}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu li>a:hover,.dropdown-menu li>a:focus,.dropdown-submenu:hover>a{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#333;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu .disabled>a,.dropdown-menu .disabled>a:hover{color:#999}.dropdown-menu .disabled>a:hover{text-decoration:none;cursor:default;background-color:transparent;background-image:none}.open{*z-index:1000}.open>.dropdown-menu{display:block}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;*line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #bbb;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#a2a2a2;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover{color:#333;text-decoration:none;background-color:#e6e6e6;*background-color:#d9d9d9;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-color:#e6e6e6;background-color:#d9d9d9 \9;background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-color:#e6e6e6;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:2px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini{padding:1px 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn{border-color:#c5c5c5;border-color:rgba(0,0,0,0.15) rgba(0,0,0,0.15) rgba(0,0,0,0.25)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006dcc;*background-color:#04c;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0044cc',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary:active,.btn-primary.active{background-color:#039 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;*background-color:#222;background-image:-moz-linear-gradient(top,#444,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#08c;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover{color:#005580;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover{color:#333;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar .btn+.btn,.btn-toolbar .btn-group+.btn,.btn-toolbar .btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu{font-size:14px}.btn-group>.btn-mini{font-size:11px}.btn-group>.btn-small{font-size:12px}.btn-group>.btn-large{font-size:16px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-mini .caret,.btn-small .caret,.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical .btn{display:block;float:none;width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical .btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical .btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical .btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical .btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical .btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;color:#c09853;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#08c}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav .dropdown-toggle:hover .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible;color:#777}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff2f2f2',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.navbar .brand:hover{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px}.navbar-link{color:#777}.navbar-link:hover{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:6px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#333;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ededed;*background-color:#e5e5e5;background-image:-moz-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#e5e5e5));background-image:-webkit-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-o-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2',endColorstr='#ffe5e5e5',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777;border-bottom-color:#777}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse{color:#999}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover{color:#fff}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;*background-color:#040404;background-image:-moz-linear-gradient(top,#151515,#040404);background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb .divider{padding:0 5px;color:#ccc}.breadcrumb .active{color:#999}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:1px 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover{text-decoration:none;background-color:#f5f5f5}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>span{color:#999;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:50%;left:50%;z-index:1050;width:560px;margin:-250px 0 0 -280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:50%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{margin-top:-3px}.tooltip.right{margin-left:3px}.tooltip.bottom{margin-top:3px}.tooltip.left{margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;width:236px;padding:1px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover-content p,.popover-content ul,.popover-content ol{margin-bottom:0}.popover .arrow,.popover .arrow:after{position:absolute;display:inline-block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow:after{z-index:-1;content:""}.popover.top .arrow{bottom:-10px;left:50%;margin-left:-10px;border-top-color:#fff;border-width:10px 10px 0}.popover.top .arrow:after{bottom:-1px;left:-11px;border-top-color:rgba(0,0,0,0.25);border-width:11px 11px 0}.popover.right .arrow{top:50%;left:-10px;margin-top:-10px;border-right-color:#fff;border-width:10px 10px 10px 0}.popover.right .arrow:after{bottom:-11px;left:-1px;border-right-color:rgba(0,0,0,0.25);border-width:11px 11px 11px 0}.popover.bottom .arrow{top:-10px;left:50%;margin-left:-10px;border-bottom-color:#fff;border-width:0 10px 10px}.popover.bottom .arrow:after{top:-1px;left:-11px;border-bottom-color:rgba(0,0,0,0.25);border-width:0 11px 11px}.popover.left .arrow{top:50%;right:-10px;margin-top:-10px;border-left-color:#fff;border-width:10px 0 10px 10px}.popover.left .arrow:after{right:-1px;bottom:-11px;border-left-color:rgba(0,0,0,0.25);border-width:11px 0 11px 11px}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover{border-color:#08c;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media .pull-left{margin-right:10px}.media .pull-right{margin-left:10px}.media-list{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}a.label:hover,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel .item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel .item>img{display:block;line-height:1}.carousel .active,.carousel .next,.carousel .prev{display:block}.carousel .active{left:0}.carousel .next,.carousel .prev{position:absolute;top:0;width:100%}.carousel .next{left:100%}.carousel .prev{left:-100%}.carousel .next.left,.carousel .prev.right{left:0}.carousel .active.left{left:-100%}.carousel .active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/ui/ui_config.html
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/ui/ui_config.html	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/ui/ui_config.html	(revision 27875)
@@ -0,0 +1,196 @@
+<h4>Plugins</h4>
+
+<form method=post action="/ui/apply">
+
+<div class="controls controls-row">
+	<div class="span4">VK.com:</div>
+	<div class="span4">${vk_auth_link}</div>
+</div>
+
+<div class="controls controls-row">
+	<div class="span4">VK.com private videos and groups workaround:</div>
+	<select class="span4" name=vk_private_workaround id=vk_private_workaround>
+		<option value="false">no</option>
+		<option selected value="true">yes</option>
+	</select>
+</div>
+
+<div class="controls controls-row">
+	<div class="span4">VK.com maximum videos (max 200):</div>
+	<input class="span4" type=text name=vk_video_count id=vk_video_count>
+</div>
+<br/>
+
+<div class="controls controls-row">
+<div class="span4">Maximum YouTube quality:</div>
+<select class="span4" class="span4" name=youtube_fmt id=youtube_fmt>
+<option value=18>360p</option>
+<option selected value=22>720p</option>
+<option value=37>1080p</option>
+<option value=84>720p 3D</option>
+<option value=85>1080p 3D</option>
+</select>
+</div>
+
+<div class="controls controls-row">
+<div class="span4">YouTube region:</div>
+<select class="span4" name=youtube_region id=youtube_region>
+<option selected value="*">*</option>
+<option value=AU>AU</option>
+<option value=BR>BR</option>
+<option value=CA>CA</option>
+<option value=FR>FR</option>
+<option value=DE>DE</option>
+<option value=GB>GB</option>
+<option value=NL>NL</option>
+<option value=HK>HK</option>
+<option value=IE>IE</option>
+<option value=IT>IT</option>
+<option value=JP>JP</option>
+<option value=MX>MX</option>
+<option value=NZ>NZ</option>
+<option value=PL>PL</option>
+<option value=RU>RU</option>
+<option value=KR>KR</option>
+<option value=ES>ES</option>
+<option value=TW>TW</option>
+<option value=US>US</option>
+</select>
+</div>
+
+<div class="controls controls-row">
+<div class="span4">YouTube maximum videos:</div><input type=text class="span4" name=youtube_video_count id=youtube_video_count>
+</div>
+
+<div class="controls controls-row">
+<div class="span4">Vimeo maximum videos:</div><input type=text class="span4" name=vimeo_video_count id=vimeo_video_count>
+</div>
+
+<div class="controls controls-row">
+<div class="span4">ivi.ru quality:</div>
+<select class="span4" name=ivi_fmt id=ivi_fmt>
+<option value="MP4-lo">Low</option>
+<option selected value="MP4-hi">High</option>
+</select>
+</div>
+
+<div class="controls controls-row">
+<div class="span4">ivi.ru maximum videos:</div><input type=text class="span4" name=ivi_video_count id=ivi_video_count>
+</div>
+
+<div class="controls controls-row">
+<div class="span4">AG.ru quality:</div>
+<select class="span4" name=ag_fmt id=ag_fmt>
+<option selected value="200p">200p</option>
+<option value="400p">400p</option>
+<option value="400pd">400p 60fps</option>
+<option value="720p">720p</option>
+<option value="720pd">720p 60fps</option>
+</select>
+</div>
+
+<div class="controls controls-row">
+<div class="span4">GameTrailers maximum videos:</div><input type=text class="span4" name=gametrailers_video_count id=gametrailers_video_count>
+</div>
+
+<hr/>
+
+<h4>Common (restart needed)</h4>
+
+<div class="controls controls-row">
+<div class="span4">Device name:</div><input class="span4" type=text name=name id=name>
+</div>
+
+<div class="controls controls-row">
+<div class="span4">* Device UUID (empty for dynamic): </div><input class="span4" type=text name=uuid id=uuid>
+</div>
+
+<div class="controls controls-row">
+<div class="span4">Default mime type (<a href="/ui/mhelp">mpeg, mpeg_ts, ...</a>):</div>
+<input class="span4" type=text name=default_mime_type id=default_mime_type>
+</div>
+
+<div class="controls controls-row">
+<div class="span4">SSDP announcement interface (LAN):</div><input class="span4" type=text name=ssdp_interface id=ssdp_interface>
+</div>
+
+<div class="controls controls-row">
+<div class="span4">* SSDP announcement interval (sec):</div><input class="span4" type=text name=ssdp_notify_interval id=ssdp_notify_interval>
+</div>
+
+<div class="controls controls-row">
+<div class="span4">* SSDP max age (sec):</div><input type=text class="span4" name=ssdp_max_age id=ssdp_max_age>
+</div>
+
+<div class="controls controls-row">
+<div class="span4">HTTP Port:</div><input type=text class="span4" name=http_port id=http_port>
+</div>
+
+<div class="controls controls-row">
+<div class="span4">* HTTP User-Agent:</div><input class="span4" type=text name=user_agent id=user_agent>
+</div>
+
+<div class="controls controls-row">
+<div class="span4">* HTTP Timeout (sec):</div><input class="span4" type=text name=http_timeout id=http_timeout>
+</div>
+
+<div class="controls controls-row">
+<div class="span4">IPTV multicast interface (WAN):</div><input class="span4" type=text name=mcast_interface id=mcast_interface>
+</div>
+
+<div class="controls controls-row">
+<div class="span4">Proxy mode:</div>
+<select class="span4" name=proxy id=proxy>
+<option selected value="0">off</option>
+<option value="1">radio only</option>
+<option value="2">on</option>
+</select>
+</div>
+
+<div class="controls controls-row">
+<div class="span4">DLNA Notify:</div>
+<select class="span4" name=dlna_notify id=dlna_notify>
+<option selected value="false">no</option>
+<option value="true">yes</option>
+</select>
+</div>
+
+<div class="controls controls-row">
+<div class="span4">Groups:</div>
+<select class="span4" name=group id=group>
+<option selected value="false">no</option>
+<option value="true">yes</option>
+</select>
+</div>
+
+<div class="controls controls-row">
+<div class="span4">Sort files:</div>
+<select class="span4" name=sort_files id=sort_files>
+<option selected value="false">no</option>
+<option value="true">yes</option>
+</select>
+</div>
+
+<div class="controls controls-row">
+<div class="span4">* Feeds reload interval (sec, 0 for manual):</div><input class="span4" type=text name=feeds_update_interval id=feeds_update_interval>
+</div>
+
+<div class="controls controls-row">
+<div class="span4">* Playlists reload interval (sec, 0 for manual):</div><input class="span4" type=text name=playlists_update_interval id=playlists_update_interval>
+</div>
+
+<div class="controls controls-row">
+<div class="span4">* Drive device name (/dev/sda, /dev/sdb, ...):</div><input class="span4" type=text name=drive id=drive>
+</div>
+
+<br/>
+<i>* Optional</i>
+
+<br/><br/><br/>
+
+<input class="btn btn-primary" type=submit value=Save>
+<a class='btn btn-primary' href='/ui/restart'>Restart</a>
+<a class='btn btn-info' href='/ui/plugins'>Plugins</a>
+<a class='btn btn-info' href='/ui/profiles'>Profiles</a>
+<a class='btn btn-info' href='/ui'>Back</a>
+</form>
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/ui/ui_main.html
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/ui/ui_main.html	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/ui/ui_main.html	(revision 27875)
@@ -0,0 +1,15 @@
+<h3>${fname}</h3>
+
+UUID: ${uuid}<br/>
+Uptime: ${uptime} <a style='font-size: 8pt' href="/ui">refresh</a> <br/>
+SSDP Interface: ${interface}<br/>
+WWW Port: ${port}<br/>
+Model: <a href=${url}>${name}-${version}</a><br/>
+Manufacturer: ${manufacturer}<br/>
+<i>${description}</i><br/><br/>
+
+<a class='btn btn-primary' href='/ui/playlists'>Playlists</a>
+<a class='btn btn-primary' href='/ui/feeds'>Feeds</a>
+<a class='btn btn-primary' href='/ui/downloads'>Downloads</a>
+<a class='btn btn-primary' href='/ui/config'>Config</a>
+<a class='btn btn-primary' href='/ui/status'">Status</a><br/>
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/ui/ui_template.html
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/ui/ui_template.html	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/ui/ui_template.html	(revision 27875)
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>${title}</title>
+<meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
+<link rel="stylesheet" href="/ui/style">
+</head>
+
+<body>    
+
+<div class="container">
+
+${content}
+
+<br/>
+<hr/>
+<p style='font-size: 8pt' align=left>
+Copyright (C) 2011-2012 Anton Burdinuk &lt;<a href='mailto:clark15b@gmail.com'>clark15b@gmail.com</a>&gt;<br/>
+License: <a href='http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt'>GPL-2.0</a><br/>
+www: <a href='http://xupnpd.org'>http://xupnpd.org</a><br/>
+
+</p>
+
+</div>
+
+</body>
+</html>
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/ui/xupnpd_ui.lua
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/ui/xupnpd_ui.lua	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/ui/xupnpd_ui.lua	(revision 27875)
@@ -0,0 +1,641 @@
+-- Copyright (C) 2011-2012 Anton Burdinuk
+-- clark15b@gmail.com
+-- https://tsdemuxer.googlecode.com/svn/trunk/xupnpd
+
+ui_args=nil
+ui_data=nil
+
+function ui_main()
+    http.sendtfile(cfg.ui_path..'ui_main.html',http_vars)
+end
+
+function ui_error()
+    http.send('<h2>Error occurred</h3>')
+    http.send('<br/><a class="btn btn-info" href="/ui">Back</a>')
+end
+
+function ui_downloads()
+    http.send('<h3>Downloads</h3>')
+    http.send('<br/><table class="table">')
+    for i,j in ipairs(playlist_data.elements[1].elements) do
+        http.send(string.format('<tr><td><a href="/ui/%s.m3u">%s</a></td></tr>',j.name,j.name))
+    end
+    http.send('</table>')
+    http.send('<br/><a class="btn btn-info" href="/ui">Back</a>')
+end
+
+function ui_download(name)
+    name=util.urldecode(string.match(name,'(.+)%.m3u$'))
+
+    local pls=nil
+
+    for i,j in ipairs(playlist_data.elements[1].elements) do
+        if j.name==name then pls=j break end
+    end
+
+    if not pls then
+        http.send(
+            string.format(
+                'HTTP/1.1 404 Not found\r\nPragma: no-cache\r\nCache-control: no-cache\r\nDate: %s\r\nServer: %s\r\n'..
+                'Connection: close\r\n\r\n',os.date('!%a, %d %b %Y %H:%M:%S GMT'),ssdp_server)
+        )
+        return
+    end
+
+    http.send(
+        string.format(
+            'HTTP/1.1 200 Ok\r\nPragma: no-cache\r\nCache-control: no-cache\r\nDate: %s\r\nServer: %s\r\nAccept-Ranges: none\r\n'..
+            'Connection: close\r\nContent-Type: audio/x-mpegurl\r\n\r\n',os.date('!%a, %d %b %Y %H:%M:%S GMT'),ssdp_server)
+    )
+
+    http.send('#EXTM3U\n')
+    for i,j in ipairs(pls.elements) do
+        local url=j.url or ''
+        if j.path then
+            url=string.format('%s/stream/%s.%s',www_location,j.objid,j.type)
+        else
+            if cfg.proxy>0 then
+                if cfg.proxy>1 or pls.mime[1]==2 then
+                    url=string.format('%s/proxy/%s.%s',www_location,j.objid,j.type)
+                end
+            end
+        end
+        http.send('#EXTINF:0,'..j.name..'\n'..url..'\n')
+    end
+end
+
+function ui_playlists()
+    http.send('<h3>Playlists</h3>')
+    http.send('<br/><table class="table">')
+
+    function f(path,args)
+        local d=util.dir(path)
+        if d then
+            table.sort(d)
+            for i,j in ipairs(d) do
+                if string.find(j,'.+%.m3u$') then
+                    local fname=util.urlencode(j)
+                    http.send(string.format('<tr><td><a href=\'/ui/show?fname=%s&%s\'>%s</a> [<a href=\'/ui/remove?fname=%s&%s\'>x</a>]</td></tr>\n',fname,args,j,fname,args))
+                end
+            end
+        end
+    end
+
+    f(cfg.playlists_path,'')
+
+    if cfg.feeds_path~=cfg.playlists_path then f(cfg.feeds_path,'feed=1') end
+
+    http.send('</table>')
+
+    http.send('<br/><h3>Upload *.m3u file</h3>')
+    http.send('<form method=post action="/ui/upload" enctype="multipart/form-data">')
+    http.send('<input type=file name=m3ufile><br /><br />')
+    http.send('<input class="btn btn-primary" type=submit value=Send>')
+    http.send('</form><hr/>')
+    http.send('<br/><a class="btn btn-primary" href="/ui/reload">Reload</a> <a class="btn btn-primary" href="/ui/reload_feeds?return_url=/ui/playlists">Reload feeds</a> <a class="btn btn-info" href="/ui">Back</a>')
+end
+
+function ui_feeds()
+    http.send('<h3>Feeds</h3>')
+    http.send('<br/><table class="table">')
+
+    for i,j in ipairs(feeds) do
+        http.send(string.format('<tr><td>%s [<a href="/ui/remove_feed?id=%s">x</a>]</td></tr>\n',j[3],i))
+    end
+
+    http.send('</table>')
+
+    http.send('<h3>Add feed</h3>')
+
+    http.send('<form method=get action="/ui/add_feed">')
+
+    http.send('<div class="controls controls-row"><div class="span2">Plugin</div><select class="span4" name="plugin">')
+
+    for plugin_name,plugin in pairs(plugins) do
+        if plugin.name and plugin.disabled~=true then
+            http.send(string.format('<option value="%s">%s</option>',plugin_name,plugin.name))
+        end
+    end
+
+    http.send('</select></div>')
+
+    http.send('<div class="controls controls-row"><div class="span2">Feed data</div><input class="span4" type="text" name="feed"><div class="span1"><a href="/ui/fhelp" target="_blank">?</a></div></div>')
+
+    http.send('<div class="controls controls-row"><div class="span2">Name</div><input class="span4" type="text" name="name"></div>')
+
+    http.send('<br/><input class="btn btn-primary" type=submit value=Add> <a class="btn btn-info" href="/ui/fhelp" target="_blank">Help</a>')
+    http.send('</form><hr/>')
+
+    http.send('<br/><a class="btn btn-primary" href="/ui/save_feeds">Save</a> <a class="btn btn-primary" href="/ui/reload_feeds?return_url=/ui/feeds">Reload feeds</a> <a class="btn btn-info" href="/ui">Back</a>')
+end
+
+function ui_fhelp()
+
+    http.send('<br/>')
+
+    for plugin_name,plugin in pairs(plugins) do
+        if plugin.name and plugin.desc and plugin.disabled~=true then
+            http.send(string.format('<b>%s</b>: ',plugin.name))
+            http.send(plugin.desc)
+            http.send('<br/><br/>\n\n')
+        end
+    end
+end
+
+function ui_mhelp()
+
+    http.send('<br/><h3>MIME-Types</h3>\n<table class="table">\n<tr><th>File Type</th><th>MIME-Type</th><th>UPnP Proto</th><th>DLNA.ORG Profile</th></tr>\n')
+
+    for i,j in pairs(mime) do
+        if j then
+            local ext=string.match(j[5],'^(DLNA.ORG_PN=[%w_]+);')
+
+            http.send(string.format('<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>\n',i,j[3],j[4],ext or j[5]))
+        end
+    end
+
+    http.send('</table>\n\n<a class="btn btn-info" href="/ui/ehelp">DLNA Extras</a> <a class="btn btn-info" href="/ui/config">Back</a>')
+end
+
+function ui_ehelp()
+    http.send('<br/><h3>DLNA Extras</h3>\n<table class="table">\n<tr><th>Name</th><th>DLNA.ORG Extras</th></tr>\n')
+
+    for i,j in pairs(dlna_org_extras) do
+        http.send(string.format('<tr><td>%s</td><td>%s</td></tr>\n',i,j))
+    end
+
+    http.send('</table>\n\n<a class="btn btn-info" href="/ui/mhelp">Back</a>')
+end
+
+function ui_plugins()
+
+    if ui_args.n and ui_args.s then
+        local p=plugins[ui_args.n]
+
+        if p then
+            if ui_args.s=='on' then p.disabled=false elseif ui_args.s=='off' then p.disabled=true end
+            core.sendevent('plugin',ui_args.n,ui_args.s)
+        end
+    end
+
+    http.send('<br/><h3>Plugins</h3>\n<table class="table">\n<tr><th>Name</th><th>Status</th></tr>\n')
+
+    for i,j in pairs(plugins) do
+        if j.name then
+            local status
+            
+            if j.disabled==true then
+                status=string.format('<a href="/ui/plugins?n=%s&s=on">on</a> | <b>off</b>',util.urlencode(i))
+            else
+                status=string.format('<b>on</b> | <a href="/ui/plugins?n=%s&s=off">off</a>',util.urlencode(i))
+            end
+
+            http.send(string.format('<tr><td>%s</td><td>%s</td></tr>\n',j.name,status))
+        end
+    end
+
+    http.send('</table>\n\n<a class="btn btn-primary" href="/ui/plapply">Save</a> <a class="btn btn-info" href="/ui/config">Back</a>')
+end
+
+function ui_plapply()
+    local f=io.open(cfg.config_path..'postinit/plugins.lua','w')
+    if f then
+        for i,j in pairs(plugins) do
+            if j.name then
+                f:write(string.format('plugins["%s"].disabled=%s\n',i,tostring(j.disabled or false)))
+            end
+        end
+        f:close()
+    end
+
+    http.send('<h3>OK</h3>')
+    http.send('<br/><a class="btn btn-info" href="/ui/plugins">Back</a>')
+end
+
+
+function ui_profiles()
+
+    if ui_args.n and ui_args.s then
+        local p=profiles[ui_args.n]
+
+        if p then
+            if ui_args.s=='on' then p.disabled=false elseif ui_args.s=='off' then p.disabled=true end
+            core.sendevent('profile',ui_args.n,ui_args.s)
+        end
+    end
+
+    http.send('<br/><h3>Profiles</h3>\n<table class="table">\n<tr><th>Name</th><th>Status</th></tr>\n')
+
+    for i,j in pairs(profiles) do
+        local status
+            
+        if j.disabled==true then
+            status=string.format('<a href="/ui/profiles?n=%s&s=on">on</a> | <b>off</b>',util.urlencode(i))
+        else
+            status=string.format('<b>on</b> | <a href="/ui/profiles?n=%s&s=off">off</a>',util.urlencode(i))
+        end
+
+        http.send(string.format('<tr><td>%s</td><td>%s</td></tr>\n',j.desc,status))
+    end
+
+    http.send('</table>\n\n<a class="btn btn-primary" href="/ui/prapply">Save</a> <a class="btn btn-info" href="/ui/config">Back</a>')
+end
+
+function ui_prapply()
+    local f=io.open(cfg.config_path..'postinit/profiles.lua','w')
+    if f then
+        for i,j in pairs(profiles) do
+            f:write(string.format('profiles["%s"].disabled=%s\n',i,tostring(j.disabled or false)))
+        end
+        f:close()
+    end
+
+    http.send('<h3>OK</h3>')
+    http.send('<br/><a class="btn btn-info" href="/ui/profiles">Back</a>')
+end
+
+function ui_show()
+    if ui_args.fname then
+        local real_name=util.urldecode(ui_args.fname)
+        if string.find(real_name,'^[^/\\]+%.m3u$') then
+
+            local path=cfg.playlists_path
+            if ui_args.feed=='1' then path=cfg.feeds_path end
+
+            local pls=m3u.parse(path..real_name)
+
+            if pls then
+                http.send('<h3>'..pls.name..'</h3>')
+                http.send('<br/><table class="table">')
+                for i,j in ipairs(pls.elements) do
+                    http.send(string.format('<tr><td><a href="%s">%s</a></td></tr>',j.url,j.name))
+                end
+                http.send('</table>')
+            end
+        end
+    end
+
+    http.send('<br/><a class="btn btn-info" href="/ui/playlists">Back</a>')
+end
+
+function ui_remove()
+    if ui_args.fname then
+        local real_name=util.urldecode(ui_args.fname)
+        if string.find(real_name,'^[^-/\\]+%.m3u$') then
+
+            local path=cfg.playlists_path
+            if ui_args.feed=='1' then path=cfg.feeds_path end
+
+            if os.remove(path..real_name) then
+                core.sendevent('reload')
+                http.send('<h3>OK</h3>')
+            else
+                http.send('<h3>Fail</h3>')
+            end
+        end
+    end
+
+    http.send('<br/><a class="btn btn-info" href="/ui/playlists">Back</a>')
+end
+
+function ui_remove_feed()
+    if ui_args.id and feeds[tonumber(ui_args.id)] then
+        core.sendevent('remove_feed',ui_args.id)
+        http.send('<h3>OK</h3>')
+    else
+        http.send('<h3>Fail</h3>')
+    end
+
+    http.send('<br/><a class="btn btn-info" href="/ui/feeds">Back</a>')
+end
+
+function ui_add_feed()
+    if ui_args.plugin and ui_args.feed then
+        if not ui_args.name or string.len(ui_args.name)==0 then ui_args.name=ui_args.plugin..' '..string.gsub(ui_args.feed,'/',' ') end
+        core.sendevent('add_feed',ui_args.plugin,ui_args.feed,ui_args.name)
+        http.send('<h3>OK</h3>')
+    else
+        http.send('<h3>Fail</h3>')
+    end
+
+    http.send('<br/><a class="btn btn-info" href="/ui/feeds">Back</a>')
+end
+
+function save_feeds()
+
+    local f=io.open(cfg.config_path..'feeds.lua','w')
+    if f then
+        f:write('feeds=\n{\n')
+
+        for i,j in ipairs(feeds) do
+            f:write(string.format('   { "%s", "%s", "%s" },\n',j[1],j[2],j[3]))
+        end
+
+        f:write('}\n')
+
+        f:close()
+        return true
+    end
+
+    return false
+end
+
+
+function ui_save_feeds()
+    if save_feeds() then http.send('<h3>OK</h3>') else http.send('<h3>Fail</h3>') end
+
+    http.send('<br/><a class="btn btn-info" href="/ui/feeds">Back</a>')
+end
+
+function ui_reload()
+    core.sendevent('reload')
+    http.send('<h3>OK</h3>')
+    http.send('<br/><a class="btn btn-info" href="/ui/playlists">Back</a>')
+end
+
+function ui_reload_feeds()
+    update_feeds_async()
+    http.send('<h3>OK</h3>')
+    http.send('<br/><a class="btn btn-info" href="'.. (ui_args.return_url or '/ui') ..'">Back</a>')
+end
+
+function ui_config()
+    for plugin_name,plugin in pairs(plugins) do
+        if plugin.ui_vars then
+            for i,var in ipairs(plugin.ui_vars) do
+                http_vars[ var[1] ]=var[2]
+            end
+        end
+    end
+
+
+    http.sendtfile(cfg.ui_path..'ui_config.html',http_vars)
+
+    http.send('<script>\n')
+    http.send('function set_select_value(id,value)\n')
+    http.send('    { var obj=document.getElementById(id); for(i=0;i<obj.length;i++) { if(obj.options[i].value==value) { obj.options[i].selected=true; break; } } }\n')
+    http.send('function set_input_value(id,value)\n')
+    http.send('    { var obj=document.getElementById(id); if(obj) { obj.value=value } }\n')
+                        
+    for plugin_name,plugin in pairs(plugins) do
+        if plugin.ui_config_vars then
+            for i,var in ipairs(plugin.ui_config_vars) do
+                http.send(string.format('set_%s_value("%s","%s");\n',var[1],var[2],tostring(cfg[ var[2] ])))
+            end
+        end
+    end
+
+    http.send('</script>\n')
+
+end
+
+function ui_apply()
+
+    local args=util.parse_postdata(ui_data)
+
+    local f=io.open(cfg.config_path..'common.lua','w')
+    if f then
+
+        for plugin_name,plugin in pairs(plugins) do
+            if plugin.ui_config_vars then
+                for i,var in ipairs(plugin.ui_config_vars) do
+                    local v=args[ var[2] ]
+                    local t=var[3]
+
+                    if not v then if t=="int" then v=0 elseif t=="bool" then v=false else v="" end end
+
+                    if t=="int" or t=="bool" then
+                        f:write(string.format('cfg["%s"]=%s\n',var[2],tostring(v)))
+                    else
+                        f:write(string.format('cfg["%s"]="%s"\n',var[2],v))
+                    end
+                end
+            end
+        end
+
+        f:close()
+        core.sendevent('config')
+    end
+
+    http.send('<h3>OK</h3>')
+    http.send('<br/><a class="btn btn-info" href="/ui/config">Back</a>')
+end
+
+function ui_status()
+    http.send('<h3>Status</h3>')
+    http.send('<br/><table class="table">')
+
+    for i,j in pairs(childs) do
+        if j.status then
+            http.send(string.format('<tr><td>%s [<a href="/ui/kill?pid=%s">x</a>]</td></tr>',j.status,i))
+        end
+    end
+
+    http.send('</table>')
+
+    http.send('<br/><a class="btn btn-primary" href="/ui/status">Refresh</a> <a class="btn btn-info" href="/ui">Back</a>')
+end
+
+function ui_kill()
+    if ui_args.pid and childs[tonumber(ui_args.pid)] then
+        util.kill(ui_args.pid)
+        http.send('<h3>OK</h3>')
+    else
+        http.send('<h3>Fail</h3>')
+    end
+    http.send('<br/><a class="btn btn-info" href="/ui/status">Back</a>')
+end
+
+function ui_upload()
+    local tt=util.multipart_split(ui_data)
+    ui_data=nil
+
+    if tt and tt[1] then
+        local n,m=string.find(tt[1],'\r?\n\r?\n')
+
+        if n then
+            local fname=string.match(string.sub(tt[1],1,n-1),'filename=\"(.+)\"')
+
+            if fname and string.find(fname,'.+%.m3u$') then
+                local tfname=cfg.tmp_path..fname
+
+                local fd=io.open(tfname,'w+')
+                if fd then
+                    fd:write(string.sub(tt[1],m+1))
+                    fd:close()
+                end
+
+                local pls=m3u.parse(tfname)
+
+                if pls then
+                    if os.execute(string.format('mv "%s" "%s"',tfname,cfg.playlists_path..fname))~=0 then
+                        os.remove(tfname)
+                        http.send('<h3>Fail</h3>')
+                    else
+                        core.sendevent('reload')
+                        http.send('<h3>OK</h3>')
+                    end
+                else
+                    os.remove(tfname)
+                    http.send('<h3>Fail</h3>')
+                end
+            else
+                http.send('<h3>Fail</h3>')
+            end
+        end
+    end
+
+    http.send('<br/><a class="btn btn-info" href="/ui/playlists">Back</a>')
+end
+
+function ui_api_call(args)
+    http_send_headers(200,'txt')
+
+    if args.action=='feeds' then
+        for i,j in ipairs(feeds) do http.send(string.format('%s;%s\r\n',i,j[3])) end
+    elseif args.action=='reload' then
+        core.sendevent('reload')
+        http.send('OK\r\n')
+    elseif args.action=='add_feed' then
+        core.sendevent('add_feed',args.plugin or '',args.feed or '',args.name or '')
+        http.send('OK\r\n')
+    elseif args.action=='remove_feed' then
+        core.sendevent('remove_feed',args.id)
+        http.send('OK\r\n')
+    elseif args.action=='save_feeds' then
+        save_feeds()
+        update_feeds_async()
+        http.send('OK\r\n')
+    elseif args.action=='update_feeds' then
+        update_feeds_async()
+        http.send('OK\r\n')
+    elseif args.action=='status' then
+        for i,j in pairs(childs) do
+            if j.status then
+                http.send(string.format('%s;%s\r\n',i,j.status))
+            end
+        end
+    elseif args.action=='kill' then
+        if args.pid and childs[tonumber(args.pid)] then
+            util.kill(args.pid)
+            http.send('OK\r\n')
+        else
+            http.send('ERR\r\n')
+        end
+    elseif args.action=='playlists' then
+        for i,j in ipairs(playlist_data.elements[1].elements) do
+            http.send(string.format('%s;%s\r\n',i,j.name))
+        end
+    elseif args.action=='playlist' then
+        local pls=playlist_data.elements[1].elements[tonumber(args.id)]
+        if pls then
+            for i,j in ipairs(pls.elements) do
+                http.send(string.format('%s;%s;%s\r\n',i,j.logo or '',j.name))
+            end
+        end
+    else
+        http.send('ERR\r\n')
+    end
+end
+
+function ui_restart()
+    if core.restart(cfg.pid_file,"./xupnpd") then http.send('<h3>Attempt to restart...</h3>') else http.send('<h3>Unable to restart.</h3>') end
+
+    http.send('<br/><form method=get action="/ui"><input class="btn btn-primary" type=submit value=OK></form>')
+
+    http.send('<script>setTimeout("document.forms[0].submit()",3000)</script>')
+end
+
+ui_actions=
+{
+    ['main']            = { 'xupnpd', ui_main },
+    ['error']           = { 'xupnpd - error', ui_error },
+    ['downloads']       = { 'xupnpd - downloads', ui_downloads },
+    ['playlists']       = { 'xupnpd - playlists', ui_playlists },
+    ['feeds']           = { 'xupnpd - feeds', ui_feeds },
+    ['show']            = { 'xupnpd - show', ui_show },
+    ['remove']          = { 'xupnpd - remove', ui_remove },
+    ['remove_feed']     = { 'xupnpd - remove feed', ui_remove_feed },
+    ['reload']          = { 'xupnpd - reload', ui_reload },
+    ['reload_feeds']    = { 'xupnpd - reload feeds', ui_reload_feeds },
+    ['save_feeds']      = { 'xupnpd - save feeds', ui_save_feeds },
+    ['add_feed']        = { 'xupnpd - add feed', ui_add_feed },
+    ['config']          = { 'xupnpd - config', ui_config },
+    ['status']          = { 'xupnpd - status', ui_status },
+    ['kill']            = { 'xupnpd - kill', ui_kill },
+    ['upload']          = { 'xupnpd - upload', ui_upload },
+    ['apply']           = { 'xupnpd - apply', ui_apply },
+    ['plugins']         = { 'xupnpd - plugins', ui_plugins },
+    ['plapply']         = { 'xupnpd - plugins apply', ui_plapply },
+    ['profiles']        = { 'xupnpd - profiles', ui_profiles },
+    ['prapply']         = { 'xupnpd - profiles apply', ui_prapply },
+    ['fhelp']           = { 'xupnpd - feeds help', ui_fhelp },
+    ['mhelp']           = { 'xupnpd - mimes help', ui_mhelp },
+    ['ehelp']           = { 'xupnpd - extras help', ui_ehelp },
+    ['restart']         = { 'xupnpd - restart', ui_restart }
+}
+
+function ui_handler(args,data,ip,url)
+    for plugin_name,plugin in pairs(plugins) do
+        if plugin.ui_actons then
+            for act_name,act in pairs(plugin.ui_actons) do
+                ui_actions[act_name]=act
+            end
+        end
+    end
+
+    local action=string.match(url,'^/ui/(.+)$')
+
+    if action=='style' then
+        http_send_headers(200,'css')
+        http.sendfile(cfg.ui_path..'bootstrap.min.css')
+        return
+    elseif action=='api' then
+        ui_api_call(args)
+        return
+    end
+
+    if action and string.find(action,'.+%.m3u$') then
+        ui_download(action)
+        return
+    end
+
+    if not action then action='main' end
+
+    http_send_headers(200,'html')
+
+    local act=ui_actions[action]
+
+    if not act then act=ui_actions['error'] end
+
+    http_vars.title=act[1]
+    http_vars.content=act[2]
+
+    ui_args=args
+    ui_data=data
+
+    http.sendtfile(cfg.ui_path..'ui_template.html',http_vars)
+end
+
+
+plugins["ui"]={}
+plugins.ui.ui_config_vars=
+{
+    { "input",  "ssdp_interface" },
+    { "input",  "ssdp_notify_interval", "int" },
+    { "input",  "ssdp_max_age", "int" },
+    { "input",  "http_port", "int" },
+    { "input",  "mcast_interface" },
+    { "select", "proxy", "int" },
+    { "input",  "user_agent" },
+    { "input",  "http_timeout", "int" },
+    { "select", "dlna_notify", "bool"},
+    { "select", "group", "bool" },
+    { "select", "sort_files", "bool" },
+    { "input",  "name" },
+    { "input",  "uuid" },
+    { "input",  "default_mime_type" },
+    { "input",  "feeds_update_interval", "int" },
+    { "input",  "playlists_update_interval", "int" },
+    { "input",  "drive" }
+}
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/www/cds.xml
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/www/cds.xml	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/www/cds.xml	(revision 27875)
@@ -0,0 +1,255 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<scpd xmlns="urn:schemas-upnp-org:service-1-0">
+   <specVersion>
+      <major>1</major>
+      <minor>0</minor>
+   </specVersion>
+   <actionList>
+      <action>
+         <name>GetSystemUpdateID</name>
+         <argumentList>
+            <argument>
+               <name>Id</name>
+               <direction>out</direction>
+               <relatedStateVariable>SystemUpdateID</relatedStateVariable>
+            </argument>
+         </argumentList>
+      </action>
+      <action>
+         <name>GetSearchCapabilities</name>
+         <argumentList>
+            <argument>
+               <name>SearchCaps</name>
+               <direction>out</direction>
+               <relatedStateVariable>SearchCapabilities</relatedStateVariable>
+            </argument>
+         </argumentList>
+      </action>
+      <action>
+        <name>GetSortCapabilities</name>
+        <argumentList>
+            <argument>
+                <name>SortCaps</name>
+                <direction>out</direction>
+                <relatedStateVariable>SortCapabilities</relatedStateVariable>
+            </argument>
+        </argumentList>
+      </action>
+      <action>
+         <name>X_GetFeatureList</name>
+         <argumentList>
+            <argument>
+               <name>FeatureList</name>
+               <direction>out</direction>
+               <relatedStateVariable>A_ARG_TYPE_FeatureList</relatedStateVariable>
+            </argument>
+         </argumentList>
+      </action>
+      <action>
+         <name>X_SetBookmark</name>
+         <argumentList>
+            <argument>
+               <name>CategoryType</name>
+               <direction>in</direction>
+               <relatedStateVariable>A_ARG_TYPE_CategoryType</relatedStateVariable>
+            </argument>
+            <argument>
+               <name>RID</name>
+               <direction>in</direction>
+               <relatedStateVariable>A_ARG_TYPE_RID</relatedStateVariable>
+            </argument>
+            <argument>
+               <name>ObjectID</name>
+               <direction>in</direction>
+               <relatedStateVariable>A_ARG_TYPE_ObjectID</relatedStateVariable>
+            </argument>
+            <argument>
+               <name>PosSecond</name>
+               <direction>in</direction>
+               <relatedStateVariable>A_ARG_TYPE_PosSec</relatedStateVariable>
+            </argument>
+         </argumentList>
+      </action>
+      <action>
+         <name>Browse</name>
+         <argumentList>
+            <argument>
+               <name>ObjectID</name>
+               <direction>in</direction>
+               <relatedStateVariable>A_ARG_TYPE_ObjectID</relatedStateVariable>
+            </argument>
+            <argument>
+               <name>BrowseFlag</name>
+               <direction>in</direction>
+               <relatedStateVariable>A_ARG_TYPE_BrowseFlag</relatedStateVariable>
+            </argument>
+            <argument>
+               <name>Filter</name>
+               <direction>in</direction>
+               <relatedStateVariable>A_ARG_TYPE_Filter</relatedStateVariable>
+            </argument>
+            <argument>
+               <name>StartingIndex</name>
+               <direction>in</direction>
+               <relatedStateVariable>A_ARG_TYPE_Index</relatedStateVariable>
+            </argument>
+            <argument>
+               <name>RequestedCount</name>
+               <direction>in</direction>
+               <relatedStateVariable>A_ARG_TYPE_Count</relatedStateVariable>
+            </argument>
+            <argument>
+               <name>SortCriteria</name>
+               <direction>in</direction>
+               <relatedStateVariable>A_ARG_TYPE_SortCriteria</relatedStateVariable>
+            </argument>
+            <argument>
+               <name>Result</name>
+               <direction>out</direction>
+               <relatedStateVariable>A_ARG_TYPE_Result</relatedStateVariable>
+            </argument>
+            <argument>
+               <name>NumberReturned</name>
+               <direction>out</direction>
+               <relatedStateVariable>A_ARG_TYPE_Count</relatedStateVariable>
+            </argument>
+            <argument>
+               <name>TotalMatches</name>
+               <direction>out</direction>
+               <relatedStateVariable>A_ARG_TYPE_Count</relatedStateVariable>
+            </argument>
+            <argument>
+               <name>UpdateID</name>
+               <direction>out</direction>
+               <relatedStateVariable>A_ARG_TYPE_UpdateID</relatedStateVariable>
+            </argument>
+         </argumentList>
+      </action>
+      <action>
+         <name>Search</name>
+         <argumentList>
+            <argument>
+               <name>ContainerID</name>
+               <direction>in</direction>
+               <relatedStateVariable>A_ARG_TYPE_ObjectID</relatedStateVariable>
+            </argument>
+            <argument>
+               <name>SearchCriteria</name>
+               <direction>in</direction>
+               <relatedStateVariable>A_ARG_TYPE_SearchCriteria</relatedStateVariable>
+            </argument>
+            <argument>
+               <name>Filter</name>
+               <direction>in</direction>
+               <relatedStateVariable>A_ARG_TYPE_Filter</relatedStateVariable>
+            </argument>
+            <argument>
+               <name>StartingIndex</name>
+               <direction>in</direction>
+               <relatedStateVariable>A_ARG_TYPE_Index</relatedStateVariable>
+            </argument>
+            <argument>
+               <name>RequestedCount</name>
+               <direction>in</direction>
+               <relatedStateVariable>A_ARG_TYPE_Count</relatedStateVariable>
+            </argument>
+            <argument>
+               <name>SortCriteria</name>
+               <direction>in</direction>
+               <relatedStateVariable>A_ARG_TYPE_SortCriteria</relatedStateVariable>
+            </argument>
+            <argument>
+               <name>Result</name>
+               <direction>out</direction>
+               <relatedStateVariable>A_ARG_TYPE_Result</relatedStateVariable>
+            </argument>
+            <argument>
+               <name>NumberReturned</name>
+               <direction>out</direction>
+               <relatedStateVariable>A_ARG_TYPE_Count</relatedStateVariable>
+            </argument>
+            <argument>
+               <name>TotalMatches</name>
+               <direction>out</direction>
+               <relatedStateVariable>A_ARG_TYPE_Count</relatedStateVariable>
+            </argument>
+            <argument>
+               <name>UpdateID</name>
+               <direction>out</direction>
+               <relatedStateVariable>A_ARG_TYPE_UpdateID</relatedStateVariable>
+            </argument>
+         </argumentList>
+      </action>
+   </actionList>
+   <serviceStateTable>
+      <stateVariable sendEvents="yes">
+         <name>SystemUpdateID</name>
+         <dataType>ui4</dataType>
+      </stateVariable>
+      <stateVariable sendEvents="no">
+         <name>A_ARG_TYPE_ObjectID</name>
+         <dataType>string</dataType>
+      </stateVariable>
+      <stateVariable sendEvents="no">
+         <name>A_ARG_TYPE_BrowseFlag</name>
+         <dataType>string</dataType>
+         <allowedValueList>
+            <allowedValue>BrowseMetadata</allowedValue>
+            <allowedValue>BrowseDirectChildren</allowedValue>
+         </allowedValueList>
+      </stateVariable>
+      <stateVariable sendEvents="no">
+         <name>A_ARG_TYPE_Filter</name>
+         <dataType>string</dataType>
+      </stateVariable>
+      <stateVariable sendEvents="no">
+         <name>A_ARG_TYPE_Index</name>
+         <dataType>ui4</dataType>
+      </stateVariable>
+      <stateVariable sendEvents="no">
+         <name>A_ARG_TYPE_Count</name>
+         <dataType>ui4</dataType>
+      </stateVariable>
+      <stateVariable sendEvents="no">
+         <name>SearchCapabilities</name>
+         <dataType>string</dataType>
+      </stateVariable>
+      <stateVariable sendEvents="no">
+         <name>A_ARG_TYPE_SortCriteria</name>
+         <dataType>string</dataType>
+      </stateVariable>
+      <stateVariable sendEvents="no">
+         <name>A_ARG_TYPE_Result</name>
+         <dataType>string</dataType>
+      </stateVariable>
+      <stateVariable sendEvents="no">
+         <name>A_ARG_TYPE_UpdateID</name>
+         <dataType>ui4</dataType>
+      </stateVariable>
+      <stateVariable sendEvents="no">
+          <name>SortCapabilities</name>
+          <dataType>string</dataType>
+      </stateVariable>
+      <stateVariable sendEvents="no">
+          <name>A_ARG_TYPE_SearchCriteria</name>
+          <dataType>string</dataType>
+      </stateVariable>
+      <stateVariable sendEvents="no">
+         <name>A_ARG_TYPE_FeatureList</name>
+         <dataType>string</dataType>
+      </stateVariable>
+      <stateVariable sendEvents="no">
+         <name>A_ARG_TYPE_CategoryType</name>
+         <dataType>ui4</dataType>
+      </stateVariable>
+      <stateVariable sendEvents="no">
+         <name>A_ARG_TYPE_RID</name>
+         <dataType>ui4</dataType>
+      </stateVariable>
+      <stateVariable sendEvents="no">
+         <name>A_ARG_TYPE_PosSec</name>
+         <dataType>ui4</dataType>
+      </stateVariable>
+   </serviceStateTable>
+</scpd>
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/www/cms.xml
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/www/cms.xml	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/www/cms.xml	(revision 27875)
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<scpd xmlns="urn:schemas-upnp-org:service-1-0">
+  <specVersion>
+    <major>1</major>
+    <minor>0</minor>
+  </specVersion>
+  <actionList>
+    <action>
+      <name>GetCurrentConnectionInfo</name>
+      <argumentList>
+        <argument>
+          <name>ConnectionID</name>
+          <direction>in</direction>
+          <relatedStateVariable>A_ARG_TYPE_ConnectionID</relatedStateVariable>
+        </argument>
+        <argument>
+          <name>RcsID</name>
+          <direction>out</direction>
+          <relatedStateVariable>A_ARG_TYPE_RcsID</relatedStateVariable>
+        </argument>
+        <argument>
+          <name>AVTransportID</name>
+          <direction>out</direction>
+          <relatedStateVariable>A_ARG_TYPE_AVTransportID</relatedStateVariable>
+        </argument>
+        <argument>
+          <name>ProtocolInfo</name>
+          <direction>out</direction>
+          <relatedStateVariable>A_ARG_TYPE_ProtocolInfo</relatedStateVariable>
+        </argument>
+        <argument>
+          <name>PeerConnectionManager</name>
+          <direction>out</direction>
+          <relatedStateVariable>A_ARG_TYPE_ConnectionManager</relatedStateVariable>
+        </argument>
+        <argument>
+          <name>PeerConnectionID</name>
+          <direction>out</direction>
+          <relatedStateVariable>A_ARG_TYPE_ConnectionID</relatedStateVariable>
+        </argument>
+        <argument>
+          <name>Direction</name>
+          <direction>out</direction>
+          <relatedStateVariable>A_ARG_TYPE_Direction</relatedStateVariable>
+        </argument>
+        <argument>
+          <name>Status</name>
+          <direction>out</direction>
+          <relatedStateVariable>A_ARG_TYPE_ConnectionStatus</relatedStateVariable>
+        </argument>
+      </argumentList>
+    </action>
+    <action>
+      <name>GetProtocolInfo</name>
+      <argumentList>
+        <argument>
+          <name>Source</name>
+          <direction>out</direction>
+          <relatedStateVariable>SourceProtocolInfo</relatedStateVariable>
+        </argument>
+        <argument>
+          <name>Sink</name>
+          <direction>out</direction>
+          <relatedStateVariable>SinkProtocolInfo</relatedStateVariable>
+        </argument>
+      </argumentList>
+    </action>
+    <action>
+      <name>GetCurrentConnectionIDs</name>
+      <argumentList>
+        <argument>
+          <name>ConnectionIDs</name>
+          <direction>out</direction>
+          <relatedStateVariable>CurrentConnectionIDs</relatedStateVariable>
+        </argument>
+      </argumentList>
+    </action>
+  </actionList>
+  <serviceStateTable>
+    <stateVariable sendEvents="no">
+      <name>A_ARG_TYPE_ProtocolInfo</name>
+      <dataType>string</dataType>
+    </stateVariable>
+    <stateVariable sendEvents="no">
+      <name>A_ARG_TYPE_ConnectionStatus</name>
+     <dataType>string</dataType>
+      <allowedValueList>
+        <allowedValue>OK</allowedValue>
+        <allowedValue>ContentFormatMismatch</allowedValue>
+        <allowedValue>InsufficientBandwidth</allowedValue>
+        <allowedValue>UnreliableChannel</allowedValue>
+        <allowedValue>Unknown</allowedValue>
+      </allowedValueList>
+    </stateVariable>
+    <stateVariable sendEvents="no">
+      <name>A_ARG_TYPE_AVTransportID</name>
+      <dataType>i4</dataType>
+    </stateVariable>
+    <stateVariable sendEvents="no">
+      <name>A_ARG_TYPE_RcsID</name>
+      <dataType>i4</dataType>
+    </stateVariable>
+    <stateVariable sendEvents="no">
+      <name>A_ARG_TYPE_ConnectionID</name>
+      <dataType>i4</dataType>
+    </stateVariable>
+    <stateVariable sendEvents="no">
+      <name>A_ARG_TYPE_ConnectionManager</name>
+      <dataType>string</dataType>
+    </stateVariable>
+    <stateVariable sendEvents="yes">
+      <name>SourceProtocolInfo</name>
+      <dataType>string</dataType>
+    </stateVariable>
+    <stateVariable sendEvents="yes">
+      <name>SinkProtocolInfo</name>
+      <dataType>string</dataType>
+    </stateVariable>
+    <stateVariable sendEvents="no">
+      <name>A_ARG_TYPE_Direction</name>
+      <dataType>string</dataType>
+      <allowedValueList>
+        <allowedValue>Input</allowedValue>
+        <allowedValue>Output</allowedValue>
+      </allowedValueList>
+    </stateVariable>
+    <stateVariable sendEvents="yes">
+      <name>CurrentConnectionIDs</name>
+      <dataType>string</dataType>
+    </stateVariable>
+  </serviceStateTable>
+</scpd>
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/www/dev.xml
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/www/dev.xml	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/www/dev.xml	(revision 27875)
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<root xmlns:dlna="urn:schemas-dlna-org:device-1-0" xmlns="urn:schemas-upnp-org:device-1-0">
+    <specVersion>
+        <major>1</major>
+        <minor>0</minor>
+    </specVersion>
+    <device>
+        <dlna:X_DLNADOC xmlns:dlna="urn:schemas-dlna-org:device-1-0">DMS-1.50</dlna:X_DLNADOC>
+        <dlna:X_DLNADOC xmlns:dlna="urn:schemas-dlna-org:device-1-0">M-DMS-1.50</dlna:X_DLNADOC>
+        <deviceType>urn:schemas-upnp-org:device:MediaServer:1</deviceType>
+        <friendlyName>${fname}</friendlyName>
+        <manufacturer>${manufacturer}</manufacturer>
+        <manufacturerURL>${manufacturer_url}</manufacturerURL>
+        <modelDescription>${description}</modelDescription>
+        <modelName>${name}-${version}</modelName>
+        <modelNumber>${version}</modelNumber>
+        <modelURL>${url}</modelURL>
+        <serialNumber>xupnpd-${version}</serialNumber>
+        <UDN>uuid:${uuid}</UDN>
+        <UPC></UPC>
+        <iconList>
+           <icon>
+                <mimetype>image/png</mimetype>
+                <height>48</height>
+                <width>48</width>
+                <depth>8</depth>
+                <url>/icon-48x48.png</url>
+           </icon>
+        </iconList>
+        <serviceList>
+            <service>
+                <serviceType>urn:schemas-upnp-org:service:ContentDirectory:1</serviceType>
+                <serviceId>urn:upnp-org:serviceId:ContentDirectory</serviceId>
+                <SCPDURL>/cds.xml</SCPDURL>
+                <controlURL>/soap/cds</controlURL>
+                <eventSubURL>/event/cds</eventSubURL>
+            </service>
+            <service>
+                <serviceType>urn:schemas-upnp-org:service:ConnectionManager:1</serviceType>
+                <serviceId>urn:upnp-org:serviceId:ConnectionManager</serviceId>
+                <SCPDURL>/cms.xml</SCPDURL>
+                <controlURL>/soap/cms</controlURL>
+                <eventSubURL>/event/cms</eventSubURL>
+            </service>
+            <service>
+                <serviceType>urn:microsoft.com:service:X_MS_MediaReceiverRegistrar:1</serviceType>
+                <serviceId>urn:microsoft.com:serviceId:X_MS_MediaReceiverRegistrar</serviceId>
+                <SCPDURL>/msr.xml</SCPDURL>
+                <controlURL>/soap/msr</controlURL>
+                <eventSubURL>/event/msr</eventSubURL>
+            </service>
+        </serviceList>
+        <presentationURL>/</presentationURL>
+    </device>
+    <URLBase>http://${interface}:${port}/</URLBase>
+</root>
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/www/index.html
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/www/index.html	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/www/index.html	(revision 27875)
@@ -0,0 +1,26 @@
+<html>
+<head>
+<title>${fname}</title>
+<meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
+</head>
+<body>
+Device name: ${fname}<br>
+UUID: ${uuid}<br>
+Multicast interface: ${interface}<br>
+WWW port: ${port}<br>
+Model: ${name}-${version}<br>
+Manufacturer: ${manufacturer}<br>
+<i>${description}</i><br><br>
+
+Descriptions: <a href='/dev.xml'>MediaServer:1</a> | <a href='/cds.xml'>ContentDirectory:1</a> | <a href='/cms.xml'>ConnectionManager:1</a> | <a href='/msr.xml'>MediaReceiverRegistrar:1</a><br>
+
+<br><br><br>
+<p style='font-size: 8pt' align=left>
+<img src='/icon-48x48.png'></img><br>
+<b>License</b>: <a href='http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt'>GPL</a><br>
+Copyright (C) 2011 Anton Burdinuk<br>
+E-Mail: <a href='mailto:clark15b@gmail.com'>clark15b@gmail.com</a><br>
+</p>
+
+</body>
+</html>
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/www/msr.xml
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/www/msr.xml	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/www/msr.xml	(revision 27875)
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<scpd xmlns="urn:schemas-upnp-org:service-1-0">
+    <specVersion>
+        <major>1</major>
+        <minor>0</minor>
+    </specVersion>
+    <actionList>
+        <action>
+            <name>IsAuthorized</name>
+            <argumentList>
+                <argument>
+                    <name>DeviceID</name>
+                    <direction>in</direction>
+                    <relatedStateVariable>A_ARG_TYPE_DeviceID</relatedStateVariable>
+                </argument>
+                <argument>
+                    <name>Result</name>
+                    <direction>out</direction>
+                    <relatedStateVariable>A_ARG_TYPE_Result</relatedStateVariable>
+                </argument>
+            </argumentList>
+        </action>
+        <action>
+            <name>RegisterDevice</name>
+            <argumentList>
+                <argument>
+                    <name>RegistrationReqMsg</name>
+                    <direction>in</direction>
+                    <relatedStateVariable>A_ARG_TYPE_RegistrationReqMsg</relatedStateVariable>
+                </argument>
+                <argument>
+                    <name>RegistrationRespMsg</name>
+                    <direction>out</direction>
+                    <relatedStateVariable>A_ARG_TYPE_RegistrationRespMsg</relatedStateVariable>
+                </argument>
+            </argumentList>
+        </action>
+        <action>
+            <name>IsValidated</name>
+            <argumentList>
+                <argument>
+                    <name>DeviceID</name>
+                    <direction>in</direction>
+                    <relatedStateVariable>A_ARG_TYPE_DeviceID</relatedStateVariable>
+                </argument>
+                <argument>
+                    <name>Result</name>
+                    <direction>out</direction>
+                    <relatedStateVariable>A_ARG_TYPE_Result</relatedStateVariable>
+                </argument>
+            </argumentList>
+        </action>
+    </actionList>
+    <serviceStateTable>
+        <stateVariable sendEvents="no">
+            <name>A_ARG_TYPE_DeviceID</name>
+            <dataType>string</dataType>
+        </stateVariable>
+        <stateVariable sendEvents="no">
+            <name>A_ARG_TYPE_Result</name>
+            <dataType>int</dataType>
+        </stateVariable>
+        <stateVariable sendEvents="no">
+            <name>A_ARG_TYPE_RegistrationReqMsg</name>
+            <dataType>bin.base64</dataType>
+        </stateVariable>
+        <stateVariable sendEvents="no">
+            <name>A_ARG_TYPE_RegistrationRespMsg</name>
+            <dataType>bin.base64</dataType>
+        </stateVariable>
+        <stateVariable sendEvents="no">
+            <name>AuthorizationGrantedUpdateID</name>
+            <dataType>ui4</dataType>
+        </stateVariable>
+        <stateVariable sendEvents="no">
+            <name>AuthorizationDeniedUpdateID</name>
+            <dataType>ui4</dataType>
+        </stateVariable>
+        <stateVariable sendEvents="no">
+            <name>ValidationSucceededUpdateID</name>
+            <dataType>ui4</dataType>
+        </stateVariable>
+        <stateVariable sendEvents="no">
+            <name>ValidationRevokedUpdateID</name>
+            <dataType>ui4</dataType>
+        </stateVariable>
+    </serviceStateTable>
+</scpd>
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/www/wmc.xml
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/www/wmc.xml	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/www/wmc.xml	(revision 27875)
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<root xmlns:dlna="urn:schemas-dlna-org:device-1-0" xmlns="urn:schemas-upnp-org:device-1-0">
+    <specVersion>
+        <major>1</major>
+        <minor>0</minor>
+    </specVersion>
+    <device>
+        <deviceType>urn:schemas-upnp-org:device:MediaServer:1</deviceType>
+        <UDN>uuid:${uuid}</UDN>
+        <friendlyName>xupnpd:Windows Media Connect</friendlyName>
+        <manufacturer>Microsoft Corporation</manufacturer>
+        <manufacturerURL>http://www.microsoft.com</manufacturerURL>
+        <modelName>Windows Media Player Sharing</modelName>
+        <modelNumber>12.0</modelNumber>
+        <modelURL>http://go.microsoft.com/fwlink/?LinkId=105926</modelURL>
+        <serialNumber>{3BBA88DE-66F2-4A7A-952B-30C69B210B0F}</serialNumber>
+        <dlna:X_DLNADOC xmlns:dlna="urn:schemas-dlna-org:device-1-0">DMS-1.50</dlna:X_DLNADOC>
+        <microsoft:magicPacketWakeSupported xmlns:microsoft="urn:schemas-microsoft-com:WMPNSS-1-0">1</microsoft:magicPacketWakeSupported>
+        <iconList>
+           <icon>
+                <mimetype>image/png</mimetype>
+                <height>48</height>
+                <width>48</width>
+                <depth>8</depth>
+                <url>/icon-48x48.png</url>
+           </icon>
+        </iconList>
+        <serviceList>
+            <service>
+                <serviceType>urn:schemas-upnp-org:service:ContentDirectory:1</serviceType>
+                <serviceId>urn:upnp-org:serviceId:ContentDirectory</serviceId>
+                <SCPDURL>/cds.xml</SCPDURL>
+                <controlURL>/soap/cds</controlURL>
+                <eventSubURL>/event/cds</eventSubURL>
+            </service>
+            <service>
+                <serviceType>urn:schemas-upnp-org:service:ConnectionManager:1</serviceType>
+                <serviceId>urn:upnp-org:serviceId:ConnectionManager</serviceId>
+                <SCPDURL>/cms.xml</SCPDURL>
+                <controlURL>/soap/cms</controlURL>
+                <eventSubURL>/event/cms</eventSubURL>
+            </service>
+            <service>
+                <serviceType>urn:microsoft.com:service:X_MS_MediaReceiverRegistrar:1</serviceType>
+                <serviceId>urn:microsoft.com:serviceId:X_MS_MediaReceiverRegistrar</serviceId>
+                <SCPDURL>/msr.xml</SCPDURL>
+                <controlURL>/soap/msr</controlURL>
+                <eventSubURL>/event/msr</eventSubURL>
+            </service>
+        </serviceList>
+        <presentationURL>/</presentationURL>
+    </device>
+    <URLBase>http://${interface}:${port}/</URLBase>
+</root>
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/xupnpd.lua
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/xupnpd.lua	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/xupnpd.lua	(revision 27875)
@@ -0,0 +1,116 @@
+cfg={}
+
+-- multicast interface for SSDP exchange, 'eth0', 'br0', 'br-lan' for example
+cfg.ssdp_interface='any'
+
+-- 'cfg.ssdp_loop' enables multicast loop (if player and server in one host)
+cfg.ssdp_loop=1
+
+-- SSDP announcement interval
+cfg.ssdp_notify_interval=15
+
+-- SSDP announcement age
+cfg.ssdp_max_age=1800
+
+-- HTTP port for incoming connections
+cfg.http_port=4044
+
+-- syslog facility (syslog,local0-local7)
+cfg.log_facility='local0'
+
+-- 'cfg.daemon' detach server from terminal
+cfg.daemon=true
+
+-- silent mode - no logs, no pid file
+cfg.embedded=true
+
+-- 'cfg.debug' enables SSDP debug output to stdout (if cfg.daemon=false)
+-- 0-off, 1-basic, 2-messages
+cfg.debug=1
+
+-- external 'udpxy' url for multicast playlists (udp://@...)
+--cfg.udpxy_url='http://192.168.1.1:4022'
+
+-- downstream interface for builtin multicast proxy (comment 'cfg.udpxy_url' for processing 'udp://@...' playlists)
+cfg.mcast_interface='eth0'
+
+-- 'cfg.proxy' enables proxy for injection DLNA headers to stream
+-- 0-off, 1-radio, 2-radio/TV
+cfg.proxy=2
+
+-- User-Agent for proxy
+cfg.user_agent='Mozilla/5.0'
+
+-- I/O timeout
+cfg.http_timeout=30
+
+-- enables UPnP/DLNA notify when reload playlist
+cfg.dlna_notify=true
+
+-- group by 'group-title'
+cfg.group=false
+
+-- sort files
+cfg.sort_files=false
+
+-- Device name
+--cfg.name='Titan UPnP-Server'
+cfg.name=io.popen("uname -n"):read("*l")..'-xupnpd'
+
+-- static device UUID, '60bd2fb3-dabe-cb14-c766-0e319b54c29a' for example or nil
+-- cfg.uuid='60bd2fb3-dabe-cb14-c766-0e319b54c29a'
+cfg.uuid='8c1be340-2ed0-11e3-aa6e-0800200c9a66'
+
+
+-- max url cache size
+cfg.cache_size=8
+
+-- url cache item ttl (sec)
+cfg.cache_ttl=900
+
+-- default mime type (mpeg, mpeg_ts, mpeg1, mpeg2, ts, ...)
+cfg.default_mime_type='mpeg'
+
+-- feeds update interval (seconds, 0 - disabled)
+cfg.feeds_update_interval=0
+cfg.playlists_update_interval=0
+
+-- playlist (m3u file path or path with alias
+playlist=
+{
+--    { './playlists/mozhay.m3u', 'Mozhay.tv' },
+    { '/media/hdd/movie', 'Records' }
+--    { './private', 'Private Media Files', '127.0.0.1;192.168.1.1' }  -- only for 127.0.0.1 and 192.168.1.1
+}
+
+-- feeds list (plugin, feed name, feed type)
+feeds=
+{
+--    { 'vimeo',          'channel/hd',           'Vimeo HD Channel' },
+--    { 'vimeo',          'channel/hdxs',         'Vimeo Xtreme sports' },
+--    { 'vimeo',          'channel/mtb',          'Vimeo MTB Channel' },
+--    { 'youtube',        'channel/top_rated',    'YouTube Top Rated' },
+--    { 'youtube',        'Drift0r',              'Drift0r' },
+--    { 'youtube',        'XboxAhoy',             'XboxAhoy' },
+--    { 'ag',             'videos',               'AG - New' },
+--    { 'ivi',            'new',                  'IVI - New' },
+--    { 'gametrailers',   'ps3',                   'GT - PS3' },
+--    { 'giantbomb',      'all',                  'GiantBomb - All' },
+--    { 'dreambox',       'http://192.168.0.1:8001/','Dreambox1' },
+}
+
+-- log ident, pid file end www root
+cfg.version='1.031'
+cfg.log_ident=arg[1] or 'xupnpd'
+cfg.pid_file='/var/run/'..cfg.log_ident..'.pid'
+cfg.www_root='./www/'
+cfg.tmp_path='/tmp/'
+cfg.plugin_path='./plugins/'
+cfg.config_path='./config/'
+cfg.playlists_path='./playlists/'
+--cfg.feeds_path='/tmp/xupnpd-feeds/'
+cfg.ui_path='./ui/'
+cfg.drive=''                    -- reload playlists only if drive state=active/idle, example: cfg.drive='/dev/sda'
+cfg.profiles='./profiles/'      -- device profiles feature
+
+dofile('xupnpd_main.lua')
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/xupnpd_http.lua
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/xupnpd_http.lua	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/xupnpd_http.lua	(revision 27875)
@@ -0,0 +1,581 @@
+-- Copyright (C) 2011-2013 Anton Burdinuk
+-- clark15b@gmail.com
+-- https://tsdemuxer.googlecode.com/svn/trunk/xupnpd
+
+http_mime={}
+http_err={}
+http_vars={}
+
+-- http_mime types
+http_mime['html']='text/html'
+http_mime['htm']='text/html'
+http_mime['xml']='text/xml; charset="UTF-8"'
+http_mime['txt']='text/plain'
+http_mime['srt']='video/subtitle'
+http_mime['cpp']='text/plain'
+http_mime['h']='text/plain'
+http_mime['lua']='text/plain'
+http_mime['jpg']='image/jpeg'
+http_mime['png']='image/png'
+http_mime['ico']='image/vnd.microsoft.icon'
+http_mime['mpeg']='video/mpeg'
+http_mime['css']='text/css'
+http_mime['json']='application/json'
+http_mime['js']='application/javascript'
+http_mime['m3u']='audio/x-mpegurl'
+
+-- http http_error list
+http_err[100]='Continue'
+http_err[101]='Switching Protocols'
+http_err[200]='OK'
+http_err[201]='Created'
+http_err[202]='Accepted'
+http_err[203]='Non-Authoritative Information'
+http_err[204]='No Content'
+http_err[205]='Reset Content'
+http_err[206]='Partial Content'
+http_err[300]='Multiple Choices'
+http_err[301]='Moved Permanently'
+http_err[302]='Moved Temporarily'
+http_err[303]='See Other'
+http_err[304]='Not Modified'
+http_err[305]='Use Proxy'
+http_err[400]='Bad Request'
+http_err[401]='Unauthorized'
+http_err[402]='Payment Required'
+http_err[403]='Forbidden'
+http_err[404]='Not Found'
+http_err[405]='Method Not Allowed'
+http_err[406]='Not Acceptable'
+http_err[407]='Proxy Authentication Required'
+http_err[408]='Request Time-Out'
+http_err[409]='Conflict'
+http_err[410]='Gone'
+http_err[411]='Length Required'
+http_err[412]='Precondition Failed'
+http_err[413]='Request Entity Too Large'
+http_err[414]='Request-URL Too Large'
+http_err[415]='Unsupported Media Type'
+http_err[416]='Requested range not satisfiable'
+http_err[500]='Internal Server http_error'
+http_err[501]='Not Implemented'
+http_err[502]='Bad Gateway'
+http_err[503]='Out of Resources'
+http_err[504]='Gateway Time-Out'
+http_err[505]='HTTP Version not supported'
+
+http_vars['fname']=cfg.name
+http_vars['manufacturer']=util.xmlencode('Anton Burdinuk <clark15b@gmail.com>')
+http_vars['manufacturer_url']=''
+http_vars['description']=ssdp_server
+http_vars['name']='xupnpd'
+http_vars['version']=cfg.version
+http_vars['url']='http://xupnpd.org'
+http_vars['uuid']=ssdp_uuid
+http_vars['interface']=ssdp.interface()
+http_vars['port']=cfg.http_port
+http_vars['uptime']=core.uptime
+
+http_templ=
+{
+    '/dev.xml',
+    '/wmc.xml',
+    '/index.html'
+}
+
+dofile('xupnpd_soap.lua')
+
+function compile_templates()
+    local path=cfg.tmp_path..'xupnpd-cache'
+
+    os.execute('mkdir -p '..path)
+
+    for i,fname in ipairs(http_templ) do
+        http.compile_template(cfg.www_root..fname,path..fname,http_vars)
+    end
+end
+
+function http_send_headers(err,ext,len)
+    http.send(
+        string.format(
+            'HTTP/1.1 %i %s\r\nPragma: no-cache\r\nCache-control: no-cache\r\nDate: %s\r\nServer: %s\r\nAccept-Ranges: none\r\n'..
+            'Connection: close\r\nContent-Type: %s\r\nEXT:\r\n',
+            err,http_err[err] or 'Unknown',os.date('!%a, %d %b %Y %H:%M:%S GMT'),ssdp_server,http_mime[ext] or 'application/x-octet-stream')
+    )
+    if len then http.send(string.format("Content-Length: %s\r\n",len)) end
+    http.send("\r\n")
+
+    if cfg.debug>0 and err~=200 then print('http error '..err) end
+
+end
+
+function get_soap_method(s)
+    local i=string.find(s,'#',1,true)
+    if not i then return s end
+    return string.sub(s,i+1)
+end
+
+function plugin_sendurl_from_cache(url,range)
+    local c=cache[url]
+
+    if c==nil or c.value==nil then return false end
+
+    if cfg.debug>0 then print('Cache URL: '..c.value) end
+
+    local rc,location,l
+
+    location=c.value
+
+    for i=1,5,1 do
+        rc,l=http.sendurl(location,1,range)
+
+        if l then
+            location=l
+            core.sendevent('store',url,location)
+            if cfg.debug>0 then print('Redirect #'..i..' to: '..location) end
+        else
+            if rc~=0 then return true end
+
+            if cfg.debug>0 then print('Retry #'..i..' location: '..location) end
+        end
+    end
+
+    return false
+end
+
+function plugin_sendurl(url,real_url,range)
+    local rc,location,l
+
+    location=real_url
+
+    core.sendevent('store',url,real_url)
+
+    for i=1,5,1 do
+        rc,l=http.sendurl(location,1,range)
+
+        if l then
+            location=l
+            core.sendevent('store',url,location)
+            if cfg.debug>0 then print('Redirect #'..i..' to: '..location) end
+        else
+            if rc~=0 then return true end
+
+            if cfg.debug>0 then print('Retry #'..i..' location: '..location) end
+        end
+    end
+
+    return false
+end
+
+function plugin_sendfile(path)
+    local len=util.getflen(path)
+    if len then
+        http.send(string.format('Content-Length: %s\r\n\r\n',len))
+        http.sendfile(path)
+    else
+        http.send('\r\n')
+    end
+end
+
+function plugin_download(url)
+    local data,location
+
+    location=url
+
+    for i=1,5,1 do
+        data,location=http.download(location)
+
+        if not location then
+            return data
+        else
+            if cfg.debug>0 then print('Redirect #'..i..' to: '..location) end
+        end
+    end
+
+    return nil
+end
+
+function plugin_get_length(url)
+    local len,location
+
+    location=url
+
+    for i=1,5,1 do
+        len,location=http.get_length(location)
+
+        if not location then
+            return len
+        else
+            if cfg.debug>0 then print('Redirect #'..i..' to: '..location) end
+        end
+    end
+
+    return 0
+end
+
+function http_get_action(url)
+
+    local t=split_string(url,'/')
+
+    return t[1] or '', string.match(t[2] or '','^([%w_]+)%.?%w*') or ''
+
+end
+
+local http_ui_main=cfg.ui_path..'xupnpd_ui.lua'
+
+if not util.getflen(http_ui_main) then
+    http_ui_main=nil
+end
+
+function http_handler(what,from,port,msg)
+
+    if not msg or not msg.reqline then return end
+
+    local pr_name=nil
+
+    if cfg.profiles then
+        pr_name=profile_change(msg['user-agent'],msg)
+
+        if msg.reqline[2]=='/dev.xml' then msg.reqline[2]=cfg.dev_desc_xml end
+    end
+
+    if msg.reqline[2]=='/' then
+        if http_ui_main then msg.reqline[2]='/ui' else msg.reqline[2]='/index.html' end
+    end
+
+    local head=false
+
+    local f=util.geturlinfo(cfg.www_root,msg.reqline[2])
+
+    if not f or (msg.reqline[3]~='HTTP/1.0' and msg.reqline[3]~='HTTP/1.1') then
+        http_send_headers(400)
+        return
+    end
+
+    if cfg.debug>0 then print(string.format('%s %s %s "%s" [%s]',from,msg.reqline[1],msg.reqline[2],msg['user-agent'] or '',pr_name or 'generic')) end
+
+    local from_ip=string.match(from,'(.+):.+')
+
+    if string.find(f.url,'^/ui/?') then
+        if not http_ui_main then
+            http_send_headers(404)
+        else
+            dofile(http_ui_main)
+            ui_handler(f.args,msg.data or '',from_ip,f.url)
+        end
+        return
+    end
+
+    if msg.reqline[1]=='HEAD' then head=true msg.reqline[1]='GET' end
+
+    local url,object=http_get_action(f.url)
+
+    -- UPnP SOAP Exchange
+    if url=='soap' then
+
+        if not msg.soapaction then msg.soapaction=f.args.action end
+
+        if cfg.debug>0 then print(from..' SOAP '..(msg.soapaction or '')) end
+
+        local err=true
+
+        local s=services[object ]
+
+        if s then
+            local func_name=get_soap_method(msg.soapaction or '')
+            local func=s[func_name]
+
+            if func then
+
+                if cfg.debug>1 then print(msg.data) end
+
+                local r=soap.find('Envelope/Body/'..func_name,soap.parse(msg.data or ''))
+
+                if not r then r=f.args end
+
+                r=func(r or {},from_ip)
+
+                if r then
+                    local resp=
+                        string.format(
+                            '<?xml version=\"1.0\" encoding=\"utf-8\"?>'..
+                            '<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">'..
+                            '<s:Body><u:%sResponse xmlns:u=\"%s\">%s</u:%sResponse></s:Body></s:Envelope>',
+                                func_name,s.schema,soap.serialize_vector(r),func_name)
+
+                    local resp_len=resp:len() if cfg.soap_length==false then resp_len=nil end
+
+                    http_send_headers(200,'xml',resp_len)
+
+                    http.send(resp)
+
+                    if cfg.debug>2 then print(resp) end
+
+                    err=false
+                end
+            end
+        end
+
+        if err==true then
+            local resp=
+            '<?xml version=\"1.0\" encoding=\"utf-8\"?>'..
+            '<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">'..
+               '<s:Body>'..
+                  '<s:Fault>'..
+                     '<faultcode>s:Client</faultcode>'..
+                     '<faultstring>UPnPError</faultstring>'..
+                     '<detail>'..
+                        '<u:UPnPError xmlns:u=\"urn:schemas-upnp-org:control-1-0\">'..
+                           '<u:errorCode>501</u:errorCode>'..
+                           '<u:errorDescription>Action Failed</u:errorDescription>'..
+                        '</u:UPnPError>'..
+                     '</detail>'..
+                  '</s:Fault>'..
+               '</s:Body>'..
+            '</s:Envelope>'
+
+            local resp_len=resp:len() if cfg.soap_length==false then resp_len=nil end
+
+            http_send_headers(200,'xml',resp_len)
+
+            http.send(resp)
+
+            if cfg.debug>0 then print('upnp error 501') end
+
+        end
+
+    -- UPnP Events
+    elseif url=='event' then
+
+        if msg.reqline[1]=='SUBSCRIBE' then
+            local ttl=1800
+            local sid=core.uuid()
+
+            if object~='' and msg.callback then
+                core.sendevent('subscribe',object,sid,string.match(msg.callback,'<(.+)>'),ttl)
+            end
+
+            http.send(
+                string.format(
+                    'HTTP/1.1 200 OK\r\nPragma: no-cache\r\nCache-control: no-cache\r\nDate: %s\r\nServer: %s\r\nAccept-Ranges: none\r\n'..
+                    'Connection: close\r\nEXT:\r\nSID: uuid:%s\r\nTIMEOUT: Second-%d\r\n\r\n',
+                    os.date('!%a, %d %b %Y %H:%M:%S GMT'),ssdp_server,sid,ttl))
+        elseif msg.reqline[1]=='UNSUBSCRIBE' then
+
+            if msg.sid then
+                core.sendevent('unsubscribe',string.match(msg.sid,'uuid:(.+)'))
+            end
+
+            http.send(
+                string.format(
+                    'HTTP/1.1 200 OK\r\nPragma: no-cache\r\nCache-control: no-cache\r\nDate: %s\r\nServer: %s\r\nAccept-Ranges: none\r\n'..
+                    'Connection: close\r\nEXT:\r\n\r\n',
+                    os.date('!%a, %d %b %Y %H:%M:%S GMT'),ssdp_server))
+        else
+            http_send_headers(404)
+        end
+
+    -- UPnP Streaming
+    elseif url=='proxy' then
+
+        local pls=find_playlist_object(object)
+
+        if not pls then http_send_headers(404) return end
+
+        local mtype,extras=playlist_item_type(pls)
+
+        http.send(string.format(
+            'HTTP/1.1 200 OK\r\nPragma: no-cache\r\nCache-control: no-cache\r\nDate: %s\r\nServer: %s\r\n'..
+            'Connection: close\r\nContent-Type: %s\r\nEXT:\r\n',
+            os.date('!%a, %d %b %Y %H:%M:%S GMT'),ssdp_server,mtype[3]))
+
+        if cfg.dlna_headers==true then http.send('TransferMode.DLNA.ORG: Streaming\r\nContentFeatures.DLNA.ORG: '..extras..'\r\n') end
+
+        if cfg.content_disp==true then
+            http.send(string.format('Content-Disposition: attachment; filename=\"%s.%s\"\r\n',pls.objid,pls.type))      -- string.gsub(pls.name,"[\/#|@&*`']","_")
+        end
+
+        if head==true then
+            http.send('\r\n')
+            http.flush()
+        else
+            if pls.event then core.sendevent(pls.event,pls.url) end
+
+            if cfg.debug>0 then print(from..' PROXY '..pls.url..' <'..mtype[3]..'>') end
+
+            core.sendevent('status',util.getpid(),from_ip..' '..pls.name)
+
+            if pls.plugin then
+                http.send('Accept-Ranges: bytes\r\n')
+                http.flush()
+
+                local p=plugins[pls.plugin]
+
+                if p and p.disabled~=true then p.sendurl(pls.url,msg.range) end
+            else
+                if cfg.wdtv==true then
+                    http.send('Content-Size: 65535\r\n')
+                    http.send('Content-Length: 65535\r\n')
+                end
+
+                http.send('Accept-Ranges: none\r\n\r\n')
+
+                if string.find(pls.url,'^udp://@') then
+                    http.sendmcasturl(string.sub(pls.url,8),cfg.mcast_interface,2048)
+                else
+                    http.sendurl(pls.url)
+                end
+            end
+        end
+
+    -- UPnP AlbumArt
+    elseif url=='logo' then
+
+        local pls=find_playlist_object(object)
+
+        if not pls or not pls.logo then http_send_headers(404) return end
+
+        http.send(string.format(
+            'HTTP/1.1 200 OK\r\nDate: %s\r\nServer: %s\r\nConnection: close\r\nAccept-Ranges: none\r\nContent-Type: %s\r\nEXT:\r\n',
+            os.date('!%a, %d %b %Y %H:%M:%S GMT'),ssdp_server,http_mime['jpg']))
+
+        if cfg.dlna_headers==true then http.send('ContentFeatures.DLNA.ORG: DLNA.ORG_PN=JPEG_TN\r\n') end
+
+        if head==true then
+            http.send('\r\n')
+        else
+            if cfg.debug>0 then print(from..' LOGO '..pls.logo) end
+
+            http.sendurl(pls.logo,1)
+        end
+
+    -- Subtitle
+    elseif url=='sub' then
+
+        local pls=find_playlist_object(object)
+
+        if not pls or not pls.path then http_send_headers(404) return end
+
+        local path=string.gsub(pls.path,'.%w+$','.srt')
+
+        local flen=util.getflen(path)
+
+        if not flen then http_send_headers(404) return end
+
+        http.send(string.format(
+            'HTTP/1.1 200 OK\r\nDate: %s\r\nServer: %s\r\nConnection: close\r\nAccept-Ranges: none\r\nContent-Type: %s\r\nContent-Length: %s\r\nEXT:\r\n\r\n',
+            os.date('!%a, %d %b %Y %H:%M:%S GMT'),ssdp_server,http_mime['srt'],flen))
+
+        if head~=true then
+            if cfg.debug>0 then print(from..' SUB '..path) end
+
+            http.sendfile(path)
+        end
+
+    -- UPnP Local files streaming
+    elseif url=='stream' then
+
+        local pls=find_playlist_object(object)
+
+        if not pls or not pls.path then http_send_headers(404) return end
+
+        local flen=pls.length
+
+        local ffrom=0
+        local flen_total=flen
+
+        if msg.range and flen and flen>0 then
+            local f,t=string.match(msg.range,'bytes=(.*)-(.*)')
+
+            f=tonumber(f)
+            t=tonumber(t)
+
+            if not f then f=0 end
+            if not t then t=flen-1 end
+
+            if f>t or t+1>flen then http_send_headers(416) return end
+
+            ffrom=f
+            flen=t-f+1
+        end
+
+        local mtype,extras=playlist_item_type(pls)
+
+        http.send(string.format(
+            'HTTP/1.1 200 OK\r\nPragma: no-cache\r\nCache-control: no-cache\r\nDate: %s\r\nServer: %s\r\n'..
+            'Connection: close\r\nContent-Type: %s\r\nEXT:\r\n',
+            os.date('!%a, %d %b %Y %H:%M:%S GMT'),ssdp_server,mtype[3]))
+
+        if flen then
+            http.send(string.format('Accept-Ranges: bytes\r\nContent-Length: %s\r\n',flen))
+        else
+            http.send('Accept-Ranges: none\r\n')
+        end
+
+        if cfg.dlna_headers==true then http.send('TransferMode.DLNA.ORG: Streaming\r\nContentFeatures.DLNA.ORG: '..extras..'\r\n') end
+
+        if cfg.content_disp==true then
+            http.send(string.format('Content-Disposition: attachment; filename=\"%s.%s\"\r\n',pls.objid,pls.type))
+        end
+
+        if msg.range and flen and flen>0 then
+            http.send(string.format('Content-Range: bytes %s-%s/%s\r\n',ffrom,ffrom+flen-1,flen_total))
+        end
+
+        http.send('\r\n')
+        http.flush()
+
+        if head~=true then
+            if pls.event then core.sendevent(pls.event,pls.path) end
+
+            if cfg.debug>0 then print(from..' STREAM '..pls.path..' <'..mtype[3]..'>') end
+
+            core.sendevent('status',util.getpid(),from_ip..' '..pls.name)
+
+            http.sendfile(pls.path,ffrom,flen)
+        end
+
+    else
+        if f.type=='none' then http_send_headers(404) return end
+        if f.type~='file' then http_send_headers(403) return end
+
+        local tmpl_name=nil
+
+        for i,fname in ipairs(http_templ) do
+            if f.url==fname then tmpl_name=cfg.tmp_path..'xupnpd-cache'..fname break end
+        end
+
+        local len=nil
+
+        if not tmpl_name then len=f.length else len=util.getflen(tmpl_name) end
+
+        http.send(
+            string.format(
+                'HTTP/1.1 200 OK\r\nDate: %s\r\nServer: %s\r\nAccept-Ranges: none\r\nConnection: close\r\nContent-Type: %s\r\nEXT:\r\n',
+                os.date('!%a, %d %b %Y %H:%M:%S GMT'),ssdp_server,http_mime[f.ext] or 'application/x-octet-stream'))
+
+        if len then
+            http.send(string.format('Content-Length: %s\r\n',len))
+        end
+
+        http.send('\r\n')
+
+        if head~=true then
+            if cfg.debug>0 then print(from..' FILE '..f.path) end
+
+            if tmpl_name~=nil then
+                if len then http.sendfile(tmpl_name) else http.sendtfile(f.path,http_vars) end
+            else
+                http.sendfile(f.path)
+            end
+        end
+    end
+
+    http.flush()
+end
+
+compile_templates()
+
+events["http"]=http_handler
+
+http.listen(cfg.http_port,"http")
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/xupnpd_m3u.lua
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/xupnpd_m3u.lua	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/xupnpd_m3u.lua	(revision 27875)
@@ -0,0 +1,276 @@
+-- Copyright (C) 2011-2013 Anton Burdinuk
+-- clark15b@gmail.com
+-- https://tsdemuxer.googlecode.com/svn/trunk/xupnpd
+
+function add_playlists_from_dir(dir_path,playlist,plist)
+
+    local d=util.dir(dir_path)
+
+    if d then
+        table.sort(d)
+        local tt={}
+        for i,j in ipairs(playlist) do
+            local path=nil
+            if type(j)=='table' then path=j[1] else path=j end
+            tt[path]=j
+        end
+
+        for i,j in ipairs(d) do
+            if string.find(j,'%.m3u$') then
+                local fname=dir_path..j
+                if not tt[fname] then
+                    table.insert(plist,fname)
+                    if cfg.debug>0 then print('found unlisted playlist \''..fname..'\'') end
+                end
+            end
+        end
+    end
+end
+
+function playlist_new_folder(parent,name)
+    local child={}
+    parent.size=parent.size+1
+    child.name=name
+    child.objid=parent.objid..'_'..parent.size
+    child.parent=parent
+    child.size=0
+    child.elements={}
+    parent.elements[parent.size]=child
+    return child
+end
+
+function playlist_sort_elements(pls)
+    if cfg.sort_files~=true or pls==nil or pls.elements==nil then return end
+    table.sort(pls.elements,function(a,b) return string.lower(a.name)<string.lower(b.name) end)
+end
+
+function playlist_fix_sub_tree(pls)
+    playlist_sort_elements(pls)
+    for i,j in ipairs(pls.elements) do
+        j.objid=pls.objid..'_'..i
+        j.parent=pls
+
+        if j.elements then
+            playlist_fix_sub_tree(j)
+        else
+            j.type=util.getfext(j.url)
+
+            if not mime[j.type] then j.type=cfg.default_mime_type end
+        end
+
+    end
+end
+
+function playlist_attach(parent,pls)
+    parent.size=parent.size+1
+    pls.objid=parent.objid..'_'..parent.size
+    pls.parent=parent
+    parent.elements[parent.size]=pls
+end
+
+function get_m3u_count(plist)
+    local count=0
+    for i,j in ipairs(plist) do
+        if type(j)=='table' then j=j[1] end
+        if string.find(j,'%.m3u$') then count=count+1 end
+    end
+    return count
+end
+
+function reload_playlists()
+    playlist_data={}
+    playlist_data.name='root'
+    playlist_data.objid='0'
+    playlist_data.size=0
+    playlist_data.elements={}
+
+    local plist=clone_table(playlist)
+
+    add_playlists_from_dir(cfg.playlists_path,playlist,plist)
+    if cfg.feeds_path~=cfg.playlists_path then add_playlists_from_dir(cfg.feeds_path,playlist,plist) end
+
+    local pls_folder=playlist_data
+
+    if cfg.group==true and get_m3u_count(plist)>0 then
+        pls_folder=playlist_new_folder(playlist_data,'Playlists')
+    end
+
+    local groups={}
+
+    for i,j in ipairs(plist) do
+
+        local pls
+
+        if type(j)=='table' then
+
+            if string.find(j[1],'%.m3u$') then pls=m3u.parse(j[1]) else pls=m3u.scan(j[1]) end
+
+            if pls then
+                if j[2] then pls.name=j[2] end
+                if j[3] then pls.acl=j[3] end
+            end
+        else
+            if string.find(j,'%.m3u$') then pls=m3u.parse(j) else pls=m3u.scan(j) end
+        end
+
+        if pls then
+            if pls.filesystem then
+                playlist_attach(playlist_data,pls)
+            else
+                playlist_attach(pls_folder,pls)
+            end
+
+            if cfg.debug>0 then print('playlist \''..pls.name..'\'') end
+
+            if pls.filesystem then
+                playlist_fix_sub_tree(pls)
+            else
+                local udpxy=cfg.udpxy_url
+
+                for ii,jj in ipairs(pls.elements) do
+
+                    if udpxy then
+                        if string.find(jj.url,'^udp://@') or string.find(jj.url,'^rtp://@') then
+                            jj.url=string.format('%s/%s/%s',udpxy,string.sub(jj.url,1,3),string.sub(jj.url,8))
+                        end
+                    end
+
+                    if not jj.type then
+                        if pls.type then
+                            jj.type=pls.type
+                        else
+                            jj.type=util.getfext(jj.url)
+                        end
+                    end
+
+                    if pls.plugin and not jj.plugin then jj.plugin=pls.plugin end
+
+                    if pls.dlna_extras and not jj.dlna_extras then jj.dlna_extras=pls.dlna_extras end
+
+                    if not mime[jj.type] then jj.type=cfg.default_mime_type end
+
+                    jj.objid=pls.objid..'_'..ii
+                    jj.parent=pls
+                    if cfg.debug>1 then print('\''..jj.name..'\' '..jj.url..' <'..jj.type..'>') end
+
+                    if cfg.group==true then
+                        local group_title=jj['group-title']
+                        if group_title then
+                            local group=groups[group_title]
+                            if not group then
+                                group={}
+                                group.name=group_title
+                                group.elements={}
+                                group.size=0
+                                group.virtual=true
+                                groups[group_title]=group
+                            end
+
+                            local element=clone_table(jj)
+                            element.parent=group
+                            element.objid=nil
+                            group.size=group.size+1
+                            group.elements[group.size]=element
+                        end
+                    end
+                end
+            end
+        end
+    end
+
+    if cfg.group==true then
+        for i,j in pairs(groups) do
+
+            if cfg.debug>0 then print('group \''..j.name..'\'') end
+
+            playlist_attach(playlist_data,j)
+
+            for ii,jj in ipairs(j.elements) do
+                jj.objid=j.objid..'_'..ii
+            end
+        end
+    end
+
+end
+
+function find_playlist_object(s)
+    if not s then return nil end
+
+    local pls=nil
+
+    for i in string.gmatch(s,'([^_]+)') do
+        if not pls then
+            if string.find(i,'^%d+$') then pls=playlist_data else return nil end
+        else
+            if not pls.elements then return nil end            
+            pls=pls.elements[tonumber(i)]
+        end
+    end
+    return pls
+end
+
+function rss_merge(new,old,max_num)
+
+    local tt={}
+
+    for i,j in ipairs(old) do tt[j.title]=j end
+    for i,j in ipairs(new) do if tt[j.title] then j.link=nil end end
+
+    tt={} local idx=1
+
+    for i,j in ipairs(new) do if idx>max_num then break end if j.link then tt[idx]=j idx=idx+1 end end
+
+    for i,j in ipairs(old) do if idx>max_num then break end tt[idx]=j idx=idx+1 end
+
+    return tt
+end
+
+function rss_parse_m3u(path)
+    local t={}
+
+    local x=m3u.parse(path)
+    if x and x.elements then
+        local idx=1
+        for i,j in ipairs(x.elements) do
+            t[idx]={ ['title']=j.name, ['link']=j.url, ['logo']=j.logo }
+            idx=idx+1
+        end
+    end
+
+    return t
+end
+
+function rss_parse_feed(url,logo_regexp)
+    local t={}
+
+    local feed_data=http.download(url)
+
+    if not feed_data then return t end
+
+    if not logo_regexp then logo_regexp='url="(.-)"' end
+
+    local x=xml.find('rss/channel',xml.decode(feed_data))
+
+    feed_data=nil
+
+    if x and x['@elements'] then
+        local idx=1
+        for i,j in ipairs(x['@elements']) do
+            if j['@name']=='item' then
+                local title=nil if j.title then title=j.title['@value'] end
+                local link =nil if j.link then link=j.link['@value'] end
+                local logo =nil if j.enclosure then logo=j.enclosure['@attr'] end
+
+                if logo then logo=string.match(logo,logo_regexp) end
+
+                if title and link then
+                    t[idx]={ ['title']=title, ['link']=link, ['logo']=logo }
+                    idx=idx+1
+                end
+            end
+        end
+    end
+    return t
+end
+
+reload_playlists()
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/xupnpd_main.lua
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/xupnpd_main.lua	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/xupnpd_main.lua	(revision 27875)
@@ -0,0 +1,360 @@
+-- Copyright (C) 2011-2013 Anton Burdinuk
+-- clark15b@gmail.com
+-- https://tsdemuxer.googlecode.com/svn/trunk/xupnpd
+
+http.sendurl_buffer_size(32768,1);
+
+if cfg.daemon==true then core.detach() end
+
+core.openlog(cfg.log_ident,cfg.log_facility)
+
+if cfg.daemon==true then core.touchpid(cfg.pid_file) end
+
+if cfg.embedded==true then cfg.debug=0 end
+
+function clone_table(t)
+    local tt={}
+    for i,j in pairs(t) do
+        tt[i]=j
+    end
+    return tt
+end
+
+function split_string(s,d)
+    local t={}
+    d='([^'..d..']+)'
+    for i in string.gmatch(s,d) do
+        table.insert(t,i)
+    end
+    return t
+end
+
+function load_plugins(path,what)
+    local d=util.dir(path)
+
+    if d then
+        for i,j in ipairs(d) do
+            if string.find(j,'^[%w_-]+%.lua$') then
+                if cfg.debug>0 then print(what..' \''..j..'\'') end
+                dofile(path..j)
+            end
+        end
+    end
+end
+
+
+-- options for profiles
+cfg.dev_desc_xml='/dev.xml'             -- UPnP Device Description XML
+cfg.upnp_container='object.container'   -- UPnP class for containers
+cfg.upnp_artist=false                   -- send <upnp:artist> / <upnp:actor> in SOAP response
+cfg.upnp_feature_list=''                -- X_GetFeatureList response body
+cfg.upnp_albumart=0                     -- 0: <upnp:albumArtURI>direct url</upnp:albumArtURI>, 1: <res>direct url<res>, 2: <upnp:albumArtURI>local url</upnp:albumArtURI>, 3: <res>local url<res>
+cfg.dlna_headers=true                   -- send TransferMode.DLNA.ORG and ContentFeatures.DLNA.ORG in HTTP response
+cfg.dlna_extras=true                    -- DLNA extras in headers and SOAP
+cfg.content_disp=false                  -- send Content-Disposition when streaming
+cfg.soap_length=true                    -- send Content-Length in SOAP response
+cfg.wdtv=false                          -- WDTV Live compatible mode
+cfg.sec_extras=false                    -- Samsung extras
+
+
+update_id=1             -- system update_id
+
+subscr={}               -- event sessions (for UPnP notify engine)
+plugins={}              -- external plugins (YouTube, Vimeo ...)
+profiles={}             -- device profiles
+cache={}                -- real URL cache for plugins
+cache_size=0
+
+if not cfg.feeds_path then cfg.feeds_path=cfg.playlists_path end
+
+-- create feeds directory
+if cfg.feeds_path~=cfg.playlists_path then os.execute('mkdir -p '..cfg.feeds_path) end
+
+-- load config, plugins and profiles
+load_plugins(cfg.plugin_path,'plugin')
+load_plugins(cfg.config_path,'config')
+
+dofile('xupnpd_mime.lua')
+
+if cfg.profiles then load_plugins(cfg.profiles,'profile') end
+
+dofile('xupnpd_m3u.lua')
+dofile('xupnpd_ssdp.lua')
+dofile('xupnpd_http.lua')
+
+-- download feeds from external sources (child process)
+function update_feeds_async()
+    local num=0
+    for i,j in ipairs(feeds) do
+        local plugin=plugins[ j[1] ]
+        if plugin and plugin.disabled~=true and plugin.updatefeed then
+            if plugin.updatefeed(j[2],j[3])==true then num=num+1 end
+        end
+    end
+
+    if num>0 then core.sendevent('reload') end
+
+end
+
+-- spawn child process for feeds downloading
+function update_feeds(what,sec)
+    core.fspawn(update_feeds_async)
+    core.timer(cfg.feeds_update_interval,what)
+end
+
+
+-- subscribe player for ContentDirectory events
+function subscribe(event,sid,callback,ttl)
+    local s={}
+    subscr[sid]=s
+
+    s.event=event
+    s.sid=sid
+    s.callback=callback
+    s.timestamp=os.time()
+    s.ttl=tonumber(ttl)
+    s.seq=0
+
+    if cfg.debug>0 then print('subscribe: '..sid..', '..event..', '..callback) end
+
+end
+
+-- unsubscribe player
+function unsubscribe(sid)
+    if subscr[sid] then
+        subscr[sid]=nil
+
+        if cfg.debug>0 then print('unsubscribe: '..sid) end
+    end
+end
+
+--store to cache
+function cache_store(k,v)
+    local time=os.time()
+
+    local cc=cache[k]
+
+    if cc then cc.value=v cc.time=time return end
+
+    if cache_size>=cfg.cache_size then
+        local min_k=nil
+        local min_time=nil
+        for i,j in pairs(cache) do
+            if not min_time or min_time>j.time then min_k=i min_time=j.time end
+        end
+        if min_k then
+            if cfg.debug>0 then print('remove URL from cache (overflow): '..min_k) end
+            cache[min_k]=nil
+            cache_size=cache_size-1
+        end
+    end
+
+    local t={}
+    t.time=time
+    t.value=v
+    cache[k]=t
+    cache_size=cache_size+1
+end
+
+
+-- garbage collection
+function sys_gc(what,sec)
+
+    local t=os.time()
+
+    -- force unsubscribe
+    local g={}
+
+    for i,j in pairs(subscr) do
+        if os.difftime(t,j.timestamp)>=j.ttl then
+            table.insert(g,i)
+        end
+    end
+
+    for i,j in ipairs(g) do
+        subscr[j]=nil
+
+        if cfg.debug>0 then print('force unsubscribe (timeout): '..j) end
+    end
+
+    -- cache clear
+    g={}
+
+    for i,j in pairs(cache) do
+        if os.difftime(t,j.time)>=cfg.cache_ttl then
+            table.insert(g,i)
+        end
+    end
+
+    cache_size=cache_size-table.maxn(g)
+
+    for i,j in ipairs(g) do
+        cache[j]=nil
+
+        if cfg.debug>0 then print('remove URL from cache (timeout): '..j) end
+    end
+
+    core.timer(sec,what)
+end
+
+
+-- ContentDirectory event deliver (child process)
+function subscr_notify_iterate_tree(pls,tt)
+    if pls.elements then
+        table.insert(tt,pls.objid..','..update_id)
+
+        for i,j in ipairs(pls.elements) do
+            subscr_notify_iterate_tree(j,tt)
+        end
+    end    
+end
+
+function subscr_notify_async(t)
+
+    local tt={}
+    subscr_notify_iterate_tree(playlist_data,tt)
+
+    local data=string.format(
+        '<e:propertyset xmlns:e=\"urn:schemas-upnp-org:event-1-0\"><e:property><SystemUpdateID>%s</SystemUpdateID><ContainerUpdateIDs>%s</ContainerUpdateIDs></e:property></e:propertyset>',
+        update_id,table.concat(tt,','))
+
+    for i,j in ipairs(t) do
+        if cfg.debug>0 then print('notify: '..j.callback..', sid='..j.sid..', seq='..j.seq) end
+        http.notify(j.callback,j.sid,data,j.seq)
+    end
+end
+
+
+-- reload all playlists
+function reload_playlist()
+    reload_playlists()
+    update_id=update_id+1
+
+    if update_id>100000 then update_id=1 end
+
+    if cfg.debug>0 then print('reload playlist, update_id='..update_id) end
+
+    if cfg.dlna_notify==true then
+        local t={}
+
+        for i,j in pairs(subscr) do
+            if j.event=='cds' then
+                table.insert(t, { ['callback']=j.callback, ['sid']=j.sid, ['seq']=j.seq } )
+                j.seq=j.seq+1
+                if j.seq>100000 then j.seq=0 end
+            end
+        end
+
+        if table.maxn(t)>0 then
+            core.fspawn(subscr_notify_async,t)
+        end
+    end
+end
+
+-- change child process status (for UI)
+function set_child_status(pid,status)
+    pid=tonumber(pid)
+    if childs[pid] then
+        childs[pid].status=status
+        childs[pid].time=os.time()
+    end
+end
+
+function get_drive_state(drive)
+    local s
+
+    local f=io.popen('/sbin/hdparm -C '..drive..' 2>/dev/null | grep -i state','r')
+
+    if f then
+        s=f:read('*a')
+        f:close()
+    end
+
+    return string.match(s,'drive state is:%s+(.+)%s+')
+end
+
+
+function profile_change(user_agent,req)
+    if not user_agent or user_agent=='' then return end
+
+    for name,profile in pairs(profiles) do
+        local match=profile.match
+
+        if profile.disabled~=true and  match and match(user_agent,req) then
+
+            local options=profile.options
+            local mtypes=profile.mime_types
+
+            if options then for i,j in pairs(options) do cfg[i]=j end end
+
+            if mtypes then
+                if profile.replace_mime_types==true then
+                    mime=mtypes
+                else
+                    for i,j in pairs(mtypes) do mime[i]=j end
+                end
+            end
+
+            return name
+        end
+    end
+    return nil
+end
+
+
+-- event handlers
+events['SIGUSR1']=reload_playlist
+events['reload']=reload_playlist
+events['store']=cache_store
+events['sys_gc']=sys_gc
+events['subscribe']=subscribe
+events['unsubscribe']=unsubscribe
+events['update_feeds']=update_feeds
+events['status']=set_child_status
+events['config']=function() load_plugins(cfg.config_path,'config') cache={} cache_size=0 end
+events['remove_feed']=function(id) table.remove(feeds,tonumber(id)) end
+events['add_feed']=function(plugin,feed,name) table.insert(feeds,{[1]=plugin,[2]=feed,[3]=name}) end
+events['plugin']=function(name,status) if status=='on' then plugins[name].disabled=false else plugins[name].disabled=true end end
+events['profile']=function(name,status) if status=='on' then profiles[name].disabled=false else profiles[name].disabled=true end end
+events['bookmark']=function(objid,pos) local pls=find_playlist_object(objid) if pls then pls.bookmark=pos end end
+
+events['update_playlists']=
+function(what,sec)
+    if cfg.drive and cfg.drive~='' then
+        if get_drive_state(cfg.drive)=='active/idle' then
+            reload_playlist()
+        end
+    else
+        reload_playlist()
+    end
+
+    core.timer(cfg.playlists_update_interval,what)
+end
+
+
+if cfg.embedded==true then print=function () end end
+
+-- start garbage collection system
+core.timer(300,'sys_gc')
+
+http.timeout(cfg.http_timeout)
+http.user_agent(cfg.user_agent)
+
+-- start feeds update system
+if cfg.feeds_update_interval>0 then
+    core.timer(3,'update_feeds')
+end
+
+if cfg.playlists_update_interval>0 then
+    core.timer(cfg.playlists_update_interval,'update_playlists')
+end
+
+load_plugins(cfg.config_path..'postinit/','postinit')
+
+print("start "..cfg.log_ident)
+
+core.mainloop()
+
+print("stop "..cfg.log_ident)
+
+if cfg.daemon==true then os.execute('rm -f '..cfg.pid_file) end
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/xupnpd_mime.lua
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/xupnpd_mime.lua	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/xupnpd_mime.lua	(revision 27875)
@@ -0,0 +1,106 @@
+-- Copyright (C) 2011-2013 Anton Burdinuk
+-- clark15b@gmail.com
+-- https://tsdemuxer.googlecode.com/svn/trunk/xupnpd
+
+upnp_type=
+{
+    ['video'] = 1,
+    ['audio'] = 2,
+    ['image'] = 3
+}
+
+upnp_class=
+{
+    ['video']     = 'object.item.videoItem',
+    ['audio']     = 'object.item.audioItem.musicTrack'
+}                
+
+
+upnp_proto=
+{
+    ['avi']   = 'http-get:*:video/avi:',
+    ['asf']   = 'http-get:*:video/x-ms-asf:',
+    ['wmv']   = 'http-get:*:video/x-ms-wmv:',
+    ['mp4']   = 'http-get:*:video/mp4:',
+    ['mpeg']  = 'http-get:*:video/mpeg:',
+    ['mpeg2'] = 'http-get:*:video/mpeg2:',
+    ['mp2t']  = 'http-get:*:video/mp2t:',
+    ['mp2p']  = 'http-get:*:video/mp2p:',
+    ['mov']   = 'http-get:*:video/quicktime:',
+    ['mkv']   = 'http-get:*:video/x-matroska:',
+    ['mka']   = 'http-get:*:audio/x-matroska:',
+    ['3gp']   = 'http-get:*:video/3gpp:',
+    ['flv']   = 'http-get:*:video/x-flv:',
+    ['aac']   = 'http-get:*:audio/x-aac:',
+    ['ac3']   = 'http-get:*:audio/x-ac3:',
+    ['mp3']   = 'http-get:*:audio/mpeg:',
+    ['ogg']   = 'http-get:*:audio/x-ogg:',
+    ['wma']   = 'http-get:*:audio/x-ms-wma:'
+}
+
+-- DLNA.ORG_PN, DLNA.ORG_OP, DLNA.ORG_CI, DLNA.ORG_FLAGS
+-- DLNA.ORG_OP=00 - no seek; DLNA.ORG_OP=01 - seek
+dlna_org_extras=
+{
+    ['none']                  = '*',
+
+    -- video
+    ['mpeg_ps_pal']           = 'DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=00;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000',
+    ['mpeg_ps_pal_ac3']       = 'DLNA.ORG_PN=MPEG_PS_PAL_XAC3;DLNA.ORG_OP=00;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000',
+    ['mpeg_ps_ntsc']          = 'DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=00;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000',
+    ['mpeg_ps_ntsc_ac3']      = 'DLNA.ORG_PN=MPEG_PS_NTSC_XAC3;DLNA.ORG_OP=00;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000',
+    ['mpeg1']                 = 'DLNA.ORG_PN=MPEG1;DLNA.ORG_OP=00;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000',
+    ['mpeg_ts_sd']            = 'DLNA.ORG_PN=MPEG_TS_SD_NA_ISO;DLNA.ORG_OP=00;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000',
+    ['mpeg_ts_hd']            = 'DLNA.ORG_PN=MPEG_TS_HD_NA;DLNA.ORG_OP=00;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000',
+    ['avchd']                 = 'DLNA.ORG_PN=AVC_TS_HD_50_AC3;DLNA.ORG_OP=00;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000',
+    ['wmv_med_base']          = 'DLNA.ORG_PN=WMVMED_BASE;DLNA.ORG_OP=00;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000',
+    ['wmv_med_full']          = 'DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=00;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000',
+    ['wmv_med_pro']           = 'DLNA.ORG_PN=WMVMED_PRO;DLNA.ORG_OP=00;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000',
+    ['wmv_high_full']         = 'DLNA.ORG_PN=WMVHIGH_FULL;DLNA.ORG_OP=00;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000',
+    ['wmv_high_pro']          = 'DLNA.ORG_PN=WMVHIGH_PRO;DLNA.ORG_OP=00;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000',
+    ['asf_mpeg4_sp']          = 'DLNA.ORG_PN=MPEG4_P2_ASF_SP_G726;DLNA.ORG_OP=00;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000',
+    ['asf_mpeg4_asp_l4']      = 'DLNA.ORG_PN=MPEG4_P2_ASF_ASP_L4_SO_G726;DLNA.ORG_OP=00;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000',
+    ['asf_mpeg4_asp_l5']      = 'DLNA.ORG_PN=MPEG4_P2_ASF_ASP_L5_SO_G726;DLNA.ORG_OP=00;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000',
+    ['asf_vc1_l1']            = 'DLNA.ORG_PN=VC1_ASF_AP_L1_WMA;DLNA.ORG_OP=00;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000',
+    ['mp4_avc_sd_mp3']        = 'DLNA.ORG_PN=AVC_MP4_MP_SD_MPEG1_L3;DLNA.ORG_OP=00;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000',
+    ['mp4_avc_sd_ac3']        = 'DLNA.ORG_PN=AVC_MP4_MP_SD_AC3;DLNA.ORG_OP=00;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000',
+    ['mp4_avc_hd_ac3']        = 'DLNA.ORG_PN=AVC_MP4_MP_HD_AC3;DLNA.ORG_OP=00;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000',
+    ['mp4_avc_sd_aac']        = 'DLNA.ORG_PN=AVC_MP4_MP_SD_AAC_MULT5;DLNA.ORG_OP=00;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000', 
+    ['mpeg_ts_hd_mp3']        = 'DLNA.ORG_PN=AVC_TS_MP_HD_MPEG1_L3;DLNA.ORG_OP=00;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000',
+    ['mpeg_ts_hd_ac3']        = 'DLNA.ORG_PN=AVC_TS_MP_HD_AC3;DLNA.ORG_OP=00;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000',
+    ['mpeg_ts_mpeg4_asp_mp3'] = 'DLNA.ORG_PN=MPEG4_P2_TS_ASP_MPEG1_L3;DLNA.ORG_OP=00;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000',
+    ['mpeg_ts_mpeg4_asp_ac3'] = 'DLNA.ORG_PN=MPEG4_P2_TS_ASP_AC3;DLNA.ORG_OP=00;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000',
+    ['avi']                   = 'DLNA.ORG_PN=AVI;DLNA.ORG_OP=11;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000',
+    ['divx5']                 = 'DLNA.ORG_PN=PV_DIVX_DX50;DLNA.ORG_OP=11;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000',
+
+    -- audio
+    ['mp3']                   = 'DLNA.ORG_PN=MP3;DLNA.ORG_OP=11;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000',
+    ['ac3']                   = 'DLNA.ORG_PN=AC3;DLNA.ORG_OP=00;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000',
+    ['wma_base']              = 'DLNA.ORG_PN=WMABASE;DLNA.ORG_OP=00;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000',
+    ['wma_full']              = 'DLNA.ORG_PN=WMAFULL;DLNA.ORG_OP=00;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000',
+    ['wma_pro']               = 'DLNA.ORG_PN=WMAPRO;DLNA.ORG_OP=00;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000'
+}
+
+mime=
+{
+    ['avi']    = { upnp_type.video, upnp_class.video, 'video/avi',       upnp_proto.avi,   dlna_org_extras.divx5 },
+    ['asf']    = { upnp_type.video, upnp_class.video, 'video/x-ms-asf',  upnp_proto.asf,   dlna_org_extras.asf_mpeg4_sp },
+    ['wmv']    = { upnp_type.video, upnp_class.video, 'video/x-ms-wmv',  upnp_proto.wmv,   dlna_org_extras.wmv_med_full },
+    ['mp4']    = { upnp_type.video, upnp_class.video, 'video/mp4',       upnp_proto.mp4,   dlna_org_extras.none },
+    ['mpeg']   = { upnp_type.video, upnp_class.video, 'video/mpeg',      upnp_proto.mpeg,  dlna_org_extras.mpeg_ps_pal },        -- video/x-mpeg
+    ['mpeg_ts']= { upnp_type.video, upnp_class.video, 'video/mpeg',      upnp_proto.mpeg,  dlna_org_extras.mpeg_ts_sd },         -- for Sharp
+    ['mpeg1']  = { upnp_type.video, upnp_class.video, 'video/mpeg',      upnp_proto.mpeg,  dlna_org_extras.mpeg1 },
+    ['mpeg2']  = { upnp_type.video, upnp_class.video, 'video/mpeg2',     upnp_proto.mpeg2, dlna_org_extras.mpeg_ps_pal },
+    ['ts']     = { upnp_type.video, upnp_class.video, 'video/mp2t',      upnp_proto.mp2t,  dlna_org_extras.mpeg_ts_hd },
+    ['mp2t']   = { upnp_type.video, upnp_class.video, 'video/mp2t',      upnp_proto.mp2t,  dlna_org_extras.mpeg_ts_hd },
+    ['mp2p']   = { upnp_type.video, upnp_class.video, 'video/mp2p',      upnp_proto.mp2p,  dlna_org_extras.mpeg_ps_pal },
+    ['mov']    = { upnp_type.video, upnp_class.video, 'video/quicktime', upnp_proto.mov,   dlna_org_extras.none },
+    ['mkv']    = { upnp_type.video, upnp_class.video, 'video/x-mkv',     upnp_proto.mkv,   dlna_org_extras.none },               -- video/x-matroska
+    ['3gp']    = { upnp_type.video, upnp_class.video, 'video/3gpp',      upnp_proto['3gp'],dlna_org_extras.none },
+    ['flv']    = { upnp_type.video, upnp_class.video, 'video/x-flv',     upnp_proto.flv,   dlna_org_extras.none },
+    ['aac']    = { upnp_type.audio, upnp_class.audio, 'audio/x-aac',     upnp_proto.aac,   dlna_org_extras.none },
+    ['ac3']    = { upnp_type.audio, upnp_class.audio, 'audio/x-ac3',     upnp_proto.ac3,   dlna_org_extras.ac3 },
+    ['mp3']    = { upnp_type.audio, upnp_class.audio, 'audio/mpeg',      upnp_proto.mp3,   dlna_org_extras.mp3 },
+    ['ogg']    = { upnp_type.audio, upnp_class.audio, 'application/ogg', upnp_proto.ogg,   dlna_org_extras.none },
+    ['wma']    = { upnp_type.audio, upnp_class.audio, 'audio/x-ms-wma',  upnp_proto.wma,   dlna_org_extras.wma_full }
+}
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/xupnpd_soap.lua
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/xupnpd_soap.lua	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/xupnpd_soap.lua	(revision 27875)
@@ -0,0 +1,271 @@
+-- Copyright (C) 2011-2013 Anton Burdinuk
+-- clark15b@gmail.com
+-- https://tsdemuxer.googlecode.com/svn/trunk/xupnpd
+
+services={}
+services.cds={}
+services.cms={}
+services.msr={}
+
+function playlist_item_type(pls)
+    local mtype=mime[pls.type]
+    local extras=nil
+
+    if cfg.dlna_extras==false then
+        extras='*'
+    else
+        if pls.dlna_extras then extras=dlna_org_extras[pls.dlna_extras] end
+        if not extras then extras=mtype[5] end
+        if pls.path and extras~='*' then extras=string.gsub(extras,'DLNA.ORG_OP=%d%d','DLNA.ORG_OP=01') end
+    end
+
+    return mtype,extras
+end
+
+function playlist_item_to_xml(id,parent_id,pls)
+    local logo=''
+    local sec_extras=''
+    local objid=pls.objid
+
+    if pls.logo then
+        local l
+
+        if cfg.upnp_albumart<2 then
+            l=pls.logo
+        else
+            l=string.format('%s/logo/%s.jpeg',www_location,objid)
+        end
+
+        if cfg.upnp_albumart==0 or cfg.upnp_albumart==2 then
+            logo=string.format('<upnp:albumArtURI dlna:profileID=\"JPEG_TN\">%s</upnp:albumArtURI>',l)
+        else
+            logo=string.format('<res protocolInfo="http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_TN">%s</res>',l)
+        end
+    end
+
+    if cfg.sec_extras then
+        if pls.path then
+            sec_extras=string.format('<sec:CaptionInfoEx sec:type="srt">%s/sub/%s.srt</sec:CaptionInfoEx>',www_location,objid)
+        end
+
+        if pls.bookmark then
+            sec_extras=sec_extras..string.format('<sec:dcmInfo>BM=%s</sec:dcmInfo>',pls.bookmark)
+        end
+    end
+
+    if pls.elements then
+        return string.format(
+            '<container id=\"%s\" childCount=\"%i\" parentID=\"%s\" restricted=\"true\"><dc:title>%s</dc:title><upnp:class>%s</upnp:class></container>',
+            id,pls.size or 0,parent_id,util.xmlencode(pls.name),cfg.upnp_container)
+    else
+        local mtype,extras=playlist_item_type(pls)
+
+        local artist=''
+        local url=pls.url or ''
+
+        if cfg.upnp_artist==true and pls.parent then
+            if mtype[1]==1 then
+                artist=string.format('<upnp:actor>%s</upnp:actor>',util.xmlencode(pls.parent.name))
+            elseif mtype[1]==2 then
+                artist=string.format('<upnp:artist>%s</upnp:artist>',util.xmlencode(pls.parent.name))
+            end
+        end
+
+        if pls.path then
+            url=string.format('%s/stream/%s.%s',www_location,objid,pls.type)
+        else
+            if cfg.proxy>0 then
+                if cfg.proxy>1 or mtype[1]==2 then
+                    url=string.format('%s/proxy/%s.%s',www_location,objid,pls.type)
+                end
+            end
+        end
+
+        return string.format(
+            '<item id=\"%s" parentID=\"%s\" restricted=\"true\"><dc:title>%s</dc:title><upnp:class>%s</upnp:class>%s%s<res size=\"%s\" protocolInfo=\"%s%s\">%s</res>%s</item>',
+            id,parent_id,util.xmlencode(pls.name),mtype[2],artist,logo,pls.length or 0,mtype[4],extras,util.xmlencode(url),sec_extras)
+
+    end
+end
+
+function get_playlist_item_parent(s)
+    if s=='0' then return '-1' end
+
+    local t={}
+
+    for i in string.gmatch(s,'(%w+)_') do table.insert(t,i) end
+    
+    return table.concat(t,'_')
+end
+
+
+function xml_serialize(r)
+    local t={}
+
+    for i,j in pairs(r) do
+        table.insert(t,'<') table.insert(t,j[1]) table.insert(t,'>')
+        table.insert(t,j[2])
+        table.insert(t,'</') table.insert(t,j[1]) table.insert(t,'>')
+    end
+
+    return table.concat(t)
+end
+
+function acl_validate(acl,ip)
+    for i in string.gmatch(acl,'([^;]+)') do
+        if ip==i then return true end
+    end
+
+    return false
+end
+
+
+services.cds.schema='urn:schemas-upnp-org:service:ContentDirectory:1'
+
+function services.cds.GetSystemUpdateID()
+    return {{'Id',update_id}}
+end
+
+function services.cds.GetSortCapabilities()
+    return {{'SortCaps','dc:title'}}
+end
+
+function services.cds.GetSearchCapabilities()
+    return {{'SearchCaps','upnp:class'}}
+end
+
+-- wget -O - "http://127.0.0.1:4044/soap/cds?action=X_GetFeatureList"
+function services.cds.X_GetFeatureList()
+    return {{'FeatureList',util.xmlencode(cfg.upnp_feature_list)}}
+end
+
+-- wget -O - "http://127.0.0.1:4044/soap/cds?action=X_SetBookmark&ObjectID=0_2_1&PosSecond=1234"
+function services.cds.X_SetBookmark(args)
+    core.sendevent('bookmark',args.ObjectID or '',args.PosSecond or '')
+    return {}
+end
+
+-- wget -O - "http://127.0.0.1:4044/soap/cds?action=Browse&ObjectID=0&StartingIndex=0&RequestedCount=100"
+function services.cds.Browse(args,ip)
+    local items={}
+    local count=0
+    local total=0
+
+    table.insert(items,'<DIDL-Lite xmlns=\"urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:upnp=\"urn:schemas-upnp-org:metadata-1-0/upnp/\" xmlns:dlna=\"urn:schemas-dlna-org:metadata-1-0\">')
+
+    local objid=args.ObjectID or args.ContainerID
+
+    local pls=find_playlist_object(objid)
+
+    if pls then
+
+        if args.BrowseFlag=='BrowseMetadata' then
+            table.insert(items,playlist_item_to_xml(objid,get_playlist_item_parent(objid),pls))
+            count=1
+            total=1
+        else
+            local from=tonumber(args.StartingIndex)
+            local to=from+tonumber(args.RequestedCount)
+
+            if to==from then to=from+pls.size end
+
+            if pls.elements then
+                for i,j in ipairs(pls.elements) do
+                    if i>from and i<=to then
+                        if not j.acl or acl_validate(j.acl,ip) then
+                            table.insert(items,playlist_item_to_xml(string.format('%s_%s',objid,i),objid,j))
+                            count=count+1
+                        end
+                    end
+                end
+                total=pls.size
+            end
+        end
+
+    end
+
+    table.insert(items,'</DIDL-Lite>')
+
+    return {{'Result',util.xmlencode(table.concat(items))}, {'NumberReturned',count}, {'TotalMatches',total}, {'UpdateID',update_id}}
+
+end
+
+-- wget -O - "http://127.0.0.1:4044/soap/cds?action=Search&ContainerID=0&StartingIndex=0&RequestedCount=100&SearchCriteria=*"
+function services.cds.Search(args,ip)
+    local items={}
+    local count=0
+    local total=0
+
+    local from=tonumber(args.StartingIndex)
+    local to=from+tonumber(args.RequestedCount)
+    local what=util.upnp_search_object_type(args.SearchCriteria)
+
+    if to==from then to=from+10000 end
+
+    table.insert(items,'<DIDL-Lite xmlns=\"urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:upnp=\"urn:schemas-upnp-org:metadata-1-0/upnp/\" xmlns:dlna=\"urn:schemas-dlna-org:metadata-1-0\">')
+
+    local pls=find_playlist_object(args.ContainerID)
+
+    if pls then
+        function __search(id,parent_id,p)
+            if p.elements then
+                if not p.virtual and (not p.acl or acl_validate(p.acl,ip)) then
+                    for i,j in pairs(p.elements) do
+                        __search(string.format('%s_%s',id,i),id,j)
+                    end
+                end
+            else
+                if what==0 or mime[p.type][1]==what then
+                    total=total+1
+
+                    if total>from and total<=to then
+                        table.insert(items,playlist_item_to_xml(id,parent_id,p))
+                        count=count+1
+                    end
+                end
+            end
+        end
+
+        __search(args.ContainerID,get_playlist_item_parent(args.ContainerID),pls)
+    end
+
+    table.insert(items,'</DIDL-Lite>')
+
+    return {{'Result',util.xmlencode(table.concat(items))}, {'NumberReturned',count}, {'TotalMatches',total}, {'UpdateID',update_id}}
+
+end
+
+
+services.cms.schema='urn:schemas-upnp-org:service:ConnectionManager:1'
+
+function services.cms.GetCurrentConnectionInfo(args)
+    return {{'ConnectionID',0}, {'RcsID',-1}, {'AVTransportID',-1}, {'ProtocolInfo',''},
+        {'PeerConnectionManager',''}, {'PeerConnectionID',-1}, {'Direction','Output'}, {'Status','OK'}}
+end
+
+function services.cms.GetProtocolInfo()
+    local protocols={}
+
+    for i,j in pairs(upnp_proto) do table.insert(protocols,j..'*') end
+
+    return {{'Sink',''}, {'Source',table.concat(protocols,',')}}
+end
+
+function services.cms.GetCurrentConnectionIDs()
+    return {{'ConnectionIDs',''}}
+end
+
+
+services.msr.schema='urn:microsoft.com:service:X_MS_MediaReceiverRegistrar:1'
+
+function services.msr.IsAuthorized(args)
+    return {{'Result',1}}
+end
+
+function services.msr.RegisterDevice(args)
+    return nil
+end
+
+function services.msr.IsValidated(args)
+    return {{'Result',1}}
+end
Index: /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/xupnpd_ssdp.lua
===================================================================
--- /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/xupnpd_ssdp.lua	(revision 27875)
+++ /ipk/source.sh4/network_xupnpd/_path_/etc/xupnpd/xupnpd_ssdp.lua	(revision 27875)
@@ -0,0 +1,103 @@
+-- Copyright (C) 2011-2013 Anton Burdinuk
+-- clark15b@gmail.com
+-- https://tsdemuxer.googlecode.com/svn/trunk/xupnpd
+
+ssdp_msg_alive={}
+ssdp_msg_byebye={}
+
+function ssdp_msg(nt,usn,nts)
+    return string.format(
+        'NOTIFY * HTTP/1.1\r\n'..
+        'HOST: 239.255.255.250:1900\r\n'..
+        'CACHE-CONTROL: max-age=%s\r\n'..
+        'LOCATION: %s\r\n'..
+        'NT: %s\r\n'..
+        'NTS: %s\r\n'..
+        'Server: %s\r\n'..
+        'USN: %s\r\n\r\n',
+        cfg.ssdp_max_age,ssdp_location,nt,nts,ssdp_server,usn
+        )
+end
+
+
+ssdp_service_list=
+{
+'upnp:rootdevice',
+'urn:schemas-upnp-org:device:MediaServer:1',
+'urn:schemas-upnp-org:service:ContentDirectory:1',
+'urn:schemas-upnp-org:service:ConnectionManager:1',
+'urn:microsoft.com:service:X_MS_MediaReceiverRegistrar:1'
+}
+
+function ssdp_init(t,nts)
+    local uuid='uuid:'..ssdp_uuid
+
+    table.insert(t,ssdp_msg(ssdp_uuid2,ssdp_uuid2,nts))
+
+    for i,s in ipairs(ssdp_service_list) do
+        table.insert(t,ssdp_msg(s,ssdp_uuid2..'::'..s,nts))
+    end
+
+end                     
+
+function ssdp_alive()
+    for i,s in ipairs(ssdp_msg_alive) do
+        ssdp.send(s)
+    end
+end
+
+function ssdp_byebye()
+    for i,s in ipairs(ssdp_msg_byebye) do
+        ssdp.send(s)
+    end
+end
+
+function ssdp_handler(what,from,msg)
+    if msg.reqline[1]=='M-SEARCH' and msg['man']=='ssdp:discover' then
+        local st=msg['st']
+
+        local resp=false
+
+        if st=='ssdp:all' or st==ssdp_uuid2 then resp=true else
+            for i,s in ipairs(ssdp_service_list) do
+                if st==s then resp=true break end
+            end
+        end
+
+        if resp then
+            ssdp.send(string.format(
+                'HTTP/1.1 200 OK\r\n'..
+                'CACHE-CONTROL: max-age=%s\r\n'..
+                'DATE: %s\r\n'..
+                'EXT:\r\n'..
+                'LOCATION: %s\r\n'..
+                'Server: %s\r\n'..
+                'ST: %s\r\n'..
+                'USN: %s::%s\r\n\r\n',
+                cfg.ssdp_max_age,os.date('!%a, %d %b %Y %H:%M:%S GMT'),ssdp_location,ssdp_server,st,ssdp_uuid2,st),from)
+        end
+    end
+end
+
+
+events["SSDP"]=ssdp_handler
+events["ssdp_timer"]=function (what,sec) ssdp_alive() core.timer(sec,what) end
+
+ssdp.init(cfg.ssdp_interface,1,cfg.ssdp_loop,cfg.debug)   -- interface, ttl, allow_loop, debug (0,1 or 2)
+
+www_location='http://'..ssdp.interface()..':'..cfg.http_port
+
+ssdp_location=www_location..'/dev.xml'
+
+if not cfg.uuid or cfg.uuid=='' then ssdp_uuid=core.uuid() else ssdp_uuid=cfg.uuid end
+
+ssdp_uuid2='uuid:'..ssdp_uuid
+ssdp_server='eXtensible UPnP agent'
+
+ssdp_init(ssdp_msg_alive,'ssdp:alive')
+ssdp_init(ssdp_msg_byebye,'ssdp:byebye')
+
+ssdp_alive()
+core.timer(cfg.ssdp_notify_interval,"ssdp_timer")
+
+table.insert(atexit,ssdp_byebye)
