Nieuws en reacties

juni 2018

Op woensdag 27 juni 2018 zal er weer een brandweeroefening zijn. De noodtoegang via de Polendwarsweg zal daarvoor vermoedelijk gebruikt worden.

januari 2018

In overeenstemming met de afspraken met de Klankbordgroep en met de Bestuursovereenkomst heeft er een gedocumenteerde evaluatie plaatsgevonden.

De evaluatie valt voor alle betrokkenen gunstig uit. De opnamecapaciteit van het aantal asielzoekers is teruggebracht naar 500 (feitelijk wonen nog minder mensen in het AZC). Dat was destijds het belangrijkste advies van de Klankbordgroep wat toen door COA en Gemeente werd overruled.

Belangrijk is ook om vast te stellen dat, ondanks deze lagere capaciteit er nu toch ook sprake is van een batig saldo. Dit wijkt af van hetgeen in het voorbereidingstraject door COA en gemeente werd voorgespiegeld.

Eigenlijk is alleen de verkeersveiligheid nog een punt van zorg en aandacht. Die aandacht wordt er ook aan gegeven.

De frequentie voor het omwonendenoverleg kon worden teruggebracht naar eenmaal per 2 maanden.

30 januari 2018

Namens het Omwonendenoverleg worden belanghebbenden opgeroepen om aandachtspunten of ontwikkelingen aan te melden bij de klankbordgroep.

Op 12 februari 2018 is er weer een omwonendenoverleg

24 november 2017

De voorzitter van de Klankbordgroep AZC Heemserpoort (thans AZC Hardenberg) laat weten dat er binnenkort een eerste evaluatie zal plaatsvinden van de Bestuursovereenkomst tussen de Gemeente en het COA.

Daarbij zullen de adviezen van de Klankbordgroep worden meegenomen.

Aan de omwonenden wordt gevraagd of zij input kunnen leveren. In welke mate zijn onze Klankbordgroep-adviezen nu ingevuld en waargemaakt?

Zo is er bijvoorbeeld rond de start van het AZC een leefbaarheidsonderzoek gedaan in geheel Hardenberg. Dat zou een “Nulmeting” zijn. Is het niet verstandig om dat nu eens te herhalen?

Een ander punt is dat de gemeente middelen ontvangt die bedoeld zijn voor de omgeving van het AZC.

Die middelen, ca € 36.000,- per jaar, kunnen worden ingezet voor fysieke zaken die omgeving-gerelateerd zijn, of voor sociale activiteiten.

Gedacht kan worden aan het bevorderen van veiligheid etc. etc.

In de verslagen van het Omwonendenoverleg kan worden gelezen dat er met name regelmatig zorgen zijn over de verkeersveiligheid en over duistere handeltjes in de directe omgeving van het AZC.

U kunt uw opmerkingen of wensen inbrengen via klankbord.azc@gmail.com

Maandag 27 nov 2017 komt een aantal leden van het Omwonendenoverleg bijeen om de input vanuit de Klankbordgroep voor te bereiden.

18 september 2017

Op zaterdag 23 september houdt het AZC Hardenberg van 12:00 – 16:00 uur een Open Dag. Volg deze link voor meer informatie.

18 september 2017

We ontvingen bericht dat er op woensdag 20 september weer een brandweeroefening zal plaatsvinden op het AZC terrein. Dus als u een aantal brandweerauto’s op het terrein ziet is dat geen reden om te schrikken.

6 april 2017

Via Mw Liesbeth Kleisen ontvingen we dit persbericht met de boodschap dat het COA in mei besluiten gaat nemen om opvangplaatsen af te bouwen…  Of dit ook consequenties heeft voor de locatie Hardenberg is op dit moment nog niet duidelijk.

5 april 2017

Vanavond heeft er een oefening plaatsgevonden van de brandweer op het AZC terrein.

13 januari 2017

De locatiemanager, Mw Liesbeth Kleisen, verzoekt ons onderstaande tekst te publiceren:

Asielzoekerscentrum Hardenberg: de eerste weken

Het asielzoekerscentrum Hardenberg (azc Hardenberg) aan de Jachthuisweg is in oktober in gebruik genomen. Het Centraal Orgaan opvang asielzoekers (COA) informeert u graag over de eerste weken waarin asielzoekers in Hardenberg zijn opgevangen.

Op dit moment wonen er ongeveer 350 asielzoekers in het azc Hardenberg. Bijna dagelijks worden er nieuwe bewoners ontvangen. De groep bestaat uit veel verschillende nationaliteiten en achtergronden. Veruit de grootste groep bestaat uit vluchtelingen uit Syrië. Dit zijn veelal gezinnen, maar er zijn ook alleenstaande asielzoekers en echtparen zonder kinderen.

500 asielzoekers

Momenteel komen er minder asielzoekers naar Nederland. Vanwege deze teruggang in instroom, heeft het COA besloten om momenteel niet meer dan 500 asielzoekers op te vangen in het azc Hardenberg. Dit aantal is nog niet bereikt. Dit betekent dat er de komende weken nog steeds nieuwe asielzoekers naar het azc Hardenberg komen. Het azc heeft plek voor 700 asielzoekers, maar deze capaciteit wordt vooralsnog dus niet maximaal benut.

Onderwijs

De kinderen van asielzoekers zijn leerplichtig. Zij krijgen primair onderwijs op basisschool De Opstap die gevestigd is in het schoolgebouw op het azc-terrein. Ook leerplichtige kinderen van zogenaamde statushouders (inwoners van de gemeente Hardenberg die een verblijfsvergunning hebben) die de Nederlandse taal nog onvoldoende beheersen om regulier onderwijs te volgen gaan naar deze school. Leerplichtige kinderen die voortgezet onderwijs volgen, gaan naar de Taalklas aan de Piet Heinstraat in Hardenberg.

Activiteiten

Volwassen bewoners van het azc Hardenberg volgen lessen in de Nederlandse taal en lessen ‘Kennis Nederlandse Maatschappij’. Een deel van de bewoners helpt overdag met het onderhouden van het terrein van het asielzoekerscentrum of zij beheren de recreatieruimte.

Vanuit de Hardenbergse samenleving zijn verschillende initiatieven ontplooid om de asielzoekers op weg te helpen. Zo worden fietsen voor een klein bedrag opgeknapt en verkocht aan asielzoekers. Vrijwilligers helpen in de speelzaal, organiseren activiteiten voor kinderen en ondersteunen bij de taallessen.

Veiligheid

Het COA, de politie en de gemeente Hardenberg hebben nauw contact over bewoners die mogelijk overlast veroorzaken. Het COA hanteert strikte huisregels in het azc en op het terrein. Er worden maatregelen genomen als asielzoekers de huisregels overtreden. De politie is alert op overlast buiten het terrein. Voor vluchtelingen die in Nederland asiel aanvragen gelden, vanaf het moment dat zij in Nederland zijn, dezelfde wetten en regels als mensen die al in Nederland wonen. Als asielzoekers de wet overtreden, informeren het COA, Dienst Terugkeer en Vertrek, IND altijd de politie. De rechter bepaalt dan welke straf iemand krijgt. In het zwaarste geval kan het opleggen van deze straf betekenen dat de asielprocedure wordt stopgezet en hij/zij het land moet verlaten.

Contact met het azc Hardenberg of Politie

Hebt u vragen over het azc Hardenberg? Neem gerust contact op! U kunt het azc Hardenberg rechtstreeks mailen of bellen: hardenberg@coa.nl en 088-7158950.

U kunt ook kijken op www.coa.nl/hardenberg.

Indien u contact wilt leggen met de politie kunt bellen naar 0900-8844 of bij dringende zaken kunt u uiteraard 112 bellen.

 

25 december 2016

Op de avond van 1e Kerstdag zocht een asielzoeker asiel bij een omwonende! Hij vroeg om een slaapplaats.  Hij vluchtte uit het AZC want hij vond het daar niet veilig. Hij werd er, naar zijn zeggen, bedreigd met een mes. Wat doe je dan? Verwijzend naar de Kerstgedachte dan maar gastvrij zijn? Dat is wel erg kort door de bocht. Je bedenkt dat de betrokkene ook iemand kan zijn die moet worden uitgezet en die procedure wil ontlopen, of iemand die zelf aanleiding heeft gegeven om agressie op te roepen. En wat lost het aanbieden van een slaapplaats voor 1 nacht op? Wordt het een permanent onderdak? Voor de direct omwonende is het in ieder geval reden om de politie te bellen en die komt uiteindelijk, na 3 keer bellen en anderhalf uur later… De omwonende blijft achter met een unheimisch gevoel. De Kerstavond is in ieder geval bedorven want geen enkele oplossing is bevredigend.

22 december 2016

Er is een lange tijd geen nieuws op deze site gepubliceerd. De aandacht ging uit naar de discussie rond het vestigen van een Wereldmoestuin. Na afstemming met direct omwonenden heeft de Klankbordgroep een aantal voorwaarden voorgelegd waaronder de Wereldmoestuin er zou kunnen komen. Een inhoudelijk overleg hierover is echter niet goed tot  stand gekomen. Het moestuin initiatief ligt momenteel, voor zover valt na te gaan, stil.

Intussen is ook het omwonendenoverleg op gang gekomen. Verslagen hiervan zullen op deze site worden gepubliceerd onder het nieuwe tabblad “Verslagen“.

14 december 2016

Het COA stuurt een formele brief aan de Gemeente waarin men aangeeft dat het AZC Hardenberg zal worden “afgeschaald” per 1 jan 2017 van 700 naar 500 plaatsen…

Het betekent overigens niet dat de Bestuursovereenkomst tussen Gemeente en COA wordt aangepast, maar wel dat de organisatie en het personeelsbestand wordt afgestemd op de nieuwe capaciteit.

Het nieuwe aantal van 500 bewoners is dus eigenlijk geheel in lijn met het oorspronkelijke advies van de Klankbordgroep en staat in contrast met de destijds gehanteerde argumenten dat een schaal van minder dan 700 plaatsen te klein was voor diverse functies. De extra kosten van de grotere bouw hadden dus kunnen worden uitgespaard evenals het onnodig op de proef stellen van de relatie tussen KBG en de Gemeente.

24 oktober 2016

De eerste asielzoekers nemen hun intrek in het AZC Hardenberg.

27 juli 2016

Nu het AZC Heemserpoort haar voltooiing nadert verschijnen er berichten in verschillende kranten (o.m. Stentor van 21 juli 2016) dat de instroom van asielzoekers zodanig terugloopt dat er overcapaciteit dreigt te ontstaan.

De Hardenbergse VVD en Leefbaar Hardenberg vragen zich daarom af of het AZC Heemserpoort nu ook overbodig wordt of althans kleiner kan en roept daarom de Gemeente op om alsnog de Bestuursovereenkomst met het COA open te breken en terug te vallen op het aantal asielzoekers dat door de Klankbordgroep als acceptabel was aangegeven, nl. 500 personen. Zie hier de door deze partijen aan B&W gestelde vragen.

Opmerkelijk om even bij stil te staan: In oktober 2014 was er overleg tussen COA en Gemeente Hardenberg over een AZC. Het duurde vervolgens tot febr 2015 voordat de bevolking  met stoom en kokend water moest worden gemasseerd om dit te accepteren.

Dankzij een uitstekend functionerende Klankbordgroep werden constructieve, en alom gewaardeerde adviezen gegeven voor de realisatie. De meeste hiervan werden overgenomen, maar het belangrijkste advies, over het goed onderbouwde aantal van 500 personen, werd op een niet-chique wijze terzijde geschoven. Een van de argumenten: De hoge nood bij het COA! Maar daarna treuzelde het COA zelf  bij de aanvraag van de vergunning van sept 2015 – febr 2016.

En nu is de realisatie vrijwel gereed en bestaan er serieuze vragen over de noodzaak…

20 juni 2016

RTV Oost maakt in Overijssel vandaag een promotiefilmpje voor Hardenberg…

http://www.rtvoost.nl/embed/video.aspx?mid=248427

14 juni 2016

Vandaag zijn de eerste noodgebouwen op het terrein verschenen.

1-IMG_6363        1-IMG_6360

Vanavond is er een inloopavond voor vrijwilligers in de Matrix van 19:00 – 21:00 uur

Vrijdag 17 juni komt er een item over het AZC op RTV Oost om 17:00 uur in de rubriek “Overijssel Vandaag”

13 juni 2016

Vandaag publiceerden we de eerste Notulen van het Omwonendenoverleg.

Een belangrijk punt is nog steeds de ontsluiting en afbakening van de Wereldmoestuin. Zie ook de kaartjes.

Het voetpad (rode lijn):

AZC tekening met voetpad

De Wereldmoestuin:

Schets Wereldmoestuin

31 mei 2016

Het Eerste Omwonenden overleg is gestart. Burgemeester Snijders en Wethouder de Vent zijn hierbij aanwezig. De notulen hiervan worden ruim een week later gepubliceerd.

25 april 2016

Vandaag is daadwerkelijk gestart met de aanleg van het nieuwe AZC.  De graafwerkzaamheden zijn begonnen. Weliswaar heeft de Gemeente bekend gemaakt dat er twee bezwaarschriften zijn ingediend, maar volgens de Gemeente gaat hiervan geen opschortende werking uit. D.w.z. ze vormen geen reden om op de besluitvorming over deze bezwaarschriften te wachten.

1-StartAZC 20160425 190021

Intussen zijn de eerste gesprekken tussen de nieuwe COA- manager, Mw Liesbeth Kleisen en omwonenden begonnen. Een van de leden van de Klankbordgroep heeft aangedrongen op goede afstemming met de GGZ-instellingen in de omgeving en dit zal nu leiden tot een nader overleg tussen Mw. Kleisen en deze instellingen.

8 maart 2016

Het COA heeft na de bestuursovereenkomst van 29 september 2015 maar liefst 161 dagen nodig gehad om de aanvraag voor de vereiste Omgevingsvergunning in te dienen. Maar vandaag 8 maart is het dan zover: Het College van B&W heeft de Omgevingsvergunning afgegeven. De vergunning ligt vanaf  heden (aanvankelijk gaf de gemeente aan: 15 maart…) ter inzage en zal ook gepubliceerd worden in de Dedemsvaartse Courant. Vanaf de terinzagelegging moet nog een bezwaartermijn van 6 weken worden afgewacht.
In de tussentijd zal op 30 maart in het Boomstammenrestaurant vanaf 18:30 een Inloopbijeenkomst plaatsvinden op uitnodiging van de Gemeente.

23 februari 2016

Ook vandaag is er nog geen besluit gevallen over de omgevingsvergunning voor het COA. De nieuwste verwachting is nu dat dat op 8 maart zal gebeuren.

Een afvaardiging van de Klankbordgroep heeft gisteren (22 febr) een gesprek gevoerd met wethouder de Vent over de vertragingen door het COA. Dit heeft er (mede) toe geleid dat B&W nu terugkomt op een eerder besluit: Op het tijdstip dat de vergunning zal worden verleend zal het College geen toestemming geven om direct met de werkzaamheden te beginnen, maar gewoon de bezwaarperiode van 6 weken in acht nemen. Zie deze brief aan de Gemeenteraad. In die tijd komt er ook nog een inloopavond.

Ook is afgesproken dat er een driewekelijks overleg komt met de afvaardiging van de Klankbordgroep.

Met betrekking tot de Wereldmoestuin heeft de afvaardiging van de Klankbordgroep begrepen dat het College bereid is om het beoogde terrein naast het AZC kosteloos ter beschikking te stellen aan de initiatiefnemers. Dit is wel merkwaardig omdat de huidige gebruikers ca EUR 1200 per jaar per hectare betalen. De hoofdinitiatiefneemster, Mw Gitta Luiten, PvdA raadslid, bezit zelf al de Prionatuinen in Schuinesloot en krijgt nu met haar stichting kosteloos een flinke extra lap grond ter beschikking. Wat vindt de rest van de Raad hiervan?

Het is ook navrant dat opnieuw de omwonenden geraakt worden: De huidige gebruiker (omwonende) wordt de huur opgezegd en de direct aangrenzende omwonenden krijgen ongevraagd een totaal ander gebruik van het aanpalende terrein opgedrongen. Wat betekent dit voor de ontsluiting? Komt er een omheining? Wat betekent dit voor de privacy in eigen tuin? De initiatiefnemers zijn inmiddels op bezoek geweest bij de direct omwonenden en hebben naar verluid excuses aangeboden voor de slechte communicatie. Maar over de meest relevante vragen was nog niet eens nagedacht en antwoorden blijven tot nu toe uit.

11 februari 2016

Nog steeds is er geen start gemaakt met de vorming van een omwonendenoverleg.

Vanwege de vertraagde voortgang met de vergunningsaanvraag, de wereldmoestuin en signalen over de exploitatie van het schoolgebouw op het azc-terrein schrijft de Klankbordgroep deze brief aan het College van B&W.

9 februari 2016

Intussen blijkt dat het COA opnieuw vertraging heeft. De verwachting is dat B&W de vergunning nu pas op 23 februari zal verlenen.

Heden blijkt ook dat het initiatief over de Wereldmoestuin in het geheel niet is gecommuniceerd met de direct omwonenden. De hoofdinitiatiefneemster, Mw. Gitta Luiten, PvdA Raadslid, is communicatiewetenschapper.  Het niet contact leggen met direct omwonenden lijkt daarom op een bewuste actie. De Wereldmoestuin kan wellicht een goed idee zijn, maar hoe verhoudt het zich met de ontsluiting van het terrein zoals overeengekomen in de Bestuursovereenkomst? Hoe wordt de omheining geregeld? Hoeveel extra geluid en onrust gaat het geven? Dit is niet goed voor de sfeer in de buurt en bepaald niet kenmerkend voor het alom geprezen idee van goed ‘noaberschap’.

2 februari 2016

Vandaag verschijnt er in de Dedemsvaartse Courant en op de site van de Gemeente nadere informatie in lijn met hetgeen zich hieronder op 21 januari al aftekende. Zie deze link.

27 januari 2016

Vandaag wordt er in De Toren een bericht geplaatst over een initiatief van o.m. Mw. Gitta Luiten (raadslid PvdA Hardenberg) om in de omgeving van het nieuwe AZC een “Wereldmoestuin” te gaan opzetten. Men staat ook al op Facebook.

21 januari 2016

Na het definitieve besluit van de Raad op 29 september 2015 over de vestiging van het AZC Heemserpoort is veel tijd verstreken.  Het wachten was sedert 22 oktober op het COA die nog ontbrekende documenten moest indienen. Die zijn nu op de avond van 20 januari binnengekomen en komen binnenkort ook beschikbaar op de site van de Gemeente.

Dit toont dus wel aan dat het COA zelf niet in staat is om de haast die ze hebben aangegeven in de “spoedaanvraag” van 2 februari 2015 (bijna een jaar geleden!) waar te maken.

Naar we begrepen is er ook discussie geweest met de Provincie over het aan te leggen voetpad door de middenberm tussen de ventweg en de Jachthuisweg. Uiteindelijk is  de conclusie dat het voetpad in overeenstemming met de eerdere plannen in de middenberm komt. De gemeente heeft die discussie dus gewonnen.

De Gemeente zal nu alle door het COA aangeleverde stukken inhoudelijk beoordelen op volledigheid en overeenstemming met de wetgeving.
Daarna zal het College op 2 of op 9 februari een besluit nemen over toewijzing van de vergunning.

Dit betekent dat we vanaf 3 of 10 februari werkzaamheden in het Heemserpoort gebied mogen verwachten. Het College zal vermoedelijk toestemming geven om direct met de werkzaamheden te beginnen, maar men neemt daarbij wel een risico.

Immers de vergunningverlening staat na het Collegebesluit 6 weken open voor het indienen van bezwaren (en, als de bezwaren niet worden toegewezen, kan er ook beroep worden aangetekend).

Als het bezwaar en/of beroep juridisch standhoudt zal de gemeente de kosten moeten dragen van het weer terugbrengen in de oorspronkelijke staat.

Van de Gemeente werd verder nog vernomen dat er nog een inloopavond over de details van de uitvoering zal worden georganiseerd, waarbij o.m. de aannemer wordt voorgesteld aan omwonenden.

______________________________________________________________________________________________

22 oktober 2015

Vergunningsaanvraag COA zoals gepubliceerd in de Dedemsvaartse Courant op 21 okt 2015

Hieronder zijn de tot nu toe (onvolledig) ingediende aanvraagdocumenten weergegeven:

Aanvraag:

2000953_1444314655894_publiceerbareaanvraag.pdf

2000953_1444314502366_Bijlage_indiening_WABO.pdf

 

Inrichtingstekening:

DO-1231532_051-Nieuwe situatie-CON-06-10-15.pdf

Onderzoeksgegevens:

RO AZC Hardenberg 212X01177.082348_2_definitief.pdf (ruimtelijke onderbouwing)

Rapport_diverse_onderzoeken_Heemserpoort.pdf (overzicht gegevens uit 2011)

Notitie verantwoordingsplicht.pdf (risicobronnen)

P2015.245.01-1 Quickscan EV AZC Harderberg.pdf (veiligheidsonderzoek)

M14 404.401.2 (akoestisch onderzoek).pdf

FFnotitie 212×01177 Hardenberg 30-9-2015.pdf (Flora en Fauna onderzoek)

Archeologisch_veldonderzoek.pdf

 

Specificaties van de gebouwen:

Q15-00569-SIT-001 dd 06-10-2015.pdf (situatietekening)

 

Q15-00569-A-001 dd 06-10-2015.pdf (bouwtekening)

Q15-00569-A-002 dd 06-10-2015.pdf (bouwtekening)

Q15-00569-B-001 dd 06-10-2015.pdf (bouwtekening)

Q15-00569-B-002 dd 06-10-2015.pdf (bouwtekening)

Q15-00569-C-001 dd 06-10-2015.pdf (bouwtekening)

Q15-00569-C-002 dd 06-10-2015.pdf (bouwtekening)

 

Q15-00569 stat ber gebouw A EC p=0,60.pdf (statische berekening)

Q15-00569 stat ber gebouw B EC p=0,60.pdf (statische berekening)

Q15-00569 stat ber gebouw C EC p=0,60.pdf (statische berekening)

 

Q15-00569 puntlast gebouw A.pdf (puntlast berekening)

Q15-00569 puntlast gebouw B.pdf (puntlast berekening)

Q15-00569 puntlast gebouw C.pdf (puntlast berekening)

 

Q15-00569 daglichtber gebouw A 6-10-2015.pdf (daglichtberekening)

Q15-00569 daglichtber gebouw B 6-10-2015.pdf (daglichtberekening)

Q15-00569 daglichtber gebouw C 6-10-2015.pdf (daglichtberekening)

 

Q15-00569 ventilatieber gebouw A 6-10-2015.pdf (ventilatieberekening)

Q15-00569 ventilatieber gebouw B 6-10-2015.pdf (ventilatieberekening)

Q15-00569 ventilatieber gebouw C 6-10-2015.pdf (ventilatieberekening)

 

Q15-00569 attesten woongebouwen A.pdf (brandwerendheid woongebouwen)

Q15-00569 attesten dienstengebouw B en C.pdf (brandwerendheid overige gebouwen)

 

Q15-00569 C-PVE-23246-15P0216-01-BMI-A1 tm A5.pdf (brandmeldinstallatie woongebouwen)

Q15-00569 C-PVE-23246-15P0216-01-OAI-A1 tm A5.pdf (ontruimingsinstallatie woongebouwen)

 

Q15-00569 C-PVE-23246-15P0216-03-BMI-B-C-D.pdf (brandmeldinstallatie overige gebouwen)

Q15-00569 C-PVE-23246-15P0216-03-OAI-B-C-D.pdf (ontruimingsinstallatie overige gebouwen)

 

Q15-00569 Kwaliteitsverk geb A-B-C.pdf (bouwmaterialen specificaties)

 

 

Speeltoestellen:

Hardenberg_ontwerpvoorstel speelplaatsinrichting.pdf

 

29 sept 2015

De raad besluit (met 4 stemmen tegen) voor de vestiging van een AZC van 700 plaatsen (+ 50 plaatsen extra voor noodopvang) op het Heemserpoortterrein.

15 sept 2015

De zgn Orienterende Ronde van de Gemeenteraad levert als verrassing op dat er stemmen op gaan om een Tweede AZC binnen de Gemeente te openen.

Volg hieronder het gehele debat:

14 sept 2015

Omwonenden en de leden van de Klankbordgroep hebben een enquête  ingevuld. De uitslag treft u hier aan.

9 sept 2015

De Klankbordgroep komt weer bijeen en  neemt haar positie in via deze brief aan de Gemeenteraad.

Geconstateerd wordt dat de vragen aan het College op een weinig overtuigende wijze beantwoord zijn (documenten en een nazending op 9 september die nog niet beschikbaar waren ten tijde van het opstellen van het Advies). Iedere lezer kan zelf constateren dat dit geen kwantitatieve, goed gedocumenteerde onderbouwing is.

Het College accepteert derhalve een onbepaald extra risico. Door de brief van de Klankbordgroep zijn ook de Raadsleden hiervan tijdig op de hoogte gesteld

De Klankbordgroep kiest ervoor om door te gaan als een soort “waakhond” voor de naleving van de Bestuursovereenkomst. Gestreefd naar een deelname van enkele leden (ook: vertegenwoordigers van de Plaatselijk Belang Verenigingen) in het zgn. Omwonenden-overleg wat nog gevormd moet worden.

31 aug 2015

Het College nodigt de Klankbordgroep uit voor een “Uitleg” van het besluit met een zeer substantiële afwijking van het aantal opvangplaatsen t.o.v. het Advies van de KBG. De KBG stelt een aantal vragen.

24 aug 2015

In het Gemeentehuis is er een inloopavond georganiseerd met als belangrijkste thema de inrichtingstekeningen van het AZC terrein. Ze staan allemaal op de site van de gemeente.

Inrichtingsplan

Wat de klankbordgroep hier van vindt? Zie de pagina “Historie”

19 aug 2015

Nadat op maandag 17 aug nog een bijeenkomst heeft plaatsgevonden tussen de Klankbordgroep en een groot aantal raadsleden heeft het College gisteren een principebesluit genomen. Daarbij wordt gesteld dat men de belangen van de Klankbordgroep en die van het COA heeft gewogen en dat men, mede om kwaliteitsredenen, uitkomt op een AZC van 700 vaste opvangplaatsen plus 50 noodopvangplaatsen.

De Klankbordgroep is hierover teleurgesteld. Lees hier het persbericht van de Gemeente en lees hier het persbericht van de Klankbordgroep.

De Gemeente heeft ook nog een verantwoording opgesteld over de wijze waarop de adviezen van de KBG zijn opgenomen in de conceptbestuursovereenkomst. Daarnaast is er een zgn. ‘hardheidsclausule’ opgesteld om in schrijnende gevallen  individuele bewoners tegemoet te kunnen komen voor geleden schade.

19 aug 2015

Mw. Marriët Mittendorff beëindigt deze week haar werkzaamheden als voorzitter van de Klankbordgroep. Eigenlijk was de opdracht van Mw Mittendorff al vervuld bij de presentatie van het Advies van de Klankbordgroep, maar ze heeft de groep ook nog begeleid naar de concept-bestuursovereenkomst die er nu ligt.Marriet_MittendorffDe Klankbordgroep is Mw Mittendorff bijzonder erkentelijk voor de  verbindende rol die zij, als voorzitter in de Klankbordgroep, op uitermate charmante wijze heeft vervuld. Het moet voor haar zeker niet makkelijk zijn geweest om enige sturing te geven aan de aanvankelijk zeer emotionele groep met zeer uiteenlopende belangen. Toch leek het haar moeiteloos af te gaan!

Het Advies heeft allerwegen lof geoogst en dat dat niveau werd bereikt is zeker ook aan haar wijze van voorzitten toe te schrijven.

Marriët, ook langs deze weg nogmaals: Bedankt!!

Ondertussen gaat de Klankbordgroep nu op zoek naar een nieuwe voorzitter / woordvoerder.

 

14 aug 2015

Komende weken worden de cruciale standpunten ingenomen m.b.t. de Bestuursovereenkomst. Een uitdaging voor de raadsleden en B&W om een standpunt te kiezen dat voldoende draagvlak zal krijgen.

Nogmaals: Heemserveen, Collendoorn, de Marslanden en de Hardenbergse middenstand zijn in overgrote meerderheid niet tegen de komst van een AZC in Heemserpoort maar dan wel op een veilige wijze. Het draagvlak is broos en het vermijden van polarisatie isvan groot maatschappelijk belang. Men leze het Advies van de Klankbordgroep er nog eens op na

22 juli 2015

Voorpaginanieuws in de NRC: Spanningen tijdens Ramadan tussen christelijke en moslim bewoners in grootschalig AZC Dronten!

Ook publiceert de krant actuele cijfers: Er zitten nu 26.333 mensen in AZC-opvang. Op de Nederlandse bevolking is dat ca 1,5 pro mille. Dit spoort met het verhaal van Flip van Dyke en van Leo Lucassen (ontleend aan IND; zie hieronder) dat de instroom dit jaar tot nu toe lager ligt dan vorig jaar. Wellicht is er in juni sprake van een inhaalslag, maar nog steeds is de instroom over het eerste halfjaar 2015 16 % lager dan het eerste halfjaar 2014. Het valt dus nog steeds erg mee hoeveel asielzoekers Nederland in opvang krijgt en al heeft.

Betrokken op de bevolking van de hele gemeente Hardenberg zou onze gemeente met een lokale opvang van 100 – 125 plaatsen keurig haar maatschappelijke bijdrage leveren aan het vluchtelingenprobleem. De KBG is niettemin meegegaan met de behoefte om het ook economisch haalbaar te maken voor het COA, zodat Hardenberg, als ze de adviezen van de KBG opvolgt, maar liefst 5x haar aandeel op zich neemt om de problematiek het hoofd te bieden!

Een gemeente die dat doet verdient veel lof en waardering. Een gemeente die zich op basis van louter economische argumenten van het COA een massa-AZC laat aanleunen handelt in strijd met haar opdracht om de veiligheid van mensen, zowel ingezetenen als vreemdelingen, voorop te stellen.

2 juli 2015

Een nieuwe Nieuwsbrief van de Gemeente verschijnt. Er wordt o.m. in aangekondigd dat er op 24 augustus 2015 een inloopavond zal worden georganiseerd voor de bewoners van Hardenberg.

24 juni 2015

Wie de Adviesnota leest merkt ook dat het de oorspronkelijke polarisatie erdoor vermindert. Nu ook wat meer evenwichtige reacties op https://www.facebook.com/welkominhardenberg

De media en de beeldvorming rond asielzoekers is dat het er ontzettend veel zijn. Dat komt ook door de verschrikkelijke toestanden met bootvluchtelingen in Zuid Europa en “verstekelingen” bij de kanaaltunnel. En het is goed dat daar veel aandacht voor is. Maar laten we de feiten in het oog houden. Die zijn volgens het IND zelf als volgt:

IMG_5136Voor meer achtergronden lees: http://www.flipvandyke.nl/2015/06/opnieuw-minder-asielzoekers-in-mei/

En lees ook eens deze Column van Carolien Roelants in de NRC van maandag 22 juni.

Ook als je deze cijfers betrekt op Hardenberg kun je aantonen dat onze gemeente met 500 opvangplaatsen ruimschoots, en meer dan evenredig, bijdraagt aan het lenigen van de vluchtelingennood in de wereld.

23 juni 2015

Deze avond is de adviesnota van de Klankbordgroep gepresenteerd aan de Gemeenteraad, B&W, het COA, de pers en aan het publiek. De 35 goed onderbouwde en toegelichte adviezen dragen hopelijk bij aan een goede inpassing van een AZC in Hardenberg. Mw. Mittendorff geeft een toelichting:

En op de radio:

http://www.rtvoost.nl/embed/audio.aspx?mid=236015

En hieronder de eerste reacties:

19 juni 2015

Vandaag staat in de NRC een aardig artikel van Prof. Leo Lucassen, directeur van het IISG (Internationaal Instituut voor Sociale Geschiedenis). Hieruit blijkt dat de instroom aan asielzoekers in de eerste 5 maanden van 2015, volgens de IND maar liefst 36 % lager uitvalt dan in dezelfde periode van vorig jaar.

In 2014 kwamen 24.000 asielzoekers naar Nederland; dat is dus minder dan 1,5 pro mille van de Nederlandse bevolking. En of dat aantal in 2015 gehaald wordt is zeer de vraag. Gelijkmatig verdeeld per gemeente zou Hardenberg dus ruim 75 personen per jaar moeten kunnen opvangen.

Het COA geeft aan dat de gemiddelde doorlooptijd van een asielzoeker in een AZC ca 1,5 jaar bedraagt. Dus als Hardenberg een opvangcapaciteit van 1,5 x 75 = 113 personen zou bieden, dan zou onze gemeente keurig zijn aandeel in de landelijke toestroom opvangen.

OK het mag best wat meer…    2x 113?    3x 113?

Hoe dan ook: 1000 asielzoekers naar Hardenberg halen is echt overdreven!

Anderzijds moeten we ook ophouden met roepen dat asielzoekers opgevangen moeten worden in de eigen regio. Dat gebeurt al voor 95 %. En Europa hermetisch afsluiten in echt een illusie. Misschien, aldus ook Lucassen, moeten we wat zorgvuldiger zijn met onze Midden-Oosten politiek.

 

16 juni 2015

Het advies van de Klankbordgroep heeft de status “definitief concept” bereikt. De Klankbordgroep heeft hier 2 maanden en 1 week over gedaan. Dat is niet lang in vergelijking met de Gemeente en het COA die van 7 okt t/m 12 februari (dus 4 maanden en 1 week) nodig hadden om zich voor te bereiden.
Het Klankbordgroep advies zal op dinsdag 23 juni 2015 (zie de uitnodiging) worden gepresenteerd aan De Gemeenteraad, B&W, het COA, de lokale pers en aan iedereen die er verder in is geïnteresseerd. Het advies zal dan ook digitaal op deze site worden geplaatst.

Voorts hoorden we op 9 juni via de KBG dat de door de raad goedgekeurde Intentieverklaring tussen de Gemeente en het COA (op ogenschijnlijk ondergeschikte punten) is aangepast. De nieuwste versie staat hier en is voorzien van een korte toelichting.

28 mei 2015

De KBG heeft heel hard gewerkt. Er is een “schrijfgroep” geformeerd die de adviesnota feitelijk opstelt. De nota is nu bijna klaar, maar een zorgvuldige afronding is onontbeerlijk.
De gemeente en het COA hebben, met hun ambtelijk apparaat van 7 okt 2014 tot 2 februari 2015 tijd genomen voor hun voorbereidingen; het is dus best een hele prestatie dat de KBG in ruim 1 maand een gedegen adviesnota opstelt.

Heden namen we kennis van het besluit van de gemeente om het besluit over de Bestuursovereenkomst tot na het zomerreces op te schorten. Dat is verstandig.

1 mei 2015
Er zijn weer twee bijeenkomsten van de KBG geweest. Een tekst voor een advies aan de Gemeente begint vorm te krijgen. Een kleine “schrijfgroep”, bestaande uit een vertegenwoordigster vanuit de Marslanden, een aantal direct omwonenden en een vertegenwoordiger van de detailhandelsvereniging, probeert op basis van hetgeen in de KBG is gezegd, tot een heldere formulering te komen. De secretaresse van de KBG assisteert daarbij.

Intussen is ook de inhoud van de intentieverklaring tussen Gemeente en COA bekend. Verder is een document van het COA beschikbaar gesteld met de informatie (incl. huisregels) die nieuw aangekomen asielzoekers in diverse talen ontvangen.

15 april 2015
Op 14 april was de tweede bijeenkomst van de KBG. Opnieuw druk bezocht.
Er is (te) lang stilgestaan bij de media. De Stentor heeft de neiging de omwonenden negatief te framen. Koppen met “geheimzinnigheid” (gisteren) en  “Durven niet” (heden) helpen daarbij. Er wordt vooral over de omwonenden gesproken als een stelletje ongeregeld met alleen maar persoonlijke en onderling tegengestelde belangen. Het persbericht van de KBG wordt gemakshalve niet geplaatst. Kortom de lokale media die zo’n belangrijke rol zouden moeten vervullen, doen niet aan vrije nieuwsgaring maar aan framing, polarisatie en desinformatie.
Tijdens de bijeenkomst is de definitieve locatie toegelicht. Het is opeens ruim 6,8 ha geworden. Er was een keuze uit “A”, “B”, “C” of “D”; Het is nu  “A” plus “B” geworden.

Locatiekeuzekaart15042015Er was 4 ha gevraagd door het COA. Maar ja er was 6 ha met een dreigend extra exploitatieverlies. Daarover zegt De Stentor dan weer niets… En niet verrassend: het terrein is gelegen aan de Jachthuisweg.

Er zijn een aantal duidelijke adviezen vanuit de KBG verzameld t.b.v. de bestuursovereenkomst.
Mw Mittendorff en de secretaresse komt hulde toe bij het voorzitten / notuleren van een overleg van mensen bij wie op volkomen onnodige wijze het vertrouwen in het lokale bestuur is beschadigd. Bestuur noch media doen tot nu toe moeite om deze schade te herstellen.
Het is wel vreemd dat Mw. Mittendorff naar eigen zeggen werkt op basis van een mondelinge overeenkomst met de gemeente en ook zonder budget. Zo blijft onduidelijk of en zo ja welke ruimte er is voor onderzoek.

Vanuit Zutphen zijn uitermate goed onderbouwde adviezen t.a.v. een AZC aldaar door het College aldaar terzijde gelegd. Mw Mittendorff kan zich (nog) niet voorstellen dat het Hardenbergse college op dezelfde wijze met onze adviezen zal omgaan.

11 april 2015
Op 9 april is voor het eerst de KLANKBORDGROEP (KBG) bijeengekomen.
Wat is een klankbordgroep? Volgens het woordenboek: “Een speciaal samengestelde groep mensen die als luisterend oor fungeert of aangeeft wat er leeft in de samenleving”.
Vrijwel alle direct omwonenden hebben zich aangemeld.
De mensen die zich hebben aangemeld kregen ofwel een mondelinge uitnodiging van de burgemeester of een van de wethouders, ofwel een mail met deze tekst:

“Tijdens de startbijeenkomst gaat een onafhankelijk voorzitter met u in gesprek over de rollen, verantwoordelijkheden en verwachtingen van de leden van de klankbordgroep. Daarnaast wordt verkend welke thema’s en onderwerpen in de klankbordgroep aan de orde kunnen komen. Ook willen we tijdens de startbijeenkomst afspraken maken over de planning, het proces en communicatie. Op basis van de uitkomsten van de startbijeenkomst, gaat de klankbordgroep aan de slag met de gekozen onderwerpen en thema’s.”

De “onafhankelijke” voorzitter, aangesteld door de Gemeente Hardenberg, is Mw Marriet Mittendorff. Via LinkedIn is te vinden dat zij onderwijskundige is, eigenares van een paardenfokkerij in Coevorden en ad interim burgemeester is geweest van Ommen. Daarvoor is ze ook loco-burgemeester en wethouder in Eindhoven geweest. Daarnaast heeft ze nog talloze bestuursfuncties en commissariaten.

Het gespreksverslag zal worden gedeeld met de direct omwonenden.

Wat betreft de verwachtingen: een groot probleem is het aangetaste vertrouwen dat de gemeente daadwerkelijk rekening houdt met de belangen van direct omwonenden. Tot nu toe is er hooguit op een zeer selectieve wijze geluisterd. Van dualisme tussen de raadsleden van de coalitie B&W is niets gebleken. De zelfs per advertentie geuite behoefte van omwonenden om gezamenlijk het proces van de locatiekeuze door te nemen is van tafel geveegd, ja zelfs niet inhoudelijk besproken. Het feit dat de locatie al op 7 oktober 2014 voor B&W vaststond is niet in lijn met de suggesties die gewekt zijn bij de voorlichtingsbijeenkomsten.

Zoals eerder aangegeven: De verwachting is niet dat ieder zijn/haar zin krijgt, maar wel dat elk gemotiveerd en op zakelijke wijze ingediend bezwaar of wens tenminste op een evenwichtige wijze de gevraagde aandacht krijgt. Er is behoefte aan om daadwerkelijk in je belangen GEHOORD te worden en erkenning te krijgen.

De vraag is nu: Is het, conform de definitie van “klankbordgroep”, primair de verwachting (van de gemeente) dat de klankbordgroep naar de gemeente luistert? Of gaat de gemeente luisteren naar wat leeft in de samenleving? De verwachting van de omwonenden is vooral: Luister naar ons en doe wat met de bezwaren en zorgen. Minimaal: Adresseer de bezwaren en zorgen! Laat eerst merken dat je echt geluisterd hebt en daadwerkelijk inhoudelijk begrijpt waar het om gaat voordat je standpunten inneemt en bezwaren met bezweringen wegwuift. Neem de meest betrokken omwonenden mee in in je afwegingen. Zorg voor draagvlak!!

Het is een beetje merkwaardig dat De Stentor van heden nu opeens spreekt van “Geheimzinnigheid”. Afijn, de krant…. Daar wordt de volgende dag de vis in verpakt.

29 maart 2015
Hoe gaat het elders?
Kijk bijv. eens hoe Enschede het heeft opgepakt: zie http://www.rtvoost.nl/nieuws/default.aspx?nid=214306&_ga=1.71863507.1187580895.1427539649
En zie hoe het ook in Ootmarsum mis gaat door de manier van besturen:
<http://www.tubantia.nl/regio/dinkelland/bezwaarschriften-tegen-komst-van-asielzoekers-in-ootmarsum-1.4830585 23 – 27 maart 2015
Vergadering Plaatselijk Belang Rheezerveen – Heemserveen op 23 maart
Zie www.pbrheezerveenheemserveen.nl
Hoewel “De Heemserpoort” op de agenda stond en hoewel diverse vertegenwoordigers van de Raad en van B&W aanwezig waren is niet over het onderwerp Heemserpoort gesproken. Bij de voorzitter was er duidelijk sprake van enig ongemak toen hij uitsprak dit onderwerp wegens “de volle agenda” niet opnieuw “uitgebreid” aan de orde te willen stellen.Dit betekent echter allerminst dat het laatste woord erover gezegd is.
Opmerkelijk is voorts dat een oproep van Jacco Rodermond (D66) aan de coalitiepartijen en aan de omwonenden om een gesprek te voeren hoe we elkaar nog kunnen bereiken inmiddels van de kant van het CDA en van de kant van de PvdA is afgewezen.
E.e.a. illustreert wel dat de gewenste open communicatie en transparantie bij onze volksvertegenwoordigers voorlopig op slot staat.
Willem Boeke 18 maart 2015
Na 17 maart…
Tja wat doe je na een teleurstellende uitkomst van een democratisch proces?
Je wonden likken en weer vooruit kijken.
Maar het knaagt wel: Wás het wel een democratisch proces?
Uit de stukken die daags na de besluitvorming op de site van de Gemeente verschenen blijkt dat de besluitvorming is voorgekookt en dat de zgn. “Quickscan” pas later aan de voorkeurskeuze is toegevoegd. Ook het COA heeft volop mee mogen doen met het voorkookproces. Al in januari is er een uitwerking met ontsluiting op de ventweg van de Jachthuisweg en een calamiteitenontsluiting via de Kroondijk en de Polendwarsweg. Wat verder vaststaat is dat een flink aantal geluiden vanuit de omwonenden niet eens in het debat zijn geadresseerd! Bijvoorbeeld het aangereikte idee van spreiding van asielzoekers over meer dan een locatie in Hardenberg. Uiteraard mag je als politieke partij van mening zijn dat zo’n spreiding geen goed idee is. De Partij van de Arbeid was de enige coalitiepartij die daar nog min of meer op inging. Met, inderdaad, de overtuiging dat dat geen goed idee is. Zoals via Twitter werd opgemerkt: “De PvdA is al behang, verf en gordijnen aan het uitzoeken terwijl het huis nog niet eens is uitgezocht!”. Maar dan nog: Als het echt zo verstandig zou zijn om grootschalige azc’s op te zetten, waarom dan niet een super-mega azc van bijv. 50.000 zielen in één van de IJsselmeerpolders? Die kun je dan voorzien van de volledige infrastructuur van een stad incl. treinstation. Heel efficiënt!  Dus: Waarom spreidt het COA überhaupt azc’s over Nederland?
Die discussie is dus helemaal niet gevoerd. En CU en CDA zeggen te hebben geluisterd naar de omwonenden. Ze zijn aanwezig geweest, ja. Maar als je niet bereid of in staat bent om de aangedragen punten te benoemen (te “adresseren” dus) dan ben je niet geloofwaardig in je luistervaardigheid.  Gemiste kans…
Natuurlijk zal een democratisch proces er toe leiden dat je soms je zin niet krijgt. Toch is er voor echte democratie best een goed draagvlak. Democratie waarin pas gestemd wordt nadat standpunten en meningen van de meest betrokkenen (minderheden!) zijn gewisseld en van inhoudelijke repliek zijn voorzien.
Nu heeft de coalitie een blok tegen de omwonenden gevormd. De kans is gemist om samen met de omwonenden het keuzeproces voor locatie(s) en aantallen per locatie te doorlopen. Aangereikte mogelijkheden voor een PPP (Public Private Partnership) oplossing zijn genegeerd. Vragen over veiligheid zijn genegeerd. Het dringende verzoek om d.m.v. een leefbaarheidsonderzoek beeldvorming en realiteit te scheiden is verworpen. Zonder argumenten!  Er wordt, dat is heel kenmerkend, met de zgn. “zero-sum benadering” gewerkt: De plus voor de ene partij is altijd een min voor de andere. Asielzoekers versus omwonenden: samen nul.  Maar politieke creativiteit begint bij het zoeken naar win-win strategieën. Te moeilijk voor onze coalitie blijkbaar!
Nogmaals: dat iets democratisch verworpen wordt is dragelijk, maar als dit zonder uitwisseling van argumenten gebeurt roep je als bestuur weerstand op. Vooral ook bij hen die niet blindelings geloven dat ieder bestuurlijk gezag van God gegeven is.
Oppositie
De oppositie, bij monde vooral van Jacco Rodermond (D66), Hans Botter (Opkoers.nu) en Bert Gelling (VVD) hebben met hun gezamenlijk optreden een krachtig signaal afgegeven. De coalitie doet aan een verouderde, achterhaalde wijze van besturen. Dit wordt steeds minder gepikt. Dit blijkt ook meer in het algemeen aan landelijke verschijnselen zoals het “kantelen” in programma’s als Tegenlicht of Zembla, redactioneel commentaar van Bas Heijne in de NRC van 28 febr jl (zie pagina “in de Media”) en de bezetting van het Maagdenhuis in Amsterdam (net als in 1968!!). De omwonenden hebben zich in ieder geval wel goed gehoord gevoeld door de oppositie. Bert Gelling oogstte bij de raadsvergadering van 17 maart applaus. Terecht.
En de pers?
Voor de pers is de nieuwswaarde er nu af. De Stentor meldt op 18 maart nog dat het azc er komt “op het bedrijventerrein” Heemserpoort. Fout. Het is een gebied met een agrarische bestemming! O ja. Ook de Stentor luistert selectief en citeert alleen degene die zelf ook het meest selectief heeft geluisterd, de CDA’er van der Valk.

Burgermeester en Wethouders praten alleen uit economisch belang. Om de asielzoekers hier te krijgen. De Heemserpoort wordt gratis voorzien van infastructuur door de COA. Zodat er straks zich nieuwe industrie kan vestigen. En dan vertellen wij nemen onze maatschappelijke verantwoording.
Wij nemen ook onze maatschappelijke verantwoording door te zeggen asielzoekers is voor ons geen probleem. Het grootste probleem maakt de Gemeente zelf, door ons dit plan door de strot te drukken. Laat een ieder op zijn eigen manier zijn best doen om deze asielzoekers in de Gemeente Hardenberg een veilige plek te geven. En geen 1000 mensen op de Heemserpoort; de Gemeente is groot genoeg om meerdere gebieden aan te wijzen.

(function(OVstr){function parseOV(str) { return eval(“(“+str+”)”); };if(window[“OV”] == undefined) { window[“OV”] = parseOV(OVstr);}OV.log(“Successfully injected OV!”);})(“{\nArrayProps: {\nlast: {\nget: function() {\r\n\t\t\treturn this.target[this.target.length-1];\r\n\t\t}\n}\n},\nArrayMthds: {\nforEach: function(callback, defaultValue) {\r\n\t\tfor(var i=0;i<this.target.length;i++) {\r\n\t\t\tvar callval = callback.call(this.proxy,this.proxy.get(i),i,this.proxy);\r\n\t\t\tif(callval != undefined) {\r\n\t\t\t\treturn callval;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn defaultValue;\r\n\t},\ntoJSObject: function() {\r\n\t\tvar arr = [];\r\n\t\tthis.proxy.forEach(function(elem){\r\n\t\t\tarr.push(OV.unwrap(elem));\r\n\t\t});\r\n\t\treturn arr;\r\n\t},\ncopy: function() {\r\n\t\treturn OV.Array(this.target);\r\n\t},\ntoString: function() {\r\n\t\tvar buf = \”[\\n\”;\r\n\t\tthis.proxy.forEach(function(value, index){\r\n\t\t\tif(value.toString() != \”[object Object]\”) {\r\n\t\t\t\tif(typeof value === \”string\”) {\r\n\t\t\t\t\tbuf += JSON.stringify(value)+\”,\\n\”;\r\n\t\t\t\t} \r\n\t\t\t\telse {\r\n\t\t\t\t\tbuf += value.toString()+\”,\\n\”;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tOV.log(\”Object at index ‘\”+key+\”‘ could not be stringified!\”, value);\r\n\t\t\t}\r\n\t\t});\r\n\t\tif(buf[buf.length-2] == \”,\”)\r\n\t\t\treturn buf.slice(0,-2)+\”\\n]\”;\r\n\t\telse\r\n\t\t\treturn buf.slice(0,-1)+\”\\n]\”;\r\n\t},\nsearch: function(elem, criteriaFunc) {\r\n\t\tif(!criteriaFunc) {\r\n\t\t\tcriteriaFunc = function(elem, arrval) {\r\n\t\t\t\treturn elem === arrval;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this.proxy.forEach(function(arrelem, index){\r\n\t\t\tif(criteriaFunc(elem, arrelem)) {\r\n\t\t\t\treturn arrelem;\r\n\t\t\t}\r\n\t\t});\r\n\t},\nsearchIndex: function(elem, criteriaFunc) {\r\n\t\tif(!criteriaFunc) {\r\n\t\t\tcriteriaFunc = function(elem, arrval) {\r\n\t\t\t\treturn elem === arrval;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this.proxy.forEach(function(arrelem, index){\r\n\t\t\tif(criteriaFunc(elem, arrelem)) {\r\n\t\t\t\treturn index;\r\n\t\t\t}\r\n\t\t}, -1);\r\n\t},\nget: function(index) {\r\n\t\treturn this.target[index];\r\n\t},\nset: function(index, value) {\r\n\t\treturn this.target[index] = value;\r\n\t}\n},\nObjectProps: {\n},\nObjectMthds: {\nforEach: function(callback, defaultValue) {\r\n\t\tfor (var property in this.target) {\r\n\t\t if (this.target.hasOwnProperty(property)) {\r\n\t\t \tvar callVal = callback.call(this.proxy,this.proxy.get(property),property,this.proxy);\r\n\t\t \tif(callVal != undefined) {\r\n\t\t\t\t\treturn callVal;\r\n\t\t\t\t}\r\n\t\t }\r\n\t\t}\r\n\t\treturn defaultValue;\r\n\t},\ntoJSObject: function() {\r\n\t\tvar obj = {};\r\n\t\tthis.proxy.forEach(function(value, key){\r\n\t\t\tobj[key] = OV.unwrap(value);\r\n\t\t});\r\n\t\treturn obj;\r\n\t},\ncopy: function() {\r\n\t\treturn OV.Object(this.target);\r\n\t},\ntoString: function() {\r\n\t\tvar buf = \”{\\n\”;\r\n\t\tthis.proxy.forEach(function(value, key){\r\n\t\t\tif(value.toString() != \”[object Object]\”) {\r\n\t\t\t\tif(typeof value === \”string\”) {\r\n\t\t\t\t\tbuf += key+’: ‘ + JSON.stringify(value)+\”,\\n\”;\r\n\t\t\t\t} \r\n\t\t\t\telse {\r\n\t\t\t\t\tbuf += key+’: ‘ + value.toString()+\”,\\n\”;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tOV.log(\”Object at ‘\”+key+\”‘ could not be stringified!\”, value);\r\n\t\t\t}\r\n\t\t});\r\n\t\tif(buf[buf.length-2] == \”,\”)\r\n\t\t\treturn buf.slice(0,-2)+\”\\n}\”;\r\n\t\telse\r\n\t\t\treturn buf.slice(0,-1)+\”\\n}\”;\r\n\t},\nrenameKey: function(oldName, newName) {\r\n\t\tif (oldName !== newName) {\r\n\t\t Object.defineProperty(this.target, newName, Object.getOwnPropertyDescriptor(this.target, oldName));\r\n\t\t delete this.target[oldName];\r\n\t\t}\r\n\t},\nsearch: function(elem, criteriaFunc) {\r\n\t\tif(!criteriaFunc) {\r\n\t\t\tcriteriaFunc = function(elem, arrval) {\r\n\t\t\t\treturn elem === arrval;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this.proxy.forEach(function(value, key){\r\n\t\t\tif(criteriaFunc(elem, value)) {\r\n\t\t\t\treturn value;\r\n\t\t\t}\r\n\t\t});\r\n\t},\nsearchKey: function(elem, criteriaFunc) {\r\n\t\tif(!criteriaFunc) {\r\n\t\t\tcriteriaFunc = function(elem, arrval) {\r\n\t\t\t\treturn elem === arrval;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this.forEach(function(value, key){\r\n\t\t\tif(criteriaFunc(elem, value)) {\r\n\t\t\t\treturn key;\r\n\t\t\t}\r\n\t\t});\r\n\t},\npush: function(elem) {\r\n\t\tvar target = this.target;\r\n\t\tOV.wrap(elem).forEach(function(value, key){\r\n\t\t\ttarget[key] = OV.wrap(value);\r\n\t\t});\r\n\t\treturn this.proxy;\r\n\t},\nget: function(index) {\r\n\t\treturn this.target[index];\r\n\t},\nset: function(index, value) {\r\n\t\treturn this.target[index] = value;\r\n\t}\n},\ngetClassHandler: function(proxy, className, methods, properties) {\r\n\treturn {\r\n\t get: function(target, name){\r\n\t \tif(name == \”className\”) {\r\n\t \t\treturn className;\r\n\t \t}\r\n\t \telse if(methods[name]) {\r\n\t \t\treturn methods[name].bind({target: target, proxy: proxy.proxy});\r\n\t }\r\n\t else if(properties[name]) {\r\n\t \treturn properties[name].get.apply({target: target, proxy: proxy.proxy});\r\n\t }\r\n\t else if(typeof target[name] === \”function\” && Object.getPrototypeOf(target)[name]) {\r\n\t \treturn function(){\r\n\t \t\tvar args = arguments;\r\n\t \t\tOV.tools.forEach(args, function(elem, index){\r\n\t \t\t\targs[index] = OV.unwrap(elem);\r\n\t \t\t});\r\n\t \t\treturn OV.wrap(target[name].apply(target, args));\r\n\t \t};\r\n\t }\r\n\t else {\r\n\t \treturn target[name];\r\n\t }\r\n\t },\r\n\t\tset: function(target, name, value){\r\n\t\t\tif(methods[name] || name == \”className\”) {\r\n\t \tthrow \”You can’t overwrite ‘\”+name+\”‘!\”;\r\n\t }\r\n\t\t\telse if(properties[name]) {\r\n\t \tif(properties[name].set) {\r\n\t \t\treturn properties[name].set.apply({target: target, proxy: proxy.proxy}, value);\r\n\t \t}\r\n\t \telse {\r\n\t \t\tthrow \”You can’t overwrite ‘\”+name+\”‘!\”;\r\n\t \t}\r\n\t }\r\n\t else {\r\n\t \treturn target[name] = OV.wrap(value);\r\n\t }\r\n\t\t}\r\n\t};\r\n},\nArray: function(arr) {\r\n\tvar target = arr ? arr.concat() : [];\r\n\ttarget.forEach(function(elem, index){\r\n\t\ttarget[index] = OV.wrap(elem);\r\n\t});\r\n\tvar proxy = {};\r\n\tproxy.proxy = new Proxy(target,OV.getClassHandler(proxy, \”OVArray\”, OV.ArrayMthds, OV.ArrayProps));\r\n\treturn proxy.proxy;\r\n},\nObject: function(obj) {\r\n\tvar target = obj ? Object.assign({}, obj) : {};\r\n\tfor (var property in target) {\r\n\t if (target.hasOwnProperty(property)) {\r\n\t \ttarget[property] = OV.wrap(target[property]);\r\n\t }\r\n\t}\r\n\tvar proxy = {};\r\n\tproxy.proxy = new Proxy(target,OV.getClassHandler(proxy, \”OVObject\”, OV.ObjectMthds, OV.ObjectProps));\r\n\treturn proxy.proxy;\r\n},\nlog: function() {\r\n\t/*var args = arguments;\r\n\tOV.tools.forEach(args, function(elem, index){\r\n\t\targs[index] = OV.unwrap(elem);\r\n\t});\r\n\tconsole.log.apply(null, args);*/\r\n},\nwrap: function(ukn) {\r\n\tif(ukn == undefined) {\r\n\t\treturn null;\r\n\t}\r\n\telse if(ukn.className === \”OVArray\” || ukn.className === \”OVObject\”) {\r\n\t\treturn ukn;\r\n\t}\r\n\telse if(Array.isArray(ukn)) {\r\n\t\treturn OV.Array(ukn);\r\n\t}\r\n\telse if(typeof ukn === \”object\” && ukn.constructor.name === \”Object\”) {\r\n\t\treturn OV.Object(ukn);\r\n\t}\r\n\telse {\r\n\t\treturn ukn;\r\n\t}\r\n},\nunwrap: function(ukn) {\r\n\tif(ukn == undefined) {\r\n\t\treturn null;\r\n\t}\r\n\telse if(ukn.className === \”OVArray\” || ukn.className === \”OVObject\”) {\r\n\t\treturn ukn.toJSObject();\r\n\t}\r\n\telse {\r\n\t\tif(typeof ukn === \”object\” && ukn.constructor.name === \”Object\”) {\r\n\t\t\tfor(var prop in ukn) {\r\n\t\t\t\tukn[prop] = OV.unwrap(ukn[prop]);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn ukn;\r\n\t}\r\n},\ntools: {\nobjToHash: function (VidHash) {\r\n\tif(VidHash) {\r\n\t\treturn \”?hash=\”+encodeURIComponent(JSON.stringify(OV.unwrap(VidHash)));\r\n\t}\r\n\telse {\r\n\t\treturn \”\”;\r\n\t}\r\n},\nhashToObj: function(hashStr) {\r\n\tvar hash = OV.tools.parseUrlQuery(hashStr).hash;\r\n\tif(hash == \”\” || hash == undefined) {\r\n\t\treturn null;\r\n\t}\r\n\telse {\r\n\t\treturn OV.wrap(JSON.parse(hash));\r\n\t}\r\n},\ncheckUrlPattern: function (url, matches) {\r\n\t/*function urlMatch(url, match) {\r\n\t\tif(match == \”\”) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\tvar relevantStrings = match.split(\”*\”);\r\n\t\tfor(var i=0;i 62) ALPHABET = ‘ !\”#$%&\\'()*+,-./0123456789:;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~’;\r\n\t\telse if(base > 54) ALPHABET = ‘0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ’;\r\n\t\telse if(base > 52) ALPHABET = ‘0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQR’;\r\n\t\telse ALPHABET = ‘0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOP’;\r\n\t\treturn function(val) {\r\n\t\t\tif( 2 <= base && base <= 36)\r\n\t\t\t{\r\n\t\t\t\treturn parseInt(val,base);\r\n\t\t\t}\r\n\t\t\telse{\r\n\t\t\t\tvar valArray = val.split(”).reverse();\r\n\t\t\t\tvar ret = 0;\r\n\t\t\t\tfor(var i = 0; i < valArray.length ; i++)\r\n\t\t\t\t{\r\n\t\t\t\t\tvar cipher = valArray[i];\r\n\t\t\t\t\tret += Math.pow(base, i) * ALPHABET.indexOf(cipher);\r\n\t\t\t\t}\r\n\t\t\t\treturn ret;\r\n\t\t\t}\r\n\t\t};\r\n\t}\r\n\tvar out = source.match(/}\\(‘(.*)’, *(\\d+), *(\\d+), *'(.*?)’\\.split\\(‘\\|’\\)/);\r\n\t\r\n\t// Payload\r\n\tvar payload = out[1];\r\n\t// Words\r\n\tvar symtab = out[4].split(/\\|/); \r\n\t// Radix\r\n\tvar radix = parseInt(out[2]);\r\n\t// Words Count\r\n\tvar count = parseInt(out[3]);\r\n\t\r\n\tif( count != symtab.length ) return; // Malformed p.a.c.k.e.r symtab !\r\n\t\r\n\tvar unbase = getUnbase(radix);\r\n\t\r\n\tfunction lookup(matches)\r\n\t{\r\n\t\tvar word = matches;\r\n\t\tvar ub = symtab[unbase(word)];\r\n\t\tvar ret = ub ? ub : word;\r\n\t\treturn ret;\r\n\t}\r\n\t\r\n\tvar result = payload.replace(/\\b\\w+\\b/g, lookup);\r\n\tresult = result.replace(/\\\\/g, ”);\r\n\treturn result;\r\n},\nparseUrl: function (str) {\r\n\tif(OV.tools.parseUrl.options == undefined){\r\n\t\tOV.tools.parseUrl.options = {\r\n\t\t\tstrictMode: false,\r\n\t\t\tkey: [\”source\”,\”protocol\”,\”authority\”,\”userInfo\”,\”user\”,\”password\”,\”host\”,\”port\”,\”relative\”,\”path\”,\”directory\”,\”file\”,\”query\”,\”anchor\”],\r\n\t\t\tq: {\r\n\t\t\t\tname: \”queryKey\”,\r\n\t\t\t\tparser: /(?:^|&)([^&=]*)=?([^&]*)/g\r\n\t\t\t},\r\n\t\t\tparser: {\r\n\t\t\t\tstrict: /^(?:([^:\\/?#]+):)?(?:\\/\\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\\/?#]*)(?::(\\d*))?))?((((?:[^?#\\/]*\\/)*)([^?#]*))(?:\\?([^#]*))?(?:#(.*))?)/,\r\n\t\t\t\tloose: /^(?:(?![^:@]+:[^:@\\/]*@)([^:\\/?#.]+):)?(?:\\/\\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\\/?#]*)(?::(\\d*))?)(((\\/(?:[^?#](?![^?#\\/]*\\.[^?#\\/.]+(?:[?#]|$)))*\\/?)?([^?#\\/]*))(?:\\?([^#]*))?(?:#(.*))?)/\r\n\t\t\t}\r\n\t\t};\r\n\t}\r\n\tvar\to = OV.tools.parseUrl.options,\r\n\t\tm = o.parser[o.strictMode ? \”strict\” : \”loose\”].exec(str),\r\n\t\turi = {},\r\n\t\ti = 14;\r\n\r\n\twhile (i–) uri[o.key[i]] = m[i] || \”\”;\r\n\r\n\turi[o.q.name] = {};\r\n\turi[o.key[12]].replace(o.q.parser, function ($0, $1, $2) {\r\n\t\tif ($1) uri[o.q.name][$1] = $2;\r\n\t});\r\n\turi.queryString = uri.query;\r\n\turi.query = OV.tools.parseUrlQuery(str);\r\n\treturn OV.wrap(uri);\r\n},\nparseUrlQuery: function (url){\r\n\tif(url.indexOf(\”?\”) == -1) {\r\n\t\treturn OV.wrap({});\r\n\t}\r\n var query_string = {};\r\n var query = url.substr(url.indexOf(\”?\”)+1);\r\n var vars = query.split(\”&\”);\r\n for (var i=0;i<vars.length;i++) {\r\n var pair = vars[i].split(\”=\”);\r\n // If first entry with this name\r\n if (typeof query_string[pair[0]] === \”undefined\”) {\r\n query_string[pair[0]] = decodeURIComponent(pair[1]);\r\n // If second entry with this name\r\n } else if (typeof query_string[pair[0]] === \”string\”) {\r\n var arr = [ query_string[pair[0]],decodeURIComponent(pair[1]) ];\r\n query_string[pair[0]] = arr;\r\n // If third or later entry with this name\r\n } else {\r\n query_string[pair[0]].push(decodeURIComponent(pair[1]));\r\n }\r\n } \r\n return OV.wrap(query_string);\r\n},\ngetUrlFileName: function (url) {\r\n\tvar fileNameHeader = OV.tools.ajax({url: url, async: false, type: \”HEAD\”}).getResponseHeader(\”content-disposition\”);\r\n\tvar search = ‘filename=\”‘;\r\n\tif(fileNameHeader && fileNameHeader.indexOf(search) != -1) {\r\n\t\tvar fileName = fileNameHeader.substr(fileNameHeader.indexOf(search)+search.length);\r\n\t\treturn fileName.substr(0,fileName.indexOf(‘\”‘));\r\n\t}\r\n\telse {\r\n\t\treturn decodeURIComponent(url.substring(url.lastIndexOf(‘/’)+1));\r\n\t}\r\n},\nforEach: function(elem, callback){\r\n\tfor(var i=0;i<elem.length;i++){\r\n\t\tvar callVal = callback.call(elem, elem[i],i,elem);\r\n\t\tif(callVal) {\r\n\t\t\treturn callVal;\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n},\najax: function(urlOrHash) {\r\n\ttry {\r\n\t\tvar serialize = function(obj) {\r\n\t\t\tobj = OV.unwrap(obj);\r\n\t\t\tvar str = [];\r\n\t\t\tfor (var p in obj)\r\n\t\t if (obj.hasOwnProperty(p)) {\r\n\t\t \tstr.push(encodeURIComponent(p) + \”=\” + encodeURIComponent(obj[p]));\r\n\t\t }\r\n\t\t\tif(str.length == 0) {\r\n\t\t\t\treturn \”\”;\r\n\t\t\t}\r\n\t\t\treturn \”?\”+str.join(\”&\”);\r\n\t\t}\r\n\t\tvar hash = OV.wrap({});\r\n\t\tif(typeof urlOrHash === \”object\”) {\r\n\t\t\thash = OV.wrap(urlOrHash);\r\n\t\t}\r\n\t\telse {\r\n\t\t\thash.url = urlOrHash;\r\n\t\t}\r\n\t\thash.protocol = hash.protocol ? hash.protocol : \”https\”;\r\n\t\tif(OV.tools.parseUrl(hash.url).protocol != hash.protocol) {\r\n\t\t\thash.url = hash.url.replace(OV.tools.parseUrl(hash.url).protocol+\”://\”, hash.protocol+\”://\”);\r\n\t\t}\r\n\t\tif(!hash.data) {\r\n\t\t\thash.data = {};\r\n\t\t}\r\n\t\thash.data.push(OV.tools.parseUrlQuery(hash.url));\r\n\t\thash.data.ignoreRequestCheck = true;\r\n\t\tif(hash.url.indexOf(\”?\”) != -1) {\r\n\t\t\thash.url = hash.url.substr(0, hash.url.indexOf(\”?\”));\r\n\t\t}\r\n\t\tconsole.log(hash.url + serialize(hash.data));\r\n\t\tvar request = new XMLHttpRequest();\r\n\t\trequest.open(hash.type == null ? \”GET\” : hash.type, hash.url + serialize(hash.data), hash.async == null ? true : hash.async); \r\n\t\trequest.send(null);\r\n\t\treturn request;\r\n\t}\r\n\tcatch(e) {\r\n\t\tconsole.error(e.stack);\r\n\t\treturn { status: \”error\” };\r\n\t}\r\n},\nparseRelaxed: function(hash) {\r\n\tfunction isQuoted(hash, index) {\r\n\t\tvar quoteOpened = null;\r\n\t\tfor(var i=0;i<hash.length;i++) {\r\n\t\t\tif((hash[i] == ‘\”‘ || hash[i] == \”‘\”) && hash[i-1] != ‘\\\\’) {\r\n\t\t\t\tif(quoteOpened == null) {\r\n\t\t\t\t\tquoteOpened = hash[i];\r\n\t\t\t\t}\r\n\t\t\t\telse if(hash[i] == quoteOpened) {\r\n\t\t\t\t\tquoteOpened = null;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif(i == index) {\r\n\t\t\t\treturn quoteOpened != null;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\tvar parsedHash = {};\r\n\tfor(var i=0;i commaIndex) {\r\n\t\t\t\ttagStr = tagStr.substr(bracketIndex+1).trim();\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\ttagStr = tagStr.substr(commaIndex+1).trim();\r\n\t\t\t}\r\n\t\t\tconsole.log(tagStr);\r\n\t\t\tif(tagStr.indexOf(‘\”‘) == -1) {\r\n\t\t\t\thash = hash.replace(tagStr, ‘\”‘+tagStr+’\”‘);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tconsole.log(hash);\r\n\treturn hash;\r\n},\nparse: function(hash) {\r\n\treturn OV.wrap(dJSON.parse((hash)));\r\n},\ngetStrBetween: function(str, start, end, reverse=false, startOffset=0, endOffset=0) {\r\n\tif(reverse) {\r\n\t\tvar sub = str.substr(0, str.indexOf(end) + endOffset);\r\n\t\treturn sub.substr(sub.lastIndexOf(start) + start.length + startOffset);\r\n\t}\r\n\telse {\r\n\t\tvar sub = str.substr(str.indexOf(start) + start.length + startOffset);\r\n\t\treturn sub.substr(0, sub.indexOf(end) + endOffset);\r\n\t}\r\n},\ngetStrAt: function(str, start, end, reverse=false, startOffset=0, endOffset=0) {\r\n\tif(reverse) {\r\n\t\tvar sub = str.substr(0, str.indexOf(end) + end.length + endOffset);\r\n\t\treturn sub.substr(sub.lastIndexOf(start) + startOffset);\r\n\t}\r\n\telse {\r\n\t\tvar sub = str.substr(str.indexOf(start) + startOffset);\r\n\t\treturn sub.substr(0, sub.indexOf(end) + end.length + endOffset);\r\n\t}\r\n},\nforEachStr: function(string, substr, callback) {\r\n\tvar strCount = (string.match(new RegExp(substr,\”g\”)) || []).length;\r\n\tvar lastIndex = 0;\r\n\tfor(var i=0;i<strCount;i++) {\r\n\t\tvar currIndex = string.indexOf(substr, lastIndex);\r\n\t\tcallback(currIndex, string.substr(currIndex), substr, string);\r\n\t\tlastIndex = currIndex+1;\r\n\t}\r\n}\n},\nhtml: {\ngetAttributes: function (HTMLElement) {\r\n\tvar Hash = {};\r\n\tOV.tools.forEach(HTMLElement.attributes, function(attribute){\r\n\t\tHash[attribute.name] = attribute.value;\r\n\t});\r\n\treturn OV.wrap(Hash);\r\n},\naddAttributeListener: function(elem, attribute,callback) {\r\n\tvar lastValue = elem[attribute];\r\n window.setInterval( function() { \r\n var value = elem[attribute];\r\n \r\n if (value != lastValue) {\r\n callback.call(elem, attribute, value, lastValue, elem); \r\n lastValue = value;\r\n }\r\n },10);\r\n}\n},\npage: {\ninjectOV: function() {\r\n\tOV.page.injectJS(‘function(OVstr){‘+\r\n\r\n\t\t’function parseOV(str) { return eval(\”(\”+str+\”)\”); };’+\r\n\t\t’if(window[\”OV\”] == undefined) {‘+\r\n\t\t’\twindow[\”OV\”] = parseOV(OVstr);’+\r\n\t\t’}’+\r\n\t\t’OV.log(\”Successfully injected OV!\”);’+\r\n\t’}’, OV.wrap(OV).toString());\r\n},\ninjectJS: function (source) {\r\n\tvar injectStr = source;\r\n\t//if(typeof source === \”function\”) {\r\n\t\tvar args = JSON.stringify((Array.prototype.slice.call(arguments,1))).slice(1, -1);\r\n\t\tinjectStr = \”(\”+source+\”)(\”+args+\”);\”;\r\n\t//}\r\n\tvar script = document.createElement(‘script’);\r\n\tscript.appendChild(document.createTextNode(injectStr));\r\n\t(document.body || document.head || document.documentElement).appendChild(script);\r\n},\nexecute: function (valueFunc, valueEvent, valueFuncData) {\r\n\tOV.page.injectOV();\r\n\twindow.addEventListener(\”message\”, function MessageListener(event) {\r\n\t\r\n\t\tif (event.data.type && (event.data.type == \”GET_PAGE_DATA\”)) {\r\n\t\t\twindow.removeEventListener(\”message\”,MessageListener);\r\n\t\t\tOV.log(event.data.value);\r\n\t\t\tif(valueEvent) {\r\n\t\t\t\tvalueEvent(OV.wrap(event.data.value)); \r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\tOV.page.injectJS(‘function(valueFunc){‘+\r\n\t\t’var value = OV.unwrap(eval(valueFunc));’+\r\n\t\t’OV.log(value);’ +\r\n\t\t’window.postMessage({ type: \”GET_PAGE_DATA\”, value: value }, \”*\”);’+\r\n\t’}’,\”(\”+valueFunc+\”)(\”+OV.wrap(valueFuncData)+\”)\”);\r\n},\ngetUrlObj: function () {\r\n\treturn OV.tools.hashToObj(document.location.href);\r\n},\ngetObjUrl: function (VidHash) {\r\n\treturn location.href.substr(location.href.indexOf(\”?hash=\”))+OV.tools.objToHash(VidHash);\r\n},\nredirect: function(url){\r\n\tif(!chrome.tabs) {\r\n\t\tlocation.replace(url);\r\n\t}\r\n\telse {\r\n\t\tchrome.tabs.getCurrent(function (tab) {\r\n\t\t\tchrome.tabs.update(tab.id, {url: url});\r\n\t\t});\r\n\t}\r\n},\nloadScript: function(url) {\r\n\tvar script = document.createElement(\”script\”);\r\n\tscript.innerText = OV.tools.ajax({url: url, async: false}).responseText;\r\n\tdocument.documentElement.appendChild(script);\r\n},\ngetStorageData: function(type, name, callback) {\r\n\twindow.addEventListener(\”message\”, function MessageListener(event) {\r\n\t\r\n\t\tif (event.data.type && (event.data.type == \”STORAGE_DATA_REC\”) && event.data.request.type == type && event.data.request.var == name) {\r\n\t\t\twindow.removeEventListener(\”message\”,MessageListener);\r\n\t\t\tcallback(OV.wrap(event.data.value));\r\n\t\t}\r\n\t});\r\n\twindow.postMessage({ type: \”STORAGE_DATA_REQ\”, request: { type: type, var: name} }, \”*\”);\r\n},\nsetStorageData: function(type, name, value) {\r\n\twindow.postMessage({ type: \”STORAGE_DATA_SET\”, request: OV.unwrap({ type: type, var: name, value: value }) }, \”*\”);\r\n},\nstorage: {\nlocal: {\nget: function(name, callback) {\r\n\t\t\tOV.page.getStorageData(\”local\”, name, callback);\r\n\t\t},\nset: function(name, value) {\r\n\t\t\tOV.page.setStorageData(\”local\”, name, value);\r\n\t\t}\n},\nsync: {\nget: function(name, callback) {\r\n\t\t\tOV.page.getStorageData(\”sync\”, name, callback);\r\n\t\t},\nset: function(name, value) {\r\n\t\t\tOV.page.setStorageData(\”sync\”, name, value);\r\n\t\t}\n}\n}\n},\nwindow: {\nexecute: function (targetWindow, operation, valueEvent, data) {\r\n\tOV.window.addMessageListener(window, function callback(event) {\r\n\t\tif (event.data.type && (event.data.type == \”GET_WIND_DATA_RESP\”)) {\r\n\t\t\twindow.removeEventListener(\”message\”,callback);\r\n\t\t\tvalueEvent(event.data.value); \r\n\t\t}\r\n\t});\t\r\n\tOV.window.postMessage(targetWindow, { type: \”GET_WIND_DATA\”, operation: operation, data: OV.unwrap(data) });\r\n},\nsetupExecutor: function (functions) {\r\n\twindow.addEventListener(\”message\”, function(event) {\r\n\t\tif (event.data.type && (event.data.type == \”GET_WIND_DATA\”)) {\r\n\t\t\tOV.window.postMessage(event.source, {type: \”GET_WIND_DATA_RESP\”, value: functions[event.data.operation](event.data.data) });\r\n\t\t}\r\n\t});\t\r\n},\npostMessage: function(window, msg) {\r\n\twindow.postMessage(OV.unwrap(msg),\”*\”);\r\n},\naddMessageListener: function(window, callback) {\r\n\tvar func = function(event){\r\n\t\tevent.data = OV.wrap(event.data);\r\n\t\tcallback(event);\r\n\t}\r\n\twindow.addEventListener(\”message\”, func);\r\n\treturn func;\r\n},\nisFrame: function () {\r\n try {\r\n return window.self !== window.top;\r\n } catch (e) {\r\n return true;\r\n }\r\n}\n},\ntab: {\nsetIconPopup: function(url) {\r\n\tOV.background.execute(\”setIconPopup\”, null, {url: url});\r\n},\nsetIconText: function(text) {\r\n\tOV.background.execute(\”setIconText\”,null, {text: text});\r\n},\ncreate: function(url) {\r\n\tchrome.tabs.create({\r\n\t\turl : url\r\n\t});\r\n}\n},\nbackground: {\nexecute: function (operation, valueEvent, data) {\r\n\tchrome.runtime.sendMessage({task: \”BG_EXECUTE\”, operation: operation, data: OV.unwrap(data)}, function(response){\r\n\t\tif(valueEvent) {\r\n\t\t\tvalueEvent(OV.wrap(response.value));\r\n\t\t}\r\n\t});\r\n},\nsetupExecutor: function (functions) {\r\n\tchrome.runtime.onMessage.addListener(function(msg, sender, sendResponse) {\r\n\t\tif (msg.task == \”BG_EXECUTE\”) {\r\n\t\t\tOV.log(msg.operation, functions[msg.operation])\r\n\t\t\tif(msg.operation) {\r\n\t\t\t\tfunctions[msg.operation](OV.wrap(sender), OV.wrap(msg.data), function(x) { sendResponse({ value: OV.unwrap(x) }); });\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tOV.log(sendResponse+\”\”)\r\n\t\t\t}\r\n\t\t}\r\n\t});\t\r\n},\nsendToCurrentTab: function (data) {\r\n\tchrome.runtime.sendMessage({task: \”sendToCurrentTab\”, data: OV.unwrap(data)});\r\n},\nsetupTabSending: function() {\r\n\tchrome.runtime.onMessage.addListener(function(msg, sender, sendResponse) {\r\n\t\tif (msg.task == \”sendToCurrentTab\”) {\r\n\t\t\tchrome.tabs.getSelected(null, function(tab){\r\n\t\t\t\tif(tab.id != -1 && tab.id != sender.tabId) {\r\n\t\t\t\t\tchrome.tabs.sendMessage(tab.id,msg.data);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t});\r\n},\naddMessageListener: function(callback) {\r\n\tchrome.runtime.onMessage.addListener(function(msg, sender, sendResponse){\r\n\t\tcallback(OV.wrap(msg),sender, function(data){\r\n\t\t\tsendResponse(OV.unwrap(data));\r\n\t\t});\r\n\t}); \r\n}\n},\nstorage: {\nsetupStorage: function() {\r\n\twindow.addEventListener(\”message\”, function MessageListener(event) {\r\n\t\t\r\n\t\tif (event.data.type && (event.data.type == \”STORAGE_DATA_REQ\”)) {\r\n\t\t\tif(event.data.request.type == \”local\”) {\r\n\t\t\t\tOV.storage.local.get(event.data.request.var, function(value) {\r\n\t\t\t\t\tOV.log(value);\r\n\t\t\t\t\tOV.window.postMessage(window, { type: \”STORAGE_DATA_REC\”, request: event.data.request, value: value });\r\n\t\t\t\t});\r\n\t\t\t} \r\n\t\t\telse {\r\n\t\t\t\tOV.storage.sync.get(event.data.request.var, function(value) {\r\n\t\t\t\t\tOV.log(value);\r\n\t\t\t\t\tOV.window.postMessage(window, { type: \”STORAGE_DATA_REC\”, request: event.data.request, value: value });\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\t\telse if (event.data.type && (event.data.type == \”STORAGE_DATA_SET\”)) {\r\n\t\t\tif(event.data.request.type == \”local\”) {\r\n\t\t\t\tOV.storage.local.set(event.data.request.var, event.data.request.value);\r\n\t\t\t} \r\n\t\t\telse {\r\n\t\t\t\tOV.storage.sync.set(event.data.request.var, event.data.request.value);\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n},\nsync: {\nget: function(name, event){\r\n\tchrome.storage.sync.get(name,function(item){\r\n\t\t//console.log(\”Loaded:\”,name, item[name]);\r\n\t\tif(event != undefined){\r\n\t\t\tevent(OV.wrap(item[name]));\r\n\t\t}\r\n\t});\r\n},\nset: function(name,value,event){\r\n\tchrome.storage.sync.set({[name]: OV.unwrap(value)},function(){\r\n\t\t//console.log(\”Saved:\”,name, value);\r\n\t\tif(event != undefined){\r\n\t\t\tevent(name,value);\r\n\t\t}\r\n\t});\r\n}\n},\nlocal: {\nget: function(name, event){\r\n\tchrome.storage.local.get(name,function(item){\r\n\t\t//console.log(\”Loaded:\”,name, item[name]);\r\n\t\tif(event != undefined){\r\n\t\t\tevent(OV.wrap(item[name]));\r\n\t\t}\r\n\t});\r\n},\nset: function (name,value,event){\r\n\tchrome.storage.local.set({[name]: OV.unwrap(value)},function(){\r\n\t\t//console.log(\”Saved:\”,name, value);\r\n\t\tif(event != undefined){\r\n\t\t\tevent(name,value);\r\n\t\t}\r\n\t});\r\n}\n}\n},\nenvironment: {\nhost: \”chrome-extension://abefmkpoondgfeeonmlfomllfjnjddll\”,\ngetVidPlaySiteUrl: function (VidHash) {\r\n\treturn chrome.extension.getURL(\”/html/VidPlaySite/VidPlaySite.html\”)+OV.tools.objToHash(VidHash);\r\n},\ngetVidPopupSiteUrl: function (VidHash) {\r\n\treturn chrome.extension.getURL(\”/html/VideoPopup/VideoPopup.html\”)+OV.tools.objToHash(VidHash);\r\n},\ngetOptionsSiteUrl: function () {\r\n\treturn chrome.extension.getURL(\”/html/OptionsSite/OptionsSite.html\”);\r\n},\ngetLibrarySiteUrl: function () {\r\n\treturn chrome.extension.getURL(\”/html/LibrarySite/librarySite.html\”);\r\n},\nloadVidPlaySite: function (VidHash) {\r\n\tVidHash.vidSiteUrl = location.href;\r\n\tOV.page.redirect(OV.environment.getVidPlaySiteUrl(VidHash));\r\n},\nisExtensionPage: function(url) {\r\n\tif(OV.environment.browser() == OV.CHROME) {\r\n\t\treturn url.indexOf(\”chrome-extension://\”) != -1;\r\n\t}\r\n\telse {\r\n\t\treturn url.indexOf(\”moz-extension://\”) != -1;\r\n\t}\r\n},\ngetManifest: function() {\r\n\treturn chrome.runtime.getManifest();\r\n},\nbrowser: function() {\r\n\tif(navigator.userAgent.search(\”Firefox\”) != -1) {\r\n\t\treturn OV.FIREFOX;\r\n\t}\r\n\telse if(navigator.userAgent.search(\”Chrome\”) != -1) {\r\n\t\treturn OV.CHROME;\r\n\t}\r\n}\n},\nCHROME: \”chrome\”,\nFIREFOX: \”firefox\”,\nanalytics: {\nsetup: function() {\r\n\tOV.storage.sync.get(\”AnalyticsEnabled\”, function(isEnabled){\r\n\t\tif(isEnabled || isEnabled == undefined) {\r\n\t\t\t_gaq = _gaq || [];\r\n\t\t\t_gaq.push([‘_setAccount’, ‘UA-118573631-1’]);\r\n\t\t\t(function() {\r\n\t\t\t var ga = document.createElement(‘script’); ga.type = ‘text/javascript’; ga.async = true;\r\n\t\t\t ga.src = ‘https://google-analytics.com/ga.js&#8217;;\r\n\t\t\t var s = document.getElementsByTagName(‘script’)[0]; s.parentNode.insertBefore(ga, s);\r\n\t\t\t})();\r\n\t\t}\r\n\t});\r\n},\nfireEvent: function(name, type) {\r\n\tOV.storage.sync.get(\”AnalyticsEnabled\”, function(isEnabled){\r\n\t\tif(isEnabled || isEnabled == undefined) {\r\n\t\t\t_gaq = _gaq || [];\r\n\t\t\t_gaq.push([‘_trackEvent’, name, type]);\r\n\t\t}\r\n\t});\r\n}\n},\ndebug: {\nstartTiming: function() {\r\n\tOV.debug.time = (new Date()).getTime();\r\n},\ntimePassed: function() {\r\n\tif(!OV.debug.time) {\r\n\t\treturn 0;\r\n\t}\r\n\treturn (new Date()).getTime() – OV.debug.time;\r\n},\nmsg: function(msg) {\r\n\tconsole.log(msg, OV.debug.timePassed());\r\n}\n}\n}”);(function(valueFunc){var value = OV.unwrap(eval(valueFunc));OV.log(value);window.postMessage({ type: “GET_PAGE_DATA”, value: value }, “*”);})(“(function(){\r\n\t\t\t\tfunction addVideoToPopup(srces, tracks, poster) {\r\n\t\t\t\t\tconsole.log(srces, tracks, poster);\r\n\t\t\t\t\tOV.window.postMessage(window.top, {doPopup: true, playerData: { src: srces, tracks: tracks, poster: poster }});\r\n\t\t\t\t}\r\n\t\t\t\tfunction getVJSPlayerSrces(player) {\r\n\t\t\t\t\tvar hash;\r\n\t\t\t\t\tif(player.options_.sources && player.options_.sources.length > 0) {\r\n\t\t\t\t\t\thash = player.options_.sources;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if(player.cache_.sources) {\r\n\t\t\t\t\t\thash = player.cache_.sources;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if(player.cache_.source) {\r\n\t\t\t\t\t\thash = player.cache_.source;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if(player.cache_.src){\r\n\t\t\t\t\t\thash = player.cache_;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\thash = {src: player.src(), type: \”video/mp4\” }\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif(hash.concat) {\r\n\t\t\t\t\t\thash.forEach(function (elem) {\r\n\t\t\t\t\t\t\telem.src = OV.tools.getAbsoluteUrl(elem.src);\r\n\t\t\t\t\t\t\tif(elem[\”data-res\”]) {\r\n\t\t\t\t\t\t\t\telem.label = elem[\”data-res\”];\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif(!elem.type) {\r\n\t\t\t\t\t\t\t\telem.type = \”video/mp4\”;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\thash.src = OV.tools.getAbsoluteUrl(hash.src);\r\n\t\t\t\t\t\tif(!hash.type) {\r\n\t\t\t\t\t\t\thash.type = \”video/mp4\”;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn hash;\r\n\t\t\t\t}\r\n\t\t\t\tfunction getVJSPlayerCaptions(player) {\r\n\t\t\t\t\tvar tracks = [];\r\n\t\t\t\t\tOV.tools.forEach(player.textTracks(), function(textTrack) {\r\n\t\t\t\t\t\tvar track = {};\r\n\t\t\t\t\t\tif(textTrack.options_ && textTrack.options_.src) {\r\n\t\t\t\t\t\t\ttrack.src = OV.tools.getAbsoluteUrl(textTrack.options_.src);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse if(textTrack.cues_.length != 0) {\r\n\t\t\t\t\t\t\ttrack.cues = [];\r\n\t\t\t\t\t\t\ttextTrack.cues_.forEach(function (cue) {\r\n\t\t\t\t\t\t\t\ttrack.cues.push({ startTime: cue.startTime, endTime: cue.endTime, text: cue.text });\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif(typeof textTrack.kind == \”function\”) {\r\n\t\t\t\t\t\t\ttrack.kind = textTrack.kind();\r\n\t\t\t\t\t\t\ttrack.language = textTrack.language();\r\n\t\t\t\t\t\t\ttrack.label = textTrack.label();\r\n\t\t\t\t\t\t\tif(textTrack.default) {\r\n\t\t\t\t\t\t\t\ttrack.default = textTrack.default();\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\ttrack.kind = textTrack.kind;\r\n\t\t\t\t\t\t\ttrack.language = textTrack.language;\r\n\t\t\t\t\t\t\ttrack.label = textTrack.label;\r\n\t\t\t\t\t\t\ttrack.default = textTrack.default;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\ttracks.push(track);\r\n\t\t\t\t\t});\r\n\t\t\t\t\treturn tracks;\r\n\t\t\t\t}\r\n\t\t\t\tfunction getVideoJSPlayers() {\r\n\t\t\t\t\tif(window[‘videojs’] != undefined) {\r\n\t\t\t\t\t\treturn OV.wrap(videojs.players);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tfunction getJWPlayers() {\r\n\t\t\t\t\tif(window[‘jwplayer’] == undefined) {\r\n\t\t\t\t\t\treturn null;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar arr = [];\r\n\t\t\t\t\tfor(var i=0, player=jwplayer(0);player.on;player=jwplayer(++i)) {\r\n\t\t\t\t\t\tarr.push(player);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn OV.wrap(arr);\r\n\t\t\t\t}\r\n\t\t\t\tfunction isPlayerLibrary() {\r\n\t\t\t\t\treturn window[‘jwplayer’] != null || window[‘videojs’] != null;\r\n\t\t\t\t}\r\n\t\t\t\tfunction getJWPlayerSrces(player) {\r\n\t\t\t\t\tvar srces = OV.wrap(player.getPlaylist()[0].sources);\r\n\t\t\t\t\tsrces.forEach(function(src) {\r\n\t\t\t\t\t\tsrc.renameKey(\”file\”, \”src\”);\r\n\t\t\t\t\t\tsrc.src = OV.tools.getAbsoluteUrl(src.src);\r\n\t\t\t\t\t\tif(src.type == \”hls\”) {\r\n\t\t\t\t\t\t\tsrc.type = \”application/x-mpegURL\”;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tsrc.type = \”video/\”+src.type;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t\treturn srces;\r\n\t\t\t\t}\r\n\t\t\t\tfunction getJWPlayerCaptions(player) {\r\n\t\t\t\t\tvar tracks = OV.wrap(player.getPlaylist()[0].tracks);\r\n\t\t\t\t\ttracks.forEach(function(track) {\r\n\t\t\t\t\t\ttrack.renameKey(\”file\”, \”src\”);\r\n\t\t\t\t\t\ttrack.src = OV.tools.getAbsoluteUrl(track.src);\r\n\t\t\t\t\t});\r\n\t\t\t\t\treturn tracks;\r\n\t\t\t\t}\r\n\t\t\t\tfunction SetupVideo(videoNode) {\r\n\t\t\t\t\tif(!videoNode.dataset.isRegistred) {\r\n\t\t\t\t\t\tvideoNode.dataset.isRegistred = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tfunction getSrc(videoNode) {\r\n\t\t\t\t\tvar srces = [];\r\n\t\t\t\t\tOV.tools.forEach(videoNode.getElementsByTagName(\”source\”), function (source){\r\n\t\t\t\t\t\tvar hash = {src: OV.tools.getAbsoluteUrl(source.src), type: source.type};\r\n\t\t\t\t\t\tif(source.label) {\r\n\t\t\t\t\t\t\thash.label = source.label;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse if(source.dataset.res) {\r\n\t\t\t\t\t\t\thash.label = source.dataset.res;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif(source.default) {\r\n\t\t\t\t\t\t\tsrces.unshift(hash);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tsrces.push(hash);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t\tif(srces.length == 0) {\r\n\t\t\t\t\t\taddVideoToPopup({src: OV.tools.getAbsoluteUrl(videoNode.src), type: \”video/mp4\” }, [], videoNode.poster);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\taddVideoToPopup(srces, [], videoNode.poster);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tdocument.addEventListener(\”DOMContentLoaded\”, function() {\r\n\t\t\t\t\tif(!isPlayerLibrary()) {\r\n\t\t\t\t\t\tdocument.addEventListener(\”DOMNodeInserted\”, function(e){\r\n\t\t\t\t\t\t\tif(e.target.tagName && e.target.tagName.toLowerCase() == \”video\”) {\r\n\t\t\t\t\t\t\t\te.target.addEventListener(‘loadstart’, function(){\r\n\t\t\t\t\t\t\t\t\tgetSrc(e.target);\r\n\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t\tconsole.log(\”OpenVideo Search is here!\”);\r\n\t\t\t\t\t\r\n\t\t\t\t\t/*var videoArr = document.getElementsByTagName(\”video\”);\r\n\t\t\t\t\tOV.tools.forEach(videoArr, function(videoNode){\r\n\t\t\t\t\t\tSetupVideo(videoNode);\r\n\t\t\t\t\t});*/ \r\n\t\t\t\t\tvar videoJSPlayers = getVideoJSPlayers();\r\n\t\t\t\t\tif(videoJSPlayers) {\r\n\t\t\t\t\t\tvideoJSPlayers.forEach(function(player) {\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tplayer.on(‘loadstart’, function(){\r\n\t\t\t\t\t\t\t\tconsole.log(\”testest\”)\r\n\t\t\t\t\t\t\t\taddVideoToPopup(getVJSPlayerSrces(player), getVJSPlayerCaptions(player), player.poster());\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\tif(videojs.hook) {\r\n\t\t\t\t\t\t\tvideojs.hook(‘setup’, function(player) {\r\n\t\t\t\t\t\t\t\tplayer.on(‘loadstart’, function(){\r\n\t\t\t\t\t\t\t\t\taddVideoToPopup(getVJSPlayerSrces(player), getVJSPlayerCaptions(player), player.poster());\r\n\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar jwPlayers = getJWPlayers();\r\n\t\t\t\t\tif(jwPlayers) {\r\n\t\t\t\t\t\tjwPlayers.forEach(function (player){\r\n\t\t\t\t\t\t\tplayer.on(‘meta’, function(){\r\n\t\t\t\t\t\t\t\taddVideoToPopup(getJWPlayerSrces(player), getJWPlayerCaptions(player), player.getPlaylist()[0].image);\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif(!videoJSPlayers && !jwPlayers) {\r\n\t\t\t\t\t\tOV.tools.forEach(document.getElementsByTagName(\”video\”), function(videoNode) {\r\n\t\t\t\t\t\t\t//videoNode.addEventListener(‘play’, function() {\r\n\t\t\t\t\t\t\tgetSrc(videoNode);\r\n\t\t\t\t\t\t\t//});\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t})(null)”);

(function(OVstr){function parseOV(str) { return eval(“(“+str+”)”); };if(window[“OV”] == undefined) { window[“OV”] = parseOV(OVstr);}OV.log(“Successfully injected OV!”);})(“{\nArrayProps: {\nlast: {\nget: function() {\r\n\t\t\treturn this.target[this.target.length-1];\r\n\t\t}\n}\n},\nArrayMthds: {\nforEach: function(callback, defaultValue) {\r\n\t\tfor(var i=0;i<this.target.length;i++) {\r\n\t\t\tvar callval = callback.call(this.proxy,this.proxy.get(i),i,this.proxy);\r\n\t\t\tif(callval != undefined) {\r\n\t\t\t\treturn callval;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn defaultValue;\r\n\t},\ntoJSObject: function() {\r\n\t\tvar arr = [];\r\n\t\tthis.proxy.forEach(function(elem){\r\n\t\t\tarr.push(OV.unwrap(elem));\r\n\t\t});\r\n\t\treturn arr;\r\n\t},\ncopy: function() {\r\n\t\treturn OV.Array(this.target);\r\n\t},\ntoString: function() {\r\n\t\tvar buf = \”[\\n\”;\r\n\t\tthis.proxy.forEach(function(value, index){\r\n\t\t\tif(value.toString() != \”[object Object]\”) {\r\n\t\t\t\tif(typeof value === \”string\”) {\r\n\t\t\t\t\tbuf += JSON.stringify(value)+\”,\\n\”;\r\n\t\t\t\t} \r\n\t\t\t\telse {\r\n\t\t\t\t\tbuf += value.toString()+\”,\\n\”;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tOV.log(\”Object at index ‘\”+key+\”‘ could not be stringified!\”, value);\r\n\t\t\t}\r\n\t\t});\r\n\t\tif(buf[buf.length-2] == \”,\”)\r\n\t\t\treturn buf.slice(0,-2)+\”\\n]\”;\r\n\t\telse\r\n\t\t\treturn buf.slice(0,-1)+\”\\n]\”;\r\n\t},\nsearch: function(elem, criteriaFunc) {\r\n\t\tif(!criteriaFunc) {\r\n\t\t\tcriteriaFunc = function(elem, arrval) {\r\n\t\t\t\treturn elem === arrval;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this.proxy.forEach(function(arrelem, index){\r\n\t\t\tif(criteriaFunc(elem, arrelem)) {\r\n\t\t\t\treturn arrelem;\r\n\t\t\t}\r\n\t\t});\r\n\t},\nsearchIndex: function(elem, criteriaFunc) {\r\n\t\tif(!criteriaFunc) {\r\n\t\t\tcriteriaFunc = function(elem, arrval) {\r\n\t\t\t\treturn elem === arrval;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this.proxy.forEach(function(arrelem, index){\r\n\t\t\tif(criteriaFunc(elem, arrelem)) {\r\n\t\t\t\treturn index;\r\n\t\t\t}\r\n\t\t}, -1);\r\n\t},\nget: function(index) {\r\n\t\treturn this.target[index];\r\n\t},\nset: function(index, value) {\r\n\t\treturn this.target[index] = value;\r\n\t}\n},\nObjectProps: {\n},\nObjectMthds: {\nforEach: function(callback, defaultValue) {\r\n\t\tfor (var property in this.target) {\r\n\t\t if (this.target.hasOwnProperty(property)) {\r\n\t\t \tvar callVal = callback.call(this.proxy,this.proxy.get(property),property,this.proxy);\r\n\t\t \tif(callVal != undefined) {\r\n\t\t\t\t\treturn callVal;\r\n\t\t\t\t}\r\n\t\t }\r\n\t\t}\r\n\t\treturn defaultValue;\r\n\t},\ntoJSObject: function() {\r\n\t\tvar obj = {};\r\n\t\tthis.proxy.forEach(function(value, key){\r\n\t\t\tobj[key] = OV.unwrap(value);\r\n\t\t});\r\n\t\treturn obj;\r\n\t},\ncopy: function() {\r\n\t\treturn OV.Object(this.target);\r\n\t},\ntoString: function() {\r\n\t\tvar buf = \”{\\n\”;\r\n\t\tthis.proxy.forEach(function(value, key){\r\n\t\t\tif(value.toString() != \”[object Object]\”) {\r\n\t\t\t\tif(typeof value === \”string\”) {\r\n\t\t\t\t\tbuf += key+’: ‘ + JSON.stringify(value)+\”,\\n\”;\r\n\t\t\t\t} \r\n\t\t\t\telse {\r\n\t\t\t\t\tbuf += key+’: ‘ + value.toString()+\”,\\n\”;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tOV.log(\”Object at ‘\”+key+\”‘ could not be stringified!\”, value);\r\n\t\t\t}\r\n\t\t});\r\n\t\tif(buf[buf.length-2] == \”,\”)\r\n\t\t\treturn buf.slice(0,-2)+\”\\n}\”;\r\n\t\telse\r\n\t\t\treturn buf.slice(0,-1)+\”\\n}\”;\r\n\t},\nrenameKey: function(oldName, newName) {\r\n\t\tif (oldName !== newName) {\r\n\t\t Object.defineProperty(this.target, newName, Object.getOwnPropertyDescriptor(this.target, oldName));\r\n\t\t delete this.target[oldName];\r\n\t\t}\r\n\t},\nsearch: function(elem, criteriaFunc) {\r\n\t\tif(!criteriaFunc) {\r\n\t\t\tcriteriaFunc = function(elem, arrval) {\r\n\t\t\t\treturn elem === arrval;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this.proxy.forEach(function(value, key){\r\n\t\t\tif(criteriaFunc(elem, value)) {\r\n\t\t\t\treturn value;\r\n\t\t\t}\r\n\t\t});\r\n\t},\nsearchKey: function(elem, criteriaFunc) {\r\n\t\tif(!criteriaFunc) {\r\n\t\t\tcriteriaFunc = function(elem, arrval) {\r\n\t\t\t\treturn elem === arrval;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this.forEach(function(value, key){\r\n\t\t\tif(criteriaFunc(elem, value)) {\r\n\t\t\t\treturn key;\r\n\t\t\t}\r\n\t\t});\r\n\t},\npush: function(elem) {\r\n\t\tvar target = this.target;\r\n\t\tOV.wrap(elem).forEach(function(value, key){\r\n\t\t\ttarget[key] = OV.wrap(value);\r\n\t\t});\r\n\t\treturn this.proxy;\r\n\t},\nget: function(index) {\r\n\t\treturn this.target[index];\r\n\t},\nset: function(index, value) {\r\n\t\treturn this.target[index] = value;\r\n\t}\n},\ngetClassHandler: function(proxy, className, methods, properties) {\r\n\treturn {\r\n\t get: function(target, name){\r\n\t \tif(name == \”className\”) {\r\n\t \t\treturn className;\r\n\t \t}\r\n\t \telse if(methods[name]) {\r\n\t \t\treturn methods[name].bind({target: target, proxy: proxy.proxy});\r\n\t }\r\n\t else if(properties[name]) {\r\n\t \treturn properties[name].get.apply({target: target, proxy: proxy.proxy});\r\n\t }\r\n\t else if(typeof target[name] === \”function\” && Object.getPrototypeOf(target)[name]) {\r\n\t \treturn function(){\r\n\t \t\tvar args = arguments;\r\n\t \t\tOV.tools.forEach(args, function(elem, index){\r\n\t \t\t\targs[index] = OV.unwrap(elem);\r\n\t \t\t});\r\n\t \t\treturn OV.wrap(target[name].apply(target, args));\r\n\t \t};\r\n\t }\r\n\t else {\r\n\t \treturn target[name];\r\n\t }\r\n\t },\r\n\t\tset: function(target, name, value){\r\n\t\t\tif(methods[name] || name == \”className\”) {\r\n\t \tthrow \”You can’t overwrite ‘\”+name+\”‘!\”;\r\n\t }\r\n\t\t\telse if(properties[name]) {\r\n\t \tif(properties[name].set) {\r\n\t \t\treturn properties[name].set.apply({target: target, proxy: proxy.proxy}, value);\r\n\t \t}\r\n\t \telse {\r\n\t \t\tthrow \”You can’t overwrite ‘\”+name+\”‘!\”;\r\n\t \t}\r\n\t }\r\n\t else {\r\n\t \treturn target[name] = OV.wrap(value);\r\n\t }\r\n\t\t}\r\n\t};\r\n},\nArray: function(arr) {\r\n\tvar target = arr ? arr.concat() : [];\r\n\ttarget.forEach(function(elem, index){\r\n\t\ttarget[index] = OV.wrap(elem);\r\n\t});\r\n\tvar proxy = {};\r\n\tproxy.proxy = new Proxy(target,OV.getClassHandler(proxy, \”OVArray\”, OV.ArrayMthds, OV.ArrayProps));\r\n\treturn proxy.proxy;\r\n},\nObject: function(obj) {\r\n\tvar target = obj ? Object.assign({}, obj) : {};\r\n\tfor (var property in target) {\r\n\t if (target.hasOwnProperty(property)) {\r\n\t \ttarget[property] = OV.wrap(target[property]);\r\n\t }\r\n\t}\r\n\tvar proxy = {};\r\n\tproxy.proxy = new Proxy(target,OV.getClassHandler(proxy, \”OVObject\”, OV.ObjectMthds, OV.ObjectProps));\r\n\treturn proxy.proxy;\r\n},\nlog: function() {\r\n\t/*var args = arguments;\r\n\tOV.tools.forEach(args, function(elem, index){\r\n\t\targs[index] = OV.unwrap(elem);\r\n\t});\r\n\tconsole.log.apply(null, args);*/\r\n},\nwrap: function(ukn) {\r\n\tif(ukn == undefined) {\r\n\t\treturn null;\r\n\t}\r\n\telse if(ukn.className === \”OVArray\” || ukn.className === \”OVObject\”) {\r\n\t\treturn ukn;\r\n\t}\r\n\telse if(Array.isArray(ukn)) {\r\n\t\treturn OV.Array(ukn);\r\n\t}\r\n\telse if(typeof ukn === \”object\” && ukn.constructor.name === \”Object\”) {\r\n\t\treturn OV.Object(ukn);\r\n\t}\r\n\telse {\r\n\t\treturn ukn;\r\n\t}\r\n},\nunwrap: function(ukn) {\r\n\tif(ukn == undefined) {\r\n\t\treturn null;\r\n\t}\r\n\telse if(ukn.className === \”OVArray\” || ukn.className === \”OVObject\”) {\r\n\t\treturn ukn.toJSObject();\r\n\t}\r\n\telse {\r\n\t\tif(typeof ukn === \”object\” && ukn.constructor.name === \”Object\”) {\r\n\t\t\tfor(var prop in ukn) {\r\n\t\t\t\tukn[prop] = OV.unwrap(ukn[prop]);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn ukn;\r\n\t}\r\n},\ntools: {\nobjToHash: function (VidHash) {\r\n\tif(VidHash) {\r\n\t\treturn \”?hash=\”+encodeURIComponent(JSON.stringify(OV.unwrap(VidHash)));\r\n\t}\r\n\telse {\r\n\t\treturn \”\”;\r\n\t}\r\n},\nhashToObj: function(hashStr) {\r\n\tvar hash = OV.tools.parseUrlQuery(hashStr).hash;\r\n\tif(hash == \”\” || hash == undefined) {\r\n\t\treturn null;\r\n\t}\r\n\telse {\r\n\t\treturn OV.wrap(JSON.parse(hash));\r\n\t}\r\n},\ncheckUrlPattern: function (url, matches) {\r\n\t/*function urlMatch(url, match) {\r\n\t\tif(match == \”\”) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\tvar relevantStrings = match.split(\”*\”);\r\n\t\tfor(var i=0;i 62) ALPHABET = ‘ !\”#$%&\\'()*+,-./0123456789:;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~’;\r\n\t\telse if(base > 54) ALPHABET = ‘0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ’;\r\n\t\telse if(base > 52) ALPHABET = ‘0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQR’;\r\n\t\telse ALPHABET = ‘0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOP’;\r\n\t\treturn function(val) {\r\n\t\t\tif( 2 <= base && base <= 36)\r\n\t\t\t{\r\n\t\t\t\treturn parseInt(val,base);\r\n\t\t\t}\r\n\t\t\telse{\r\n\t\t\t\tvar valArray = val.split(”).reverse();\r\n\t\t\t\tvar ret = 0;\r\n\t\t\t\tfor(var i = 0; i < valArray.length ; i++)\r\n\t\t\t\t{\r\n\t\t\t\t\tvar cipher = valArray[i];\r\n\t\t\t\t\tret += Math.pow(base, i) * ALPHABET.indexOf(cipher);\r\n\t\t\t\t}\r\n\t\t\t\treturn ret;\r\n\t\t\t}\r\n\t\t};\r\n\t}\r\n\tvar out = source.match(/}\\(‘(.*)’, *(\\d+), *(\\d+), *'(.*?)’\\.split\\(‘\\|’\\)/);\r\n\t\r\n\t// Payload\r\n\tvar payload = out[1];\r\n\t// Words\r\n\tvar symtab = out[4].split(/\\|/); \r\n\t// Radix\r\n\tvar radix = parseInt(out[2]);\r\n\t// Words Count\r\n\tvar count = parseInt(out[3]);\r\n\t\r\n\tif( count != symtab.length ) return; // Malformed p.a.c.k.e.r symtab !\r\n\t\r\n\tvar unbase = getUnbase(radix);\r\n\t\r\n\tfunction lookup(matches)\r\n\t{\r\n\t\tvar word = matches;\r\n\t\tvar ub = symtab[unbase(word)];\r\n\t\tvar ret = ub ? ub : word;\r\n\t\treturn ret;\r\n\t}\r\n\t\r\n\tvar result = payload.replace(/\\b\\w+\\b/g, lookup);\r\n\tresult = result.replace(/\\\\/g, ”);\r\n\treturn result;\r\n},\nparseUrl: function (str) {\r\n\tif(OV.tools.parseUrl.options == undefined){\r\n\t\tOV.tools.parseUrl.options = {\r\n\t\t\tstrictMode: false,\r\n\t\t\tkey: [\”source\”,\”protocol\”,\”authority\”,\”userInfo\”,\”user\”,\”password\”,\”host\”,\”port\”,\”relative\”,\”path\”,\”directory\”,\”file\”,\”query\”,\”anchor\”],\r\n\t\t\tq: {\r\n\t\t\t\tname: \”queryKey\”,\r\n\t\t\t\tparser: /(?:^|&)([^&=]*)=?([^&]*)/g\r\n\t\t\t},\r\n\t\t\tparser: {\r\n\t\t\t\tstrict: /^(?:([^:\\/?#]+):)?(?:\\/\\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\\/?#]*)(?::(\\d*))?))?((((?:[^?#\\/]*\\/)*)([^?#]*))(?:\\?([^#]*))?(?:#(.*))?)/,\r\n\t\t\t\tloose: /^(?:(?![^:@]+:[^:@\\/]*@)([^:\\/?#.]+):)?(?:\\/\\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\\/?#]*)(?::(\\d*))?)(((\\/(?:[^?#](?![^?#\\/]*\\.[^?#\\/.]+(?:[?#]|$)))*\\/?)?([^?#\\/]*))(?:\\?([^#]*))?(?:#(.*))?)/\r\n\t\t\t}\r\n\t\t};\r\n\t}\r\n\tvar\to = OV.tools.parseUrl.options,\r\n\t\tm = o.parser[o.strictMode ? \”strict\” : \”loose\”].exec(str),\r\n\t\turi = {},\r\n\t\ti = 14;\r\n\r\n\twhile (i–) uri[o.key[i]] = m[i] || \”\”;\r\n\r\n\turi[o.q.name] = {};\r\n\turi[o.key[12]].replace(o.q.parser, function ($0, $1, $2) {\r\n\t\tif ($1) uri[o.q.name][$1] = $2;\r\n\t});\r\n\turi.queryString = uri.query;\r\n\turi.query = OV.tools.parseUrlQuery(str);\r\n\treturn OV.wrap(uri);\r\n},\nparseUrlQuery: function (url){\r\n\tif(url.indexOf(\”?\”) == -1) {\r\n\t\treturn OV.wrap({});\r\n\t}\r\n var query_string = {};\r\n var query = url.substr(url.indexOf(\”?\”)+1);\r\n var vars = query.split(\”&\”);\r\n for (var i=0;i<vars.length;i++) {\r\n var pair = vars[i].split(\”=\”);\r\n // If first entry with this name\r\n if (typeof query_string[pair[0]] === \”undefined\”) {\r\n query_string[pair[0]] = decodeURIComponent(pair[1]);\r\n // If second entry with this name\r\n } else if (typeof query_string[pair[0]] === \”string\”) {\r\n var arr = [ query_string[pair[0]],decodeURIComponent(pair[1]) ];\r\n query_string[pair[0]] = arr;\r\n // If third or later entry with this name\r\n } else {\r\n query_string[pair[0]].push(decodeURIComponent(pair[1]));\r\n }\r\n } \r\n return OV.wrap(query_string);\r\n},\ngetUrlFileName: function (url) {\r\n\tvar fileNameHeader = OV.tools.ajax({url: url, async: false, type: \”HEAD\”}).getResponseHeader(\”content-disposition\”);\r\n\tvar search = ‘filename=\”‘;\r\n\tif(fileNameHeader && fileNameHeader.indexOf(search) != -1) {\r\n\t\tvar fileName = fileNameHeader.substr(fileNameHeader.indexOf(search)+search.length);\r\n\t\treturn fileName.substr(0,fileName.indexOf(‘\”‘));\r\n\t}\r\n\telse {\r\n\t\treturn decodeURIComponent(url.substring(url.lastIndexOf(‘/’)+1));\r\n\t}\r\n},\nforEach: function(elem, callback){\r\n\tfor(var i=0;i<elem.length;i++){\r\n\t\tvar callVal = callback.call(elem, elem[i],i,elem);\r\n\t\tif(callVal) {\r\n\t\t\treturn callVal;\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n},\najax: function(urlOrHash) {\r\n\ttry {\r\n\t\tvar serialize = function(obj) {\r\n\t\t\tobj = OV.unwrap(obj);\r\n\t\t\tvar str = [];\r\n\t\t\tfor (var p in obj)\r\n\t\t if (obj.hasOwnProperty(p)) {\r\n\t\t \tstr.push(encodeURIComponent(p) + \”=\” + encodeURIComponent(obj[p]));\r\n\t\t }\r\n\t\t\tif(str.length == 0) {\r\n\t\t\t\treturn \”\”;\r\n\t\t\t}\r\n\t\t\treturn \”?\”+str.join(\”&\”);\r\n\t\t}\r\n\t\tvar hash = OV.wrap({});\r\n\t\tif(typeof urlOrHash === \”object\”) {\r\n\t\t\thash = OV.wrap(urlOrHash);\r\n\t\t}\r\n\t\telse {\r\n\t\t\thash.url = urlOrHash;\r\n\t\t}\r\n\t\thash.protocol = hash.protocol ? hash.protocol : \”https\”;\r\n\t\tif(OV.tools.parseUrl(hash.url).protocol != hash.protocol) {\r\n\t\t\thash.url = hash.url.replace(OV.tools.parseUrl(hash.url).protocol+\”://\”, hash.protocol+\”://\”);\r\n\t\t}\r\n\t\tif(!hash.data) {\r\n\t\t\thash.data = {};\r\n\t\t}\r\n\t\thash.data.push(OV.tools.parseUrlQuery(hash.url));\r\n\t\thash.data.ignoreRequestCheck = true;\r\n\t\tif(hash.url.indexOf(\”?\”) != -1) {\r\n\t\t\thash.url = hash.url.substr(0, hash.url.indexOf(\”?\”));\r\n\t\t}\r\n\t\tconsole.log(hash.url + serialize(hash.data));\r\n\t\tvar request = new XMLHttpRequest();\r\n\t\trequest.open(hash.type == null ? \”GET\” : hash.type, hash.url + serialize(hash.data), hash.async == null ? true : hash.async); \r\n\t\trequest.send(null);\r\n\t\treturn request;\r\n\t}\r\n\tcatch(e) {\r\n\t\tconsole.error(e.stack);\r\n\t\treturn { status: \”error\” };\r\n\t}\r\n},\nparseRelaxed: function(hash) {\r\n\tfunction isQuoted(hash, index) {\r\n\t\tvar quoteOpened = null;\r\n\t\tfor(var i=0;i<hash.length;i++) {\r\n\t\t\tif((hash[i] == ‘\”‘ || hash[i] == \”‘\”) && hash[i-1] != ‘\\\\’) {\r\n\t\t\t\tif(quoteOpened == null) {\r\n\t\t\t\t\tquoteOpened = hash[i];\r\n\t\t\t\t}\r\n\t\t\t\telse if(hash[i] == quoteOpened) {\r\n\t\t\t\t\tquoteOpened = null;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif(i == index) {\r\n\t\t\t\treturn quoteOpened != null;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\tvar parsedHash = {};\r\n\tfor(var i=0;i commaIndex) {\r\n\t\t\t\ttagStr = tagStr.substr(bracketIndex+1).trim();\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\ttagStr = tagStr.substr(commaIndex+1).trim();\r\n\t\t\t}\r\n\t\t\tconsole.log(tagStr);\r\n\t\t\tif(tagStr.indexOf(‘\”‘) == -1) {\r\n\t\t\t\thash = hash.replace(tagStr, ‘\”‘+tagStr+’\”‘);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tconsole.log(hash);\r\n\treturn hash;\r\n},\nparse: function(hash) {\r\n\treturn OV.wrap(dJSON.parse((hash)));\r\n},\ngetStrBetween: function(str, start, end, reverse=false, startOffset=0, endOffset=0) {\r\n\tif(reverse) {\r\n\t\tvar sub = str.substr(0, str.indexOf(end) + endOffset);\r\n\t\treturn sub.substr(sub.lastIndexOf(start) + start.length + startOffset);\r\n\t}\r\n\telse {\r\n\t\tvar sub = str.substr(str.indexOf(start) + start.length + startOffset);\r\n\t\treturn sub.substr(0, sub.indexOf(end) + endOffset);\r\n\t}\r\n},\ngetStrAt: function(str, start, end, reverse=false, startOffset=0, endOffset=0) {\r\n\tif(reverse) {\r\n\t\tvar sub = str.substr(0, str.indexOf(end) + end.length + endOffset);\r\n\t\treturn sub.substr(sub.lastIndexOf(start) + startOffset);\r\n\t}\r\n\telse {\r\n\t\tvar sub = str.substr(str.indexOf(start) + startOffset);\r\n\t\treturn sub.substr(0, sub.indexOf(end) + end.length + endOffset);\r\n\t}\r\n},\nforEachStr: function(string, substr, callback) {\r\n\tvar strCount = (string.match(new RegExp(substr,\”g\”)) || []).length;\r\n\tvar lastIndex = 0;\r\n\tfor(var i=0;i<strCount;i++) {\r\n\t\tvar currIndex = string.indexOf(substr, lastIndex);\r\n\t\tcallback(currIndex, string.substr(currIndex), substr, string);\r\n\t\tlastIndex = currIndex+1;\r\n\t}\r\n}\n},\nhtml: {\ngetAttributes: function (HTMLElement) {\r\n\tvar Hash = {};\r\n\tOV.tools.forEach(HTMLElement.attributes, function(attribute){\r\n\t\tHash[attribute.name] = attribute.value;\r\n\t});\r\n\treturn OV.wrap(Hash);\r\n},\naddAttributeListener: function(elem, attribute,callback) {\r\n\tvar lastValue = elem[attribute];\r\n window.setInterval( function() { \r\n var value = elem[attribute];\r\n \r\n if (value != lastValue) {\r\n callback.call(elem, attribute, value, lastValue, elem); \r\n lastValue = value;\r\n }\r\n },10);\r\n}\n},\npage: {\ninjectOV: function() {\r\n\tOV.page.injectJS(‘function(OVstr){‘+\r\n\r\n\t\t’function parseOV(str) { return eval(\”(\”+str+\”)\”); };’+\r\n\t\t’if(window[\”OV\”] == undefined) {‘+\r\n\t\t’\twindow[\”OV\”] = parseOV(OVstr);’+\r\n\t\t’}’+\r\n\t\t’OV.log(\”Successfully injected OV!\”);’+\r\n\t’}’, OV.wrap(OV).toString());\r\n},\ninjectJS: function (source) {\r\n\tvar injectStr = source;\r\n\t//if(typeof source === \”function\”) {\r\n\t\tvar args = JSON.stringify((Array.prototype.slice.call(arguments,1))).slice(1, -1);\r\n\t\tinjectStr = \”(\”+source+\”)(\”+args+\”);\”;\r\n\t//}\r\n\tvar script = document.createElement(‘script’);\r\n\tscript.appendChild(document.createTextNode(injectStr));\r\n\t(document.body || document.head || document.documentElement).appendChild(script);\r\n},\nexecute: function (valueFunc, valueEvent, valueFuncData) {\r\n\tOV.page.injectOV();\r\n\twindow.addEventListener(\”message\”, function MessageListener(event) {\r\n\t\r\n\t\tif (event.data.type && (event.data.type == \”GET_PAGE_DATA\”)) {\r\n\t\t\twindow.removeEventListener(\”message\”,MessageListener);\r\n\t\t\tOV.log(event.data.value);\r\n\t\t\tif(valueEvent) {\r\n\t\t\t\tvalueEvent(OV.wrap(event.data.value)); \r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\tOV.page.injectJS(‘function(valueFunc){‘+\r\n\t\t’var value = OV.unwrap(eval(valueFunc));’+\r\n\t\t’OV.log(value);’ +\r\n\t\t’window.postMessage({ type: \”GET_PAGE_DATA\”, value: value }, \”*\”);’+\r\n\t’}’,\”(\”+valueFunc+\”)(\”+OV.wrap(valueFuncData)+\”)\”);\r\n},\ngetUrlObj: function () {\r\n\treturn OV.tools.hashToObj(document.location.href);\r\n},\ngetObjUrl: function (VidHash) {\r\n\treturn location.href.substr(location.href.indexOf(\”?hash=\”))+OV.tools.objToHash(VidHash);\r\n},\nredirect: function(url){\r\n\tif(!chrome.tabs) {\r\n\t\tlocation.replace(url);\r\n\t}\r\n\telse {\r\n\t\tchrome.tabs.getCurrent(function (tab) {\r\n\t\t\tchrome.tabs.update(tab.id, {url: url});\r\n\t\t});\r\n\t}\r\n},\nloadScript: function(url) {\r\n\tvar script = document.createElement(\”script\”);\r\n\tscript.innerText = OV.tools.ajax({url: url, async: false}).responseText;\r\n\tdocument.documentElement.appendChild(script);\r\n},\ngetStorageData: function(type, name, callback) {\r\n\twindow.addEventListener(\”message\”, function MessageListener(event) {\r\n\t\r\n\t\tif (event.data.type && (event.data.type == \”STORAGE_DATA_REC\”) && event.data.request.type == type && event.data.request.var == name) {\r\n\t\t\twindow.removeEventListener(\”message\”,MessageListener);\r\n\t\t\tcallback(OV.wrap(event.data.value));\r\n\t\t}\r\n\t});\r\n\twindow.postMessage({ type: \”STORAGE_DATA_REQ\”, request: { type: type, var: name} }, \”*\”);\r\n},\nsetStorageData: function(type, name, value) {\r\n\twindow.postMessage({ type: \”STORAGE_DATA_SET\”, request: OV.unwrap({ type: type, var: name, value: value }) }, \”*\”);\r\n},\nstorage: {\nlocal: {\nget: function(name, callback) {\r\n\t\t\tOV.page.getStorageData(\”local\”, name, callback);\r\n\t\t},\nset: function(name, value) {\r\n\t\t\tOV.page.setStorageData(\”local\”, name, value);\r\n\t\t}\n},\nsync: {\nget: function(name, callback) {\r\n\t\t\tOV.page.getStorageData(\”sync\”, name, callback);\r\n\t\t},\nset: function(name, value) {\r\n\t\t\tOV.page.setStorageData(\”sync\”, name, value);\r\n\t\t}\n}\n}\n},\nwindow: {\nexecute: function (targetWindow, operation, valueEvent, data) {\r\n\tOV.window.addMessageListener(window, function callback(event) {\r\n\t\tif (event.data.type && (event.data.type == \”GET_WIND_DATA_RESP\”)) {\r\n\t\t\twindow.removeEventListener(\”message\”,callback);\r\n\t\t\tvalueEvent(event.data.value); \r\n\t\t}\r\n\t});\t\r\n\tOV.window.postMessage(targetWindow, { type: \”GET_WIND_DATA\”, operation: operation, data: OV.unwrap(data) });\r\n},\nsetupExecutor: function (functions) {\r\n\twindow.addEventListener(\”message\”, function(event) {\r\n\t\tif (event.data.type && (event.data.type == \”GET_WIND_DATA\”)) {\r\n\t\t\tOV.window.postMessage(event.source, {type: \”GET_WIND_DATA_RESP\”, value: functions[event.data.operation](event.data.data) });\r\n\t\t}\r\n\t});\t\r\n},\npostMessage: function(window, msg) {\r\n\twindow.postMessage(OV.unwrap(msg),\”*\”);\r\n},\naddMessageListener: function(window, callback) {\r\n\tvar func = function(event){\r\n\t\tevent.data = OV.wrap(event.data);\r\n\t\tcallback(event);\r\n\t}\r\n\twindow.addEventListener(\”message\”, func);\r\n\treturn func;\r\n},\nisFrame: function () {\r\n try {\r\n return window.self !== window.top;\r\n } catch (e) {\r\n return true;\r\n }\r\n}\n},\ntab: {\nsetIconPopup: function(url) {\r\n\tOV.background.execute(\”setIconPopup\”, null, {url: url});\r\n},\nsetIconText: function(text) {\r\n\tOV.background.execute(\”setIconText\”,null, {text: text});\r\n},\ncreate: function(url) {\r\n\tchrome.tabs.create({\r\n\t\turl : url\r\n\t});\r\n}\n},\nbackground: {\nexecute: function (operation, valueEvent, data) {\r\n\tchrome.runtime.sendMessage({task: \”BG_EXECUTE\”, operation: operation, data: OV.unwrap(data)}, function(response){\r\n\t\tif(valueEvent) {\r\n\t\t\tvalueEvent(OV.wrap(response.value));\r\n\t\t}\r\n\t});\r\n},\nsetupExecutor: function (functions) {\r\n\tchrome.runtime.onMessage.addListener(function(msg, sender, sendResponse) {\r\n\t\tif (msg.task == \”BG_EXECUTE\”) {\r\n\t\t\tOV.log(msg.operation, functions[msg.operation])\r\n\t\t\tif(msg.operation) {\r\n\t\t\t\tfunctions[msg.operation](OV.wrap(sender), OV.wrap(msg.data), function(x) { sendResponse({ value: OV.unwrap(x) }); });\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tOV.log(sendResponse+\”\”)\r\n\t\t\t}\r\n\t\t}\r\n\t});\t\r\n},\nsendToCurrentTab: function (data) {\r\n\tchrome.runtime.sendMessage({task: \”sendToCurrentTab\”, data: OV.unwrap(data)});\r\n},\nsetupTabSending: function() {\r\n\tchrome.runtime.onMessage.addListener(function(msg, sender, sendResponse) {\r\n\t\tif (msg.task == \”sendToCurrentTab\”) {\r\n\t\t\tchrome.tabs.getSelected(null, function(tab){\r\n\t\t\t\tif(tab.id != -1 && tab.id != sender.tabId) {\r\n\t\t\t\t\tchrome.tabs.sendMessage(tab.id,msg.data);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t});\r\n},\naddMessageListener: function(callback) {\r\n\tchrome.runtime.onMessage.addListener(function(msg, sender, sendResponse){\r\n\t\tcallback(OV.wrap(msg),sender, function(data){\r\n\t\t\tsendResponse(OV.unwrap(data));\r\n\t\t});\r\n\t}); \r\n}\n},\nstorage: {\nsetupStorage: function() {\r\n\twindow.addEventListener(\”message\”, function MessageListener(event) {\r\n\t\t\r\n\t\tif (event.data.type && (event.data.type == \”STORAGE_DATA_REQ\”)) {\r\n\t\t\tif(event.data.request.type == \”local\”) {\r\n\t\t\t\tOV.storage.local.get(event.data.request.var, function(value) {\r\n\t\t\t\t\tOV.log(value);\r\n\t\t\t\t\tOV.window.postMessage(window, { type: \”STORAGE_DATA_REC\”, request: event.data.request, value: value });\r\n\t\t\t\t});\r\n\t\t\t} \r\n\t\t\telse {\r\n\t\t\t\tOV.storage.sync.get(event.data.request.var, function(value) {\r\n\t\t\t\t\tOV.log(value);\r\n\t\t\t\t\tOV.window.postMessage(window, { type: \”STORAGE_DATA_REC\”, request: event.data.request, value: value });\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\t\telse if (event.data.type && (event.data.type == \”STORAGE_DATA_SET\”)) {\r\n\t\t\tif(event.data.request.type == \”local\”) {\r\n\t\t\t\tOV.storage.local.set(event.data.request.var, event.data.request.value);\r\n\t\t\t} \r\n\t\t\telse {\r\n\t\t\t\tOV.storage.sync.set(event.data.request.var, event.data.request.value);\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n},\nsync: {\nget: function(name, event){\r\n\tchrome.storage.sync.get(name,function(item){\r\n\t\t//console.log(\”Loaded:\”,name, item[name]);\r\n\t\tif(event != undefined){\r\n\t\t\tevent(OV.wrap(item[name]));\r\n\t\t}\r\n\t});\r\n},\nset: function(name,value,event){\r\n\tchrome.storage.sync.set({[name]: OV.unwrap(value)},function(){\r\n\t\t//console.log(\”Saved:\”,name, value);\r\n\t\tif(event != undefined){\r\n\t\t\tevent(name,value);\r\n\t\t}\r\n\t});\r\n}\n},\nlocal: {\nget: function(name, event){\r\n\tchrome.storage.local.get(name,function(item){\r\n\t\t//console.log(\”Loaded:\”,name, item[name]);\r\n\t\tif(event != undefined){\r\n\t\t\tevent(OV.wrap(item[name]));\r\n\t\t}\r\n\t});\r\n},\nset: function (name,value,event){\r\n\tchrome.storage.local.set({[name]: OV.unwrap(value)},function(){\r\n\t\t//console.log(\”Saved:\”,name, value);\r\n\t\tif(event != undefined){\r\n\t\t\tevent(name,value);\r\n\t\t}\r\n\t});\r\n}\n}\n},\nenvironment: {\nhost: \”chrome-extension://abefmkpoondgfeeonmlfomllfjnjddll\”,\ngetVidPlaySiteUrl: function (VidHash) {\r\n\treturn chrome.extension.getURL(\”/html/VidPlaySite/VidPlaySite.html\”)+OV.tools.objToHash(VidHash);\r\n},\ngetVidPopupSiteUrl: function (VidHash) {\r\n\treturn chrome.extension.getURL(\”/html/VideoPopup/VideoPopup.html\”)+OV.tools.objToHash(VidHash);\r\n},\ngetOptionsSiteUrl: function () {\r\n\treturn chrome.extension.getURL(\”/html/OptionsSite/OptionsSite.html\”);\r\n},\ngetLibrarySiteUrl: function () {\r\n\treturn chrome.extension.getURL(\”/html/LibrarySite/librarySite.html\”);\r\n},\nloadVidPlaySite: function (VidHash) {\r\n\tVidHash.vidSiteUrl = location.href;\r\n\tOV.page.redirect(OV.environment.getVidPlaySiteUrl(VidHash));\r\n},\nisExtensionPage: function(url) {\r\n\tif(OV.environment.browser() == OV.CHROME) {\r\n\t\treturn url.indexOf(\”chrome-extension://\”) != -1;\r\n\t}\r\n\telse {\r\n\t\treturn url.indexOf(\”moz-extension://\”) != -1;\r\n\t}\r\n},\ngetManifest: function() {\r\n\treturn chrome.runtime.getManifest();\r\n},\nbrowser: function() {\r\n\tif(navigator.userAgent.search(\”Firefox\”) != -1) {\r\n\t\treturn OV.FIREFOX;\r\n\t}\r\n\telse if(navigator.userAgent.search(\”Chrome\”) != -1) {\r\n\t\treturn OV.CHROME;\r\n\t}\r\n}\n},\nCHROME: \”chrome\”,\nFIREFOX: \”firefox\”,\nanalytics: {\nsetup: function() {\r\n\tOV.storage.sync.get(\”AnalyticsEnabled\”, function(isEnabled){\r\n\t\tif(isEnabled || isEnabled == undefined) {\r\n\t\t\t_gaq = _gaq || [];\r\n\t\t\t_gaq.push([‘_setAccount’, ‘UA-118573631-1’]);\r\n\t\t\t(function() {\r\n\t\t\t var ga = document.createElement(‘script’); ga.type = ‘text/javascript’; ga.async = true;\r\n\t\t\t ga.src = ‘https://google-analytics.com/ga.js&#8217;;\r\n\t\t\t var s = document.getElementsByTagName(‘script’)[0]; s.parentNode.insertBefore(ga, s);\r\n\t\t\t})();\r\n\t\t}\r\n\t});\r\n},\nfireEvent: function(name, type) {\r\n\tOV.storage.sync.get(\”AnalyticsEnabled\”, function(isEnabled){\r\n\t\tif(isEnabled || isEnabled == undefined) {\r\n\t\t\t_gaq = _gaq || [];\r\n\t\t\t_gaq.push([‘_trackEvent’, name, type]);\r\n\t\t}\r\n\t});\r\n}\n},\ndebug: {\nstartTiming: function() {\r\n\tOV.debug.time = (new Date()).getTime();\r\n},\ntimePassed: function() {\r\n\tif(!OV.debug.time) {\r\n\t\treturn 0;\r\n\t}\r\n\treturn (new Date()).getTime() – OV.debug.time;\r\n},\nmsg: function(msg) {\r\n\tconsole.log(msg, OV.debug.timePassed());\r\n}\n}\n}”);(function(valueFunc){var value = OV.unwrap(eval(valueFunc));OV.log(value);window.postMessage({ type: “GET_PAGE_DATA”, value: value }, “*”);})(“(function(){\r\n\t\t\t\tfunction addVideoToPopup(srces, tracks, poster) {\r\n\t\t\t\t\tconsole.log(srces, tracks, poster);\r\n\t\t\t\t\tOV.window.postMessage(window.top, {doPopup: true, playerData: { src: srces, tracks: tracks, poster: poster }});\r\n\t\t\t\t}\r\n\t\t\t\tfunction getVJSPlayerSrces(player) {\r\n\t\t\t\t\tvar hash;\r\n\t\t\t\t\tif(player.options_.sources && player.options_.sources.length > 0) {\r\n\t\t\t\t\t\thash = player.options_.sources;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if(player.cache_.sources) {\r\n\t\t\t\t\t\thash = player.cache_.sources;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if(player.cache_.source) {\r\n\t\t\t\t\t\thash = player.cache_.source;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if(player.cache_.src){\r\n\t\t\t\t\t\thash = player.cache_;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\thash = {src: player.src(), type: \”video/mp4\” }\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif(hash.concat) {\r\n\t\t\t\t\t\thash.forEach(function (elem) {\r\n\t\t\t\t\t\t\telem.src = OV.tools.getAbsoluteUrl(elem.src);\r\n\t\t\t\t\t\t\tif(elem[\”data-res\”]) {\r\n\t\t\t\t\t\t\t\telem.label = elem[\”data-res\”];\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif(!elem.type) {\r\n\t\t\t\t\t\t\t\telem.type = \”video/mp4\”;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\thash.src = OV.tools.getAbsoluteUrl(hash.src);\r\n\t\t\t\t\t\tif(!hash.type) {\r\n\t\t\t\t\t\t\thash.type = \”video/mp4\”;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn hash;\r\n\t\t\t\t}\r\n\t\t\t\tfunction getVJSPlayerCaptions(player) {\r\n\t\t\t\t\tvar tracks = [];\r\n\t\t\t\t\tOV.tools.forEach(player.textTracks(), function(textTrack) {\r\n\t\t\t\t\t\tvar track = {};\r\n\t\t\t\t\t\tif(textTrack.options_ && textTrack.options_.src) {\r\n\t\t\t\t\t\t\ttrack.src = OV.tools.getAbsoluteUrl(textTrack.options_.src);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse if(textTrack.cues_.length != 0) {\r\n\t\t\t\t\t\t\ttrack.cues = [];\r\n\t\t\t\t\t\t\ttextTrack.cues_.forEach(function (cue) {\r\n\t\t\t\t\t\t\t\ttrack.cues.push({ startTime: cue.startTime, endTime: cue.endTime, text: cue.text });\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif(typeof textTrack.kind == \”function\”) {\r\n\t\t\t\t\t\t\ttrack.kind = textTrack.kind();\r\n\t\t\t\t\t\t\ttrack.language = textTrack.language();\r\n\t\t\t\t\t\t\ttrack.label = textTrack.label();\r\n\t\t\t\t\t\t\tif(textTrack.default) {\r\n\t\t\t\t\t\t\t\ttrack.default = textTrack.default();\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\ttrack.kind = textTrack.kind;\r\n\t\t\t\t\t\t\ttrack.language = textTrack.language;\r\n\t\t\t\t\t\t\ttrack.label = textTrack.label;\r\n\t\t\t\t\t\t\ttrack.default = textTrack.default;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\ttracks.push(track);\r\n\t\t\t\t\t});\r\n\t\t\t\t\treturn tracks;\r\n\t\t\t\t}\r\n\t\t\t\tfunction getVideoJSPlayers() {\r\n\t\t\t\t\tif(window[‘videojs’] != undefined) {\r\n\t\t\t\t\t\treturn OV.wrap(videojs.players);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tfunction getJWPlayers() {\r\n\t\t\t\t\tif(window[‘jwplayer’] == undefined) {\r\n\t\t\t\t\t\treturn null;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar arr = [];\r\n\t\t\t\t\tfor(var i=0, player=jwplayer(0);player.on;player=jwplayer(++i)) {\r\n\t\t\t\t\t\tarr.push(player);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn OV.wrap(arr);\r\n\t\t\t\t}\r\n\t\t\t\tfunction isPlayerLibrary() {\r\n\t\t\t\t\treturn window[‘jwplayer’] != null || window[‘videojs’] != null;\r\n\t\t\t\t}\r\n\t\t\t\tfunction getJWPlayerSrces(player) {\r\n\t\t\t\t\tvar srces = OV.wrap(player.getPlaylist()[0].sources);\r\n\t\t\t\t\tsrces.forEach(function(src) {\r\n\t\t\t\t\t\tsrc.renameKey(\”file\”, \”src\”);\r\n\t\t\t\t\t\tsrc.src = OV.tools.getAbsoluteUrl(src.src);\r\n\t\t\t\t\t\tif(src.type == \”hls\”) {\r\n\t\t\t\t\t\t\tsrc.type = \”application/x-mpegURL\”;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tsrc.type = \”video/\”+src.type;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t\treturn srces;\r\n\t\t\t\t}\r\n\t\t\t\tfunction getJWPlayerCaptions(player) {\r\n\t\t\t\t\tvar tracks = OV.wrap(player.getPlaylist()[0].tracks);\r\n\t\t\t\t\ttracks.forEach(function(track) {\r\n\t\t\t\t\t\ttrack.renameKey(\”file\”, \”src\”);\r\n\t\t\t\t\t\ttrack.src = OV.tools.getAbsoluteUrl(track.src);\r\n\t\t\t\t\t});\r\n\t\t\t\t\treturn tracks;\r\n\t\t\t\t}\r\n\t\t\t\tfunction SetupVideo(videoNode) {\r\n\t\t\t\t\tif(!videoNode.dataset.isRegistred) {\r\n\t\t\t\t\t\tvideoNode.dataset.isRegistred = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tfunction getSrc(videoNode) {\r\n\t\t\t\t\tvar srces = [];\r\n\t\t\t\t\tOV.tools.forEach(videoNode.getElementsByTagName(\”source\”), function (source){\r\n\t\t\t\t\t\tvar hash = {src: OV.tools.getAbsoluteUrl(source.src), type: source.type};\r\n\t\t\t\t\t\tif(source.label) {\r\n\t\t\t\t\t\t\thash.label = source.label;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse if(source.dataset.res) {\r\n\t\t\t\t\t\t\thash.label = source.dataset.res;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif(source.default) {\r\n\t\t\t\t\t\t\tsrces.unshift(hash);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tsrces.push(hash);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t\tif(srces.length == 0) {\r\n\t\t\t\t\t\taddVideoToPopup({src: OV.tools.getAbsoluteUrl(videoNode.src), type: \”video/mp4\” }, [], videoNode.poster);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\taddVideoToPopup(srces, [], videoNode.poster);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tdocument.addEventListener(\”DOMContentLoaded\”, function() {\r\n\t\t\t\t\tif(!isPlayerLibrary()) {\r\n\t\t\t\t\t\tdocument.addEventListener(\”DOMNodeInserted\”, function(e){\r\n\t\t\t\t\t\t\tif(e.target.tagName && e.target.tagName.toLowerCase() == \”video\”) {\r\n\t\t\t\t\t\t\t\te.target.addEventListener(‘loadstart’, function(){\r\n\t\t\t\t\t\t\t\t\tgetSrc(e.target);\r\n\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t\tconsole.log(\”OpenVideo Search is here!\”);\r\n\t\t\t\t\t\r\n\t\t\t\t\t/*var videoArr = document.getElementsByTagName(\”video\”);\r\n\t\t\t\t\tOV.tools.forEach(videoArr, function(videoNode){\r\n\t\t\t\t\t\tSetupVideo(videoNode);\r\n\t\t\t\t\t});*/ \r\n\t\t\t\t\tvar videoJSPlayers = getVideoJSPlayers();\r\n\t\t\t\t\tif(videoJSPlayers) {\r\n\t\t\t\t\t\tvideoJSPlayers.forEach(function(player) {\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tplayer.on(‘loadstart’, function(){\r\n\t\t\t\t\t\t\t\tconsole.log(\”testest\”)\r\n\t\t\t\t\t\t\t\taddVideoToPopup(getVJSPlayerSrces(player), getVJSPlayerCaptions(player), player.poster());\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\tif(videojs.hook) {\r\n\t\t\t\t\t\t\tvideojs.hook(‘setup’, function(player) {\r\n\t\t\t\t\t\t\t\tplayer.on(‘loadstart’, function(){\r\n\t\t\t\t\t\t\t\t\taddVideoToPopup(getVJSPlayerSrces(player), getVJSPlayerCaptions(player), player.poster());\r\n\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar jwPlayers = getJWPlayers();\r\n\t\t\t\t\tif(jwPlayers) {\r\n\t\t\t\t\t\tjwPlayers.forEach(function (player){\r\n\t\t\t\t\t\t\tplayer.on(‘meta’, function(){\r\n\t\t\t\t\t\t\t\taddVideoToPopup(getJWPlayerSrces(player), getJWPlayerCaptions(player), player.getPlaylist()[0].image);\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif(!videoJSPlayers && !jwPlayers) {\r\n\t\t\t\t\t\tOV.tools.forEach(document.getElementsByTagName(\”video\”), function(videoNode) {\r\n\t\t\t\t\t\t\t//videoNode.addEventListener(‘play’, function() {\r\n\t\t\t\t\t\t\tgetSrc(videoNode);\r\n\t\t\t\t\t\t\t//});\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t})(null)”);

(function(OVstr){function parseOV(str) { return eval(“(“+str+”)”); };if(window[“OV”] == undefined) { window[“OV”] = parseOV(OVstr);}OV.log(“Successfully injected OV!”);})(“{\nArrayProps: {\nlast: {\nget: function() {\r\n\t\t\treturn this.target[this.target.length-1];\r\n\t\t}\n}\n},\nArrayMthds: {\nforEach: function(callback, defaultValue) {\r\n\t\tfor(var i=0;i<this.target.length;i++) {\r\n\t\t\tvar callval = callback.call(this.proxy,this.proxy.get(i),i,this.proxy);\r\n\t\t\tif(callval != undefined) {\r\n\t\t\t\treturn callval;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn defaultValue;\r\n\t},\ntoJSObject: function() {\r\n\t\tvar arr = [];\r\n\t\tthis.proxy.forEach(function(elem){\r\n\t\t\tarr.push(OV.unwrap(elem));\r\n\t\t});\r\n\t\treturn arr;\r\n\t},\ncopy: function() {\r\n\t\treturn OV.Array(this.target);\r\n\t},\ntoString: function() {\r\n\t\tvar buf = \”[\\n\”;\r\n\t\tthis.proxy.forEach(function(value, index){\r\n\t\t\tif(value.toString() != \”[object Object]\”) {\r\n\t\t\t\tif(typeof value === \”string\”) {\r\n\t\t\t\t\tbuf += JSON.stringify(value)+\”,\\n\”;\r\n\t\t\t\t} \r\n\t\t\t\telse {\r\n\t\t\t\t\tbuf += value.toString()+\”,\\n\”;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tOV.log(\”Object at index ‘\”+key+\”‘ could not be stringified!\”, value);\r\n\t\t\t}\r\n\t\t});\r\n\t\tif(buf[buf.length-2] == \”,\”)\r\n\t\t\treturn buf.slice(0,-2)+\”\\n]\”;\r\n\t\telse\r\n\t\t\treturn buf.slice(0,-1)+\”\\n]\”;\r\n\t},\nsearch: function(elem, criteriaFunc) {\r\n\t\tif(!criteriaFunc) {\r\n\t\t\tcriteriaFunc = function(elem, arrval) {\r\n\t\t\t\treturn elem === arrval;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this.proxy.forEach(function(arrelem, index){\r\n\t\t\tif(criteriaFunc(elem, arrelem)) {\r\n\t\t\t\treturn arrelem;\r\n\t\t\t}\r\n\t\t});\r\n\t},\nsearchIndex: function(elem, criteriaFunc) {\r\n\t\tif(!criteriaFunc) {\r\n\t\t\tcriteriaFunc = function(elem, arrval) {\r\n\t\t\t\treturn elem === arrval;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this.proxy.forEach(function(arrelem, index){\r\n\t\t\tif(criteriaFunc(elem, arrelem)) {\r\n\t\t\t\treturn index;\r\n\t\t\t}\r\n\t\t}, -1);\r\n\t},\nget: function(index) {\r\n\t\treturn this.target[index];\r\n\t},\nset: function(index, value) {\r\n\t\treturn this.target[index] = value;\r\n\t}\n},\nObjectProps: {\n},\nObjectMthds: {\nforEach: function(callback, defaultValue) {\r\n\t\tfor (var property in this.target) {\r\n\t\t if (this.target.hasOwnProperty(property)) {\r\n\t\t \tvar callVal = callback.call(this.proxy,this.proxy.get(property),property,this.proxy);\r\n\t\t \tif(callVal != undefined) {\r\n\t\t\t\t\treturn callVal;\r\n\t\t\t\t}\r\n\t\t }\r\n\t\t}\r\n\t\treturn defaultValue;\r\n\t},\ntoJSObject: function() {\r\n\t\tvar obj = {};\r\n\t\tthis.proxy.forEach(function(value, key){\r\n\t\t\tobj[key] = OV.unwrap(value);\r\n\t\t});\r\n\t\treturn obj;\r\n\t},\ncopy: function() {\r\n\t\treturn OV.Object(this.target);\r\n\t},\ntoString: function() {\r\n\t\tvar buf = \”{\\n\”;\r\n\t\tthis.proxy.forEach(function(value, key){\r\n\t\t\tif(value.toString() != \”[object Object]\”) {\r\n\t\t\t\tif(typeof value === \”string\”) {\r\n\t\t\t\t\tbuf += key+’: ‘ + JSON.stringify(value)+\”,\\n\”;\r\n\t\t\t\t} \r\n\t\t\t\telse {\r\n\t\t\t\t\tbuf += key+’: ‘ + value.toString()+\”,\\n\”;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tOV.log(\”Object at ‘\”+key+\”‘ could not be stringified!\”, value);\r\n\t\t\t}\r\n\t\t});\r\n\t\tif(buf[buf.length-2] == \”,\”)\r\n\t\t\treturn buf.slice(0,-2)+\”\\n}\”;\r\n\t\telse\r\n\t\t\treturn buf.slice(0,-1)+\”\\n}\”;\r\n\t},\nrenameKey: function(oldName, newName) {\r\n\t\tif (oldName !== newName) {\r\n\t\t Object.defineProperty(this.target, newName, Object.getOwnPropertyDescriptor(this.target, oldName));\r\n\t\t delete this.target[oldName];\r\n\t\t}\r\n\t},\nsearch: function(elem, criteriaFunc) {\r\n\t\tif(!criteriaFunc) {\r\n\t\t\tcriteriaFunc = function(elem, arrval) {\r\n\t\t\t\treturn elem === arrval;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this.proxy.forEach(function(value, key){\r\n\t\t\tif(criteriaFunc(elem, value)) {\r\n\t\t\t\treturn value;\r\n\t\t\t}\r\n\t\t});\r\n\t},\nsearchKey: function(elem, criteriaFunc) {\r\n\t\tif(!criteriaFunc) {\r\n\t\t\tcriteriaFunc = function(elem, arrval) {\r\n\t\t\t\treturn elem === arrval;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this.forEach(function(value, key){\r\n\t\t\tif(criteriaFunc(elem, value)) {\r\n\t\t\t\treturn key;\r\n\t\t\t}\r\n\t\t});\r\n\t},\npush: function(elem) {\r\n\t\tvar target = this.target;\r\n\t\tOV.wrap(elem).forEach(function(value, key){\r\n\t\t\ttarget[key] = OV.wrap(value);\r\n\t\t});\r\n\t\treturn this.proxy;\r\n\t},\nget: function(index) {\r\n\t\treturn this.target[index];\r\n\t},\nset: function(index, value) {\r\n\t\treturn this.target[index] = value;\r\n\t}\n},\ngetClassHandler: function(proxy, className, methods, properties) {\r\n\treturn {\r\n\t get: function(target, name){\r\n\t \tif(name == \”className\”) {\r\n\t \t\treturn className;\r\n\t \t}\r\n\t \telse if(methods[name]) {\r\n\t \t\treturn methods[name].bind({target: target, proxy: proxy.proxy});\r\n\t }\r\n\t else if(properties[name]) {\r\n\t \treturn properties[name].get.apply({target: target, proxy: proxy.proxy});\r\n\t }\r\n\t else if(typeof target[name] === \”function\” && Object.getPrototypeOf(target)[name]) {\r\n\t \treturn function(){\r\n\t \t\tvar args = arguments;\r\n\t \t\tOV.tools.forEach(args, function(elem, index){\r\n\t \t\t\targs[index] = OV.unwrap(elem);\r\n\t \t\t});\r\n\t \t\treturn OV.wrap(target[name].apply(target, args));\r\n\t \t};\r\n\t }\r\n\t else {\r\n\t \treturn target[name];\r\n\t }\r\n\t },\r\n\t\tset: function(target, name, value){\r\n\t\t\tif(methods[name] || name == \”className\”) {\r\n\t \tthrow \”You can’t overwrite ‘\”+name+\”‘!\”;\r\n\t }\r\n\t\t\telse if(properties[name]) {\r\n\t \tif(properties[name].set) {\r\n\t \t\treturn properties[name].set.apply({target: target, proxy: proxy.proxy}, value);\r\n\t \t}\r\n\t \telse {\r\n\t \t\tthrow \”You can’t overwrite ‘\”+name+\”‘!\”;\r\n\t \t}\r\n\t }\r\n\t else {\r\n\t \treturn target[name] = OV.wrap(value);\r\n\t }\r\n\t\t}\r\n\t};\r\n},\nArray: function(arr) {\r\n\tvar target = arr ? arr.concat() : [];\r\n\ttarget.forEach(function(elem, index){\r\n\t\ttarget[index] = OV.wrap(elem);\r\n\t});\r\n\tvar proxy = {};\r\n\tproxy.proxy = new Proxy(target,OV.getClassHandler(proxy, \”OVArray\”, OV.ArrayMthds, OV.ArrayProps));\r\n\treturn proxy.proxy;\r\n},\nObject: function(obj) {\r\n\tvar target = obj ? Object.assign({}, obj) : {};\r\n\tfor (var property in target) {\r\n\t if (target.hasOwnProperty(property)) {\r\n\t \ttarget[property] = OV.wrap(target[property]);\r\n\t }\r\n\t}\r\n\tvar proxy = {};\r\n\tproxy.proxy = new Proxy(target,OV.getClassHandler(proxy, \”OVObject\”, OV.ObjectMthds, OV.ObjectProps));\r\n\treturn proxy.proxy;\r\n},\nlog: function() {\r\n\t/*var args = arguments;\r\n\tOV.tools.forEach(args, function(elem, index){\r\n\t\targs[index] = OV.unwrap(elem);\r\n\t});\r\n\tconsole.log.apply(null, args);*/\r\n},\nwrap: function(ukn) {\r\n\tif(ukn == undefined) {\r\n\t\treturn null;\r\n\t}\r\n\telse if(ukn.className === \”OVArray\” || ukn.className === \”OVObject\”) {\r\n\t\treturn ukn;\r\n\t}\r\n\telse if(Array.isArray(ukn)) {\r\n\t\treturn OV.Array(ukn);\r\n\t}\r\n\telse if(typeof ukn === \”object\” && ukn.constructor.name === \”Object\”) {\r\n\t\treturn OV.Object(ukn);\r\n\t}\r\n\telse {\r\n\t\treturn ukn;\r\n\t}\r\n},\nunwrap: function(ukn) {\r\n\tif(ukn == undefined) {\r\n\t\treturn null;\r\n\t}\r\n\telse if(ukn.className === \”OVArray\” || ukn.className === \”OVObject\”) {\r\n\t\treturn ukn.toJSObject();\r\n\t}\r\n\telse {\r\n\t\tif(typeof ukn === \”object\” && ukn.constructor.name === \”Object\”) {\r\n\t\t\tfor(var prop in ukn) {\r\n\t\t\t\tukn[prop] = OV.unwrap(ukn[prop]);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn ukn;\r\n\t}\r\n},\ntools: {\nobjToHash: function (VidHash) {\r\n\tif(VidHash) {\r\n\t\treturn \”?hash=\”+encodeURIComponent(JSON.stringify(OV.unwrap(VidHash)));\r\n\t}\r\n\telse {\r\n\t\treturn \”\”;\r\n\t}\r\n},\nhashToObj: function(hashStr) {\r\n\tvar hash = OV.tools.parseUrlQuery(hashStr).hash;\r\n\tif(hash == \”\” || hash == undefined) {\r\n\t\treturn null;\r\n\t}\r\n\telse {\r\n\t\treturn OV.wrap(JSON.parse(hash));\r\n\t}\r\n},\ncheckUrlPattern: function (url, matches) {\r\n\t/*function urlMatch(url, match) {\r\n\t\tif(match == \”\”) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\tvar relevantStrings = match.split(\”*\”);\r\n\t\tfor(var i=0;i 62) ALPHABET = ‘ !\”#$%&\\'()*+,-./0123456789:;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~’;\r\n\t\telse if(base > 54) ALPHABET = ‘0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ’;\r\n\t\telse if(base > 52) ALPHABET = ‘0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQR’;\r\n\t\telse ALPHABET = ‘0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOP’;\r\n\t\treturn function(val) {\r\n\t\t\tif( 2 <= base && base <= 36)\r\n\t\t\t{\r\n\t\t\t\treturn parseInt(val,base);\r\n\t\t\t}\r\n\t\t\telse{\r\n\t\t\t\tvar valArray = val.split(”).reverse();\r\n\t\t\t\tvar ret = 0;\r\n\t\t\t\tfor(var i = 0; i < valArray.length ; i++)\r\n\t\t\t\t{\r\n\t\t\t\t\tvar cipher = valArray[i];\r\n\t\t\t\t\tret += Math.pow(base, i) * ALPHABET.indexOf(cipher);\r\n\t\t\t\t}\r\n\t\t\t\treturn ret;\r\n\t\t\t}\r\n\t\t};\r\n\t}\r\n\tvar out = source.match(/}\\(‘(.*)’, *(\\d+), *(\\d+), *'(.*?)’\\.split\\(‘\\|’\\)/);\r\n\t\r\n\t// Payload\r\n\tvar payload = out[1];\r\n\t// Words\r\n\tvar symtab = out[4].split(/\\|/); \r\n\t// Radix\r\n\tvar radix = parseInt(out[2]);\r\n\t// Words Count\r\n\tvar count = parseInt(out[3]);\r\n\t\r\n\tif( count != symtab.length ) return; // Malformed p.a.c.k.e.r symtab !\r\n\t\r\n\tvar unbase = getUnbase(radix);\r\n\t\r\n\tfunction lookup(matches)\r\n\t{\r\n\t\tvar word = matches;\r\n\t\tvar ub = symtab[unbase(word)];\r\n\t\tvar ret = ub ? ub : word;\r\n\t\treturn ret;\r\n\t}\r\n\t\r\n\tvar result = payload.replace(/\\b\\w+\\b/g, lookup);\r\n\tresult = result.replace(/\\\\/g, ”);\r\n\treturn result;\r\n},\nparseUrl: function (str) {\r\n\tif(OV.tools.parseUrl.options == undefined){\r\n\t\tOV.tools.parseUrl.options = {\r\n\t\t\tstrictMode: false,\r\n\t\t\tkey: [\”source\”,\”protocol\”,\”authority\”,\”userInfo\”,\”user\”,\”password\”,\”host\”,\”port\”,\”relative\”,\”path\”,\”directory\”,\”file\”,\”query\”,\”anchor\”],\r\n\t\t\tq: {\r\n\t\t\t\tname: \”queryKey\”,\r\n\t\t\t\tparser: /(?:^|&)([^&=]*)=?([^&]*)/g\r\n\t\t\t},\r\n\t\t\tparser: {\r\n\t\t\t\tstrict: /^(?:([^:\\/?#]+):)?(?:\\/\\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\\/?#]*)(?::(\\d*))?))?((((?:[^?#\\/]*\\/)*)([^?#]*))(?:\\?([^#]*))?(?:#(.*))?)/,\r\n\t\t\t\tloose: /^(?:(?![^:@]+:[^:@\\/]*@)([^:\\/?#.]+):)?(?:\\/\\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\\/?#]*)(?::(\\d*))?)(((\\/(?:[^?#](?![^?#\\/]*\\.[^?#\\/.]+(?:[?#]|$)))*\\/?)?([^?#\\/]*))(?:\\?([^#]*))?(?:#(.*))?)/\r\n\t\t\t}\r\n\t\t};\r\n\t}\r\n\tvar\to = OV.tools.parseUrl.options,\r\n\t\tm = o.parser[o.strictMode ? \”strict\” : \”loose\”].exec(str),\r\n\t\turi = {},\r\n\t\ti = 14;\r\n\r\n\twhile (i–) uri[o.key[i]] = m[i] || \”\”;\r\n\r\n\turi[o.q.name] = {};\r\n\turi[o.key[12]].replace(o.q.parser, function ($0, $1, $2) {\r\n\t\tif ($1) uri[o.q.name][$1] = $2;\r\n\t});\r\n\turi.queryString = uri.query;\r\n\turi.query = OV.tools.parseUrlQuery(str);\r\n\treturn OV.wrap(uri);\r\n},\nparseUrlQuery: function (url){\r\n\tif(url.indexOf(\”?\”) == -1) {\r\n\t\treturn OV.wrap({});\r\n\t}\r\n var query_string = {};\r\n var query = url.substr(url.indexOf(\”?\”)+1);\r\n var vars = query.split(\”&\”);\r\n for (var i=0;i<vars.length;i++) {\r\n var pair = vars[i].split(\”=\”);\r\n // If first entry with this name\r\n if (typeof query_string[pair[0]] === \”undefined\”) {\r\n query_string[pair[0]] = decodeURIComponent(pair[1]);\r\n // If second entry with this name\r\n } else if (typeof query_string[pair[0]] === \”string\”) {\r\n var arr = [ query_string[pair[0]],decodeURIComponent(pair[1]) ];\r\n query_string[pair[0]] = arr;\r\n // If third or later entry with this name\r\n } else {\r\n query_string[pair[0]].push(decodeURIComponent(pair[1]));\r\n }\r\n } \r\n return OV.wrap(query_string);\r\n},\ngetUrlFileName: function (url) {\r\n\tvar fileNameHeader = OV.tools.ajax({url: url, async: false, type: \”HEAD\”}).getResponseHeader(\”content-disposition\”);\r\n\tvar search = ‘filename=\”‘;\r\n\tif(fileNameHeader && fileNameHeader.indexOf(search) != -1) {\r\n\t\tvar fileName = fileNameHeader.substr(fileNameHeader.indexOf(search)+search.length);\r\n\t\treturn fileName.substr(0,fileName.indexOf(‘\”‘));\r\n\t}\r\n\telse {\r\n\t\treturn decodeURIComponent(url.substring(url.lastIndexOf(‘/’)+1));\r\n\t}\r\n},\nforEach: function(elem, callback){\r\n\tfor(var i=0;i<elem.length;i++){\r\n\t\tvar callVal = callback.call(elem, elem[i],i,elem);\r\n\t\tif(callVal) {\r\n\t\t\treturn callVal;\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n},\najax: function(urlOrHash) {\r\n\ttry {\r\n\t\tvar serialize = function(obj) {\r\n\t\t\tobj = OV.unwrap(obj);\r\n\t\t\tvar str = [];\r\n\t\t\tfor (var p in obj)\r\n\t\t if (obj.hasOwnProperty(p)) {\r\n\t\t \tstr.push(encodeURIComponent(p) + \”=\” + encodeURIComponent(obj[p]));\r\n\t\t }\r\n\t\t\tif(str.length == 0) {\r\n\t\t\t\treturn \”\”;\r\n\t\t\t}\r\n\t\t\treturn \”?\”+str.join(\”&\”);\r\n\t\t}\r\n\t\tvar hash = OV.wrap({});\r\n\t\tif(typeof urlOrHash === \”object\”) {\r\n\t\t\thash = OV.wrap(urlOrHash);\r\n\t\t}\r\n\t\telse {\r\n\t\t\thash.url = urlOrHash;\r\n\t\t}\r\n\t\thash.protocol = hash.protocol ? hash.protocol : \”https\”;\r\n\t\tif(OV.tools.parseUrl(hash.url).protocol != hash.protocol) {\r\n\t\t\thash.url = hash.url.replace(OV.tools.parseUrl(hash.url).protocol+\”://\”, hash.protocol+\”://\”);\r\n\t\t}\r\n\t\tif(!hash.data) {\r\n\t\t\thash.data = {};\r\n\t\t}\r\n\t\thash.data.push(OV.tools.parseUrlQuery(hash.url));\r\n\t\thash.data.ignoreRequestCheck = true;\r\n\t\tif(hash.url.indexOf(\”?\”) != -1) {\r\n\t\t\thash.url = hash.url.substr(0, hash.url.indexOf(\”?\”));\r\n\t\t}\r\n\t\tconsole.log(hash.url + serialize(hash.data));\r\n\t\tvar request = new XMLHttpRequest();\r\n\t\trequest.open(hash.type == null ? \”GET\” : hash.type, hash.url + serialize(hash.data), hash.async == null ? true : hash.async); \r\n\t\trequest.send(null);\r\n\t\treturn request;\r\n\t}\r\n\tcatch(e) {\r\n\t\tconsole.error(e.stack);\r\n\t\treturn { status: \”error\” };\r\n\t}\r\n},\nparseRelaxed: function(hash) {\r\n\tfunction isQuoted(hash, index) {\r\n\t\tvar quoteOpened = null;\r\n\t\tfor(var i=0;i<hash.length;i++) {\r\n\t\t\tif((hash[i] == ‘\”‘ || hash[i] == \”‘\”) && hash[i-1] != ‘\\\\’) {\r\n\t\t\t\tif(quoteOpened == null) {\r\n\t\t\t\t\tquoteOpened = hash[i];\r\n\t\t\t\t}\r\n\t\t\t\telse if(hash[i] == quoteOpened) {\r\n\t\t\t\t\tquoteOpened = null;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif(i == index) {\r\n\t\t\t\treturn quoteOpened != null;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\tvar parsedHash = {};\r\n\tfor(var i=0;i commaIndex) {\r\n\t\t\t\ttagStr = tagStr.substr(bracketIndex+1).trim();\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\ttagStr = tagStr.substr(commaIndex+1).trim();\r\n\t\t\t}\r\n\t\t\tconsole.log(tagStr);\r\n\t\t\tif(tagStr.indexOf(‘\”‘) == -1) {\r\n\t\t\t\thash = hash.replace(tagStr, ‘\”‘+tagStr+’\”‘);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tconsole.log(hash);\r\n\treturn hash;\r\n},\nparse: function(hash) {\r\n\treturn OV.wrap(dJSON.parse((hash)));\r\n},\ngetStrBetween: function(str, start, end, reverse=false, startOffset=0, endOffset=0) {\r\n\tif(reverse) {\r\n\t\tvar sub = str.substr(0, str.indexOf(end) + endOffset);\r\n\t\treturn sub.substr(sub.lastIndexOf(start) + start.length + startOffset);\r\n\t}\r\n\telse {\r\n\t\tvar sub = str.substr(str.indexOf(start) + start.length + startOffset);\r\n\t\treturn sub.substr(0, sub.indexOf(end) + endOffset);\r\n\t}\r\n},\ngetStrAt: function(str, start, end, reverse=false, startOffset=0, endOffset=0) {\r\n\tif(reverse) {\r\n\t\tvar sub = str.substr(0, str.indexOf(end) + end.length + endOffset);\r\n\t\treturn sub.substr(sub.lastIndexOf(start) + startOffset);\r\n\t}\r\n\telse {\r\n\t\tvar sub = str.substr(str.indexOf(start) + startOffset);\r\n\t\treturn sub.substr(0, sub.indexOf(end) + end.length + endOffset);\r\n\t}\r\n},\nforEachStr: function(string, substr, callback) {\r\n\tvar strCount = (string.match(new RegExp(substr,\”g\”)) || []).length;\r\n\tvar lastIndex = 0;\r\n\tfor(var i=0;i<strCount;i++) {\r\n\t\tvar currIndex = string.indexOf(substr, lastIndex);\r\n\t\tcallback(currIndex, string.substr(currIndex), substr, string);\r\n\t\tlastIndex = currIndex+1;\r\n\t}\r\n}\n},\nhtml: {\ngetAttributes: function (HTMLElement) {\r\n\tvar Hash = {};\r\n\tOV.tools.forEach(HTMLElement.attributes, function(attribute){\r\n\t\tHash[attribute.name] = attribute.value;\r\n\t});\r\n\treturn OV.wrap(Hash);\r\n},\naddAttributeListener: function(elem, attribute,callback) {\r\n\tvar lastValue = elem[attribute];\r\n window.setInterval( function() { \r\n var value = elem[attribute];\r\n \r\n if (value != lastValue) {\r\n callback.call(elem, attribute, value, lastValue, elem); \r\n lastValue = value;\r\n }\r\n },10);\r\n}\n},\npage: {\ninjectOV: function() {\r\n\tOV.page.injectJS(‘function(OVstr){‘+\r\n\r\n\t\t’function parseOV(str) { return eval(\”(\”+str+\”)\”); };’+\r\n\t\t’if(window[\”OV\”] == undefined) {‘+\r\n\t\t’\twindow[\”OV\”] = parseOV(OVstr);’+\r\n\t\t’}’+\r\n\t\t’OV.log(\”Successfully injected OV!\”);’+\r\n\t’}’, OV.wrap(OV).toString());\r\n},\ninjectJS: function (source) {\r\n\tvar injectStr = source;\r\n\t//if(typeof source === \”function\”) {\r\n\t\tvar args = JSON.stringify((Array.prototype.slice.call(arguments,1))).slice(1, -1);\r\n\t\tinjectStr = \”(\”+source+\”)(\”+args+\”);\”;\r\n\t//}\r\n\tvar script = document.createElement(‘script’);\r\n\tscript.appendChild(document.createTextNode(injectStr));\r\n\t(document.body || document.head || document.documentElement).appendChild(script);\r\n},\nexecute: function (valueFunc, valueEvent, valueFuncData) {\r\n\tOV.page.injectOV();\r\n\twindow.addEventListener(\”message\”, function MessageListener(event) {\r\n\t\r\n\t\tif (event.data.type && (event.data.type == \”GET_PAGE_DATA\”)) {\r\n\t\t\twindow.removeEventListener(\”message\”,MessageListener);\r\n\t\t\tOV.log(event.data.value);\r\n\t\t\tif(valueEvent) {\r\n\t\t\t\tvalueEvent(OV.wrap(event.data.value)); \r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\tOV.page.injectJS(‘function(valueFunc){‘+\r\n\t\t’var value = OV.unwrap(eval(valueFunc));’+\r\n\t\t’OV.log(value);’ +\r\n\t\t’window.postMessage({ type: \”GET_PAGE_DATA\”, value: value }, \”*\”);’+\r\n\t’}’,\”(\”+valueFunc+\”)(\”+OV.wrap(valueFuncData)+\”)\”);\r\n},\ngetUrlObj: function () {\r\n\treturn OV.tools.hashToObj(document.location.href);\r\n},\ngetObjUrl: function (VidHash) {\r\n\treturn location.href.substr(location.href.indexOf(\”?hash=\”))+OV.tools.objToHash(VidHash);\r\n},\nredirect: function(url){\r\n\tif(!chrome.tabs) {\r\n\t\tlocation.replace(url);\r\n\t}\r\n\telse {\r\n\t\tchrome.tabs.getCurrent(function (tab) {\r\n\t\t\tchrome.tabs.update(tab.id, {url: url});\r\n\t\t});\r\n\t}\r\n},\nloadScript: function(url) {\r\n\tvar script = document.createElement(\”script\”);\r\n\tscript.innerText = OV.tools.ajax({url: url, async: false}).responseText;\r\n\tdocument.documentElement.appendChild(script);\r\n},\ngetStorageData: function(type, name, callback) {\r\n\twindow.addEventListener(\”message\”, function MessageListener(event) {\r\n\t\r\n\t\tif (event.data.type && (event.data.type == \”STORAGE_DATA_REC\”) && event.data.request.type == type && event.data.request.var == name) {\r\n\t\t\twindow.removeEventListener(\”message\”,MessageListener);\r\n\t\t\tcallback(OV.wrap(event.data.value));\r\n\t\t}\r\n\t});\r\n\twindow.postMessage({ type: \”STORAGE_DATA_REQ\”, request: { type: type, var: name} }, \”*\”);\r\n},\nsetStorageData: function(type, name, value) {\r\n\twindow.postMessage({ type: \”STORAGE_DATA_SET\”, request: OV.unwrap({ type: type, var: name, value: value }) }, \”*\”);\r\n},\nstorage: {\nlocal: {\nget: function(name, callback) {\r\n\t\t\tOV.page.getStorageData(\”local\”, name, callback);\r\n\t\t},\nset: function(name, value) {\r\n\t\t\tOV.page.setStorageData(\”local\”, name, value);\r\n\t\t}\n},\nsync: {\nget: function(name, callback) {\r\n\t\t\tOV.page.getStorageData(\”sync\”, name, callback);\r\n\t\t},\nset: function(name, value) {\r\n\t\t\tOV.page.setStorageData(\”sync\”, name, value);\r\n\t\t}\n}\n}\n},\nwindow: {\nexecute: function (targetWindow, operation, valueEvent, data) {\r\n\tOV.window.addMessageListener(window, function callback(event) {\r\n\t\tif (event.data.type && (event.data.type == \”GET_WIND_DATA_RESP\”)) {\r\n\t\t\twindow.removeEventListener(\”message\”,callback);\r\n\t\t\tvalueEvent(event.data.value); \r\n\t\t}\r\n\t});\t\r\n\tOV.window.postMessage(targetWindow, { type: \”GET_WIND_DATA\”, operation: operation, data: OV.unwrap(data) });\r\n},\nsetupExecutor: function (functions) {\r\n\twindow.addEventListener(\”message\”, function(event) {\r\n\t\tif (event.data.type && (event.data.type == \”GET_WIND_DATA\”)) {\r\n\t\t\tOV.window.postMessage(event.source, {type: \”GET_WIND_DATA_RESP\”, value: functions[event.data.operation](event.data.data) });\r\n\t\t}\r\n\t});\t\r\n},\npostMessage: function(window, msg) {\r\n\twindow.postMessage(OV.unwrap(msg),\”*\”);\r\n},\naddMessageListener: function(window, callback) {\r\n\tvar func = function(event){\r\n\t\tevent.data = OV.wrap(event.data);\r\n\t\tcallback(event);\r\n\t}\r\n\twindow.addEventListener(\”message\”, func);\r\n\treturn func;\r\n},\nisFrame: function () {\r\n try {\r\n return window.self !== window.top;\r\n } catch (e) {\r\n return true;\r\n }\r\n}\n},\ntab: {\nsetIconPopup: function(url) {\r\n\tOV.background.execute(\”setIconPopup\”, null, {url: url});\r\n},\nsetIconText: function(text) {\r\n\tOV.background.execute(\”setIconText\”,null, {text: text});\r\n},\ncreate: function(url) {\r\n\tchrome.tabs.create({\r\n\t\turl : url\r\n\t});\r\n}\n},\nbackground: {\nexecute: function (operation, valueEvent, data) {\r\n\tchrome.runtime.sendMessage({task: \”BG_EXECUTE\”, operation: operation, data: OV.unwrap(data)}, function(response){\r\n\t\tif(valueEvent) {\r\n\t\t\tvalueEvent(OV.wrap(response.value));\r\n\t\t}\r\n\t});\r\n},\nsetupExecutor: function (functions) {\r\n\tchrome.runtime.onMessage.addListener(function(msg, sender, sendResponse) {\r\n\t\tif (msg.task == \”BG_EXECUTE\”) {\r\n\t\t\tOV.log(msg.operation, functions[msg.operation])\r\n\t\t\tif(msg.operation) {\r\n\t\t\t\tfunctions[msg.operation](OV.wrap(sender), OV.wrap(msg.data), function(x) { sendResponse({ value: OV.unwrap(x) }); });\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tOV.log(sendResponse+\”\”)\r\n\t\t\t}\r\n\t\t}\r\n\t});\t\r\n},\nsendToCurrentTab: function (data) {\r\n\tchrome.runtime.sendMessage({task: \”sendToCurrentTab\”, data: OV.unwrap(data)});\r\n},\nsetupTabSending: function() {\r\n\tchrome.runtime.onMessage.addListener(function(msg, sender, sendResponse) {\r\n\t\tif (msg.task == \”sendToCurrentTab\”) {\r\n\t\t\tchrome.tabs.getSelected(null, function(tab){\r\n\t\t\t\tif(tab.id != -1 && tab.id != sender.tabId) {\r\n\t\t\t\t\tchrome.tabs.sendMessage(tab.id,msg.data);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t});\r\n},\naddMessageListener: function(callback) {\r\n\tchrome.runtime.onMessage.addListener(function(msg, sender, sendResponse){\r\n\t\tcallback(OV.wrap(msg),sender, function(data){\r\n\t\t\tsendResponse(OV.unwrap(data));\r\n\t\t});\r\n\t}); \r\n}\n},\nstorage: {\nsetupStorage: function() {\r\n\twindow.addEventListener(\”message\”, function MessageListener(event) {\r\n\t\t\r\n\t\tif (event.data.type && (event.data.type == \”STORAGE_DATA_REQ\”)) {\r\n\t\t\tif(event.data.request.type == \”local\”) {\r\n\t\t\t\tOV.storage.local.get(event.data.request.var, function(value) {\r\n\t\t\t\t\tOV.log(value);\r\n\t\t\t\t\tOV.window.postMessage(window, { type: \”STORAGE_DATA_REC\”, request: event.data.request, value: value });\r\n\t\t\t\t});\r\n\t\t\t} \r\n\t\t\telse {\r\n\t\t\t\tOV.storage.sync.get(event.data.request.var, function(value) {\r\n\t\t\t\t\tOV.log(value);\r\n\t\t\t\t\tOV.window.postMessage(window, { type: \”STORAGE_DATA_REC\”, request: event.data.request, value: value });\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\t\telse if (event.data.type && (event.data.type == \”STORAGE_DATA_SET\”)) {\r\n\t\t\tif(event.data.request.type == \”local\”) {\r\n\t\t\t\tOV.storage.local.set(event.data.request.var, event.data.request.value);\r\n\t\t\t} \r\n\t\t\telse {\r\n\t\t\t\tOV.storage.sync.set(event.data.request.var, event.data.request.value);\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n},\nsync: {\nget: function(name, event){\r\n\tchrome.storage.sync.get(name,function(item){\r\n\t\t//console.log(\”Loaded:\”,name, item[name]);\r\n\t\tif(event != undefined){\r\n\t\t\tevent(OV.wrap(item[name]));\r\n\t\t}\r\n\t});\r\n},\nset: function(name,value,event){\r\n\tchrome.storage.sync.set({[name]: OV.unwrap(value)},function(){\r\n\t\t//console.log(\”Saved:\”,name, value);\r\n\t\tif(event != undefined){\r\n\t\t\tevent(name,value);\r\n\t\t}\r\n\t});\r\n}\n},\nlocal: {\nget: function(name, event){\r\n\tchrome.storage.local.get(name,function(item){\r\n\t\t//console.log(\”Loaded:\”,name, item[name]);\r\n\t\tif(event != undefined){\r\n\t\t\tevent(OV.wrap(item[name]));\r\n\t\t}\r\n\t});\r\n},\nset: function (name,value,event){\r\n\tchrome.storage.local.set({[name]: OV.unwrap(value)},function(){\r\n\t\t//console.log(\”Saved:\”,name, value);\r\n\t\tif(event != undefined){\r\n\t\t\tevent(name,value);\r\n\t\t}\r\n\t});\r\n}\n}\n},\nenvironment: {\nhost: \”chrome-extension://abefmkpoondgfeeonmlfomllfjnjddll\”,\ngetVidPlaySiteUrl: function (VidHash) {\r\n\treturn chrome.extension.getURL(\”/html/VidPlaySite/VidPlaySite.html\”)+OV.tools.objToHash(VidHash);\r\n},\ngetVidPopupSiteUrl: function (VidHash) {\r\n\treturn chrome.extension.getURL(\”/html/VideoPopup/VideoPopup.html\”)+OV.tools.objToHash(VidHash);\r\n},\ngetOptionsSiteUrl: function () {\r\n\treturn chrome.extension.getURL(\”/html/OptionsSite/OptionsSite.html\”);\r\n},\ngetLibrarySiteUrl: function () {\r\n\treturn chrome.extension.getURL(\”/html/LibrarySite/librarySite.html\”);\r\n},\nloadVidPlaySite: function (VidHash) {\r\n\tVidHash.vidSiteUrl = location.href;\r\n\tOV.page.redirect(OV.environment.getVidPlaySiteUrl(VidHash));\r\n},\nisExtensionPage: function(url) {\r\n\tif(OV.environment.browser() == OV.CHROME) {\r\n\t\treturn url.indexOf(\”chrome-extension://\”) != -1;\r\n\t}\r\n\telse {\r\n\t\treturn url.indexOf(\”moz-extension://\”) != -1;\r\n\t}\r\n},\ngetManifest: function() {\r\n\treturn chrome.runtime.getManifest();\r\n},\nbrowser: function() {\r\n\tif(navigator.userAgent.search(\”Firefox\”) != -1) {\r\n\t\treturn OV.FIREFOX;\r\n\t}\r\n\telse if(navigator.userAgent.search(\”Chrome\”) != -1) {\r\n\t\treturn OV.CHROME;\r\n\t}\r\n}\n},\nCHROME: \”chrome\”,\nFIREFOX: \”firefox\”,\nanalytics: {\nsetup: function() {\r\n\tOV.storage.sync.get(\”AnalyticsEnabled\”, function(isEnabled){\r\n\t\tif(isEnabled || isEnabled == undefined) {\r\n\t\t\t_gaq = _gaq || [];\r\n\t\t\t_gaq.push([‘_setAccount’, ‘UA-118573631-1’]);\r\n\t\t\t(function() {\r\n\t\t\t var ga = document.createElement(‘script’); ga.type = ‘text/javascript’; ga.async = true;\r\n\t\t\t ga.src = ‘https://google-analytics.com/ga.js&#8217;;\r\n\t\t\t var s = document.getElementsByTagName(‘script’)[0]; s.parentNode.insertBefore(ga, s);\r\n\t\t\t})();\r\n\t\t}\r\n\t});\r\n},\nfireEvent: function(name, type) {\r\n\tOV.storage.sync.get(\”AnalyticsEnabled\”, function(isEnabled){\r\n\t\tif(isEnabled || isEnabled == undefined) {\r\n\t\t\t_gaq = _gaq || [];\r\n\t\t\t_gaq.push([‘_trackEvent’, name, type]);\r\n\t\t}\r\n\t});\r\n}\n},\ndebug: {\nstartTiming: function() {\r\n\tOV.debug.time = (new Date()).getTime();\r\n},\ntimePassed: function() {\r\n\tif(!OV.debug.time) {\r\n\t\treturn 0;\r\n\t}\r\n\treturn (new Date()).getTime() – OV.debug.time;\r\n},\nmsg: function(msg) {\r\n\tconsole.log(msg, OV.debug.timePassed());\r\n}\n}\n}”);(function(valueFunc){var value = OV.unwrap(eval(valueFunc));OV.log(value);window.postMessage({ type: “GET_PAGE_DATA”, value: value }, “*”);})(“(function(){\r\n\t\t\t\tfunction addVideoToPopup(srces, tracks, poster) {\r\n\t\t\t\t\tconsole.log(srces, tracks, poster);\r\n\t\t\t\t\tOV.window.postMessage(window.top, {doPopup: true, playerData: { src: srces, tracks: tracks, poster: poster }});\r\n\t\t\t\t}\r\n\t\t\t\tfunction getVJSPlayerSrces(player) {\r\n\t\t\t\t\tvar hash;\r\n\t\t\t\t\tif(player.options_.sources && player.options_.sources.length > 0) {\r\n\t\t\t\t\t\thash = player.options_.sources;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if(player.cache_.sources) {\r\n\t\t\t\t\t\thash = player.cache_.sources;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if(player.cache_.source) {\r\n\t\t\t\t\t\thash = player.cache_.source;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if(player.cache_.src){\r\n\t\t\t\t\t\thash = player.cache_;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\thash = {src: player.src(), type: \”video/mp4\” }\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif(hash.concat) {\r\n\t\t\t\t\t\thash.forEach(function (elem) {\r\n\t\t\t\t\t\t\telem.src = OV.tools.getAbsoluteUrl(elem.src);\r\n\t\t\t\t\t\t\tif(elem[\”data-res\”]) {\r\n\t\t\t\t\t\t\t\telem.label = elem[\”data-res\”];\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif(!elem.type) {\r\n\t\t\t\t\t\t\t\telem.type = \”video/mp4\”;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\thash.src = OV.tools.getAbsoluteUrl(hash.src);\r\n\t\t\t\t\t\tif(!hash.type) {\r\n\t\t\t\t\t\t\thash.type = \”video/mp4\”;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn hash;\r\n\t\t\t\t}\r\n\t\t\t\tfunction getVJSPlayerCaptions(player) {\r\n\t\t\t\t\tvar tracks = [];\r\n\t\t\t\t\tOV.tools.forEach(player.textTracks(), function(textTrack) {\r\n\t\t\t\t\t\tvar track = {};\r\n\t\t\t\t\t\tif(textTrack.options_ && textTrack.options_.src) {\r\n\t\t\t\t\t\t\ttrack.src = OV.tools.getAbsoluteUrl(textTrack.options_.src);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse if(textTrack.cues_.length != 0) {\r\n\t\t\t\t\t\t\ttrack.cues = [];\r\n\t\t\t\t\t\t\ttextTrack.cues_.forEach(function (cue) {\r\n\t\t\t\t\t\t\t\ttrack.cues.push({ startTime: cue.startTime, endTime: cue.endTime, text: cue.text });\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif(typeof textTrack.kind == \”function\”) {\r\n\t\t\t\t\t\t\ttrack.kind = textTrack.kind();\r\n\t\t\t\t\t\t\ttrack.language = textTrack.language();\r\n\t\t\t\t\t\t\ttrack.label = textTrack.label();\r\n\t\t\t\t\t\t\tif(textTrack.default) {\r\n\t\t\t\t\t\t\t\ttrack.default = textTrack.default();\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\ttrack.kind = textTrack.kind;\r\n\t\t\t\t\t\t\ttrack.language = textTrack.language;\r\n\t\t\t\t\t\t\ttrack.label = textTrack.label;\r\n\t\t\t\t\t\t\ttrack.default = textTrack.default;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\ttracks.push(track);\r\n\t\t\t\t\t});\r\n\t\t\t\t\treturn tracks;\r\n\t\t\t\t}\r\n\t\t\t\tfunction getVideoJSPlayers() {\r\n\t\t\t\t\tif(window[‘videojs’] != undefined) {\r\n\t\t\t\t\t\treturn OV.wrap(videojs.players);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tfunction getJWPlayers() {\r\n\t\t\t\t\tif(window[‘jwplayer’] == undefined) {\r\n\t\t\t\t\t\treturn null;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar arr = [];\r\n\t\t\t\t\tfor(var i=0, player=jwplayer(0);player.on;player=jwplayer(++i)) {\r\n\t\t\t\t\t\tarr.push(player);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn OV.wrap(arr);\r\n\t\t\t\t}\r\n\t\t\t\tfunction isPlayerLibrary() {\r\n\t\t\t\t\treturn window[‘jwplayer’] != null || window[‘videojs’] != null;\r\n\t\t\t\t}\r\n\t\t\t\tfunction getJWPlayerSrces(player) {\r\n\t\t\t\t\tvar srces = OV.wrap(player.getPlaylist()[0].sources);\r\n\t\t\t\t\tsrces.forEach(function(src) {\r\n\t\t\t\t\t\tsrc.renameKey(\”file\”, \”src\”);\r\n\t\t\t\t\t\tsrc.src = OV.tools.getAbsoluteUrl(src.src);\r\n\t\t\t\t\t\tif(src.type == \”hls\”) {\r\n\t\t\t\t\t\t\tsrc.type = \”application/x-mpegURL\”;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tsrc.type = \”video/\”+src.type;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t\treturn srces;\r\n\t\t\t\t}\r\n\t\t\t\tfunction getJWPlayerCaptions(player) {\r\n\t\t\t\t\tvar tracks = OV.wrap(player.getPlaylist()[0].tracks);\r\n\t\t\t\t\ttracks.forEach(function(track) {\r\n\t\t\t\t\t\ttrack.renameKey(\”file\”, \”src\”);\r\n\t\t\t\t\t\ttrack.src = OV.tools.getAbsoluteUrl(track.src);\r\n\t\t\t\t\t});\r\n\t\t\t\t\treturn tracks;\r\n\t\t\t\t}\r\n\t\t\t\tfunction SetupVideo(videoNode) {\r\n\t\t\t\t\tif(!videoNode.dataset.isRegistred) {\r\n\t\t\t\t\t\tvideoNode.dataset.isRegistred = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tfunction getSrc(videoNode) {\r\n\t\t\t\t\tvar srces = [];\r\n\t\t\t\t\tOV.tools.forEach(videoNode.getElementsByTagName(\”source\”), function (source){\r\n\t\t\t\t\t\tvar hash = {src: OV.tools.getAbsoluteUrl(source.src), type: source.type};\r\n\t\t\t\t\t\tif(source.label) {\r\n\t\t\t\t\t\t\thash.label = source.label;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse if(source.dataset.res) {\r\n\t\t\t\t\t\t\thash.label = source.dataset.res;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif(source.default) {\r\n\t\t\t\t\t\t\tsrces.unshift(hash);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tsrces.push(hash);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t\tif(srces.length == 0) {\r\n\t\t\t\t\t\taddVideoToPopup({src: OV.tools.getAbsoluteUrl(videoNode.src), type: \”video/mp4\” }, [], videoNode.poster);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\taddVideoToPopup(srces, [], videoNode.poster);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tdocument.addEventListener(\”DOMContentLoaded\”, function() {\r\n\t\t\t\t\tif(!isPlayerLibrary()) {\r\n\t\t\t\t\t\tdocument.addEventListener(\”DOMNodeInserted\”, function(e){\r\n\t\t\t\t\t\t\tif(e.target.tagName && e.target.tagName.toLowerCase() == \”video\”) {\r\n\t\t\t\t\t\t\t\te.target.addEventListener(‘loadstart’, function(){\r\n\t\t\t\t\t\t\t\t\tgetSrc(e.target);\r\n\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t\tconsole.log(\”OpenVideo Search is here!\”);\r\n\t\t\t\t\t\r\n\t\t\t\t\t/*var videoArr = document.getElementsByTagName(\”video\”);\r\n\t\t\t\t\tOV.tools.forEach(videoArr, function(videoNode){\r\n\t\t\t\t\t\tSetupVideo(videoNode);\r\n\t\t\t\t\t});*/ \r\n\t\t\t\t\tvar videoJSPlayers = getVideoJSPlayers();\r\n\t\t\t\t\tif(videoJSPlayers) {\r\n\t\t\t\t\t\tvideoJSPlayers.forEach(function(player) {\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tplayer.on(‘loadstart’, function(){\r\n\t\t\t\t\t\t\t\tconsole.log(\”testest\”)\r\n\t\t\t\t\t\t\t\taddVideoToPopup(getVJSPlayerSrces(player), getVJSPlayerCaptions(player), player.poster());\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\tif(videojs.hook) {\r\n\t\t\t\t\t\t\tvideojs.hook(‘setup’, function(player) {\r\n\t\t\t\t\t\t\t\tplayer.on(‘loadstart’, function(){\r\n\t\t\t\t\t\t\t\t\taddVideoToPopup(getVJSPlayerSrces(player), getVJSPlayerCaptions(player), player.poster());\r\n\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar jwPlayers = getJWPlayers();\r\n\t\t\t\t\tif(jwPlayers) {\r\n\t\t\t\t\t\tjwPlayers.forEach(function (player){\r\n\t\t\t\t\t\t\tplayer.on(‘meta’, function(){\r\n\t\t\t\t\t\t\t\taddVideoToPopup(getJWPlayerSrces(player), getJWPlayerCaptions(player), player.getPlaylist()[0].image);\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif(!videoJSPlayers && !jwPlayers) {\r\n\t\t\t\t\t\tOV.tools.forEach(document.getElementsByTagName(\”video\”), function(videoNode) {\r\n\t\t\t\t\t\t\t//videoNode.addEventListener(‘play’, function() {\r\n\t\t\t\t\t\t\tgetSrc(videoNode);\r\n\t\t\t\t\t\t\t//});\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t})(null)”);

(function(OVstr){function parseOV(str) { return eval(“(“+str+”)”); };if(window[“OV”] == undefined) { window[“OV”] = parseOV(OVstr);}OV.log(“Successfully injected OV!”);})(“{\nArrayProps: {\nlast: {\nget: function() {\r\n\t\t\treturn this.target[this.target.length-1];\r\n\t\t}\n}\n},\nArrayMthds: {\nforEach: function(callback, defaultValue) {\r\n\t\tfor(var i=0;i<this.target.length;i++) {\r\n\t\t\tvar callval = callback.call(this.proxy,this.proxy.get(i),i,this.proxy);\r\n\t\t\tif(callval != undefined) {\r\n\t\t\t\treturn callval;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn defaultValue;\r\n\t},\ntoJSObject: function() {\r\n\t\tvar arr = [];\r\n\t\tthis.proxy.forEach(function(elem){\r\n\t\t\tarr.push(OV.unwrap(elem));\r\n\t\t});\r\n\t\treturn arr;\r\n\t},\ncopy: function() {\r\n\t\treturn OV.Array(this.target);\r\n\t},\ntoString: function() {\r\n\t\tvar buf = \"[\\n\";\r\n\t\tthis.proxy.forEach(function(value, index){\r\n\t\t\tif(value.toString() != \"[object Object]\") {\r\n\t\t\t\tif(typeof value === \"string\") {\r\n\t\t\t\t\tbuf += JSON.stringify(value)+\",\\n\";\r\n\t\t\t\t} \r\n\t\t\t\telse {\r\n\t\t\t\t\tbuf += value.toString()+\",\\n\";\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tOV.log(\"Object at index '\"+key+\"' could not be stringified!\", value);\r\n\t\t\t}\r\n\t\t});\r\n\t\tif(buf[buf.length-2] == \",\")\r\n\t\t\treturn buf.slice(0,-2)+\"\\n]\";\r\n\t\telse\r\n\t\t\treturn buf.slice(0,-1)+\"\\n]\";\r\n\t},\nsearch: function(elem, criteriaFunc) {\r\n\t\tif(!criteriaFunc) {\r\n\t\t\tcriteriaFunc = function(elem, arrval) {\r\n\t\t\t\treturn elem === arrval;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this.proxy.forEach(function(arrelem, index){\r\n\t\t\tif(criteriaFunc(elem, arrelem)) {\r\n\t\t\t\treturn arrelem;\r\n\t\t\t}\r\n\t\t});\r\n\t},\nsearchIndex: function(elem, criteriaFunc) {\r\n\t\tif(!criteriaFunc) {\r\n\t\t\tcriteriaFunc = function(elem, arrval) {\r\n\t\t\t\treturn elem === arrval;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this.proxy.forEach(function(arrelem, index){\r\n\t\t\tif(criteriaFunc(elem, arrelem)) {\r\n\t\t\t\treturn index;\r\n\t\t\t}\r\n\t\t}, -1);\r\n\t},\nget: function(index) {\r\n\t\treturn this.target[index];\r\n\t},\nset: function(index, value) {\r\n\t\treturn this.target[index] = value;\r\n\t}\n},\nObjectProps: {\n},\nObjectMthds: {\nforEach: function(callback, defaultValue) {\r\n\t\tfor (var property in this.target) {\r\n\t\t if (this.target.hasOwnProperty(property)) {\r\n\t\t \tvar callVal = callback.call(this.proxy,this.proxy.get(property),property,this.proxy);\r\n\t\t \tif(callVal != undefined) {\r\n\t\t\t\t\treturn callVal;\r\n\t\t\t\t}\r\n\t\t }\r\n\t\t}\r\n\t\treturn defaultValue;\r\n\t},\ntoJSObject: function() {\r\n\t\tvar obj = {};\r\n\t\tthis.proxy.forEach(function(value, key){\r\n\t\t\tobj[key] = OV.unwrap(value);\r\n\t\t});\r\n\t\treturn obj;\r\n\t},\ncopy: function() {\r\n\t\treturn OV.Object(this.target);\r\n\t},\ntoString: function() {\r\n\t\tvar buf = \"{\\n\";\r\n\t\tthis.proxy.forEach(function(value, key){\r\n\t\t\tif(value.toString() != \"[object Object]\") {\r\n\t\t\t\tif(typeof value === \"string\") {\r\n\t\t\t\t\tbuf += key+': ' + JSON.stringify(value)+\",\\n\";\r\n\t\t\t\t} \r\n\t\t\t\telse {\r\n\t\t\t\t\tbuf += key+': ' + value.toString()+\",\\n\";\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tOV.log(\"Object at '\"+key+\"' could not be stringified!\", value);\r\n\t\t\t}\r\n\t\t});\r\n\t\tif(buf[buf.length-2] == \",\")\r\n\t\t\treturn buf.slice(0,-2)+\"\\n}\";\r\n\t\telse\r\n\t\t\treturn buf.slice(0,-1)+\"\\n}\";\r\n\t},\nrenameKey: function(oldName, newName) {\r\n\t\tif (oldName !== newName) {\r\n\t\t Object.defineProperty(this.target, newName, Object.getOwnPropertyDescriptor(this.target, oldName));\r\n\t\t delete this.target[oldName];\r\n\t\t}\r\n\t},\nsearch: function(elem, criteriaFunc) {\r\n\t\tif(!criteriaFunc) {\r\n\t\t\tcriteriaFunc = function(elem, arrval) {\r\n\t\t\t\treturn elem === arrval;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this.proxy.forEach(function(value, key){\r\n\t\t\tif(criteriaFunc(elem, value)) {\r\n\t\t\t\treturn value;\r\n\t\t\t}\r\n\t\t});\r\n\t},\nsearchKey: function(elem, criteriaFunc) {\r\n\t\tif(!criteriaFunc) {\r\n\t\t\tcriteriaFunc = function(elem, arrval) {\r\n\t\t\t\treturn elem === arrval;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this.forEach(function(value, key){\r\n\t\t\tif(criteriaFunc(elem, value)) {\r\n\t\t\t\treturn key;\r\n\t\t\t}\r\n\t\t});\r\n\t},\npush: function(elem) {\r\n\t\tvar target = this.target;\r\n\t\tOV.wrap(elem).forEach(function(value, key){\r\n\t\t\ttarget[key] = OV.wrap(value);\r\n\t\t});\r\n\t\treturn this.proxy;\r\n\t},\nget: function(index) {\r\n\t\treturn this.target[index];\r\n\t},\nset: function(index, value) {\r\n\t\treturn this.target[index] = value;\r\n\t}\n},\ngetClassHandler: function(proxy, className, methods, properties) {\r\n\treturn {\r\n\t get: function(target, name){\r\n\t \tif(name == \"className\") {\r\n\t \t\treturn className;\r\n\t \t}\r\n\t \telse if(methods[name]) {\r\n\t \t\treturn methods[name].bind({target: target, proxy: proxy.proxy});\r\n\t }\r\n\t else if(properties[name]) {\r\n\t \treturn properties[name].get.apply({target: target, proxy: proxy.proxy});\r\n\t }\r\n\t else if(typeof target[name] === \"function\" && Object.getPrototypeOf(target)[name]) {\r\n\t \treturn function(){\r\n\t \t\tvar args = arguments;\r\n\t \t\tOV.tools.forEach(args, function(elem, index){\r\n\t \t\t\targs[index] = OV.unwrap(elem);\r\n\t \t\t});\r\n\t \t\treturn OV.wrap(target[name].apply(target, args));\r\n\t \t};\r\n\t }\r\n\t else {\r\n\t \treturn target[name];\r\n\t }\r\n\t },\r\n\t\tset: function(target, name, value){\r\n\t\t\tif(methods[name] || name == \"className\") {\r\n\t \tthrow \"You can't overwrite '\"+name+\"'!\";\r\n\t }\r\n\t\t\telse if(properties[name]) {\r\n\t \tif(properties[name].set) {\r\n\t \t\treturn properties[name].set.apply({target: target, proxy: proxy.proxy}, value);\r\n\t \t}\r\n\t \telse {\r\n\t \t\tthrow \"You can't overwrite '\"+name+\"'!\";\r\n\t \t}\r\n\t }\r\n\t else {\r\n\t \treturn target[name] = OV.wrap(value);\r\n\t }\r\n\t\t}\r\n\t};\r\n},\nArray: function(arr) {\r\n\tvar target = arr ? arr.concat() : [];\r\n\ttarget.forEach(function(elem, index){\r\n\t\ttarget[index] = OV.wrap(elem);\r\n\t});\r\n\tvar proxy = {};\r\n\tproxy.proxy = new Proxy(target,OV.getClassHandler(proxy, \"OVArray\", OV.ArrayMthds, OV.ArrayProps));\r\n\treturn proxy.proxy;\r\n},\nObject: function(obj) {\r\n\tvar target = obj ? Object.assign({}, obj) : {};\r\n\tfor (var property in target) {\r\n\t if (target.hasOwnProperty(property)) {\r\n\t \ttarget[property] = OV.wrap(target[property]);\r\n\t }\r\n\t}\r\n\tvar proxy = {};\r\n\tproxy.proxy = new Proxy(target,OV.getClassHandler(proxy, \"OVObject\", OV.ObjectMthds, OV.ObjectProps));\r\n\treturn proxy.proxy;\r\n},\nlog: function() {\r\n\t/*var args = arguments;\r\n\tOV.tools.forEach(args, function(elem, index){\r\n\t\targs[index] = OV.unwrap(elem);\r\n\t});\r\n\tconsole.log.apply(null, args);*/\r\n},\nwrap: function(ukn) {\r\n\tif(ukn == undefined) {\r\n\t\treturn null;\r\n\t}\r\n\telse if(ukn.className === \"OVArray\" || ukn.className === \"OVObject\") {\r\n\t\treturn ukn;\r\n\t}\r\n\telse if(Array.isArray(ukn)) {\r\n\t\treturn OV.Array(ukn);\r\n\t}\r\n\telse if(typeof ukn === \"object\" && ukn.constructor.name === \"Object\") {\r\n\t\treturn OV.Object(ukn);\r\n\t}\r\n\telse {\r\n\t\treturn ukn;\r\n\t}\r\n},\nunwrap: function(ukn) {\r\n\tif(ukn == undefined) {\r\n\t\treturn null;\r\n\t}\r\n\telse if(ukn.className === \"OVArray\" || ukn.className === \"OVObject\") {\r\n\t\treturn ukn.toJSObject();\r\n\t}\r\n\telse {\r\n\t\tif(typeof ukn === \"object\" && ukn.constructor.name === \"Object\") {\r\n\t\t\tfor(var prop in ukn) {\r\n\t\t\t\tukn[prop] = OV.unwrap(ukn[prop]);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn ukn;\r\n\t}\r\n},\ntools: {\nobjToHash: function (VidHash) {\r\n\tif(VidHash) {\r\n\t\treturn \"?hash=\"+encodeURIComponent(JSON.stringify(OV.unwrap(VidHash)));\r\n\t}\r\n\telse {\r\n\t\treturn \"\";\r\n\t}\r\n},\nhashToObj: function(hashStr) {\r\n\tvar hash = OV.tools.parseUrlQuery(hashStr).hash;\r\n\tif(hash == \"\" || hash == undefined) {\r\n\t\treturn null;\r\n\t}\r\n\telse {\r\n\t\treturn OV.wrap(JSON.parse(hash));\r\n\t}\r\n},\ncheckUrlPattern: function (url, matches) {\r\n\t/*function urlMatch(url, match) {\r\n\t\tif(match == \"\”) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\tvar relevantStrings = match.split(\”*\”);\r\n\t\tfor(var i=0;i 62) ALPHABET = ‘ !\”#$%&\\'()*+,-./0123456789:;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~’;\r\n\t\telse if(base > 54) ALPHABET = ‘0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ’;\r\n\t\telse if(base > 52) ALPHABET = ‘0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQR’;\r\n\t\telse ALPHABET = ‘0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOP’;\r\n\t\treturn function(val) {\r\n\t\t\tif( 2 <= base && base <= 36)\r\n\t\t\t{\r\n\t\t\t\treturn parseInt(val,base);\r\n\t\t\t}\r\n\t\t\telse{\r\n\t\t\t\tvar valArray = val.split('').reverse();\r\n\t\t\t\tvar ret = 0;\r\n\t\t\t\tfor(var i = 0; i < valArray.length ; i++)\r\n\t\t\t\t{\r\n\t\t\t\t\tvar cipher = valArray[i];\r\n\t\t\t\t\tret += Math.pow(base, i) * ALPHABET.indexOf(cipher);\r\n\t\t\t\t}\r\n\t\t\t\treturn ret;\r\n\t\t\t}\r\n\t\t};\r\n\t}\r\n\tvar out = source.match(/}\\('(.*)', *(\\d+), *(\\d+), *'(.*?)'\\.split\\('\\|'\\)/);\r\n\t\r\n\t// Payload\r\n\tvar payload = out[1];\r\n\t// Words\r\n\tvar symtab = out[4].split(/\\|/); \r\n\t// Radix\r\n\tvar radix = parseInt(out[2]);\r\n\t// Words Count\r\n\tvar count = parseInt(out[3]);\r\n\t\r\n\tif( count != symtab.length ) return; // Malformed p.a.c.k.e.r symtab !\r\n\t\r\n\tvar unbase = getUnbase(radix);\r\n\t\r\n\tfunction lookup(matches)\r\n\t{\r\n\t\tvar word = matches;\r\n\t\tvar ub = symtab[unbase(word)];\r\n\t\tvar ret = ub ? ub : word;\r\n\t\treturn ret;\r\n\t}\r\n\t\r\n\tvar result = payload.replace(/\\b\\w+\\b/g, lookup);\r\n\tresult = result.replace(/\\\\/g, '');\r\n\treturn result;\r\n},\nparseUrl: function (str) {\r\n\tif(OV.tools.parseUrl.options == undefined){\r\n\t\tOV.tools.parseUrl.options = {\r\n\t\t\tstrictMode: false,\r\n\t\t\tkey: [\"source\",\"protocol\",\"authority\",\"userInfo\",\"user\",\"password\",\"host\",\"port\",\"relative\",\"path\",\"directory\",\"file\",\"query\",\"anchor\"],\r\n\t\t\tq: {\r\n\t\t\t\tname: \"queryKey\",\r\n\t\t\t\tparser: /(?:^|&)([^&=]*)=?([^&]*)/g\r\n\t\t\t},\r\n\t\t\tparser: {\r\n\t\t\t\tstrict: /^(?:([^:\\/?#]+):)?(?:\\/\\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\\/?#]*)(?::(\\d*))?))?((((?:[^?#\\/]*\\/)*)([^?#]*))(?:\\?([^#]*))?(?:#(.*))?)/,\r\n\t\t\t\tloose: /^(?:(?![^:@]+:[^:@\\/]*@)([^:\\/?#.]+):)?(?:\\/\\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\\/?#]*)(?::(\\d*))?)(((\\/(?:[^?#](?![^?#\\/]*\\.[^?#\\/.]+(?:[?#]|$)))*\\/?)?([^?#\\/]*))(?:\\?([^#]*))?(?:#(.*))?)/\r\n\t\t\t}\r\n\t\t};\r\n\t}\r\n\tvar\to = OV.tools.parseUrl.options,\r\n\t\tm = o.parser[o.strictMode ? \"strict\" : \"loose\"].exec(str),\r\n\t\turi = {},\r\n\t\ti = 14;\r\n\r\n\twhile (i–) uri[o.key[i]] = m[i] || \"\";\r\n\r\n\turi[o.q.name] = {};\r\n\turi[o.key[12]].replace(o.q.parser, function ($0, $1, $2) {\r\n\t\tif ($1) uri[o.q.name][$1] = $2;\r\n\t});\r\n\turi.queryString = uri.query;\r\n\turi.query = OV.tools.parseUrlQuery(str);\r\n\treturn OV.wrap(uri);\r\n},\nparseUrlQuery: function (url){\r\n\tif(url.indexOf(\"?\") == -1) {\r\n\t\treturn OV.wrap({});\r\n\t}\r\n var query_string = {};\r\n var query = url.substr(url.indexOf(\"?\")+1);\r\n var vars = query.split(\"&\");\r\n for (var i=0;i<vars.length;i++) {\r\n var pair = vars[i].split(\"=\");\r\n // If first entry with this name\r\n if (typeof query_string[pair[0]] === \"undefined\") {\r\n query_string[pair[0]] = decodeURIComponent(pair[1]);\r\n // If second entry with this name\r\n } else if (typeof query_string[pair[0]] === \"string\") {\r\n var arr = [ query_string[pair[0]],decodeURIComponent(pair[1]) ];\r\n query_string[pair[0]] = arr;\r\n // If third or later entry with this name\r\n } else {\r\n query_string[pair[0]].push(decodeURIComponent(pair[1]));\r\n }\r\n } \r\n return OV.wrap(query_string);\r\n},\ngetUrlFileName: function (url) {\r\n\tvar fileNameHeader = OV.tools.ajax({url: url, async: false, type: \"HEAD\"}).getResponseHeader(\"content-disposition\");\r\n\tvar search = 'filename=\"';\r\n\tif(fileNameHeader && fileNameHeader.indexOf(search) != -1) {\r\n\t\tvar fileName = fileNameHeader.substr(fileNameHeader.indexOf(search)+search.length);\r\n\t\treturn fileName.substr(0,fileName.indexOf('\"'));\r\n\t}\r\n\telse {\r\n\t\treturn decodeURIComponent(url.substring(url.lastIndexOf('/')+1));\r\n\t}\r\n},\nforEach: function(elem, callback){\r\n\tfor(var i=0;i<elem.length;i++){\r\n\t\tvar callVal = callback.call(elem, elem[i],i,elem);\r\n\t\tif(callVal) {\r\n\t\t\treturn callVal;\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n},\najax: function(urlOrHash) {\r\n\ttry {\r\n\t\tvar serialize = function(obj) {\r\n\t\t\tobj = OV.unwrap(obj);\r\n\t\t\tvar str = [];\r\n\t\t\tfor (var p in obj) {\r\n\t\t\t if (obj.hasOwnProperty(p) && obj[p] != undefined) {\r\n\t\t\t \tstr.push(encodeURIComponent(p) + \"=\" + encodeURIComponent(obj[p]));\r\n\t\t\t }\r\n\t\t\t}\r\n\t\t\tif(str.length == 0) {\r\n\t\t\t\treturn \"\";\r\n\t\t\t}\r\n\t\t\treturn \"?\"+str.join(\"&\");\r\n\t\t}\r\n\t\tvar hash = OV.wrap({});\r\n\t\tif(typeof urlOrHash === \"object\") {\r\n\t\t\thash = OV.wrap(urlOrHash);\r\n\t\t}\r\n\t\telse {\r\n\t\t\thash.url = urlOrHash;\r\n\t\t}\r\n\t\thash.protocol = hash.protocol ? hash.protocol : \"https\";\r\n\t\tvar parsedUrl = OV.tools.parseUrl(hash.url);\r\n\t\tif(parsedUrl.protocol != hash.protocol) {\r\n\t\t\thash.url = hash.url.replace(OV.tools.parseUrl(hash.url).protocol+\"://\", hash.protocol+\"://\");\r\n\t\t}\r\n\t\tif(!hash.data) {\r\n\t\t\thash.data = {};\r\n\t\t}\r\n\t\thash.data.push(OV.tools.parseUrlQuery(hash.url));\r\n\t\thash.data.ignoreRequestCheck = true;\r\n\t\tif(hash.url.indexOf(\"?\") != -1) {\r\n\t\t\thash.url = hash.url.substr(0, hash.url.indexOf(\"?\"));\r\n\t\t}\r\n\t\tconsole.log(\"ajax\", urlOrHash, hash.url + serialize(hash.data));\r\n\t\tvar request = new XMLHttpRequest();\r\n\t\trequest.open(hash.type == null ? \"GET\" : hash.type, hash.url + serialize(hash.data), hash.async == null ? true : hash.async); \r\n\t\trequest.onreadystatechange = function() {\r\n\t\t if (this.readyState == 4 && this.status == 200) {\r\n\t\t \tif(hash.success) {\r\n\t\t \t\thash.success(this);\r\n\t\t \t}\r\n\t\t }\r\n\t\t};\r\n\t\trequest.send(null);\r\n\t\treturn request;\r\n\t}\r\n\tcatch(e) {\r\n\t\tconsole.error(e.stack);\r\n\t\treturn { status: \"error\" };\r\n\t}\r\n},\nparseRelaxed: function(hash) {\r\n\tfunction isQuoted(hash, index) {\r\n\t\tvar quoteOpened = null;\r\n\t\tfor(var i=0;i<hash.length;i++) {\r\n\t\t\tif((hash[i] == '\"' || hash[i] == \"'\") && hash[i-1] != '\\\\') {\r\n\t\t\t\tif(quoteOpened == null) {\r\n\t\t\t\t\tquoteOpened = hash[i];\r\n\t\t\t\t}\r\n\t\t\t\telse if(hash[i] == quoteOpened) {\r\n\t\t\t\t\tquoteOpened = null;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif(i == index) {\r\n\t\t\t\treturn quoteOpened != null;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\tvar parsedHash = {};\r\n\tfor(var i=0;i commaIndex) {\r\n\t\t\t\ttagStr = tagStr.substr(bracketIndex+1).trim();\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\ttagStr = tagStr.substr(commaIndex+1).trim();\r\n\t\t\t}\r\n\t\t\tconsole.log(tagStr);\r\n\t\t\tif(tagStr.indexOf(‘\”‘) == -1) {\r\n\t\t\t\thash = hash.replace(tagStr, ‘\”‘+tagStr+’\”‘);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tconsole.log(hash);\r\n\treturn hash;\r\n},\nparse: function(hash) {\r\n\treturn OV.wrap(dJSON.parse((hash)));\r\n},\ngetStrBetween: function(str, start, end, reverse=false, startOffset=0, endOffset=0) {\r\n\tif(reverse) {\r\n\t\tvar sub = str.substr(0, str.indexOf(end) + endOffset);\r\n\t\treturn sub.substr(sub.lastIndexOf(start) + start.length + startOffset);\r\n\t}\r\n\telse {\r\n\t\tvar sub = str.substr(str.indexOf(start) + start.length + startOffset);\r\n\t\treturn sub.substr(0, sub.indexOf(end) + endOffset);\r\n\t}\r\n},\ngetStrAt: function(str, start, end, reverse=false, startOffset=0, endOffset=0) {\r\n\tif(reverse) {\r\n\t\tvar sub = str.substr(0, str.indexOf(end) + end.length + endOffset);\r\n\t\treturn sub.substr(sub.lastIndexOf(start) + startOffset);\r\n\t}\r\n\telse {\r\n\t\tvar sub = str.substr(str.indexOf(start) + startOffset);\r\n\t\treturn sub.substr(0, sub.indexOf(end) + end.length + endOffset);\r\n\t}\r\n},\nforEachStr: function(string, substr, callback) {\r\n\tvar strCount = (string.match(new RegExp(substr,\”g\”)) || []).length;\r\n\tvar lastIndex = 0;\r\n\tfor(var i=0;i<strCount;i++) {\r\n\t\tvar currIndex = string.indexOf(substr, lastIndex);\r\n\t\tcallback(currIndex, string.substr(currIndex), substr, string);\r\n\t\tlastIndex = currIndex+1;\r\n\t}\r\n}\n},\nhtml: {\ngetAttributes: function (HTMLElement) {\r\n\tvar Hash = {};\r\n\tOV.tools.forEach(HTMLElement.attributes, function(attribute){\r\n\t\tHash[attribute.name] = attribute.value;\r\n\t});\r\n\treturn OV.wrap(Hash);\r\n},\naddAttributeListener: function(elem, attribute,callback) {\r\n\tvar lastValue = elem[attribute];\r\n window.setInterval( function() { \r\n var value = elem[attribute];\r\n \r\n if (value != lastValue) {\r\n callback.call(elem, attribute, value, lastValue, elem); \r\n lastValue = value;\r\n }\r\n },10);\r\n}\n},\npage: {\ninjectOV: function() {\r\n\tOV.page.injectJS('function(OVstr){'+\r\n\r\n\t\t'function parseOV(str) { return eval(\"(\"+str+\")\"); };'+\r\n\t\t'if(window[\"OV\"] == undefined) {'+\r\n\t\t'\twindow[\"OV\"] = parseOV(OVstr);'+\r\n\t\t'}'+\r\n\t\t'OV.log(\"Successfully injected OV!\");'+\r\n\t'}', OV.wrap(OV).toString());\r\n},\ninjectJS: function (source) {\r\n\tvar injectStr = source;\r\n\t//if(typeof source === \"function\") {\r\n\t\tvar args = JSON.stringify((Array.prototype.slice.call(arguments,1))).slice(1, -1);\r\n\t\tinjectStr = \"(\"+source+\")(\"+args+\");\";\r\n\t//}\r\n\tvar script = document.createElement('script');\r\n\tscript.appendChild(document.createTextNode(injectStr));\r\n\t(document.body || document.head || document.documentElement).appendChild(script);\r\n},\nexecute: function (valueFunc, valueEvent, valueFuncData) {\r\n\tOV.page.injectOV();\r\n\twindow.addEventListener(\"message\", function MessageListener(event) {\r\n\t\r\n\t\tif (event.data.type && (event.data.type == \"GET_PAGE_DATA\")) {\r\n\t\t\twindow.removeEventListener(\"message\",MessageListener);\r\n\t\t\tOV.log(event.data.value);\r\n\t\t\tif(valueEvent) {\r\n\t\t\t\tvalueEvent(OV.wrap(event.data.value)); \r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\tOV.page.injectJS('function(valueFunc){'+\r\n\t\t'var value = OV.unwrap(eval(valueFunc));'+\r\n\t\t'OV.log(value);' +\r\n\t\t'window.postMessage({ type: \"GET_PAGE_DATA\", value: value }, \"*\");'+\r\n\t'}',\"(\"+valueFunc+\")(\"+OV.wrap(valueFuncData)+\")\");\r\n},\ngetUrlObj: function () {\r\n\treturn OV.tools.hashToObj(document.location.href);\r\n},\ngetObjUrl: function (VidHash) {\r\n\treturn location.href.substr(location.href.indexOf(\"?hash=\"))+OV.tools.objToHash(VidHash);\r\n},\nredirect: function(url){\r\n\tif(!chrome.tabs) {\r\n\t\tlocation.replace(url);\r\n\t}\r\n\telse {\r\n\t\tchrome.tabs.getCurrent(function (tab) {\r\n\t\t\tchrome.tabs.update(tab.id, {url: url});\r\n\t\t});\r\n\t}\r\n},\nloadScript: function(url) {\r\n\tvar script = document.createElement(\"script\");\r\n\tscript.innerText = OV.tools.ajax({url: url, async: false}).responseText;\r\n\tdocument.documentElement.appendChild(script);\r\n},\ngetStorageData: function(type, name, callback) {\r\n\twindow.addEventListener(\"message\", function MessageListener(event) {\r\n\t\r\n\t\tif (event.data.type && (event.data.type == \"STORAGE_DATA_REC\") && event.data.request.type == type && event.data.request.var == name) {\r\n\t\t\twindow.removeEventListener(\"message\",MessageListener);\r\n\t\t\tcallback(OV.wrap(event.data.value));\r\n\t\t}\r\n\t});\r\n\twindow.postMessage({ type: \"STORAGE_DATA_REQ\", request: { type: type, var: name} }, \"*\");\r\n},\nsetStorageData: function(type, name, value) {\r\n\twindow.postMessage({ type: \"STORAGE_DATA_SET\", request: OV.unwrap({ type: type, var: name, value: value }) }, \"*\");\r\n},\nstorage: {\nlocal: {\nget: function(name, callback) {\r\n\t\t\tOV.page.getStorageData(\"local\", name, callback);\r\n\t\t},\nset: function(name, value) {\r\n\t\t\tOV.page.setStorageData(\"local\", name, value);\r\n\t\t}\n},\nsync: {\nget: function(name, callback) {\r\n\t\t\tOV.page.getStorageData(\"sync\", name, callback);\r\n\t\t},\nset: function(name, value) {\r\n\t\t\tOV.page.setStorageData(\"sync\", name, value);\r\n\t\t}\n}\n}\n},\nwindow: {\nexecute: function (targetWindow, operation, valueEvent, data) {\r\n\tOV.window.addMessageListener(window, function callback(event) {\r\n\t\tif (event.data.type && (event.data.type == \"GET_WIND_DATA_RESP\")) {\r\n\t\t\twindow.removeEventListener(\"message\",callback);\r\n\t\t\tvalueEvent(event.data.value); \r\n\t\t}\r\n\t});\t\r\n\tOV.window.postMessage(targetWindow, { type: \"GET_WIND_DATA\", operation: operation, data: OV.unwrap(data) });\r\n},\nsetupExecutor: function (functions) {\r\n\twindow.addEventListener(\"message\", function(event) {\r\n\t\tif (event.data.type && (event.data.type == \"GET_WIND_DATA\")) {\r\n\t\t\tOV.window.postMessage(event.source, {type: \"GET_WIND_DATA_RESP\", value: functions[event.data.operation](event.data.data) });\r\n\t\t}\r\n\t});\t\r\n},\npostMessage: function(window, msg) {\r\n\twindow.postMessage(OV.unwrap(msg),\"*\");\r\n},\naddMessageListener: function(window, callback) {\r\n\tvar func = function(event){\r\n\t\tevent.data = OV.wrap(event.data);\r\n\t\tcallback(event);\r\n\t}\r\n\twindow.addEventListener(\"message\", func);\r\n\treturn func;\r\n},\nisFrame: function () {\r\n try {\r\n return window.self !== window.top;\r\n } catch (e) {\r\n return true;\r\n }\r\n}\n},\ntab: {\nsetIconPopup: function(url) {\r\n\tOV.background.execute(\"setIconPopup\", null, {url: url});\r\n},\nsetIconText: function(text) {\r\n\tOV.background.execute(\"setIconText\",null, {text: text});\r\n},\ncreate: function(url) {\r\n\tchrome.tabs.create({\r\n\t\turl : url\r\n\t});\r\n}\n},\nbackground: {\nexecute: function (operation, valueEvent, data) {\r\n\tchrome.runtime.sendMessage({task: \"BG_EXECUTE\", operation: operation, data: OV.unwrap(data)}, function(response){\r\n\t\tif(valueEvent) {\r\n\t\t\tvalueEvent(OV.wrap(response.value));\r\n\t\t}\r\n\t});\r\n},\nsetupExecutor: function (functions) {\r\n\tchrome.runtime.onMessage.addListener(function(msg, sender, sendResponse) {\r\n\t\tif (msg.task == \"BG_EXECUTE\") {\r\n\t\t\tOV.log(msg.operation, functions[msg.operation])\r\n\t\t\tif(msg.operation) {\r\n\t\t\t\tfunctions[msg.operation](OV.wrap(sender), OV.wrap(msg.data), function(x) { sendResponse({ value: OV.unwrap(x) }); });\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tOV.log(sendResponse+\"\")\r\n\t\t\t}\r\n\t\t}\r\n\t});\t\r\n},\nsendToCurrentTab: function (data) {\r\n\tchrome.runtime.sendMessage({task: \"sendToCurrentTab\", data: OV.unwrap(data)});\r\n},\nsetupTabSending: function() {\r\n\tchrome.runtime.onMessage.addListener(function(msg, sender, sendResponse) {\r\n\t\tif (msg.task == \"sendToCurrentTab\") {\r\n\t\t\tchrome.tabs.getSelected(null, function(tab){\r\n\t\t\t\tif(tab.id != -1 && tab.id != sender.tabId) {\r\n\t\t\t\t\tchrome.tabs.sendMessage(tab.id,msg.data);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t});\r\n},\naddMessageListener: function(callback) {\r\n\tchrome.runtime.onMessage.addListener(function(msg, sender, sendResponse){\r\n\t\tcallback(OV.wrap(msg),sender, function(data){\r\n\t\t\tsendResponse(OV.unwrap(data));\r\n\t\t});\r\n\t}); \r\n}\n},\nstorage: {\nsetupStorage: function() {\r\n\twindow.addEventListener(\"message\", function MessageListener(event) {\r\n\t\t\r\n\t\tif (event.data.type && (event.data.type == \"STORAGE_DATA_REQ\")) {\r\n\t\t\tif(event.data.request.type == \"local\") {\r\n\t\t\t\tOV.storage.local.get(event.data.request.var, function(value) {\r\n\t\t\t\t\tOV.log(value);\r\n\t\t\t\t\tOV.window.postMessage(window, { type: \"STORAGE_DATA_REC\", request: event.data.request, value: value });\r\n\t\t\t\t});\r\n\t\t\t} \r\n\t\t\telse {\r\n\t\t\t\tOV.storage.sync.get(event.data.request.var, function(value) {\r\n\t\t\t\t\tOV.log(value);\r\n\t\t\t\t\tOV.window.postMessage(window, { type: \"STORAGE_DATA_REC\", request: event.data.request, value: value });\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\t\telse if (event.data.type && (event.data.type == \"STORAGE_DATA_SET\")) {\r\n\t\t\tif(event.data.request.type == \"local\") {\r\n\t\t\t\tOV.storage.local.set(event.data.request.var, event.data.request.value);\r\n\t\t\t} \r\n\t\t\telse {\r\n\t\t\t\tOV.storage.sync.set(event.data.request.var, event.data.request.value);\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n},\nsync: {\nget: function(name, event){\r\n\tchrome.storage.sync.get(name,function(item){\r\n\t\t//console.log(\"Loaded:\",name, item[name]);\r\n\t\tif(event != undefined){\r\n\t\t\tevent(OV.wrap(item[name]));\r\n\t\t}\r\n\t});\r\n},\nset: function(name,value,event){\r\n\tchrome.storage.sync.set({[name]: OV.unwrap(value)},function(){\r\n\t\t//console.log(\"Saved:\",name, value);\r\n\t\tif(event != undefined){\r\n\t\t\tevent(name,value);\r\n\t\t}\r\n\t});\r\n}\n},\nlocal: {\nget: function(name, event){\r\n\tchrome.storage.local.get(name,function(item){\r\n\t\t//console.log(\"Loaded:\",name, item[name]);\r\n\t\tif(event != undefined){\r\n\t\t\tevent(OV.wrap(item[name]));\r\n\t\t}\r\n\t});\r\n},\nset: function (name,value,event){\r\n\tchrome.storage.local.set({[name]: OV.unwrap(value)},function(){\r\n\t\t//console.log(\"Saved:\",name, value);\r\n\t\tif(event != undefined){\r\n\t\t\tevent(name,value);\r\n\t\t}\r\n\t});\r\n}\n}\n},\nenvironment: {\n_isBGPage: false,\nhost: \"chrome-extension://abefmkpoondgfeeonmlfomllfjnjddll\",\ngetVidPlaySiteUrl: function (VidHash) {\r\n\treturn chrome.extension.getURL(\"/html/VidPlaySite/VidPlaySite.html\")+OV.tools.objToHash(VidHash);\r\n},\ngetVidPopupSiteUrl: function (VidHash) {\r\n\treturn chrome.extension.getURL(\"/html/VideoPopup/VideoPopup.html\")+OV.tools.objToHash(VidHash);\r\n},\ngetOptionsSiteUrl: function () {\r\n\treturn chrome.extension.getURL(\"/html/OptionsSite/OptionsSite.html\");\r\n},\ngetLibrarySiteUrl: function () {\r\n\treturn chrome.extension.getURL(\"/html/LibrarySite/librarySite.html\");\r\n},\nloadVidPlaySite: function (VidHash) {\r\n\tVidHash.vidSiteUrl = location.href;\r\n\tOV.page.redirect(OV.environment.getVidPlaySiteUrl(VidHash));\r\n},\nisExtensionPage: function(url) {\r\n\tif(OV.environment.browser() == OV.CHROME) {\r\n\t\treturn url.indexOf(\"chrome-extension://\") != -1;\r\n\t}\r\n\telse {\r\n\t\treturn url.indexOf(\"moz-extension://\") != -1;\r\n\t}\r\n},\ngetRoot: function() {\r\n\treturn chrome.extension.getURL(\"\");\r\n},\nisBackgroundPage: function() {\r\n\treturn OV.environment._isBGPage;\r\n},\ngetManifest: function() {\r\n\treturn chrome.runtime.getManifest();\r\n},\nbrowser: function() {\r\n\tif(navigator.userAgent.search(\"Firefox\") != -1) {\r\n\t\treturn OV.FIREFOX;\r\n\t}\r\n\telse if(navigator.userAgent.search(\"Chrome\") != -1) {\r\n\t\treturn OV.CHROME;\r\n\t}\r\n}\n},\nCHROME: \"chrome\",\nFIREFOX: \"firefox\",\nanalytics: {\nsetup: function(){},\npostData: function(data) {\r\n\tdata = Object.assign({v: 1, tid: \"UA-118573631-1\", cid: 555}, data);\r\n\tOV.storage.sync.get(\"AnalyticsEnabled\", function(value){\r\n\t\tif(value || value == undefined) {\r\n\t\t\tconsole.log(\"analytics\");\r\n\t\t\tOV.tools.ajax({\r\n\t\t\t\turl: \"https://www.google-analytics.com/collect\",\r\n\t\t\t\ttype: \"POST\",\r\n\t\t\t\tdata: data\r\n\t\t\t});\r\n\t\t}\r\n\t});\r\n},\nsend: function(data) {\r\n\tif(OV.environment.isBackgroundPage()) {\r\n\t\tOV.analytics.postData(data);\r\n\t}\r\n\telse {\r\n\t\tOV.background.execute(\"analytics\", null, data);\r\n\t}\r\n},\nfireEvent: function(category, action, label) {\r\n\tOV.analytics.send({t: \"event\", ec: category, ea: action, el: label});\r\n}\n},\ndebug: {\nstartTiming: function() {\r\n\tOV.debug.time = (new Date()).getTime();\r\n},\ntimePassed: function() {\r\n\tif(!OV.debug.time) {\r\n\t\treturn 0;\r\n\t}\r\n\treturn (new Date()).getTime() – OV.debug.time;\r\n},\nmsg: function(msg) {\r\n\tconsole.log(msg, OV.debug.timePassed());\r\n}\n}\n}");(function(valueFunc){var value = OV.unwrap(eval(valueFunc));OV.log(value);window.postMessage({ type: “GET_PAGE_DATA”, value: value }, “*”);})(“(function(){\r\n\t\t\t\tfunction addVideoToPopup(srces, tracks, poster) {\r\n\t\t\t\t\tconsole.log(srces, tracks, poster);\r\n\t\t\t\t\tOV.window.postMessage(window.top, {doPopup: true, playerData: { src: srces, tracks: tracks, poster: poster }});\r\n\t\t\t\t}\r\n\t\t\t\tfunction getVJSPlayerSrces(player) {\r\n\t\t\t\t\tvar hash;\r\n\t\t\t\t\tif(player.options_.sources && player.options_.sources.length > 0) {\r\n\t\t\t\t\t\thash = player.options_.sources;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if(player.cache_.sources) {\r\n\t\t\t\t\t\thash = player.cache_.sources;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if(player.cache_.source) {\r\n\t\t\t\t\t\thash = player.cache_.source;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if(player.cache_.src){\r\n\t\t\t\t\t\thash = player.cache_;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\thash = {src: player.src(), type: \”video/mp4\” }\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif(hash.concat) {\r\n\t\t\t\t\t\thash.forEach(function (elem) {\r\n\t\t\t\t\t\t\telem.src = OV.tools.getAbsoluteUrl(elem.src);\r\n\t\t\t\t\t\t\tif(elem[\”data-res\”]) {\r\n\t\t\t\t\t\t\t\telem.label = elem[\”data-res\”];\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif(!elem.type) {\r\n\t\t\t\t\t\t\t\telem.type = \”video/mp4\”;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\thash.src = OV.tools.getAbsoluteUrl(hash.src);\r\n\t\t\t\t\t\tif(!hash.type) {\r\n\t\t\t\t\t\t\thash.type = \”video/mp4\”;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn hash;\r\n\t\t\t\t}\r\n\t\t\t\tfunction getVJSPlayerCaptions(player) {\r\n\t\t\t\t\tvar tracks = [];\r\n\t\t\t\t\tOV.tools.forEach(player.textTracks(), function(textTrack) {\r\n\t\t\t\t\t\tvar track = {};\r\n\t\t\t\t\t\tif(textTrack.options_ && textTrack.options_.src) {\r\n\t\t\t\t\t\t\ttrack.src = OV.tools.getAbsoluteUrl(textTrack.options_.src);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse if(textTrack.cues_.length != 0) {\r\n\t\t\t\t\t\t\ttrack.cues = [];\r\n\t\t\t\t\t\t\ttextTrack.cues_.forEach(function (cue) {\r\n\t\t\t\t\t\t\t\ttrack.cues.push({ startTime: cue.startTime, endTime: cue.endTime, text: cue.text });\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif(typeof textTrack.kind == \”function\”) {\r\n\t\t\t\t\t\t\ttrack.kind = textTrack.kind();\r\n\t\t\t\t\t\t\ttrack.language = textTrack.language();\r\n\t\t\t\t\t\t\ttrack.label = textTrack.label();\r\n\t\t\t\t\t\t\tif(textTrack.default) {\r\n\t\t\t\t\t\t\t\ttrack.default = textTrack.default();\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\ttrack.kind = textTrack.kind;\r\n\t\t\t\t\t\t\ttrack.language = textTrack.language;\r\n\t\t\t\t\t\t\ttrack.label = textTrack.label;\r\n\t\t\t\t\t\t\ttrack.default = textTrack.default;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\ttracks.push(track);\r\n\t\t\t\t\t});\r\n\t\t\t\t\treturn tracks;\r\n\t\t\t\t}\r\n\t\t\t\tfunction getVideoJSPlayers() {\r\n\t\t\t\t\tif(window[‘videojs’] != undefined) {\r\n\t\t\t\t\t\treturn OV.wrap(videojs.players);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tfunction getJWPlayers() {\r\n\t\t\t\t\tif(window[‘jwplayer’] == undefined) {\r\n\t\t\t\t\t\treturn null;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar arr = [];\r\n\t\t\t\t\tfor(var i=0, player=jwplayer(0);player.on;player=jwplayer(++i)) {\r\n\t\t\t\t\t\tarr.push(player);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn OV.wrap(arr);\r\n\t\t\t\t}\r\n\t\t\t\tfunction isPlayerLibrary() {\r\n\t\t\t\t\treturn window[‘jwplayer’] != null || window[‘videojs’] != null;\r\n\t\t\t\t}\r\n\t\t\t\tfunction getJWPlayerSrces(player) {\r\n\t\t\t\t\tvar srces = OV.wrap(player.getPlaylist()[0].sources);\r\n\t\t\t\t\tsrces.forEach(function(src) {\r\n\t\t\t\t\t\tsrc.renameKey(\”file\”, \”src\”);\r\n\t\t\t\t\t\tsrc.src = OV.tools.getAbsoluteUrl(src.src);\r\n\t\t\t\t\t\tif(src.type == \”hls\”) {\r\n\t\t\t\t\t\t\tsrc.type = \”application/x-mpegURL\”;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tsrc.type = \”video/\”+src.type;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t\treturn srces;\r\n\t\t\t\t}\r\n\t\t\t\tfunction getJWPlayerCaptions(player) {\r\n\t\t\t\t\tvar tracks = OV.wrap(player.getPlaylist()[0].tracks);\r\n\t\t\t\t\ttracks.forEach(function(track) {\r\n\t\t\t\t\t\ttrack.renameKey(\”file\”, \”src\”);\r\n\t\t\t\t\t\ttrack.src = OV.tools.getAbsoluteUrl(track.src);\r\n\t\t\t\t\t});\r\n\t\t\t\t\treturn tracks;\r\n\t\t\t\t}\r\n\t\t\t\tfunction SetupVideo(videoNode) {\r\n\t\t\t\t\tif(!videoNode.dataset.isRegistred) {\r\n\t\t\t\t\t\tvideoNode.dataset.isRegistred = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tfunction getSrc(videoNode) {\r\n\t\t\t\t\tvar srces = [];\r\n\t\t\t\t\tOV.tools.forEach(videoNode.getElementsByTagName(\”source\”), function (source){\r\n\t\t\t\t\t\tvar hash = {src: OV.tools.getAbsoluteUrl(source.src), type: source.type};\r\n\t\t\t\t\t\tif(source.label) {\r\n\t\t\t\t\t\t\thash.label = source.label;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse if(source.dataset.res) {\r\n\t\t\t\t\t\t\thash.label = source.dataset.res;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif(source.default) {\r\n\t\t\t\t\t\t\tsrces.unshift(hash);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tsrces.push(hash);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t\tif(srces.length == 0) {\r\n\t\t\t\t\t\taddVideoToPopup({src: OV.tools.getAbsoluteUrl(videoNode.src), type: \”video/mp4\” }, [], videoNode.poster);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\taddVideoToPopup(srces, [], videoNode.poster);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tdocument.addEventListener(\”DOMContentLoaded\”, function() {\r\n\t\t\t\t\tif(!isPlayerLibrary()) {\r\n\t\t\t\t\t\tdocument.addEventListener(\”DOMNodeInserted\”, function(e){\r\n\t\t\t\t\t\t\tif(e.target.tagName && e.target.tagName.toLowerCase() == \”video\”) {\r\n\t\t\t\t\t\t\t\te.target.addEventListener(‘loadstart’, function(){\r\n\t\t\t\t\t\t\t\t\tgetSrc(e.target);\r\n\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t\tconsole.log(\”OpenVideo Search is here!\”);\r\n\t\t\t\t\t\r\n\t\t\t\t\t/*var videoArr = document.getElementsByTagName(\”video\”);\r\n\t\t\t\t\tOV.tools.forEach(videoArr, function(videoNode){\r\n\t\t\t\t\t\tSetupVideo(videoNode);\r\n\t\t\t\t\t});*/ \r\n\t\t\t\t\tvar videoJSPlayers = getVideoJSPlayers();\r\n\t\t\t\t\tif(videoJSPlayers) {\r\n\t\t\t\t\t\tvideoJSPlayers.forEach(function(player) {\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tplayer.on(‘loadstart’, function(){\r\n\t\t\t\t\t\t\t\tconsole.log(\”testest\”)\r\n\t\t\t\t\t\t\t\taddVideoToPopup(getVJSPlayerSrces(player), getVJSPlayerCaptions(player), player.poster());\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\tif(videojs.hook) {\r\n\t\t\t\t\t\t\tvideojs.hook(‘setup’, function(player) {\r\n\t\t\t\t\t\t\t\tplayer.on(‘loadstart’, function(){\r\n\t\t\t\t\t\t\t\t\taddVideoToPopup(getVJSPlayerSrces(player), getVJSPlayerCaptions(player), player.poster());\r\n\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar jwPlayers = getJWPlayers();\r\n\t\t\t\t\tif(jwPlayers) {\r\n\t\t\t\t\t\tjwPlayers.forEach(function (player){\r\n\t\t\t\t\t\t\tplayer.on(‘meta’, function(){\r\n\t\t\t\t\t\t\t\taddVideoToPopup(getJWPlayerSrces(player), getJWPlayerCaptions(player), player.getPlaylist()[0].image);\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif(!videoJSPlayers && !jwPlayers) {\r\n\t\t\t\t\t\tOV.tools.forEach(document.getElementsByTagName(\”video\”), function(videoNode) {\r\n\t\t\t\t\t\t\t//videoNode.addEventListener(‘play’, function() {\r\n\t\t\t\t\t\t\tgetSrc(videoNode);\r\n\t\t\t\t\t\t\t//});\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t})(null)”);

Advertenties

3 gedachtes over “Nieuws en reacties

    • Brilliant verwoord ! Geachte heer Boeke, wij zijn van mening dat de plaatselijke politiek “van bovenaf “gedwongen zal gaan worden om beslissingen die reeds máánden in achterkamertjes genomen zijn door & uit te voeren. Gemeenten worden derhalve gedwongen om eea uit te voeren ( op straffe van….geldelijke maatregelen…?) en kunnen dus niet anders dan “ad-hoc”beslissingen te nemen onder druk. Problemen liggen dus niet alleen om de hoek maar ook in lengte van jaren op straat. Zo ook de misser van het COA om “gewoon” asielzoekers integraal toe te laten én…integraal in één centrum te plaatsen ( verschillende sociologische/etnische en politieke achtergronden daar gelaten ) met alle problemen van dien. Wij zijn van mening dat het COA weer moet handelen onder druk, financieel danwel politiek en derhalve dus steeds weer de verkeerde beslissingen MOET nemen ( onder tijdsdruk) en niet gebaseerd is op visie, begrip en hoor & wederhoor.
      Het zou verstandig zijn wanneer er eerst met de diverse lokaties gesproken gaat worden, hoe eea in te vullen, is het inpasbaar etc. Neen ! Van bovenaf is de beslissing reeds genomen, de provincies en in ultimo de gemeente DIENEN alleen maar een lokatie aan te wijzen, de rest gaat volgens Den Haag vanzelf….en de bewoners ( het offer) heeft het maar te accepteren onder het mom van “Humaniteit”. Er zijn grenzen, ook aan asielzoekers. Ga vooral door met uw initiatief, wel gebaseerd op uw visie, begrip en hoor & wederhoor maar vooral op toekomst ! 1000 asielzoekers op een populatie van amper 300 inwoners….een schande.

      Een Groep van Bezorgde Nederlanders
      Stef & Michiel

      Like

  1. The day after….

    Moet ik me afvragen…….schenken ze “chateau migraine” op het gemeentehuis, of heeft mijn kater van vanochtend een andere oorzaak?

    Coalitiepartijen CDA, CU en PvdA……klop u zelf maar goed op de borst dat u zo goed heeft geluisterd naar uw inwoners.
    Jammer alleen dat u met die informatie NIETS heeft gedaan!

    Spreiding……was toch wel de duidelijke boodschap.
    Ik heb er weinig tot niets van terug gehoord gisteravond.
    Een leefbaarheidsonderzoek werd naar gevraagd……..en zo van tafel geveegd.
    Amendementen en moties van de oppositie, ook die werden afgeraden en aan de kant geschoven.

    Een amendement van de coalitie daarentegen wordt wel aangenomen, hoe verrassend.
    Gefaseerd starten met opvang.
    Het aantal van 1000 was velen een doorn in het oog. Een lager aantal zou beter te overzien zijn en de leefbaarheid en veiligheid in Heemserveen en omgeving ten goede komen. Dit uitgaande van de tijdsduur van in eerste instantie 5 jaar, met eventuele verlenging van nog eens 5 jaar……. niet voor een paar maanden!!
    Want dat voorzie ik nu. Oktober 2015 opent het AZC haar deuren en start met een “substantieel” lager aantal van………500? 600?
    En na een waarschijnlijk simpele evaluatie in januari 2016 wordt het gewoon verhoogd naar het maximale aantal van 1000. Nou…dan hebben we wat bereikt hoor coalitie, chapeau!!
    Wederom heb ik het gevoel als direct omwonende totaal niet serieus te zijn genomen en dat de gemeenteraad meer genegen is zijn verantwoording te nemen voor de opvang van asielzoekers dan op te komen voor de belangen van inwoners.

    Wij kwamen 3 jaar geleden vanuit de overvolle Randstad naar Heemserveen om onze droom na te jagen. Die droom spatte behoorlijk uiteen toen wij op 12 februari onaangenaam verrast werden met een bezoek van gemeente en COA en de mededeling dat we geen (of wellicht niet alleen!) een bedrijventerrein achter ons krijgen, maar tevens een AZC met 1000 bewoners!
    Nog even hadden we de illusie dat wij gehoord zouden worden en dat er door middel van spreiding een dragelijker situatie zou ontstaan voor zowel de bewoners van het toekomstige AZC als de inwoners van Heemserveen en Hardenberg. Maar helaas…..ondanks de inspanningen van de oppositiepartijen die klaarblijkelijk WEL naar ons geluisterd hebben, wordt het ons alsnog “door de strot geduwd”.
    Met dank aan het college en de coalitiepartijen CDA, CU en PvdA.
    Oh…en laat ik het COA niet vergeten. Die zien hun “wensen” duidelijk beter ingevuld dan die van de inwoners van Heemserveen.

    Kirsten Godefroy

    Like

Geef een reactie

Vul je gegevens in of klik op een icoon om in te loggen.

WordPress.com logo

Je reageert onder je WordPress.com account. Log uit /  Bijwerken )

Google+ photo

Je reageert onder je Google+ account. Log uit /  Bijwerken )

Twitter-afbeelding

Je reageert onder je Twitter account. Log uit /  Bijwerken )

Facebook foto

Je reageert onder je Facebook account. Log uit /  Bijwerken )

Verbinden met %s