8
.anylint
@ -1,4 +1,6 @@
|
||||
{
|
||||
"html_has_js": false,
|
||||
"json_severity": "failure"
|
||||
{
|
||||
"html_has_js": false,
|
||||
"php_has_html": false,
|
||||
"json_severity": "failure",
|
||||
"ignore": ["html/ace/"]
|
||||
}
|
63
.build.php
Normal file
@ -0,0 +1,63 @@
|
||||
<?php
|
||||
if(file_exists("Universal Bypass.zip"))
|
||||
{
|
||||
unlink("Universal Bypass.zip");
|
||||
}
|
||||
if(file_exists("Universal Bypass for Firefox.zip"))
|
||||
{
|
||||
unlink("Universal Bypass for Firefox.zip");
|
||||
}
|
||||
|
||||
echo "Indexing...\n";
|
||||
$index = [];
|
||||
function recursivelyIndex($dir)
|
||||
{
|
||||
global $index;
|
||||
foreach(scandir($dir) as $f)
|
||||
{
|
||||
if(substr($f, 0, 1) != ".")
|
||||
{
|
||||
$fn = $dir."/".$f;
|
||||
if(is_dir($fn))
|
||||
{
|
||||
recursivelyIndex($fn);
|
||||
}
|
||||
else
|
||||
{
|
||||
array_push($index, substr($fn, 2));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
recursivelyIndex(".");
|
||||
|
||||
echo "Building...\n";
|
||||
function createZip($file)
|
||||
{
|
||||
$zip = new ZipArchive();
|
||||
$zip->open($file, ZipArchive::CREATE + ZipArchive::EXCL + ZipArchive::CHECKCONS) or die("Failed to create {$file}.\n");
|
||||
return $zip;
|
||||
}
|
||||
$build = createZip("Universal Bypass.zip");
|
||||
$firefox = createZip("Universal Bypass for Firefox.zip");
|
||||
foreach($index as $fn)
|
||||
{
|
||||
if($fn == "README.md")
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if($fn == "manifest.json")
|
||||
{
|
||||
$json = json_decode(file_get_contents($fn), true);
|
||||
unset($json["web_accessible_resources"]);
|
||||
$json["incognito"] = "split";
|
||||
$build->addFromString($fn, json_encode($json, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES));
|
||||
}
|
||||
else
|
||||
{
|
||||
$build->addFile($fn, $fn);
|
||||
}
|
||||
$firefox->addFile($fn, $fn);
|
||||
}
|
||||
$build->close();
|
||||
$firefox->close();
|
1
.gitignore
vendored
@ -1 +0,0 @@
|
||||
Universal Bypass.zip
|
50
.update_locales.php
Normal file
@ -0,0 +1,50 @@
|
||||
<?php
|
||||
function recursivelyDelete($file)
|
||||
{
|
||||
if(is_dir($file))
|
||||
{
|
||||
foreach(scandir($file) as $child)
|
||||
{
|
||||
if(!in_array($child, [".", ".."]))
|
||||
{
|
||||
recursivelyDelete($file."/".$child);
|
||||
}
|
||||
}
|
||||
rmdir($file);
|
||||
}
|
||||
else
|
||||
{
|
||||
unlink($file);
|
||||
}
|
||||
}
|
||||
|
||||
if(!file_exists("bypass.zip"))
|
||||
{
|
||||
die("bypass.zip not found.\n");
|
||||
}
|
||||
$zip = new ZipArchive();
|
||||
$zip->open("bypass.zip") or die("Failed to open bypass.zip\n");
|
||||
rename("_locales/en/messages.json", "messages.json");
|
||||
recursivelyDelete("_locales");
|
||||
$zip->extractTo("_locales");
|
||||
foreach(scandir("_locales") as $locale)
|
||||
{
|
||||
if(in_array($locale, [".", ".."]))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
unlink("_locales/{$locale}/marketing.json");
|
||||
if(file_get_contents("_locales/{$locale}/messages.json") == "{\n\n}")
|
||||
{
|
||||
recursivelyDelete("_locales/{$locale}");
|
||||
continue;
|
||||
}
|
||||
if(in_array($locale, ["es-ES"]))
|
||||
{
|
||||
rename("_locales/{$locale}", "_locales/".substr($locale, 0, 2));
|
||||
}
|
||||
}
|
||||
$zip->close();
|
||||
unlink("bypass.zip");
|
||||
mkdir("_locales/en");
|
||||
rename("messages.json", "_locales/en/messages.json");
|
2
LICENSE
@ -1,6 +1,6 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2018 Hellsh Ltd.
|
||||
Copyright (c) 2018-2019, Tim "timmyRS" Speckhals
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
5
PRIVACY.md
Normal file
@ -0,0 +1,5 @@
|
||||
# Privacy Policy
|
||||
|
||||
When Crowd Bypass (Options > "Give and take the destinations of unbypassable shorteners.") is enabled, a request to my server is being sent for it to work, of which I store nothing.
|
||||
|
||||
I use Clouflare and [their privacy policy](https://www.cloudflare.com/privacypolicy/) applies to you as an "End User."
|
@ -2,4 +2,8 @@
|
||||
|
||||
Don't waste your time with compliance. Universal Bypass automatically skips annoying link shorteners.
|
||||
|
||||
[Get the Extension for Chrome and/or Firefox.](https://universal-bypass.org)
|
||||
- [Translate Universal Bypass on Crowdin](https://crowdin.com/project/bypass)
|
||||
- [Homepage](https://universal-bypass.org)
|
||||
- [Install Universal Bypass](https://universal-bypass.org/install)
|
||||
- [FAQ](https://universal-bypass.org/faq)
|
||||
- [Changelog](https://universal-bypass.org/changelog)
|
||||
|
68
_locales/ar/messages.json
Normal file
@ -0,0 +1,68 @@
|
||||
{
|
||||
"appDesc": {
|
||||
"message": "لا تضيع وقتك بالتخطي. المتجاوز الشامل سيتخطى تلقائيًا كل مواقع إختصار الروابط المزعجة."
|
||||
},
|
||||
"firstrunTitle": {
|
||||
"message": "شكرًا لتثبيتك المتجاوز الشامل!"
|
||||
},
|
||||
"firstrunSubtitle": {
|
||||
"message": "أنت رائع!"
|
||||
},
|
||||
"firstrunNoScript": {
|
||||
"message": "للاسف يبدو أنك تستخدم NoScript أو احد الاضافات المماثلة التي تكون غير متوافقة مع المتجاوز الشامل."
|
||||
},
|
||||
"faq": {
|
||||
"message": "الأسئلة المتداولة"
|
||||
},
|
||||
"options": {
|
||||
"message": "الخيارات"
|
||||
},
|
||||
"optionsEnabled": {
|
||||
"message": "تمكين تجاوز مواقع الويب."
|
||||
},
|
||||
"optionsInstantNavigation": {
|
||||
"message": "قم بنقلي إلى الوجهات تلقائيًا."
|
||||
},
|
||||
"optionsTrackerBypass": {
|
||||
"message": "تجاوز المتتبعين بإستخدام Apimon.de."
|
||||
},
|
||||
"optionsBlockIPLoggers": {
|
||||
"message": "حظر مسجلات الـ IP إذا كان لا يمكن تجاوزهم."
|
||||
},
|
||||
"optionsCrowdBypass": {
|
||||
"message": "إعطاء وأخذ وجهات الروابط المختصرة الغير قابلة للتجاوز."
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "سياسة الخصوصية"
|
||||
},
|
||||
"optionsUserscripts": {
|
||||
"message": "عمليات التجاوز المخصصة"
|
||||
},
|
||||
"optionsUserscriptsSubtitle": {
|
||||
"message": "سيكون من الرائع إذا كنت تستطيع إرسال متجاوزات تعمل إلى صفحة الـ GitHub، حتى يستطيع اﻵخرين اﻹستفادة منها."
|
||||
},
|
||||
"beforeNavigate": {
|
||||
"message": "انت الأن قريب من وجهتك."
|
||||
},
|
||||
"beforeNavigateDestination": {
|
||||
"message": "وجهتك هي %"
|
||||
},
|
||||
"beforeNavigateInfo": {
|
||||
"message": "هل تريد من المتجاوز الشامل إعادة توجيهك علي الفور الي وجهتك؟"
|
||||
},
|
||||
"blockedTitle": {
|
||||
"message": "المتجاوز الشامل قام بمنع تسجيل عنوان الـ IP الخاص بك."
|
||||
},
|
||||
"blockedSubtitle": {
|
||||
"message": "لا تريد من المتجاوز الشامل ان يمنع الجهات السيئه من الحصول علي الأي بي الخاص بك ؟"
|
||||
},
|
||||
"crowdBypassed": {
|
||||
"message": "ربما لن تحتاج للإنتظار بعد الأن!"
|
||||
},
|
||||
"crowdBypassedInfo": {
|
||||
"message": "قام مستخدمون آخرون للمتجاوز الشامل بالإنتظار بدلاً عنك والتبليع بأن هذا الرابط يؤدي إلى %"
|
||||
},
|
||||
"crowdBypassedIgnore": {
|
||||
"message": "ليس هذا صحيحًا؟"
|
||||
}
|
||||
}
|
50
_locales/az/messages.json
Normal file
@ -0,0 +1,50 @@
|
||||
{
|
||||
"appDesc": {
|
||||
"message": "Vaxtınızı uyğunlaşdırmaya xərcləməyin. Universal Bypass, zəhlətökən bağlantı qısaldıcılarını ötürür."
|
||||
},
|
||||
"firstrunTitle": {
|
||||
"message": "Universal Bypass quraşdırdığınız üçün təşəkkürlər!"
|
||||
},
|
||||
"firstrunSubtitle": {
|
||||
"message": "Mükəmməlsiniz!"
|
||||
},
|
||||
"firstrunNoScript": {
|
||||
"message": "Buna baxmayaraq, Universal Bypass ilə uyğunlaşmayan NoScript və ya oxşarını istifadə edirsiniz."
|
||||
},
|
||||
"optionsInstantNavigation": {
|
||||
"message": "Məni dərhal təyinat yerinə apar."
|
||||
},
|
||||
"optionsTrackerBypass": {
|
||||
"message": "Apimon.de istifadə edən Bypass izləyiciləri."
|
||||
},
|
||||
"optionsBlockIPLoggers": {
|
||||
"message": "Ötürə bilməsə, IP qeydlərini əngəllə."
|
||||
},
|
||||
"optionsCrowdBypass": {
|
||||
"message": "Ötürülə bilməyən qısaldıcıların yerlərini verin və aparın."
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Gizlilik Siyasəti"
|
||||
},
|
||||
"optionsUserscripts": {
|
||||
"message": "Özəl Bypass-lar"
|
||||
},
|
||||
"beforeNavigate": {
|
||||
"message": "Demək olar ki, təyinat yerindəsiniz."
|
||||
},
|
||||
"beforeNavigateDestination": {
|
||||
"message": "Təyinat yeri %"
|
||||
},
|
||||
"blockedTitle": {
|
||||
"message": "Universal Bypass, IP ünvanların qeydlərə əlavə edilməsinin qarşısı aldı."
|
||||
},
|
||||
"crowdBypassed": {
|
||||
"message": "Gözləməyinizə ehtiyac yoxdur!"
|
||||
},
|
||||
"crowdBypassedInfo": {
|
||||
"message": "Digər Universal Bypass istifadəçiləri artıq sizi gözlədilər və bunun % a çatdığı bildirildi"
|
||||
},
|
||||
"crowdBypassedIgnore": {
|
||||
"message": "Bu doğru deyil?"
|
||||
}
|
||||
}
|
68
_locales/bg/messages.json
Normal file
@ -0,0 +1,68 @@
|
||||
{
|
||||
"appDesc": {
|
||||
"message": "Не си губете времето със спазването. Universal Bypass автоматично прескача досадни съкращения на връзки."
|
||||
},
|
||||
"firstrunTitle": {
|
||||
"message": "Благодарим ви за инсталирането на Universal Bypass!"
|
||||
},
|
||||
"firstrunSubtitle": {
|
||||
"message": "Ти си невероятен!"
|
||||
},
|
||||
"firstrunNoScript": {
|
||||
"message": "Въпреки това изглежда, че използвате NoScript или подобен, с който Universal Bypass не е съвместим."
|
||||
},
|
||||
"faq": {
|
||||
"message": "Често задавани въпроси (FAQ)"
|
||||
},
|
||||
"options": {
|
||||
"message": "Настроики"
|
||||
},
|
||||
"optionsEnabled": {
|
||||
"message": "Активирайте заобикалянето на уебсайтовете."
|
||||
},
|
||||
"optionsInstantNavigation": {
|
||||
"message": "Незабавно ме отведе до дестинации."
|
||||
},
|
||||
"optionsTrackerBypass": {
|
||||
"message": "Заобиколете тракерите, използвайки Apimon.de."
|
||||
},
|
||||
"optionsBlockIPLoggers": {
|
||||
"message": "Блокирайте IP регистраторите, ако не могат да бъдат прескочени."
|
||||
},
|
||||
"optionsCrowdBypass": {
|
||||
"message": "Дайте и вземете дестинациите на непроходимите сайтове."
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Декларация за поверителност"
|
||||
},
|
||||
"optionsUserscripts": {
|
||||
"message": "Персонализирани байпаси"
|
||||
},
|
||||
"optionsUserscriptsSubtitle": {
|
||||
"message": "Би било хубаво, ако можете да изпратите работещи байпаси на GitHub, за да могат другите да се възползват от тях."
|
||||
},
|
||||
"beforeNavigate": {
|
||||
"message": "Почти сте на местоназначението си."
|
||||
},
|
||||
"beforeNavigateDestination": {
|
||||
"message": "Вашата дестинация е %"
|
||||
},
|
||||
"beforeNavigateInfo": {
|
||||
"message": "Искате ли Universal Bypass незабавно да ви пренасочи към вашата дестинация?"
|
||||
},
|
||||
"blockedTitle": {
|
||||
"message": "Universal Bypass предотврати регистрирането на вашия IP адрес."
|
||||
},
|
||||
"blockedSubtitle": {
|
||||
"message": "Не искате Universal Bypass да попречи на лошите хора да получат вашия IP адрес?"
|
||||
},
|
||||
"crowdBypassed": {
|
||||
"message": "Може да не се наложи да чакате!"
|
||||
},
|
||||
"crowdBypassedInfo": {
|
||||
"message": "Други потребители на Universal Bypass вече са ви чакали и съобщиха, че това води до %"
|
||||
},
|
||||
"crowdBypassedIgnore": {
|
||||
"message": "Не беше ли това правилно?"
|
||||
}
|
||||
}
|
41
_locales/ca/messages.json
Normal file
@ -0,0 +1,41 @@
|
||||
{
|
||||
"appDesc": {
|
||||
"message": "No perdis el teu temps amb la conformitat. Universal Bypass se salta automàticament molests escurçadors d'enllaços."
|
||||
},
|
||||
"firstrunTitle": {
|
||||
"message": "Gràcies per instal·lar Universal Bypass!"
|
||||
},
|
||||
"firstrunSubtitle": {
|
||||
"message": "Ets fantàstic!"
|
||||
},
|
||||
"firstrunNoScript": {
|
||||
"message": "Però, sembla que estàs utilitzant NoScript o similar, amb la qual Universal Bypass no és compatible."
|
||||
},
|
||||
"optionsTrackerBypass": {
|
||||
"message": "Circumval·la rastrejadors utilitzant Apimon.de."
|
||||
},
|
||||
"optionsBlockIPLoggers": {
|
||||
"message": "Bloqueja registradors d'adreces IP si no poden circumval·lar-se."
|
||||
},
|
||||
"optionsCrowdBypass": {
|
||||
"message": "Comparteix i rep la destinació de escurçadors no circumval·lables."
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Política de privacitat"
|
||||
},
|
||||
"optionsUserscripts": {
|
||||
"message": "Circumval·lacions personalitzades"
|
||||
},
|
||||
"blockedTitle": {
|
||||
"message": "Universal Bypass ha impedit que la seva adreça IP es registrés."
|
||||
},
|
||||
"crowdBypassed": {
|
||||
"message": "Potser que no hagis d'esperar!"
|
||||
},
|
||||
"crowdBypassedInfo": {
|
||||
"message": "Altres usuaris de Universal Bypass ja han esperat per tu i han informat que això porta a %"
|
||||
},
|
||||
"crowdBypassedIgnore": {
|
||||
"message": "Això no era correcte?"
|
||||
}
|
||||
}
|
@ -8,52 +8,61 @@
|
||||
"firstrunSubtitle": {
|
||||
"message": "Du bist der Beste!"
|
||||
},
|
||||
"firstrunWhatnow": {
|
||||
"message": "Was du nun tun kannst:"
|
||||
"firstrunNoScript": {
|
||||
"message": "Jedoch sieht es so aus, als ob du NoScript oder ähnliches verwendest, womit Universal Bypass nicht kompatibel ist."
|
||||
},
|
||||
"firstrunOptions": {
|
||||
"message": "Ändere die Universal Bypass Optionen."
|
||||
},
|
||||
"firstrunTwitter": {
|
||||
"message": "Folge Universal Bypass auf Twitter um immer auf dem neusten Stand zu sein."
|
||||
},
|
||||
"homepage": {
|
||||
"message": "Homepage"
|
||||
},
|
||||
"popupOptions": {
|
||||
"message": "Optionen"
|
||||
"faq": {
|
||||
"message": "Häufig gestellte Fragen (FAQ)"
|
||||
},
|
||||
"options": {
|
||||
"message": "Universal Bypass Optionen"
|
||||
"message": "Optionen"
|
||||
},
|
||||
"save": {
|
||||
"message": "Speichern"
|
||||
"optionsEnabled": {
|
||||
"message": "Aktiviere Webseiten-Umgehungen."
|
||||
},
|
||||
"optionsNotifications": {
|
||||
"message": "Status-Meldungen auf Webseiten, die Universal Bypass kennt, anzeigen."
|
||||
"optionsInstantNavigation": {
|
||||
"message": "Navigiere mich automatisch zu Ziel-Urls."
|
||||
},
|
||||
"optionsTrackerBypass": {
|
||||
"message": "Umgehe Tracker mit Apimon.de."
|
||||
},
|
||||
"optionsBlockIPLoggers": {
|
||||
"message": "Blockiere IP-Logger wenn sie nicht umgangen werden können."
|
||||
},
|
||||
"optionsCrowdBypass": {
|
||||
"message": "Gebe und nehme die Ziel-Urls von unumgänglichen Linkkürzern."
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Datenschutzerklärung"
|
||||
},
|
||||
"optionsUserscripts": {
|
||||
"message": "Eigene Umgehungen"
|
||||
},
|
||||
"optionsUserscriptsSubtitle": {
|
||||
"message": "Es wäre nett, wenn du funktionierende Umgehungen auf GitHub einreichen wüdest, damit Andere auch davon profitieren können: "
|
||||
"message": "Es wäre nett, wenn du funktionierende Umgehungen auf GitHub einreichen würdest, damit Andere auch davon profitieren können."
|
||||
},
|
||||
"optionsUserscriptsName": {
|
||||
"message": "Name. Mit einem leeren Namen, wird diese Umgehung gelöscht."
|
||||
"beforeNavigate": {
|
||||
"message": "Du bist fast am Ziel."
|
||||
},
|
||||
"optionsUserscriptsDomains": {
|
||||
"message": "Domains. Nutze * damit diese Umgehung überall in effekt tritt."
|
||||
"beforeNavigateDestination": {
|
||||
"message": "Dein Ziel ist %"
|
||||
},
|
||||
"optionsUserscriptsDelete": {
|
||||
"message": "Umgehung löschen"
|
||||
"beforeNavigateInfo": {
|
||||
"message": "Willst du, dass Universal Bypass dich automatisch an dein Ziel bringt?"
|
||||
},
|
||||
"notificationTimerSkip": {
|
||||
"message": "Universal Bypass hat gerade den Timer übersprungen."
|
||||
"blockedTitle": {
|
||||
"message": "Universal Bypass hat dich vor einem IP-Logger geschützt."
|
||||
},
|
||||
"notificationTimerLeap": {
|
||||
"message": "Universal Bypass hat gerade %secs% Sekunde(n) von dem Timer entfernt."
|
||||
"blockedSubtitle": {
|
||||
"message": "Möchtest du nicht, dass Universal Bypass deine IP vor bösen Leuten schützt?"
|
||||
},
|
||||
"notificationBackend": {
|
||||
"message": "Universal Bypass kann diese Seite nicht umgehen, da diese einen Server-seitigen Check hat."
|
||||
"crowdBypassed": {
|
||||
"message": "Du musst vielleicht nicht warten!"
|
||||
},
|
||||
"crowdBypassedInfo": {
|
||||
"message": "Andere Universal Bypass-Nutzer haben bereits für dich gewartet und gemeldet, dass das zu % führt."
|
||||
},
|
||||
"crowdBypassedIgnore": {
|
||||
"message": "War das nicht richtig?"
|
||||
}
|
||||
}
|
||||
}
|
41
_locales/el/messages.json
Normal file
@ -0,0 +1,41 @@
|
||||
{
|
||||
"appDesc": {
|
||||
"message": "Μην σπαταλάτε το χρόνο σας περιμένοντας. Ο Universal Bypass παραλείπει αυτόματα ενοχλητικούς συνδέσμους συντομεύσεων."
|
||||
},
|
||||
"firstrunTitle": {
|
||||
"message": "Ευχαριστούμε που εγκαταστήσατε το Universal Bypass!"
|
||||
},
|
||||
"firstrunSubtitle": {
|
||||
"message": "Είστε καταπληκτικός\/ή!"
|
||||
},
|
||||
"firstrunNoScript": {
|
||||
"message": "Ωστόσο, φαίνεται να χρησιμοποιείτε NoScript ή παρόμοιο, με τα οποία το Universal Bypass δεν είναι συμβατό."
|
||||
},
|
||||
"optionsTrackerBypass": {
|
||||
"message": "Παράκαμψη trackers χρησιμοποιώντας το Apimon.de."
|
||||
},
|
||||
"optionsBlockIPLoggers": {
|
||||
"message": "Μπλόκαρε IP loggers, αν αυτοί δεν μπορούν να παρακάμπτουν."
|
||||
},
|
||||
"optionsCrowdBypass": {
|
||||
"message": "Δώσε και να πάρε τους προορισμούς των unbypassable shorteners."
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Πολιτική Απορρήτου"
|
||||
},
|
||||
"optionsUserscripts": {
|
||||
"message": "Προσαρμοσμένες παρακάμψεις"
|
||||
},
|
||||
"blockedTitle": {
|
||||
"message": "Το Universal Bypass εμπόδισε την IP σας από το να καταγραφεί."
|
||||
},
|
||||
"crowdBypassed": {
|
||||
"message": "Ίσως να μην χρειαστεί να περιμένετε!"
|
||||
},
|
||||
"crowdBypassedInfo": {
|
||||
"message": "Άλλοι χρήστες του Universal Bypass έχουν ήδη περιμένει εσάς και έχουν αναφέρει ότι αυτό οδηγεί σε %"
|
||||
},
|
||||
"crowdBypassedIgnore": {
|
||||
"message": "Δεν ήταν αυτό σωστό;"
|
||||
}
|
||||
}
|
@ -8,52 +8,61 @@
|
||||
"firstrunSubtitle": {
|
||||
"message": "You're amazing!"
|
||||
},
|
||||
"firstrunWhatnow": {
|
||||
"message": "What you can do now:"
|
||||
"firstrunNoScript": {
|
||||
"message": "However, you seem to be using NoScript or similar, which Universal Bypass is not compatible with."
|
||||
},
|
||||
"firstrunOptions": {
|
||||
"message": "Change Universal Bypass' options."
|
||||
},
|
||||
"firstrunTwitter": {
|
||||
"message": "Follow Universal Bypass on Twitter to always be in the loop about Universal Bypass."
|
||||
},
|
||||
"homepage": {
|
||||
"message": "Homepage"
|
||||
},
|
||||
"popupOptions": {
|
||||
"message": "Options"
|
||||
"faq": {
|
||||
"message": "Frequently Asked Questions (FAQ)"
|
||||
},
|
||||
"options": {
|
||||
"message": "Universal Bypass Options"
|
||||
"message": "Options"
|
||||
},
|
||||
"save": {
|
||||
"message": "Save"
|
||||
"optionsEnabled": {
|
||||
"message": "Enable website bypasses."
|
||||
},
|
||||
"optionsNotifications": {
|
||||
"message": "Show status notifications on websites Universal Bypass knows."
|
||||
"optionsInstantNavigation": {
|
||||
"message": "Instantly take me to destinations."
|
||||
},
|
||||
"optionsTrackerBypass": {
|
||||
"message": "Bypass trackers using Apimon.de."
|
||||
},
|
||||
"optionsBlockIPLoggers": {
|
||||
"message": "Block IP loggers if they can't be bypassed."
|
||||
},
|
||||
"optionsCrowdBypass": {
|
||||
"message": "Give and take the destinations of unbypassable shorteners."
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Privacy Policy"
|
||||
},
|
||||
"optionsUserscripts": {
|
||||
"message": "Custom Bypasses"
|
||||
},
|
||||
"optionsUserscriptsSubtitle": {
|
||||
"message": "It would be nice if you could submit working bypasses to GitHub, so others can benefit from it: "
|
||||
"message": "It would be nice if you could submit working bypasses on GitHub, so others can benefit from it."
|
||||
},
|
||||
"optionsUserscriptsName": {
|
||||
"message": "Name. With an empty name, this bypass will be deleted."
|
||||
"beforeNavigate": {
|
||||
"message": "You're almost at your destination."
|
||||
},
|
||||
"optionsUserscriptsDomains": {
|
||||
"message": "Domains. Use * for this bypass to be effective everywhere."
|
||||
"beforeNavigateDestination": {
|
||||
"message": "Your destination is %"
|
||||
},
|
||||
"optionsUserscriptsDelete": {
|
||||
"message": "Delete Bypass"
|
||||
"beforeNavigateInfo": {
|
||||
"message": "Do you want Universal Bypass to instantly redirect you to your destination?"
|
||||
},
|
||||
"notificationTimerSkip": {
|
||||
"message": "Universal Bypass just skipped that timer for you."
|
||||
"blockedTitle": {
|
||||
"message": "Universal Bypass prevented your IP from being logged."
|
||||
},
|
||||
"notificationTimerLeap": {
|
||||
"message": "Universal Bypass just removed %secs% second(s) from that timer."
|
||||
"blockedSubtitle": {
|
||||
"message": "Don't want Universal Bypass to prevent bad actors from getting your IP?"
|
||||
},
|
||||
"notificationBackend": {
|
||||
"message": "Universal Bypass can't bypass this site because they have a server-side check."
|
||||
"crowdBypassed": {
|
||||
"message": "You might not have to wait!"
|
||||
},
|
||||
"crowdBypassedInfo": {
|
||||
"message": "Other Universal Bypass users have already waited for you and reported that this leads to %"
|
||||
},
|
||||
"crowdBypassedIgnore": {
|
||||
"message": "Was this not correct?"
|
||||
}
|
||||
}
|
||||
|
@ -3,45 +3,66 @@
|
||||
"message": "No pierdas el tiempo para acceder. Universal Bypass omite automáticamente los molestos acortadores de enlaces."
|
||||
},
|
||||
"firstrunTitle": {
|
||||
"message": "Gracias por instalar Universal Bypass!"
|
||||
"message": "¡Gracias por instalar Universal Bypass!"
|
||||
},
|
||||
"firstrunSubtitle": {
|
||||
"message": "¡Eres increíble!"
|
||||
},
|
||||
"firstrunWhatnow": {
|
||||
"message": "Lo que puedes hacer ahora:"
|
||||
"firstrunNoScript": {
|
||||
"message": "No obstante, parece que estés utilizando NoScript o similar, con la que Universal Bypass no es compatible."
|
||||
},
|
||||
"firstrunOptions": {
|
||||
"message": "Configura Universal Bypass' opción."
|
||||
},
|
||||
"firstrunTwitter": {
|
||||
"message": "Siga a Universal Bypass en Twitter para estar informado sobre Universal Bypass."
|
||||
},
|
||||
"homepage": {
|
||||
"message": "Inicio"
|
||||
},
|
||||
"popupOptions": {
|
||||
"message": "Opciones"
|
||||
"faq": {
|
||||
"message": "Preguntas más frecuentes"
|
||||
},
|
||||
"options": {
|
||||
"message": "Universal Bypass Opciones"
|
||||
"message": "Opciones"
|
||||
},
|
||||
"save": {
|
||||
"message": "Guardar"
|
||||
"optionsEnabled": {
|
||||
"message": "Activar bypass pagina web."
|
||||
},
|
||||
"optionsInstantNavigation": {
|
||||
"message": "Llevarme directamente al destino."
|
||||
},
|
||||
"optionsTrackerBypass": {
|
||||
"message": "Evita rastreadores usando Apimon.de."
|
||||
},
|
||||
"optionsBlockIPLoggers": {
|
||||
"message": "Bloquea los registradores IP si no pueden ser Saltados."
|
||||
},
|
||||
"optionsCrowdBypass": {
|
||||
"message": "Da y toma los destinos de los acortadores que no se pueden Saltar."
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Política de privacidad"
|
||||
},
|
||||
"optionsUserscripts": {
|
||||
"message": "Personalizar Bypasses"
|
||||
"message": "Bypasses personalizadas"
|
||||
},
|
||||
"optionsUserscriptsSubtitle": {
|
||||
"message": "Sería bueno que pudieras enviarle a GitHub las bifurcaciones (fork) que funcionan, para que otros puedan beneficiarse de ello: "
|
||||
"message": "Sería bueno que pudieras enviarle a GitHub las bifurcaciones (fork) que funcionan, para que otros puedan beneficiarse de ello."
|
||||
},
|
||||
"optionsUserscriptsName": {
|
||||
"message": "Nombre. Con un nombre vacío, este bypass será borrado."
|
||||
"beforeNavigate": {
|
||||
"message": "Ya casi estas en tu destino."
|
||||
},
|
||||
"optionsUserscriptsDomains": {
|
||||
"message": "Dominios. Utilice * para que este bypass sea efectivo en todas partes."
|
||||
"beforeNavigateDestination": {
|
||||
"message": "Tu dirección de destino es %"
|
||||
},
|
||||
"optionsUserscriptsDelete": {
|
||||
"message": "Eliminar Bypass"
|
||||
"beforeNavigateInfo": {
|
||||
"message": "¿Desea que Universal Bypass lo redirija instantáneamente a su destino?"
|
||||
},
|
||||
"blockedTitle": {
|
||||
"message": "Bypass Universal evitó que su IP se registrara."
|
||||
},
|
||||
"blockedSubtitle": {
|
||||
"message": "¿No quiere que Universal Bypass impida que los actores malos obtengan su IP?"
|
||||
},
|
||||
"crowdBypassed": {
|
||||
"message": "Puede que no tengas que esperar!"
|
||||
},
|
||||
"crowdBypassedInfo": {
|
||||
"message": "Otros usuarios de Universal Bypass ya han esperado por ti y han informado que esto lleva a %"
|
||||
},
|
||||
"crowdBypassedIgnore": {
|
||||
"message": "¿No era eso correcto?"
|
||||
}
|
||||
}
|
||||
}
|
@ -6,56 +6,63 @@
|
||||
"message": "Merci d'avoir installer Universal Bypass!"
|
||||
},
|
||||
"firstrunSubtitle": {
|
||||
"message": "Vou-êtes incroyable!"
|
||||
"message": "Vous êtes incroyable!"
|
||||
},
|
||||
"firstrunWhatnow": {
|
||||
"message": "Voici ce que vous pouvez faire maintenant:"
|
||||
"firstrunNoScript": {
|
||||
"message": "Cependant, vous semblez utiliser le module NoScript ou quelque chose de similaire, qui n'est pas compatible avec le contourneur universel."
|
||||
},
|
||||
"firstrunOptions": {
|
||||
"message": "Changer les options de Universal Bypass."
|
||||
},
|
||||
"firstrunTwitter": {
|
||||
"message": "Suivre Universal Bypass sur Twitter pour être toujours tenu au courrant de Universal Bypass."
|
||||
},
|
||||
"homepage": {
|
||||
"message": "Page d'accueil"
|
||||
},
|
||||
"popupOptions": {
|
||||
"message": "Options"
|
||||
"faq": {
|
||||
"message": "Questions fréquemment posées (FAQ)"
|
||||
},
|
||||
"options": {
|
||||
"message": "Options d'Universal Bypass"
|
||||
"message": "Réglages"
|
||||
},
|
||||
"save": {
|
||||
"message": "Sauvegarder"
|
||||
"optionsEnabled": {
|
||||
"message": "Activez les contournements de site Web."
|
||||
},
|
||||
"save": {
|
||||
"message": "Sauvegarder"
|
||||
"optionsInstantNavigation": {
|
||||
"message": "M'envoyer instantanément vers les destinations."
|
||||
},
|
||||
"optionsNotifications": {
|
||||
"message": "Afficher notifications de statut sur les sites webs que Universal Bypass connaît."
|
||||
"optionsTrackerBypass": {
|
||||
"message": "Contourner les traqueurs en utilisant Apimon.de."
|
||||
},
|
||||
"optionsBlockIPLoggers": {
|
||||
"message": "Bloque les enregistreurs d’IP si ils ne peuvent être contournés."
|
||||
},
|
||||
"optionsCrowdBypass": {
|
||||
"message": "Donner et prendre les cibles des raccourcisseurs incontournables."
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Politique Vie Privée"
|
||||
},
|
||||
"optionsUserscripts": {
|
||||
"message": "Bypass sur mesure"
|
||||
},
|
||||
"optionsUserscriptsSubtitle": {
|
||||
"message": "Ce serait bien si vous pouviez soumettre des dérivations de travail à GitHub, afin que d'autres puissent en bénéficier: "
|
||||
"message": "Ce serait bien si vous pouviez soumettre des dérivations fonctionelles sur GitHub, afin que d'autres puissent en bénéficier."
|
||||
},
|
||||
"optionsUserscriptsName": {
|
||||
"message": "Nom. Avec un nom vide, ce contournements sera supprimé."
|
||||
"beforeNavigate": {
|
||||
"message": "Vous êtes presque arrivé à destination."
|
||||
},
|
||||
"optionsUserscriptsDomains": {
|
||||
"message": "Domaines. Utiliser * pour ce contournement pour qu'il soit éffectif partout."
|
||||
"beforeNavigateDestination": {
|
||||
"message": "Votre destination est %"
|
||||
},
|
||||
"optionsUserscriptsDelete": {
|
||||
"message": "Supprimer Bypass"
|
||||
"beforeNavigateInfo": {
|
||||
"message": "Vouslez-vous qu'Universal Bypass vous redirige instantanément à votre destination?"
|
||||
},
|
||||
"notificationTimerSkip": {
|
||||
"message": "Universal Bypass zappe juste ce compteur pour vous."
|
||||
"blockedTitle": {
|
||||
"message": "Universal Bypass empêche l’enregistrement de votre IP."
|
||||
},
|
||||
"notificationTimerLeap": {
|
||||
"message": "Universal Bypass supprime juste les %secs% seconde(s) fr votre compteur."
|
||||
"blockedSubtitle": {
|
||||
"message": "Pas envie qu'Universal Bypass empêche de mauvais acteurs d'acquérir votre IP?"
|
||||
},
|
||||
"notificationBackend": {
|
||||
"message": "Universal Bypass ne peut pas contourner ce site parce qu\'ils ont une vérification côté serveur."
|
||||
}
|
||||
"crowdBypassed": {
|
||||
"message": "Vous n'aurez peut-être pas à attendre !"
|
||||
},
|
||||
"crowdBypassedInfo": {
|
||||
"message": "D'autres utilisateurs du contourneur universel vous ont déjà attendu et ont rapporté que cela mène à %"
|
||||
},
|
||||
"crowdBypassedIgnore": {
|
||||
"message": "Cela n'était-il pas exact ?"
|
||||
}
|
||||
}
|
35
_locales/hu/messages.json
Normal file
@ -0,0 +1,35 @@
|
||||
{
|
||||
"appDesc": {
|
||||
"message": "Ne vesztegesd az időd beleegyezésekkel. A Universal Bypass automatikusan kikerüli a bosszantó link-rövidítőket."
|
||||
},
|
||||
"firstrunTitle": {
|
||||
"message": "Köszönjük, hogy telepítetted a Universal Bypass-t!"
|
||||
},
|
||||
"firstrunSubtitle": {
|
||||
"message": "Csodálatos vagy!"
|
||||
},
|
||||
"optionsTrackerBypass": {
|
||||
"message": "Apimon.de-t használó trackerek kikerülése."
|
||||
},
|
||||
"optionsBlockIPLoggers": {
|
||||
"message": "IP-loggerek blokkolása, ha nem kerülhetők ki."
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Adatvédelmi irányelvek"
|
||||
},
|
||||
"optionsUserscripts": {
|
||||
"message": "Egyéni kikerülések"
|
||||
},
|
||||
"blockedTitle": {
|
||||
"message": "A Universal Bypass megtiltotta, hogy az IP-t naplózható legyen."
|
||||
},
|
||||
"crowdBypassed": {
|
||||
"message": "Talán nem kell várakoznod!"
|
||||
},
|
||||
"crowdBypassedInfo": {
|
||||
"message": "Más Universal Bypass felhasználók már vártak helyetted, és szerintük ez a(z) % webhelyhez vezet"
|
||||
},
|
||||
"crowdBypassedIgnore": {
|
||||
"message": "Ez helytelen?"
|
||||
}
|
||||
}
|
68
_locales/id/messages.json
Normal file
@ -0,0 +1,68 @@
|
||||
{
|
||||
"appDesc": {
|
||||
"message": "Jangan habiskan waktu anda dengan menaati aturan. Universal Bypass secara otomatis akan melompati link pemendek yang menyebalkan."
|
||||
},
|
||||
"firstrunTitle": {
|
||||
"message": "Terima kasih anda sudah menginstal Universal Bypass!"
|
||||
},
|
||||
"firstrunSubtitle": {
|
||||
"message": "Anda luar biasa!"
|
||||
},
|
||||
"firstrunNoScript": {
|
||||
"message": "Akan tetapi, anda sepertinya menggunakan NoScript atau menyerupai itu, Karena itu Universal Bypass tidak kompatibel dengannya."
|
||||
},
|
||||
"faq": {
|
||||
"message": "Pertanyaan yang Sering Diajukan\n(FAQ)"
|
||||
},
|
||||
"options": {
|
||||
"message": "Pilihan"
|
||||
},
|
||||
"optionsEnabled": {
|
||||
"message": "Aktifkan bypass website."
|
||||
},
|
||||
"optionsInstantNavigation": {
|
||||
"message": "Langsung arahkan ke tujuan."
|
||||
},
|
||||
"optionsTrackerBypass": {
|
||||
"message": "Pelacak Bypass menggunakan Apimon.de."
|
||||
},
|
||||
"optionsBlockIPLoggers": {
|
||||
"message": "Memblokir IP Logger jika tidak dapat dilewati."
|
||||
},
|
||||
"optionsCrowdBypass": {
|
||||
"message": "Memberikan dan mendapatkan tujuan dari pemendek yang tidak dapat dilewati."
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Kebijakan Pribadi"
|
||||
},
|
||||
"optionsUserscripts": {
|
||||
"message": "Atur Bypass sesuai keinginan"
|
||||
},
|
||||
"optionsUserscriptsSubtitle": {
|
||||
"message": "Akan lebih baik jika Anda bisa mengirimkan bypass karya anda lewat GitHub, sehingga orang lain dapat memperoleh manfaatnya."
|
||||
},
|
||||
"beforeNavigate": {
|
||||
"message": "Anda hampir sampai pada destinasi anda."
|
||||
},
|
||||
"beforeNavigateDestination": {
|
||||
"message": "Destinasi anda adalah %"
|
||||
},
|
||||
"beforeNavigateInfo": {
|
||||
"message": "Apakah Anda ingin Universal Bypass langsung mengarahkan ke tujuan Anda?"
|
||||
},
|
||||
"blockedTitle": {
|
||||
"message": "Universal Bypass mencegah IP Anda saat sedang login."
|
||||
},
|
||||
"blockedSubtitle": {
|
||||
"message": "Tidak ingin Universal Bypass untuk mencegah situs buruk dari mendapatkan IP Anda?"
|
||||
},
|
||||
"crowdBypassed": {
|
||||
"message": "Anda mungkin tidak perlu menunggu !"
|
||||
},
|
||||
"crowdBypassedInfo": {
|
||||
"message": "Pengguna Universal Bypass lainnya sudah menunggu untuk anda dan melaporkan bahwa hal ini menyebabkan %"
|
||||
},
|
||||
"crowdBypassedIgnore": {
|
||||
"message": "Apakah ini tidak benar ?"
|
||||
}
|
||||
}
|
68
_locales/it/messages.json
Normal file
@ -0,0 +1,68 @@
|
||||
{
|
||||
"appDesc": {
|
||||
"message": "Non sprecare il tuo tempo con il conformismo. Universal Bypass salta automaticamente i fastidiosi link shortener."
|
||||
},
|
||||
"firstrunTitle": {
|
||||
"message": "Grazie per aver installato Universal Bypass!"
|
||||
},
|
||||
"firstrunSubtitle": {
|
||||
"message": "Sei incredibile!"
|
||||
},
|
||||
"firstrunNoScript": {
|
||||
"message": "Però, sembra che tu stia usando NoScript o simili, con le quali Universal Bypass non è compatibile."
|
||||
},
|
||||
"faq": {
|
||||
"message": "Domande frequenti (FAQ)"
|
||||
},
|
||||
"options": {
|
||||
"message": "Opzioni"
|
||||
},
|
||||
"optionsEnabled": {
|
||||
"message": "Attiva i bypass dei siti web."
|
||||
},
|
||||
"optionsInstantNavigation": {
|
||||
"message": "Portami istantaneamente alla destinazione."
|
||||
},
|
||||
"optionsTrackerBypass": {
|
||||
"message": "Bypass tracker utilizzando Apimon.de."
|
||||
},
|
||||
"optionsBlockIPLoggers": {
|
||||
"message": "Blocca i logger IP se essi non possono essere bypassati."
|
||||
},
|
||||
"optionsCrowdBypass": {
|
||||
"message": "Dai e ottieni le destinazioni degli shorteners non bypassati."
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Informativa sulla privacy"
|
||||
},
|
||||
"optionsUserscripts": {
|
||||
"message": "Bypass personalizzati"
|
||||
},
|
||||
"optionsUserscriptsSubtitle": {
|
||||
"message": "Sarebbe bello se tu potessi inviare i bypass funzionanti su GitHub, in modo che anche altri possano trarne beneficio."
|
||||
},
|
||||
"beforeNavigate": {
|
||||
"message": "Sei quasi a destinazione."
|
||||
},
|
||||
"beforeNavigateDestination": {
|
||||
"message": "La tua destinazione è %"
|
||||
},
|
||||
"beforeNavigateInfo": {
|
||||
"message": "Vuoi che Universal Bypass ti porti istantaneamente a destinazione?"
|
||||
},
|
||||
"blockedTitle": {
|
||||
"message": "Universal Bypass ha impedito la registrazione del tuo IP."
|
||||
},
|
||||
"blockedSubtitle": {
|
||||
"message": "Non vuoi che Universal Bypass impedisca ai malintenzionati di ottenere il tuo IP?"
|
||||
},
|
||||
"crowdBypassed": {
|
||||
"message": "Forse non dovrai aspettare!"
|
||||
},
|
||||
"crowdBypassedInfo": {
|
||||
"message": "Altri utenti di Universal Bypass hanno già aspettato e hanno riferito che questo porta a%"
|
||||
},
|
||||
"crowdBypassedIgnore": {
|
||||
"message": "Non era corretto?"
|
||||
}
|
||||
}
|
56
_locales/ja/messages.json
Normal file
@ -0,0 +1,56 @@
|
||||
{
|
||||
"appDesc": {
|
||||
"message": "ユニバーサルバイパスは、迷惑な短縮URLを自動的にスキップします。コンプライアンスとあなたの時間を無駄にしません。"
|
||||
},
|
||||
"firstrunTitle": {
|
||||
"message": "ユニバーサルバイパスをインストールしていただきありがとうございます!"
|
||||
},
|
||||
"firstrunSubtitle": {
|
||||
"message": "素晴らしいです!"
|
||||
},
|
||||
"firstrunNoScript": {
|
||||
"message": "あなたはNoScriptなどを使用しているようですが、ユニバーサルバイパスとは互換性がありません。"
|
||||
},
|
||||
"options": {
|
||||
"message": "オプション"
|
||||
},
|
||||
"optionsEnabled": {
|
||||
"message": "ウェブサイトのバイパスを有効化する"
|
||||
},
|
||||
"optionsInstantNavigation": {
|
||||
"message": "即座にリンク先へ移動します。"
|
||||
},
|
||||
"optionsTrackerBypass": {
|
||||
"message": "Apimon.deを使用してトラッカーをバイパスする"
|
||||
},
|
||||
"optionsBlockIPLoggers": {
|
||||
"message": "バイパスできない場合は、IPロガーをブロックする"
|
||||
},
|
||||
"optionsCrowdBypass": {
|
||||
"message": "バイパスできない短縮urlの行き先を設定する"
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "プライバシーポリシー"
|
||||
},
|
||||
"optionsUserscripts": {
|
||||
"message": "カスタムバイパス"
|
||||
},
|
||||
"beforeNavigate": {
|
||||
"message": "リンク先まであと少しです。"
|
||||
},
|
||||
"beforeNavigateDestination": {
|
||||
"message": "リンク先は %"
|
||||
},
|
||||
"blockedTitle": {
|
||||
"message": "ユニバーサルバイパスにより、IPがログに記録されなくなりました。"
|
||||
},
|
||||
"crowdBypassed": {
|
||||
"message": "あなたは待つ必要はありません!"
|
||||
},
|
||||
"crowdBypassedInfo": {
|
||||
"message": "他のユニバーサルバイパスユーザーはすでにあなたを待っていて、これが % につながっていると報告しています。"
|
||||
},
|
||||
"crowdBypassedIgnore": {
|
||||
"message": "これは間違っていたのですか?"
|
||||
}
|
||||
}
|
41
_locales/ko/messages.json
Normal file
@ -0,0 +1,41 @@
|
||||
{
|
||||
"appDesc": {
|
||||
"message": "순하게 시간을 낭비하고 있지 마세요. Universal Bypass로 성가신 URL 단축 서비스를 자동 생략하세요."
|
||||
},
|
||||
"firstrunTitle": {
|
||||
"message": "Universal Bypass를 설치해 주셔서 감사합니다!"
|
||||
},
|
||||
"firstrunSubtitle": {
|
||||
"message": "당신은 멋쟁이에요!"
|
||||
},
|
||||
"firstrunNoScript": {
|
||||
"message": "물론, NoScript나 그와 비슷한 걸 쓰는 것 같지만, Universal Bypass는 그런 것들과 호환되지 않습니다."
|
||||
},
|
||||
"optionsTrackerBypass": {
|
||||
"message": "Apimon.de 로 추적 우회하기."
|
||||
},
|
||||
"optionsBlockIPLoggers": {
|
||||
"message": "우회할 수 없다면 해당 페이지를 차단합니다."
|
||||
},
|
||||
"optionsCrowdBypass": {
|
||||
"message": "우회할 수 없는 URL 단축 사이트 목적지 주고 받기."
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "개인정보 취급방침"
|
||||
},
|
||||
"optionsUserscripts": {
|
||||
"message": "사용자 지정 우회책"
|
||||
},
|
||||
"blockedTitle": {
|
||||
"message": "Universal Bypass가 당신의 IP를 기록하지 못하게 막았습니다."
|
||||
},
|
||||
"crowdBypassed": {
|
||||
"message": "이제 기다리지 않을 겁니다!"
|
||||
},
|
||||
"crowdBypassedInfo": {
|
||||
"message": "다른 Universal Bypass 사용자가 이미 기다리고 있고, 끝난 순간에 % 로 이동합니다."
|
||||
},
|
||||
"crowdBypassedIgnore": {
|
||||
"message": "올바르지 않나요?"
|
||||
}
|
||||
}
|
@ -8,52 +8,61 @@
|
||||
"firstrunSubtitle": {
|
||||
"message": "Je bent geweldig!"
|
||||
},
|
||||
"firstrunWhatnow": {
|
||||
"message": "Wat je nu kan doen:"
|
||||
"firstrunNoScript": {
|
||||
"message": "U lijkt NoScript of dergelijke te gebruiken, daarmee werkt Universal Bypass niet."
|
||||
},
|
||||
"firstrunOptions": {
|
||||
"message": "Wijzig de Universal Bypass-opties."
|
||||
},
|
||||
"firstrunTwitter": {
|
||||
"message": "Volg Universal Bypass op Twitter om altijd op de hoogte te blijven van Universal Bypass."
|
||||
},
|
||||
"homepage": {
|
||||
"message": "Startpagina"
|
||||
},
|
||||
"popupOptions": {
|
||||
"message": "Opties"
|
||||
"faq": {
|
||||
"message": "Veelgestelde Vragen (FAQ)"
|
||||
},
|
||||
"options": {
|
||||
"message": "Universal Bypass Opties"
|
||||
"message": "Opties"
|
||||
},
|
||||
"save": {
|
||||
"message": "Opslaan"
|
||||
"optionsEnabled": {
|
||||
"message": "Website bypass inschakelen."
|
||||
},
|
||||
"optionsNotifications": {
|
||||
"message": "Toon statusmeldingen op websites die Universal Bypass kent."
|
||||
"optionsInstantNavigation": {
|
||||
"message": "Stuur me gelijk door naar de site."
|
||||
},
|
||||
"optionsTrackerBypass": {
|
||||
"message": "Omzeil trackers met behulp van Apimon.de."
|
||||
},
|
||||
"optionsBlockIPLoggers": {
|
||||
"message": "Blokkeer IP-loggers als ze niet kunnen worden omzeilt."
|
||||
},
|
||||
"optionsCrowdBypass": {
|
||||
"message": "Geef en neem de bestemmingen van ondoorlaatbare verkortingen."
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Privacy Verklaring"
|
||||
},
|
||||
"optionsUserscripts": {
|
||||
"message": "Aangepaste bypasses"
|
||||
},
|
||||
"optionsUserscriptsSubtitle": {
|
||||
"message": "Het zou leuk zijn als je je eigen toevoegingen naar GitHub zou kunnen aanbieden, zodat anderen er profijt van kunnen hebben: "
|
||||
"message": "Het zou leuk zijn als je je eigen toevoegingen op Github zou publiceren, zodat anderen er ook profijt van kunnen hebben."
|
||||
},
|
||||
"optionsUserscriptsName": {
|
||||
"message": "Naam. Met een lege naam wordt deze bypass verwijderd."
|
||||
"beforeNavigate": {
|
||||
"message": "Je bent bijna op je bestemming."
|
||||
},
|
||||
"optionsUserscriptsDomains": {
|
||||
"message": "Domeinen. Gebruik * om deze bypass overal effectief te maken."
|
||||
"beforeNavigateDestination": {
|
||||
"message": "Uw bestemming is %"
|
||||
},
|
||||
"optionsUserscriptsDelete": {
|
||||
"message": "Verwijder Bypass"
|
||||
"beforeNavigateInfo": {
|
||||
"message": "Wilt u dat Universal Bypass u direct doorstuurt naar uw bestemming?"
|
||||
},
|
||||
"notificationTimerSkip": {
|
||||
"message": "Universal Bypass heeft die timer voor u overgeslagen."
|
||||
"blockedTitle": {
|
||||
"message": "Universal Bypass voorkomt dat uw IP wordt geregistreerd."
|
||||
},
|
||||
"notificationTimerLeap": {
|
||||
"message": "Universal Bypass heeft zojuist %sec% seconde(n) uit die timer verwijderd."
|
||||
"blockedSubtitle": {
|
||||
"message": "Weet u zeker dat u IP-Logger bescherming wilt uitschakelen?"
|
||||
},
|
||||
"notificationBackend": {
|
||||
"message": "Universal Bypass kan deze site niet omzeilen omdat ze een controle aan de serverzijde hebben."
|
||||
"crowdBypassed": {
|
||||
"message": "U hoeft misschien niet te wachten!"
|
||||
},
|
||||
"crowdBypassedInfo": {
|
||||
"message": "Andere Universal Bypass-gebruikers hebben al aangegeven dat dit aan % ligt"
|
||||
},
|
||||
"crowdBypassedIgnore": {
|
||||
"message": "Klopt dit niet?"
|
||||
}
|
||||
}
|
41
_locales/no/messages.json
Normal file
@ -0,0 +1,41 @@
|
||||
{
|
||||
"appDesc": {
|
||||
"message": "Ikke kast bort tiden din på å følge krav. Universal Bypass hopper automatisk over irriterende lenkeforkortere."
|
||||
},
|
||||
"firstrunTitle": {
|
||||
"message": "Takk for at du har installert Universal Bypass!"
|
||||
},
|
||||
"firstrunSubtitle": {
|
||||
"message": "Du er fantastisk!"
|
||||
},
|
||||
"firstrunNoScript": {
|
||||
"message": "Men du ser ut til å bruke NoScript eller noe lignende, som Universal Bypass ikke er kompatibel med."
|
||||
},
|
||||
"optionsTrackerBypass": {
|
||||
"message": "Hopp forbi sporere ved hjelp av Apimon.de."
|
||||
},
|
||||
"optionsBlockIPLoggers": {
|
||||
"message": "Blokker IP-loggførere dersom de ikke kan bli hoppet forbi."
|
||||
},
|
||||
"optionsCrowdBypass": {
|
||||
"message": "Gi og ta ankomstpunktene til upasserbare forkortere."
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Privatlivsretningslinjer"
|
||||
},
|
||||
"optionsUserscripts": {
|
||||
"message": "Tilpassede forbipasserere"
|
||||
},
|
||||
"blockedTitle": {
|
||||
"message": "Universal Bypass hindret IP-adressen din fra å bli loggført."
|
||||
},
|
||||
"crowdBypassed": {
|
||||
"message": "Du vil kanskje ikke måtte vente!"
|
||||
},
|
||||
"crowdBypassedInfo": {
|
||||
"message": "Andre Universal Bypass-brukere har allerede ventet på deg, og har meldt ifra om at dette fører til %"
|
||||
},
|
||||
"crowdBypassedIgnore": {
|
||||
"message": "Var ikke dette korrekt?"
|
||||
}
|
||||
}
|
68
_locales/pt-PT/messages.json
Normal file
@ -0,0 +1,68 @@
|
||||
{
|
||||
"appDesc": {
|
||||
"message": "Não perca tempo com conformidades. O Universal Bypass automaticamente ignora encurtadores de links irritantes."
|
||||
},
|
||||
"firstrunTitle": {
|
||||
"message": "Obrigado por instalar o Universal Bypass!"
|
||||
},
|
||||
"firstrunSubtitle": {
|
||||
"message": "Você é demais!"
|
||||
},
|
||||
"firstrunNoScript": {
|
||||
"message": "No entanto, parece que você está usando o NoScript ou similar, com o qual o Universal Bypass não é compatível."
|
||||
},
|
||||
"faq": {
|
||||
"message": "Perguntas Frequentes (FAQ)"
|
||||
},
|
||||
"options": {
|
||||
"message": "Opções"
|
||||
},
|
||||
"optionsEnabled": {
|
||||
"message": "Habilite bypasses de websites."
|
||||
},
|
||||
"optionsInstantNavigation": {
|
||||
"message": "Levar-me instantaneamente aos destinos."
|
||||
},
|
||||
"optionsTrackerBypass": {
|
||||
"message": "Ignorar rastreadores usando Apimon.de."
|
||||
},
|
||||
"optionsBlockIPLoggers": {
|
||||
"message": "Bloqueie os registradores de IP se eles não puderem ser ignorados."
|
||||
},
|
||||
"optionsCrowdBypass": {
|
||||
"message": "Dê e pegue o destino de encurtadores não-passáveis."
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Política de Privacidade"
|
||||
},
|
||||
"optionsUserscripts": {
|
||||
"message": "Bypasses Personalizados"
|
||||
},
|
||||
"optionsUserscriptsSubtitle": {
|
||||
"message": "Seria legal se você pudesse enviar bypasses funcionais para o GitHub, para que outros se beneficiem deles."
|
||||
},
|
||||
"beforeNavigate": {
|
||||
"message": "Você está quase no seu destino."
|
||||
},
|
||||
"beforeNavigateDestination": {
|
||||
"message": "Seu destino é %"
|
||||
},
|
||||
"beforeNavigateInfo": {
|
||||
"message": "Deseja que o Universal Bypass instantaneamente redirecione você para o seu destino?"
|
||||
},
|
||||
"blockedTitle": {
|
||||
"message": "O Universal Bypass preveniu que seu IP fosse registrado."
|
||||
},
|
||||
"blockedSubtitle": {
|
||||
"message": "Você quer que o Universal Bypass previna que pessoas mal intencionadas obtenham seu IP?"
|
||||
},
|
||||
"crowdBypassed": {
|
||||
"message": "Talvez você não precise esperar!"
|
||||
},
|
||||
"crowdBypassedInfo": {
|
||||
"message": "Outros usuários do Universal Bypass já esperaram para você e reportaram que isto leva para %"
|
||||
},
|
||||
"crowdBypassedIgnore": {
|
||||
"message": "Isto não estava correto?"
|
||||
}
|
||||
}
|
68
_locales/ru/messages.json
Normal file
@ -0,0 +1,68 @@
|
||||
{
|
||||
"appDesc": {
|
||||
"message": "Не тратьте зря своё время на уступчивость. Universal Bypass автоматически пропускает раздражающие сокращатели ссылок."
|
||||
},
|
||||
"firstrunTitle": {
|
||||
"message": "Спасибо за установку Universal Bypass!"
|
||||
},
|
||||
"firstrunSubtitle": {
|
||||
"message": "Вы восхитительны!"
|
||||
},
|
||||
"firstrunNoScript": {
|
||||
"message": "Тем не менее, похоже, что Вы используете NoScript или что-то подобное, с чем Universal Bypass несовместим."
|
||||
},
|
||||
"faq": {
|
||||
"message": "Часто задаваемые вопросы (FAQ)"
|
||||
},
|
||||
"options": {
|
||||
"message": "Настройки"
|
||||
},
|
||||
"optionsEnabled": {
|
||||
"message": "Включить обходы веб-сайтов."
|
||||
},
|
||||
"optionsInstantNavigation": {
|
||||
"message": "Сразу переходить по адресу назначения."
|
||||
},
|
||||
"optionsTrackerBypass": {
|
||||
"message": "Обходить средства слежки, используя Apimon.de."
|
||||
},
|
||||
"optionsBlockIPLoggers": {
|
||||
"message": "Блокировать всех сохраняющих IP, если их нельзя обойти."
|
||||
},
|
||||
"optionsCrowdBypass": {
|
||||
"message": "Отправлять и принимать адреса назначения сокращателей, которых невозможно обойти."
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Политика конфиденциальности"
|
||||
},
|
||||
"optionsUserscripts": {
|
||||
"message": "Пользовательские обходы"
|
||||
},
|
||||
"optionsUserscriptsSubtitle": {
|
||||
"message": "Было бы хорошо, если бы Вы могли сообщить о работающих обходах на GitHub, чтобы они стали полезны другим людям."
|
||||
},
|
||||
"beforeNavigate": {
|
||||
"message": "Вы почти достигли адреса назначения."
|
||||
},
|
||||
"beforeNavigateDestination": {
|
||||
"message": "Ваш адрес назначения - %"
|
||||
},
|
||||
"beforeNavigateInfo": {
|
||||
"message": "Хотите ли Вы, чтобы Universal Bypass сразу перенаправлял Вас по адресу назначения?"
|
||||
},
|
||||
"blockedTitle": {
|
||||
"message": "Universal Bypass предотвратил запись Вашего IP."
|
||||
},
|
||||
"blockedSubtitle": {
|
||||
"message": "Не хотите, чтобы Universal Bypass предотвращал получение Вашего IP нежелательными лицами?"
|
||||
},
|
||||
"crowdBypassed": {
|
||||
"message": "Вы можете не ждать!"
|
||||
},
|
||||
"crowdBypassedInfo": {
|
||||
"message": "Другие пользователи Universal Bypass уже подождали за Вас и сообщили, что это ведёт на %"
|
||||
},
|
||||
"crowdBypassedIgnore": {
|
||||
"message": "Это было неправильно?"
|
||||
}
|
||||
}
|
68
_locales/sv-SE/messages.json
Normal file
@ -0,0 +1,68 @@
|
||||
{
|
||||
"appDesc": {
|
||||
"message": "Slösa inte bort din tid med samstämmighet. Universal Bypass hoppar automatiskt över irriterande länkförkortare."
|
||||
},
|
||||
"firstrunTitle": {
|
||||
"message": "Tack för att du installerat Universal Bypass!"
|
||||
},
|
||||
"firstrunSubtitle": {
|
||||
"message": "Du är fantastisk!"
|
||||
},
|
||||
"firstrunNoScript": {
|
||||
"message": "Det verkar som om du använder NoScript eller något liknande vilket Universal Bypass inte är kompatibel med."
|
||||
},
|
||||
"faq": {
|
||||
"message": "Vanliga frågor (FAQ)"
|
||||
},
|
||||
"options": {
|
||||
"message": "Alternativ"
|
||||
},
|
||||
"optionsEnabled": {
|
||||
"message": "Aktivera förbikopplingar av webbplats."
|
||||
},
|
||||
"optionsInstantNavigation": {
|
||||
"message": "Ta mig omedelbart till målen."
|
||||
},
|
||||
"optionsTrackerBypass": {
|
||||
"message": "Förbikopplare som använder Apimon.de."
|
||||
},
|
||||
"optionsBlockIPLoggers": {
|
||||
"message": "Blockera IP-loggerare om de inte kan förbikopplas."
|
||||
},
|
||||
"optionsCrowdBypass": {
|
||||
"message": "Ge och ta destinationerna för icke förbikopplade länkförkortare."
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Integritetspolicy"
|
||||
},
|
||||
"optionsUserscripts": {
|
||||
"message": "Anpassade förbikopplingar"
|
||||
},
|
||||
"optionsUserscriptsSubtitle": {
|
||||
"message": "Det vore snällt om du kunde skicka upp fungerande förbikopplingar till GitHub, så andra också kan ha nytta av dem."
|
||||
},
|
||||
"beforeNavigate": {
|
||||
"message": "Du har nästan nått ditt mål."
|
||||
},
|
||||
"beforeNavigateDestination": {
|
||||
"message": "Ditt mål är %"
|
||||
},
|
||||
"beforeNavigateInfo": {
|
||||
"message": "Vill du att Universal Bypass omdirigerar dig direkt till ditt mål?"
|
||||
},
|
||||
"blockedTitle": {
|
||||
"message": "Universal Bypass förhindrade din IP-adress från att loggas."
|
||||
},
|
||||
"blockedSubtitle": {
|
||||
"message": "Vill du inte att Universal Bypass ska förhindra skurkar från att få tag på din IP-adress?"
|
||||
},
|
||||
"crowdBypassed": {
|
||||
"message": "Det är inte säkert du behöver vänta!"
|
||||
},
|
||||
"crowdBypassedInfo": {
|
||||
"message": "Andra användare av Universal Bypass har redan väntat på dig och rapporterat att denna leder till %"
|
||||
},
|
||||
"crowdBypassedIgnore": {
|
||||
"message": "Var detta inte korrekt?"
|
||||
}
|
||||
}
|
29
_locales/th/messages.json
Normal file
@ -0,0 +1,29 @@
|
||||
{
|
||||
"appDesc": {
|
||||
"message": "อย่าไปเสียเวลากับสิ่งที่ต้องทำตามมัน Universal Bypass ช่วยให้คุณข้ามพวกตัวย่อลิงค์ที่โครตราคาญให้อัตโนมัติ"
|
||||
},
|
||||
"firstrunTitle": {
|
||||
"message": "ขอขอบคุณที่ติดตั้ง Universal Bypass!"
|
||||
},
|
||||
"firstrunSubtitle": {
|
||||
"message": "คุณนี้มันเจ๋งจริงๆเลยแหะ!"
|
||||
},
|
||||
"firstrunNoScript": {
|
||||
"message": "แต่อย่างไรก็ตาม ดูเหมือนคุณกำลังใช้ NoScript หรืออะไรที่มันคล้ายๆกัน ซึ่ง Universal Bypass นั้นไม่เข้ากันกับพวกนี้"
|
||||
},
|
||||
"optionsBlockIPLoggers": {
|
||||
"message": "หยุดตัวบันทึก IP ถ้าเขาไม่สามารถให้ผ่านไปได้"
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "นโยบายความเป็นส่วนตัว"
|
||||
},
|
||||
"optionsUserscripts": {
|
||||
"message": "สร้างตัวข้ามเอง"
|
||||
},
|
||||
"blockedTitle": {
|
||||
"message": "Universal Bypass ช่วยป้องกัน IP คุณจากการถูกเก็บประวัติ"
|
||||
},
|
||||
"crowdBypassed": {
|
||||
"message": "คุณอาจไม่ต้องรออีกต่อไป!"
|
||||
}
|
||||
}
|
62
_locales/tr/messages.json
Normal file
@ -0,0 +1,62 @@
|
||||
{
|
||||
"appDesc": {
|
||||
"message": "Zamanınızı karmaşa ile harcamayın. Universal Bypass, rahatsız edici bağlantı kısaltıcıları kendiliğinden geçer."
|
||||
},
|
||||
"firstrunTitle": {
|
||||
"message": "Universal Bypass'i kurduğunuz için çok teşekkürler!"
|
||||
},
|
||||
"firstrunSubtitle": {
|
||||
"message": "Harikasınız!"
|
||||
},
|
||||
"firstrunNoScript": {
|
||||
"message": "Ancak görünen o ki Universal Baypass'in uyumlu olmadığı NoScript veya benzeri bir betik kullanıyorsunuz."
|
||||
},
|
||||
"options": {
|
||||
"message": "Seçenekler"
|
||||
},
|
||||
"optionsEnabled": {
|
||||
"message": "Web sayfalarını es geçmeyi etkinleştir."
|
||||
},
|
||||
"optionsInstantNavigation": {
|
||||
"message": "Beni anında hedef adrese yönlendir."
|
||||
},
|
||||
"optionsTrackerBypass": {
|
||||
"message": "Apimon.de kullanan bypass izleyicileri."
|
||||
},
|
||||
"optionsBlockIPLoggers": {
|
||||
"message": "Eğer es geçilemezse IP kayıtçılarını engelle."
|
||||
},
|
||||
"optionsCrowdBypass": {
|
||||
"message": "Ötürülə bilməyən qısaldıcıların yerlərini götür və apar."
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Gizlilik Sözleşmesi"
|
||||
},
|
||||
"optionsUserscripts": {
|
||||
"message": "Özel Bypasslar"
|
||||
},
|
||||
"beforeNavigate": {
|
||||
"message": "Neredeyse vardınız."
|
||||
},
|
||||
"beforeNavigateDestination": {
|
||||
"message": "Hedefiniz: %"
|
||||
},
|
||||
"beforeNavigateInfo": {
|
||||
"message": "Universal Bypass'in sizi doğrudan hedefe yönlendirmesini ister misiniz?"
|
||||
},
|
||||
"blockedTitle": {
|
||||
"message": "Universal Bypass, IP adresinizin kayıtlara eklenmesini engelledi."
|
||||
},
|
||||
"blockedSubtitle": {
|
||||
"message": "Universal Bypass'in sizi kötü adamların IP adresinizi almasından korumasını istemiyor musunuz?"
|
||||
},
|
||||
"crowdBypassed": {
|
||||
"message": "Beklemek zorunda değilsin!"
|
||||
},
|
||||
"crowdBypassedInfo": {
|
||||
"message": "Diğer Universal Baypass kullanıcıları sizin yerinize beklediler ve bunun % 'e gittiğini bildirdiler."
|
||||
},
|
||||
"crowdBypassedIgnore": {
|
||||
"message": "Bu doğru değil miydi?"
|
||||
}
|
||||
}
|
68
_locales/vi/messages.json
Normal file
@ -0,0 +1,68 @@
|
||||
{
|
||||
"appDesc": {
|
||||
"message": "Đừng lãng phí thời gian của bạn. Universal Bypass tự động bỏ qua các liên kết rút gọn phiền phức."
|
||||
},
|
||||
"firstrunTitle": {
|
||||
"message": "Cảm ơn bạn đã cài đặt Universal Bypass!"
|
||||
},
|
||||
"firstrunSubtitle": {
|
||||
"message": "Bạn thật tuyệt vời!"
|
||||
},
|
||||
"firstrunNoScript": {
|
||||
"message": "Tuy nhiên, bạn dường như sử dụng NoScript hoặc tương tự, mà Universal Bypass không tương thích với."
|
||||
},
|
||||
"faq": {
|
||||
"message": "Câu Hỏi Thường Gặp (FAQ)"
|
||||
},
|
||||
"options": {
|
||||
"message": "Tùy chỉnh"
|
||||
},
|
||||
"optionsEnabled": {
|
||||
"message": "Bật bỏ qua website."
|
||||
},
|
||||
"optionsInstantNavigation": {
|
||||
"message": "Lập tức dẫn tôi đến đích đến."
|
||||
},
|
||||
"optionsTrackerBypass": {
|
||||
"message": "Bỏ qua trackers bằng cách sử dụng Apimon.de."
|
||||
},
|
||||
"optionsBlockIPLoggers": {
|
||||
"message": "Chặn IP Logger nếu nó không thể bỏ qua."
|
||||
},
|
||||
"optionsCrowdBypass": {
|
||||
"message": "Gửi và lấy đích đến của rút gọn chưa thế bypass."
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "Chính sách bảo mật"
|
||||
},
|
||||
"optionsUserscripts": {
|
||||
"message": "Bypasses tùy chỉnh"
|
||||
},
|
||||
"optionsUserscriptsSubtitle": {
|
||||
"message": "Sẽ thật tuyệt vời nếu bạn có thể gửi Code bỏ qua hoạt động được lên GitHub, để giúp đỡ người khác."
|
||||
},
|
||||
"beforeNavigate": {
|
||||
"message": "Bạn sắp đến đích đến."
|
||||
},
|
||||
"beforeNavigateDestination": {
|
||||
"message": "Điểm đến của bạn là %"
|
||||
},
|
||||
"beforeNavigateInfo": {
|
||||
"message": "Bạn có muốn Universal Bypass chuyển hướng bạn đến đích đến của bạn ngay lập tức?"
|
||||
},
|
||||
"blockedTitle": {
|
||||
"message": "Universal Bypass đã ngăn chặn IP của bạn bị ghi lại."
|
||||
},
|
||||
"blockedSubtitle": {
|
||||
"message": "Không muốn Universal Bypass ngăn kẻ xấu lấy được IP của bạn?"
|
||||
},
|
||||
"crowdBypassed": {
|
||||
"message": "Bạn không cần phải đợi!"
|
||||
},
|
||||
"crowdBypassedInfo": {
|
||||
"message": "Người dùng Universal Bypass khác hiện đang chờ bạn và được báo cáo rằng điều này dẫn đến %"
|
||||
},
|
||||
"crowdBypassedIgnore": {
|
||||
"message": "Điều này chưa chính xác?"
|
||||
}
|
||||
}
|
68
_locales/zh-TW/messages.json
Normal file
@ -0,0 +1,68 @@
|
||||
{
|
||||
"appDesc": {
|
||||
"message": "別浪費時間在等待上!Universal Bypass 能夠全自動地繞過煩人的短連結!"
|
||||
},
|
||||
"firstrunTitle": {
|
||||
"message": "感謝您安裝 Universal Bypass!"
|
||||
},
|
||||
"firstrunSubtitle": {
|
||||
"message": "這真是令人驚嘆!"
|
||||
},
|
||||
"firstrunNoScript": {
|
||||
"message": "然而,您似乎安裝了 NoScript 或類似的插件,導致與 Universal Bypass 造成衝突。"
|
||||
},
|
||||
"faq": {
|
||||
"message": "常見問答 (FAQ)"
|
||||
},
|
||||
"options": {
|
||||
"message": "選項"
|
||||
},
|
||||
"optionsEnabled": {
|
||||
"message": "啟用網站繞過功能"
|
||||
},
|
||||
"optionsInstantNavigation": {
|
||||
"message": "跳過確認頁面,直接帶我到目的地。"
|
||||
},
|
||||
"optionsTrackerBypass": {
|
||||
"message": "利用 Apimon.de 繞過隱私追蹤器。"
|
||||
},
|
||||
"optionsBlockIPLoggers": {
|
||||
"message": "若實在無法繞過,直接禁止瀏覽器訪問IP記錄網站。"
|
||||
},
|
||||
"optionsCrowdBypass": {
|
||||
"message": "對於無法繞過的短連結,直接帶我到短連結頁面。"
|
||||
},
|
||||
"privacyPolicy": {
|
||||
"message": "隱私權政策"
|
||||
},
|
||||
"optionsUserscripts": {
|
||||
"message": "自定義繞過規則"
|
||||
},
|
||||
"optionsUserscriptsSubtitle": {
|
||||
"message": "如果您能夠在 GitHub 上協助添加新的繞過規則,那就實在太好了,如此一來大家都能夠受惠於您。"
|
||||
},
|
||||
"beforeNavigate": {
|
||||
"message": "您與目的地觸手可及。"
|
||||
},
|
||||
"beforeNavigateDestination": {
|
||||
"message": "您的目的地是 %"
|
||||
},
|
||||
"beforeNavigateInfo": {
|
||||
"message": "您希望下次 Universal Bypass 自動地帶您到目的地嗎?"
|
||||
},
|
||||
"blockedTitle": {
|
||||
"message": "Universal Bypass 防止您的IP被記錄。"
|
||||
},
|
||||
"blockedSubtitle": {
|
||||
"message": "不希望Universal Bypass自動防止不法者獲取您的IP嗎?"
|
||||
},
|
||||
"crowdBypassed": {
|
||||
"message": "或許您可以不用再等待了。"
|
||||
},
|
||||
"crowdBypassedInfo": {
|
||||
"message": "其他的 Universal Bypass 用戶已經替您省下寶貴的時間,並回報該短連結重導向 %"
|
||||
},
|
||||
"crowdBypassedIgnore": {
|
||||
"message": "該回報資訊有誤嗎?"
|
||||
}
|
||||
}
|
431
background.js
@ -1,3 +1,428 @@
|
||||
let r=chrome.runtime;
|
||||
r.onInstalled.addListener((d)=>{if(d.reason=="install")window.open(chrome.extension.getURL("/html/firstrun.html"))});
|
||||
r.setUninstallURL("https://goo.gl/forms/H8FswYQ2a37LSxc13");
|
||||
var brws = (typeof browser == "undefined" ? chrome : browser),
|
||||
platform = brws.runtime.getURL("").split("-")[0],
|
||||
//Keeping track of options
|
||||
enabled = true,
|
||||
instantNavigation = false,
|
||||
trackerBypassEnabled = true,
|
||||
blockIPLoggers = true,
|
||||
crowdEnabled = true,
|
||||
userscript="",
|
||||
getRedirect=url=>({redirectUrl:(instantNavigation?url:brws.runtime.getURL("html/before-navigate.html")+"?target="+encodeURIComponent(url))})
|
||||
encodedRedirect=url=>({redirectUrl:(instantNavigation?decodeURIComponent(url):brws.runtime.getURL("html/before-navigate.html")+"?target="+url)})
|
||||
brws.storage.sync.get(["disable","instant_navigation","no_tracker_bypass","allow_ip_loggers","crowd_bypass_opt_out"],res=>{
|
||||
if(res)
|
||||
{
|
||||
enabled=(!res.disable||res.disable!=="true")
|
||||
instantNavigation=(res.instant_navigation&&res.instant_navigation==="true")
|
||||
trackerBypassEnabled=(!res.no_tracker_bypass||res.no_tracker_bypass!=="true")
|
||||
blockIPLoggers=(!res.allow_ip_loggers||res.allow_ip_loggers!=="true")
|
||||
crowdEnabled=(!res.crowd_bypass_opt_out||res.crowd_bypass_opt_out!=="true")
|
||||
}
|
||||
})
|
||||
brws.storage.local.get(["userscript"],res=>{
|
||||
if(res&&res.userscript)
|
||||
{
|
||||
userscript=res.userscript
|
||||
}
|
||||
})
|
||||
brws.storage.onChanged.addListener(changes=>{
|
||||
if(changes.disable)
|
||||
{
|
||||
enabled=(changes.disable.newValue!=="true")
|
||||
}
|
||||
if(changes.instant_navigation)
|
||||
{
|
||||
instantNavigation=(changes.instant_navigation.newValue==="true")
|
||||
}
|
||||
if(changes.no_tracker_bypass)
|
||||
{
|
||||
trackerBypassEnabled=(changes.no_tracker_bypass.newValue!=="true")
|
||||
}
|
||||
if(changes.allow_ip_loggers)
|
||||
{
|
||||
blockIPLoggers=(changes.allow_ip_loggers.newValue!=="true")
|
||||
}
|
||||
if(changes.crowd_bypass_opt_out)
|
||||
{
|
||||
crowdEnabled=(changes.crowd_bypass_opt_out.newValue!=="true")
|
||||
}
|
||||
if(changes.userscript)
|
||||
{
|
||||
userscript=changes.userscript.newValue
|
||||
}
|
||||
})
|
||||
chrome.runtime.onMessage.addListener((req, sender, respond) => {
|
||||
respond({
|
||||
enabled: enabled,
|
||||
crowdEnabled: crowdEnabled,
|
||||
userscript: userscript
|
||||
})
|
||||
})
|
||||
|
||||
//Internal redirects to extension URLs to bypass content script limitations
|
||||
brws.webRequest.onBeforeRequest.addListener(details=>{
|
||||
if(details.url.substr(38)=="1")
|
||||
{
|
||||
return {redirectUrl:brws.runtime.getURL("html/firstrun.html")}
|
||||
}
|
||||
else
|
||||
{
|
||||
return {redirectUrl:brws.runtime.getURL("html/firstrun-noscript.html")}
|
||||
}
|
||||
},{types:["main_frame"],urls:["https://universal-bypass.org/firstrun?*"]},["blocking"])
|
||||
|
||||
brws.webRequest.onBeforeRequest.addListener(details=>{
|
||||
return encodedRedirect(details.url.substr(52))
|
||||
},{types:["main_frame"],urls:["https://universal-bypass.org/before-navigate?target=*"]},["blocking"])
|
||||
|
||||
brws.webRequest.onBeforeRequest.addListener(details=>{
|
||||
return {redirectUrl:brws.runtime.getURL("html/crowd-bypassed.html")+details.url.substr(43)}
|
||||
},{types:["main_frame"],urls:["https://universal-bypass.org/crowd-bypassed?*"]},["blocking"])
|
||||
|
||||
//Preflight Bypasses
|
||||
brws.webRequest.onBeforeRequest.addListener(details=>{
|
||||
if(enabled)
|
||||
{
|
||||
return getRedirect(details.url.substr(details.url.indexOf("url=")+4))
|
||||
}
|
||||
},{types:["main_frame"],urls:["*://*/st?api=*&url=*","*://*.zxro.com/u/*?url=*"]},["blocking"])
|
||||
|
||||
brws.webRequest.onBeforeRequest.addListener(details=>{
|
||||
if(enabled)
|
||||
{
|
||||
let url=new URL(details.url)
|
||||
if(url.searchParams.has("url"))
|
||||
{
|
||||
return getRedirect(url.searchParams.get("url"))
|
||||
}
|
||||
}
|
||||
},{types:["main_frame"],urls:[
|
||||
"*://*.raidcall.com.tw/direct.php?url=*",
|
||||
"*://*.raidcall.com.tw/direct.tips.php?url=*"
|
||||
]},["blocking"])
|
||||
|
||||
brws.webRequest.onBeforeRequest.addListener(details=>{
|
||||
if(enabled)
|
||||
{
|
||||
return encodedRedirect(details.url.substr(details.url.indexOf("link=")+5))
|
||||
}
|
||||
},{types:["main_frame"],urls:["*://*.spaste.com/r/*link=*",]},["blocking"])
|
||||
|
||||
brws.webRequest.onBeforeRequest.addListener(details=>{
|
||||
if(enabled)
|
||||
{
|
||||
return getRedirect(atob(details.url.substr(details.url.indexOf("?link=")+6)))
|
||||
}
|
||||
},{types:["main_frame"],urls:["*://*.leechpremium.link/cheat/?link=*"]},["blocking"])
|
||||
|
||||
brws.webRequest.onBeforeRequest.addListener(details=>{
|
||||
if(enabled)
|
||||
{
|
||||
return encodedRedirect(details.url.substr(details.url.indexOf("?s=")+3))
|
||||
}
|
||||
},{types:["main_frame"],urls:["*://*.ouo.io/s/*?s=*","*://*.cpmlink.net/s/*?s=*"]},["blocking"])
|
||||
|
||||
brws.webRequest.onBeforeRequest.addListener(details=>{
|
||||
if(enabled)
|
||||
{
|
||||
return encodedRedirect(details.url.substr(details.url.indexOf("/12/1/")+6))
|
||||
}
|
||||
},{types:["main_frame"],urls:["*://*.sh.st/r/*/12/1/*"]},["blocking"])
|
||||
|
||||
brws.webRequest.onBeforeRequest.addListener(details=>{
|
||||
if(enabled)
|
||||
{
|
||||
return encodedRedirect(details.url.substr(details.url.indexOf("/s/")+3))
|
||||
}
|
||||
},{types:["main_frame"],urls:["*://*.gslink.co/e/*/s/*"]},["blocking"])
|
||||
|
||||
brws.webRequest.onBeforeRequest.addListener(details=>{
|
||||
if(enabled)
|
||||
{
|
||||
let url=new URL(details.url)
|
||||
if(url.searchParams.has("u"))
|
||||
{
|
||||
return getRedirect(atob(url.searchParams.get("u"))+url.hash)
|
||||
}
|
||||
}
|
||||
},{types:["main_frame"],urls:["*://*.noriskdomain.com/*/analyze?*"]},["blocking"])
|
||||
|
||||
//Install & Uninstall Actions
|
||||
brws.runtime.onInstalled.addListener(details=>{
|
||||
if(details.reason == "install")
|
||||
{
|
||||
if(platform == "ms" || platform == "moz")
|
||||
{
|
||||
brws.windows.create({url: "https://universal-bypass.org/firstrun"})
|
||||
}
|
||||
else
|
||||
{
|
||||
setTimeout(()=>window.open("https://universal-bypass.org/firstrun"),1000)
|
||||
// For some reason, Chromium doesn't instantly register the webRequest handlers, so we're waiting.
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//Upgrade configuration
|
||||
brws.storage.local.get(["custom_bypasses"],result=>{
|
||||
if(!result||!result.custom_bypasses)
|
||||
{
|
||||
return
|
||||
}
|
||||
let customBypasses=JSON.parse(result.custom_bypasses),userscript=""
|
||||
for(let name in customBypasses)
|
||||
{
|
||||
userscript += "// " + name + "\ndomainBypass(\"" + customBypasses[name].domains + "\", ()=>{\n" + customBypasses[name].content + "})\n\n"
|
||||
}
|
||||
brws.storage.local.set({
|
||||
userscript: userscript
|
||||
}, ()=>brws.storage.local.remove("custom_bypasses"))
|
||||
})
|
||||
}
|
||||
})
|
||||
brws.runtime.setUninstallURL("https://docs.google.com/forms/d/e/1FAIpQLSdXw-Yf5IaDXZWw4fDHroZkDFOF6hgWEvVDaXT9ZADqnF2reg/viewform")
|
||||
|
||||
//Fixing Content-Security-Policy on Firefox because apparently extensions have no special privileges in Firefox
|
||||
if(platform == "moz")
|
||||
{
|
||||
brws.webRequest.onHeadersReceived.addListener(details=>{
|
||||
if(enabled)
|
||||
{
|
||||
let csp = false
|
||||
for(let i in details.responseHeaders)
|
||||
{
|
||||
if("value"in details.responseHeaders[i]&&["content-security-policy","x-content-security-policy"].indexOf(details.responseHeaders[i].name.toLowerCase())>-1)
|
||||
{
|
||||
csp = true
|
||||
let _policies = details.responseHeaders[i].value.replace(";,",";").split(";"),
|
||||
policies = {}
|
||||
for(let j in _policies)
|
||||
{
|
||||
let policy = _policies[j].trim(),name=policy.split(" ")[0]
|
||||
policies[name] = policy.substr(name.length).trim().split(" ")
|
||||
}
|
||||
if(!("script-src"in policies)&&"default-src"in policies)
|
||||
{
|
||||
policies["script-src"] = policies["default-src"]
|
||||
let ni = policies["script-src"].indexOf("'none'")
|
||||
if(ni > -1)
|
||||
{
|
||||
policies["script-src"].splice(ni, 1)
|
||||
}
|
||||
}
|
||||
if("script-src"in policies)
|
||||
{
|
||||
if(policies["script-src"].indexOf("'unsafe-inline'")==-1)
|
||||
{
|
||||
policies["script-src"].push("'unsafe-inline'")
|
||||
}
|
||||
if(policies["script-src"].indexOf("'unsafe-eval'")==-1)
|
||||
{
|
||||
policies["script-src"].push("'unsafe-eval'")
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
policies["script-src"]=["*","blob:","data:","'unsafe-inline'","'unsafe-eval'"]
|
||||
}
|
||||
let value=""
|
||||
for(let name in policies)
|
||||
{
|
||||
value+=name;
|
||||
for(let j in policies[name])
|
||||
{
|
||||
value+=" "+policies[name][j]
|
||||
}
|
||||
value+="; "
|
||||
}
|
||||
details.responseHeaders[i].value=value.substr(0,value.length-2)
|
||||
}
|
||||
}
|
||||
if(csp)
|
||||
{
|
||||
return{responseHeaders:details.responseHeaders}
|
||||
}
|
||||
}
|
||||
},{types:["main_frame"],urls:["<all_urls>"]},["blocking","responseHeaders"])
|
||||
}
|
||||
|
||||
//Tracker Bypass using Apimon.de; see options for more details.
|
||||
function resolveRedirect(url)
|
||||
{
|
||||
let xhr=new XMLHttpRequest(),destination
|
||||
xhr.onreadystatechange=()=>{
|
||||
if(xhr.readyState==4&&xhr.status==200)
|
||||
{
|
||||
let json=JSON.parse(xhr.responseText)
|
||||
if(json&&json.destination)
|
||||
destination=json.destination
|
||||
}
|
||||
}
|
||||
xhr.open("GET","https://apimon.de/redirect/"+encodeURIComponent(url),false)
|
||||
xhr.send()
|
||||
return destination
|
||||
}
|
||||
brws.webRequest.onBeforeRequest.addListener(details=>{
|
||||
if(trackerBypassEnabled && new URL(details.url).pathname != "/")
|
||||
{
|
||||
let destination = resolveRedirect(details.url)
|
||||
if(destination && destination != details.url)
|
||||
{
|
||||
return {redirectUrl: destination}
|
||||
}
|
||||
}
|
||||
},{
|
||||
types:["main_frame"],
|
||||
urls:[
|
||||
"*://*.great.social/*",
|
||||
"*://*.send.digital/*",
|
||||
"*://*.snipli.com/*",
|
||||
"*://*.shortcm.li/*",
|
||||
"*://*.page.link/*",
|
||||
"*://*.go2l.ink/*",
|
||||
"*://*.buff.ly/*",
|
||||
"*://*.snip.li/*",
|
||||
"*://*.hive.am/*",
|
||||
"*://*.cutt.ly/*",
|
||||
"*://*.tiny.ie/*",
|
||||
"*://*.bit.ly/*",
|
||||
"*://*.goo.gl/*",
|
||||
"*://*.bit.do/*",
|
||||
"*://*.t2m.io/*",
|
||||
"*://*.dis.gd/*",
|
||||
"*://*.zii.bz/*",
|
||||
"*://*.plu.sh/*",
|
||||
"*://*.b.link/*",
|
||||
"*://*.po.st/*",
|
||||
"*://*.ow.ly/*",
|
||||
"*://*.is.gd/*",
|
||||
"*://*.1b.yt/*",
|
||||
"*://*.1w.tf/*",
|
||||
"*://*.t.co/*",
|
||||
"*://*.x.co/*"
|
||||
]
|
||||
},["blocking"])
|
||||
brws.webRequest.onBeforeRequest.addListener(details=>{
|
||||
if(new URL(details.url).pathname != "/")
|
||||
{
|
||||
if(trackerBypassEnabled)
|
||||
{
|
||||
let destination = resolveRedirect(details.url)
|
||||
if(destination && destination != details.url)
|
||||
{
|
||||
return {redirectUrl: destination}
|
||||
}
|
||||
}
|
||||
if(blockIPLoggers)
|
||||
{
|
||||
return {redirectUrl: brws.runtime.getURL("html/blocked.html")}
|
||||
}
|
||||
}
|
||||
},{types:["main_frame"],urls:getIPLoggerPatterns()},["blocking"])
|
||||
function getIPLoggerPatterns()
|
||||
{
|
||||
let patterns=[],
|
||||
//https://github.com/timmyrs/Evil-Domains/blob/master/lists/IP%20Loggers.txt
|
||||
ipLoggers=`viral.over-blog.com
|
||||
gyazo.in
|
||||
ps3cfw.com
|
||||
urlz.fr
|
||||
webpanel.space
|
||||
steamcommumity.com
|
||||
i.imgur.com.de
|
||||
www.fuglekos.com
|
||||
|
||||
# Grabify
|
||||
|
||||
grabify.link
|
||||
bmwforum.co
|
||||
leancoding.co
|
||||
quickmessage.io
|
||||
spottyfly.com
|
||||
spötify.com
|
||||
stopify.co
|
||||
yoütu.be
|
||||
yoütübe.co
|
||||
yoütübe.com
|
||||
xda-developers.io
|
||||
starbucksiswrong.com
|
||||
starbucksisbadforyou.com
|
||||
bucks.as
|
||||
discörd.com
|
||||
minecräft.com
|
||||
cyberh1.xyz
|
||||
discördapp.com
|
||||
freegiftcards.co
|
||||
disçordapp.com
|
||||
rëddït.com
|
||||
|
||||
# Cyberhub (formerly SkypeGrab)
|
||||
|
||||
ġooģle.com
|
||||
drive.ġooģle.com
|
||||
maps.ġooģle.com
|
||||
disċordapp.com
|
||||
ìṃgur.com
|
||||
transferfiles.cloud
|
||||
tvshare.co
|
||||
publicwiki.me
|
||||
hbotv.co
|
||||
gameskeys.shop
|
||||
videoblog.tech
|
||||
twitch-stats.stream
|
||||
anonfiles.download
|
||||
bbcbloggers.co.uk
|
||||
|
||||
# Yip
|
||||
|
||||
yip.su
|
||||
iplogger.com
|
||||
iplogger.org
|
||||
iplogger.ru
|
||||
2no.co
|
||||
02ip.ru
|
||||
iplis.ru
|
||||
iplo.ru
|
||||
ezstat.ru
|
||||
|
||||
# What's their IP
|
||||
|
||||
www.whatstheirip.com
|
||||
www.hondachat.com
|
||||
www.bvog.com
|
||||
www.youramonkey.com
|
||||
|
||||
# Pronosparadise
|
||||
|
||||
pronosparadise.com
|
||||
freebooter.pro
|
||||
|
||||
# Blasze
|
||||
|
||||
blasze.com
|
||||
blasze.tk
|
||||
|
||||
# IPGrab
|
||||
|
||||
ipgrab.org
|
||||
i.gyazos.com`,
|
||||
lines=ipLoggers.split("\n")
|
||||
for(let i in lines)
|
||||
{
|
||||
let line=lines[i].trim();
|
||||
if(line&&line.substr(0,1)!="#")
|
||||
{
|
||||
if(line.substr(0,4)=="www.")
|
||||
line=line.substr(4)
|
||||
else if(line.substr(0,2)=="i.")
|
||||
line=line.substr(2)
|
||||
else if(line.substr(0,6)=="drive.")
|
||||
line=line.substr(6)
|
||||
else if(line.substr(0,5)=="maps.")
|
||||
line=line.substr(5)
|
||||
if(patterns.indexOf(line)==-1)
|
||||
patterns.push("*://*."+line+"/*")
|
||||
}
|
||||
}
|
||||
return patterns
|
||||
}
|
||||
|
1530
content_script.js
21618
html/ace/ace.js
Normal file
797
html/ace/mode-javascript.js
Normal file
@ -0,0 +1,797 @@
|
||||
ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) {
|
||||
"use strict";
|
||||
|
||||
var oop = require("../lib/oop");
|
||||
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
|
||||
|
||||
var DocCommentHighlightRules = function() {
|
||||
this.$rules = {
|
||||
"start" : [ {
|
||||
token : "comment.doc.tag",
|
||||
regex : "@[\\w\\d_]+" // TODO: fix email addresses
|
||||
},
|
||||
DocCommentHighlightRules.getTagRule(),
|
||||
{
|
||||
defaultToken : "comment.doc",
|
||||
caseInsensitive: true
|
||||
}]
|
||||
};
|
||||
};
|
||||
|
||||
oop.inherits(DocCommentHighlightRules, TextHighlightRules);
|
||||
|
||||
DocCommentHighlightRules.getTagRule = function(start) {
|
||||
return {
|
||||
token : "comment.doc.tag.storage.type",
|
||||
regex : "\\b(?:TODO|FIXME|XXX|HACK)\\b"
|
||||
};
|
||||
};
|
||||
|
||||
DocCommentHighlightRules.getStartRule = function(start) {
|
||||
return {
|
||||
token : "comment.doc", // doc comment
|
||||
regex : "\\/\\*(?=\\*)",
|
||||
next : start
|
||||
};
|
||||
};
|
||||
|
||||
DocCommentHighlightRules.getEndRule = function (start) {
|
||||
return {
|
||||
token : "comment.doc", // closing comment
|
||||
regex : "\\*\\/",
|
||||
next : start
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
exports.DocCommentHighlightRules = DocCommentHighlightRules;
|
||||
|
||||
});
|
||||
|
||||
ace.define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"], function(require, exports, module) {
|
||||
"use strict";
|
||||
|
||||
var oop = require("../lib/oop");
|
||||
var DocCommentHighlightRules = require("./doc_comment_highlight_rules").DocCommentHighlightRules;
|
||||
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
|
||||
var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*";
|
||||
|
||||
var JavaScriptHighlightRules = function(options) {
|
||||
var keywordMapper = this.createKeywordMapper({
|
||||
"variable.language":
|
||||
"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|" + // Constructors
|
||||
"Namespace|QName|XML|XMLList|" + // E4X
|
||||
"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|" +
|
||||
"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|" +
|
||||
"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|" + // Errors
|
||||
"SyntaxError|TypeError|URIError|" +
|
||||
"decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|" + // Non-constructor functions
|
||||
"isNaN|parseFloat|parseInt|" +
|
||||
"JSON|Math|" + // Other
|
||||
"this|arguments|prototype|window|document" , // Pseudo
|
||||
"keyword":
|
||||
"const|yield|import|get|set|async|await|" +
|
||||
"break|case|catch|continue|default|delete|do|else|finally|for|function|" +
|
||||
"if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|" +
|
||||
"__parent__|__count__|escape|unescape|with|__proto__|" +
|
||||
"class|enum|extends|super|export|implements|private|public|interface|package|protected|static",
|
||||
"storage.type":
|
||||
"const|let|var|function",
|
||||
"constant.language":
|
||||
"null|Infinity|NaN|undefined",
|
||||
"support.function":
|
||||
"alert",
|
||||
"constant.language.boolean": "true|false"
|
||||
}, "identifier");
|
||||
var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void";
|
||||
|
||||
var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex
|
||||
"u[0-9a-fA-F]{4}|" + // unicode
|
||||
"u{[0-9a-fA-F]{1,6}}|" + // es6 unicode
|
||||
"[0-2][0-7]{0,2}|" + // oct
|
||||
"3[0-7][0-7]?|" + // oct
|
||||
"[4-7][0-7]?|" + //oct
|
||||
".)";
|
||||
this.$rules = {
|
||||
"no_regex" : [
|
||||
DocCommentHighlightRules.getStartRule("doc-start"),
|
||||
comments("no_regex"),
|
||||
{
|
||||
token : "string",
|
||||
regex : "'(?=.)",
|
||||
next : "qstring"
|
||||
}, {
|
||||
token : "string",
|
||||
regex : '"(?=.)',
|
||||
next : "qqstring"
|
||||
}, {
|
||||
token : "constant.numeric", // hexadecimal, octal and binary
|
||||
regex : /0(?:[xX][0-9a-fA-F]+|[oO][0-7]+|[bB][01]+)\b/
|
||||
}, {
|
||||
token : "constant.numeric", // decimal integers and floats
|
||||
regex : /(?:\d\d*(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+\b)?/
|
||||
}, {
|
||||
token : [
|
||||
"storage.type", "punctuation.operator", "support.function",
|
||||
"punctuation.operator", "entity.name.function", "text","keyword.operator"
|
||||
],
|
||||
regex : "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe +")(\\s*)(=)",
|
||||
next: "function_arguments"
|
||||
}, {
|
||||
token : [
|
||||
"storage.type", "punctuation.operator", "entity.name.function", "text",
|
||||
"keyword.operator", "text", "storage.type", "text", "paren.lparen"
|
||||
],
|
||||
regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",
|
||||
next: "function_arguments"
|
||||
}, {
|
||||
token : [
|
||||
"entity.name.function", "text", "keyword.operator", "text", "storage.type",
|
||||
"text", "paren.lparen"
|
||||
],
|
||||
regex : "(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",
|
||||
next: "function_arguments"
|
||||
}, {
|
||||
token : [
|
||||
"storage.type", "punctuation.operator", "entity.name.function", "text",
|
||||
"keyword.operator", "text",
|
||||
"storage.type", "text", "entity.name.function", "text", "paren.lparen"
|
||||
],
|
||||
regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()",
|
||||
next: "function_arguments"
|
||||
}, {
|
||||
token : [
|
||||
"storage.type", "text", "entity.name.function", "text", "paren.lparen"
|
||||
],
|
||||
regex : "(function)(\\s+)(" + identifierRe + ")(\\s*)(\\()",
|
||||
next: "function_arguments"
|
||||
}, {
|
||||
token : [
|
||||
"entity.name.function", "text", "punctuation.operator",
|
||||
"text", "storage.type", "text", "paren.lparen"
|
||||
],
|
||||
regex : "(" + identifierRe + ")(\\s*)(:)(\\s*)(function)(\\s*)(\\()",
|
||||
next: "function_arguments"
|
||||
}, {
|
||||
token : [
|
||||
"text", "text", "storage.type", "text", "paren.lparen"
|
||||
],
|
||||
regex : "(:)(\\s*)(function)(\\s*)(\\()",
|
||||
next: "function_arguments"
|
||||
}, {
|
||||
token : "keyword",
|
||||
regex : "from(?=\\s*('|\"))"
|
||||
}, {
|
||||
token : "keyword",
|
||||
regex : "(?:" + kwBeforeRe + ")\\b",
|
||||
next : "start"
|
||||
}, {
|
||||
token : ["support.constant"],
|
||||
regex : /that\b/
|
||||
}, {
|
||||
token : ["storage.type", "punctuation.operator", "support.function.firebug"],
|
||||
regex : /(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/
|
||||
}, {
|
||||
token : keywordMapper,
|
||||
regex : identifierRe
|
||||
}, {
|
||||
token : "punctuation.operator",
|
||||
regex : /[.](?![.])/,
|
||||
next : "property"
|
||||
}, {
|
||||
token : "storage.type",
|
||||
regex : /=>/,
|
||||
next : "start"
|
||||
}, {
|
||||
token : "keyword.operator",
|
||||
regex : /--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/,
|
||||
next : "start"
|
||||
}, {
|
||||
token : "punctuation.operator",
|
||||
regex : /[?:,;.]/,
|
||||
next : "start"
|
||||
}, {
|
||||
token : "paren.lparen",
|
||||
regex : /[\[({]/,
|
||||
next : "start"
|
||||
}, {
|
||||
token : "paren.rparen",
|
||||
regex : /[\])}]/
|
||||
}, {
|
||||
token: "comment",
|
||||
regex: /^#!.*$/
|
||||
}
|
||||
],
|
||||
property: [{
|
||||
token : "text",
|
||||
regex : "\\s+"
|
||||
}, {
|
||||
token : [
|
||||
"storage.type", "punctuation.operator", "entity.name.function", "text",
|
||||
"keyword.operator", "text",
|
||||
"storage.type", "text", "entity.name.function", "text", "paren.lparen"
|
||||
],
|
||||
regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()",
|
||||
next: "function_arguments"
|
||||
}, {
|
||||
token : "punctuation.operator",
|
||||
regex : /[.](?![.])/
|
||||
}, {
|
||||
token : "support.function",
|
||||
regex : /(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/
|
||||
}, {
|
||||
token : "support.function.dom",
|
||||
regex : /(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/
|
||||
}, {
|
||||
token : "support.constant",
|
||||
regex : /(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/
|
||||
}, {
|
||||
token : "identifier",
|
||||
regex : identifierRe
|
||||
}, {
|
||||
regex: "",
|
||||
token: "empty",
|
||||
next: "no_regex"
|
||||
}
|
||||
],
|
||||
"start": [
|
||||
DocCommentHighlightRules.getStartRule("doc-start"),
|
||||
comments("start"),
|
||||
{
|
||||
token: "string.regexp",
|
||||
regex: "\\/",
|
||||
next: "regex"
|
||||
}, {
|
||||
token : "text",
|
||||
regex : "\\s+|^$",
|
||||
next : "start"
|
||||
}, {
|
||||
token: "empty",
|
||||
regex: "",
|
||||
next: "no_regex"
|
||||
}
|
||||
],
|
||||
"regex": [
|
||||
{
|
||||
token: "regexp.keyword.operator",
|
||||
regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"
|
||||
}, {
|
||||
token: "string.regexp",
|
||||
regex: "/[sxngimy]*",
|
||||
next: "no_regex"
|
||||
}, {
|
||||
token : "invalid",
|
||||
regex: /\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/
|
||||
}, {
|
||||
token : "constant.language.escape",
|
||||
regex: /\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/
|
||||
}, {
|
||||
token : "constant.language.delimiter",
|
||||
regex: /\|/
|
||||
}, {
|
||||
token: "constant.language.escape",
|
||||
regex: /\[\^?/,
|
||||
next: "regex_character_class"
|
||||
}, {
|
||||
token: "empty",
|
||||
regex: "$",
|
||||
next: "no_regex"
|
||||
}, {
|
||||
defaultToken: "string.regexp"
|
||||
}
|
||||
],
|
||||
"regex_character_class": [
|
||||
{
|
||||
token: "regexp.charclass.keyword.operator",
|
||||
regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"
|
||||
}, {
|
||||
token: "constant.language.escape",
|
||||
regex: "]",
|
||||
next: "regex"
|
||||
}, {
|
||||
token: "constant.language.escape",
|
||||
regex: "-"
|
||||
}, {
|
||||
token: "empty",
|
||||
regex: "$",
|
||||
next: "no_regex"
|
||||
}, {
|
||||
defaultToken: "string.regexp.charachterclass"
|
||||
}
|
||||
],
|
||||
"function_arguments": [
|
||||
{
|
||||
token: "variable.parameter",
|
||||
regex: identifierRe
|
||||
}, {
|
||||
token: "punctuation.operator",
|
||||
regex: "[, ]+"
|
||||
}, {
|
||||
token: "punctuation.operator",
|
||||
regex: "$"
|
||||
}, {
|
||||
token: "empty",
|
||||
regex: "",
|
||||
next: "no_regex"
|
||||
}
|
||||
],
|
||||
"qqstring" : [
|
||||
{
|
||||
token : "constant.language.escape",
|
||||
regex : escapedRe
|
||||
}, {
|
||||
token : "string",
|
||||
regex : "\\\\$",
|
||||
consumeLineEnd : true
|
||||
}, {
|
||||
token : "string",
|
||||
regex : '"|$',
|
||||
next : "no_regex"
|
||||
}, {
|
||||
defaultToken: "string"
|
||||
}
|
||||
],
|
||||
"qstring" : [
|
||||
{
|
||||
token : "constant.language.escape",
|
||||
regex : escapedRe
|
||||
}, {
|
||||
token : "string",
|
||||
regex : "\\\\$",
|
||||
consumeLineEnd : true
|
||||
}, {
|
||||
token : "string",
|
||||
regex : "'|$",
|
||||
next : "no_regex"
|
||||
}, {
|
||||
defaultToken: "string"
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
|
||||
if (!options || !options.noES6) {
|
||||
this.$rules.no_regex.unshift({
|
||||
regex: "[{}]", onMatch: function(val, state, stack) {
|
||||
this.next = val == "{" ? this.nextState : "";
|
||||
if (val == "{" && stack.length) {
|
||||
stack.unshift("start", state);
|
||||
}
|
||||
else if (val == "}" && stack.length) {
|
||||
stack.shift();
|
||||
this.next = stack.shift();
|
||||
if (this.next.indexOf("string") != -1 || this.next.indexOf("jsx") != -1)
|
||||
return "paren.quasi.end";
|
||||
}
|
||||
return val == "{" ? "paren.lparen" : "paren.rparen";
|
||||
},
|
||||
nextState: "start"
|
||||
}, {
|
||||
token : "string.quasi.start",
|
||||
regex : /`/,
|
||||
push : [{
|
||||
token : "constant.language.escape",
|
||||
regex : escapedRe
|
||||
}, {
|
||||
token : "paren.quasi.start",
|
||||
regex : /\${/,
|
||||
push : "start"
|
||||
}, {
|
||||
token : "string.quasi.end",
|
||||
regex : /`/,
|
||||
next : "pop"
|
||||
}, {
|
||||
defaultToken: "string.quasi"
|
||||
}]
|
||||
});
|
||||
|
||||
if (!options || options.jsx != false)
|
||||
JSX.call(this);
|
||||
}
|
||||
|
||||
this.embedRules(DocCommentHighlightRules, "doc-",
|
||||
[ DocCommentHighlightRules.getEndRule("no_regex") ]);
|
||||
|
||||
this.normalizeRules();
|
||||
};
|
||||
|
||||
oop.inherits(JavaScriptHighlightRules, TextHighlightRules);
|
||||
|
||||
function JSX() {
|
||||
var tagRegex = identifierRe.replace("\\d", "\\d\\-");
|
||||
var jsxTag = {
|
||||
onMatch : function(val, state, stack) {
|
||||
var offset = val.charAt(1) == "/" ? 2 : 1;
|
||||
if (offset == 1) {
|
||||
if (state != this.nextState)
|
||||
stack.unshift(this.next, this.nextState, 0);
|
||||
else
|
||||
stack.unshift(this.next);
|
||||
stack[2]++;
|
||||
} else if (offset == 2) {
|
||||
if (state == this.nextState) {
|
||||
stack[1]--;
|
||||
if (!stack[1] || stack[1] < 0) {
|
||||
stack.shift();
|
||||
stack.shift();
|
||||
}
|
||||
}
|
||||
}
|
||||
return [{
|
||||
type: "meta.tag.punctuation." + (offset == 1 ? "" : "end-") + "tag-open.xml",
|
||||
value: val.slice(0, offset)
|
||||
}, {
|
||||
type: "meta.tag.tag-name.xml",
|
||||
value: val.substr(offset)
|
||||
}];
|
||||
},
|
||||
regex : "</?" + tagRegex + "",
|
||||
next: "jsxAttributes",
|
||||
nextState: "jsx"
|
||||
};
|
||||
this.$rules.start.unshift(jsxTag);
|
||||
var jsxJsRule = {
|
||||
regex: "{",
|
||||
token: "paren.quasi.start",
|
||||
push: "start"
|
||||
};
|
||||
this.$rules.jsx = [
|
||||
jsxJsRule,
|
||||
jsxTag,
|
||||
{include : "reference"},
|
||||
{defaultToken: "string"}
|
||||
];
|
||||
this.$rules.jsxAttributes = [{
|
||||
token : "meta.tag.punctuation.tag-close.xml",
|
||||
regex : "/?>",
|
||||
onMatch : function(value, currentState, stack) {
|
||||
if (currentState == stack[0])
|
||||
stack.shift();
|
||||
if (value.length == 2) {
|
||||
if (stack[0] == this.nextState)
|
||||
stack[1]--;
|
||||
if (!stack[1] || stack[1] < 0) {
|
||||
stack.splice(0, 2);
|
||||
}
|
||||
}
|
||||
this.next = stack[0] || "start";
|
||||
return [{type: this.token, value: value}];
|
||||
},
|
||||
nextState: "jsx"
|
||||
},
|
||||
jsxJsRule,
|
||||
comments("jsxAttributes"),
|
||||
{
|
||||
token : "entity.other.attribute-name.xml",
|
||||
regex : tagRegex
|
||||
}, {
|
||||
token : "keyword.operator.attribute-equals.xml",
|
||||
regex : "="
|
||||
}, {
|
||||
token : "text.tag-whitespace.xml",
|
||||
regex : "\\s+"
|
||||
}, {
|
||||
token : "string.attribute-value.xml",
|
||||
regex : "'",
|
||||
stateName : "jsx_attr_q",
|
||||
push : [
|
||||
{token : "string.attribute-value.xml", regex: "'", next: "pop"},
|
||||
{include : "reference"},
|
||||
{defaultToken : "string.attribute-value.xml"}
|
||||
]
|
||||
}, {
|
||||
token : "string.attribute-value.xml",
|
||||
regex : '"',
|
||||
stateName : "jsx_attr_qq",
|
||||
push : [
|
||||
{token : "string.attribute-value.xml", regex: '"', next: "pop"},
|
||||
{include : "reference"},
|
||||
{defaultToken : "string.attribute-value.xml"}
|
||||
]
|
||||
},
|
||||
jsxTag
|
||||
];
|
||||
this.$rules.reference = [{
|
||||
token : "constant.language.escape.reference.xml",
|
||||
regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"
|
||||
}];
|
||||
}
|
||||
|
||||
function comments(next) {
|
||||
return [
|
||||
{
|
||||
token : "comment", // multi line comment
|
||||
regex : /\/\*/,
|
||||
next: [
|
||||
DocCommentHighlightRules.getTagRule(),
|
||||
{token : "comment", regex : "\\*\\/", next : next || "pop"},
|
||||
{defaultToken : "comment", caseInsensitive: true}
|
||||
]
|
||||
}, {
|
||||
token : "comment",
|
||||
regex : "\\/\\/",
|
||||
next: [
|
||||
DocCommentHighlightRules.getTagRule(),
|
||||
{token : "comment", regex : "$|^", next : next || "pop"},
|
||||
{defaultToken : "comment", caseInsensitive: true}
|
||||
]
|
||||
}
|
||||
];
|
||||
}
|
||||
exports.JavaScriptHighlightRules = JavaScriptHighlightRules;
|
||||
});
|
||||
|
||||
ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) {
|
||||
"use strict";
|
||||
|
||||
var Range = require("../range").Range;
|
||||
|
||||
var MatchingBraceOutdent = function() {};
|
||||
|
||||
(function() {
|
||||
|
||||
this.checkOutdent = function(line, input) {
|
||||
if (! /^\s+$/.test(line))
|
||||
return false;
|
||||
|
||||
return /^\s*\}/.test(input);
|
||||
};
|
||||
|
||||
this.autoOutdent = function(doc, row) {
|
||||
var line = doc.getLine(row);
|
||||
var match = line.match(/^(\s*\})/);
|
||||
|
||||
if (!match) return 0;
|
||||
|
||||
var column = match[1].length;
|
||||
var openBracePos = doc.findMatchingBracket({row: row, column: column});
|
||||
|
||||
if (!openBracePos || openBracePos.row == row) return 0;
|
||||
|
||||
var indent = this.$getIndent(doc.getLine(openBracePos.row));
|
||||
doc.replace(new Range(row, 0, row, column-1), indent);
|
||||
};
|
||||
|
||||
this.$getIndent = function(line) {
|
||||
return line.match(/^\s*/)[0];
|
||||
};
|
||||
|
||||
}).call(MatchingBraceOutdent.prototype);
|
||||
|
||||
exports.MatchingBraceOutdent = MatchingBraceOutdent;
|
||||
});
|
||||
|
||||
ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) {
|
||||
"use strict";
|
||||
|
||||
var oop = require("../../lib/oop");
|
||||
var Range = require("../../range").Range;
|
||||
var BaseFoldMode = require("./fold_mode").FoldMode;
|
||||
|
||||
var FoldMode = exports.FoldMode = function(commentRegex) {
|
||||
if (commentRegex) {
|
||||
this.foldingStartMarker = new RegExp(
|
||||
this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start)
|
||||
);
|
||||
this.foldingStopMarker = new RegExp(
|
||||
this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end)
|
||||
);
|
||||
}
|
||||
};
|
||||
oop.inherits(FoldMode, BaseFoldMode);
|
||||
|
||||
(function() {
|
||||
|
||||
this.foldingStartMarker = /([\{\[\(])[^\}\]\)]*$|^\s*(\/\*)/;
|
||||
this.foldingStopMarker = /^[^\[\{\(]*([\}\]\)])|^[\s\*]*(\*\/)/;
|
||||
this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/;
|
||||
this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/;
|
||||
this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/;
|
||||
this._getFoldWidgetBase = this.getFoldWidget;
|
||||
this.getFoldWidget = function(session, foldStyle, row) {
|
||||
var line = session.getLine(row);
|
||||
|
||||
if (this.singleLineBlockCommentRe.test(line)) {
|
||||
if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))
|
||||
return "";
|
||||
}
|
||||
|
||||
var fw = this._getFoldWidgetBase(session, foldStyle, row);
|
||||
|
||||
if (!fw && this.startRegionRe.test(line))
|
||||
return "start"; // lineCommentRegionStart
|
||||
|
||||
return fw;
|
||||
};
|
||||
|
||||
this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {
|
||||
var line = session.getLine(row);
|
||||
|
||||
if (this.startRegionRe.test(line))
|
||||
return this.getCommentRegionBlock(session, line, row);
|
||||
|
||||
var match = line.match(this.foldingStartMarker);
|
||||
if (match) {
|
||||
var i = match.index;
|
||||
|
||||
if (match[1])
|
||||
return this.openingBracketBlock(session, match[1], row, i);
|
||||
|
||||
var range = session.getCommentFoldRange(row, i + match[0].length, 1);
|
||||
|
||||
if (range && !range.isMultiLine()) {
|
||||
if (forceMultiline) {
|
||||
range = this.getSectionRange(session, row);
|
||||
} else if (foldStyle != "all")
|
||||
range = null;
|
||||
}
|
||||
|
||||
return range;
|
||||
}
|
||||
|
||||
if (foldStyle === "markbegin")
|
||||
return;
|
||||
|
||||
var match = line.match(this.foldingStopMarker);
|
||||
if (match) {
|
||||
var i = match.index + match[0].length;
|
||||
|
||||
if (match[1])
|
||||
return this.closingBracketBlock(session, match[1], row, i);
|
||||
|
||||
return session.getCommentFoldRange(row, i, -1);
|
||||
}
|
||||
};
|
||||
|
||||
this.getSectionRange = function(session, row) {
|
||||
var line = session.getLine(row);
|
||||
var startIndent = line.search(/\S/);
|
||||
var startRow = row;
|
||||
var startColumn = line.length;
|
||||
row = row + 1;
|
||||
var endRow = row;
|
||||
var maxRow = session.getLength();
|
||||
while (++row < maxRow) {
|
||||
line = session.getLine(row);
|
||||
var indent = line.search(/\S/);
|
||||
if (indent === -1)
|
||||
continue;
|
||||
if (startIndent > indent)
|
||||
break;
|
||||
var subRange = this.getFoldWidgetRange(session, "all", row);
|
||||
|
||||
if (subRange) {
|
||||
if (subRange.start.row <= startRow) {
|
||||
break;
|
||||
} else if (subRange.isMultiLine()) {
|
||||
row = subRange.end.row;
|
||||
} else if (startIndent == indent) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
endRow = row;
|
||||
}
|
||||
|
||||
return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);
|
||||
};
|
||||
this.getCommentRegionBlock = function(session, line, row) {
|
||||
var startColumn = line.search(/\s*$/);
|
||||
var maxRow = session.getLength();
|
||||
var startRow = row;
|
||||
|
||||
var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/;
|
||||
var depth = 1;
|
||||
while (++row < maxRow) {
|
||||
line = session.getLine(row);
|
||||
var m = re.exec(line);
|
||||
if (!m) continue;
|
||||
if (m[1]) depth--;
|
||||
else depth++;
|
||||
|
||||
if (!depth) break;
|
||||
}
|
||||
|
||||
var endRow = row;
|
||||
if (endRow > startRow) {
|
||||
return new Range(startRow, startColumn, endRow, line.length);
|
||||
}
|
||||
};
|
||||
|
||||
}).call(FoldMode.prototype);
|
||||
|
||||
});
|
||||
|
||||
ace.define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"], function(require, exports, module) {
|
||||
"use strict";
|
||||
|
||||
var oop = require("../lib/oop");
|
||||
var TextMode = require("./text").Mode;
|
||||
var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules;
|
||||
var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent;
|
||||
var WorkerClient = require("../worker/worker_client").WorkerClient;
|
||||
var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour;
|
||||
var CStyleFoldMode = require("./folding/cstyle").FoldMode;
|
||||
|
||||
var Mode = function() {
|
||||
this.HighlightRules = JavaScriptHighlightRules;
|
||||
|
||||
this.$outdent = new MatchingBraceOutdent();
|
||||
this.$behaviour = new CstyleBehaviour();
|
||||
this.foldingRules = new CStyleFoldMode();
|
||||
};
|
||||
oop.inherits(Mode, TextMode);
|
||||
|
||||
(function() {
|
||||
|
||||
this.lineCommentStart = "//";
|
||||
this.blockComment = {start: "/*", end: "*/"};
|
||||
this.$quotes = {'"': '"', "'": "'", "`": "`"};
|
||||
|
||||
this.getNextLineIndent = function(state, line, tab) {
|
||||
var indent = this.$getIndent(line);
|
||||
|
||||
var tokenizedLine = this.getTokenizer().getLineTokens(line, state);
|
||||
var tokens = tokenizedLine.tokens;
|
||||
var endState = tokenizedLine.state;
|
||||
|
||||
if (tokens.length && tokens[tokens.length-1].type == "comment") {
|
||||
return indent;
|
||||
}
|
||||
|
||||
if (state == "start" || state == "no_regex") {
|
||||
var match = line.match(/^.*(?:\bcase\b.*:|[\{\(\[])\s*$/);
|
||||
if (match) {
|
||||
indent += tab;
|
||||
}
|
||||
} else if (state == "doc-start") {
|
||||
if (endState == "start" || endState == "no_regex") {
|
||||
return "";
|
||||
}
|
||||
var match = line.match(/^\s*(\/?)\*/);
|
||||
if (match) {
|
||||
if (match[1]) {
|
||||
indent += " ";
|
||||
}
|
||||
indent += "* ";
|
||||
}
|
||||
}
|
||||
|
||||
return indent;
|
||||
};
|
||||
|
||||
this.checkOutdent = function(state, line, input) {
|
||||
return this.$outdent.checkOutdent(line, input);
|
||||
};
|
||||
|
||||
this.autoOutdent = function(state, doc, row) {
|
||||
this.$outdent.autoOutdent(doc, row);
|
||||
};
|
||||
|
||||
this.createWorker = function(session) {
|
||||
var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker");
|
||||
worker.attachToDocument(session.getDocument());
|
||||
|
||||
worker.on("annotate", function(results) {
|
||||
session.setAnnotations(results.data);
|
||||
});
|
||||
|
||||
worker.on("terminate", function() {
|
||||
session.clearAnnotations();
|
||||
});
|
||||
|
||||
return worker;
|
||||
};
|
||||
|
||||
this.$id = "ace/mode/javascript";
|
||||
}).call(Mode.prototype);
|
||||
|
||||
exports.Mode = Mode;
|
||||
});
|
||||
(function() {
|
||||
ace.require(["ace/mode/javascript"], function(m) {
|
||||
if (typeof module == "object" && typeof exports == "object" && module) {
|
||||
module.exports = m;
|
||||
}
|
||||
});
|
||||
})();
|
||||
|
112
html/ace/theme-monokai.js
Normal file
@ -0,0 +1,112 @@
|
||||
ace.define("ace/theme/monokai",["require","exports","module","ace/lib/dom"], function(require, exports, module) {
|
||||
|
||||
exports.isDark = true;
|
||||
exports.cssClass = "ace-monokai";
|
||||
exports.cssText = ".ace-monokai .ace_gutter {\
|
||||
background: #2F3129;\
|
||||
color: #8F908A\
|
||||
}\
|
||||
.ace-monokai .ace_print-margin {\
|
||||
width: 1px;\
|
||||
background: #555651\
|
||||
}\
|
||||
.ace-monokai {\
|
||||
background-color: #272822;\
|
||||
color: #F8F8F2\
|
||||
}\
|
||||
.ace-monokai .ace_cursor {\
|
||||
color: #F8F8F0\
|
||||
}\
|
||||
.ace-monokai .ace_marker-layer .ace_selection {\
|
||||
background: #49483E\
|
||||
}\
|
||||
.ace-monokai.ace_multiselect .ace_selection.ace_start {\
|
||||
box-shadow: 0 0 3px 0px #272822;\
|
||||
}\
|
||||
.ace-monokai .ace_marker-layer .ace_step {\
|
||||
background: rgb(102, 82, 0)\
|
||||
}\
|
||||
.ace-monokai .ace_marker-layer .ace_bracket {\
|
||||
margin: -1px 0 0 -1px;\
|
||||
border: 1px solid #49483E\
|
||||
}\
|
||||
.ace-monokai .ace_marker-layer .ace_active-line {\
|
||||
background: #202020\
|
||||
}\
|
||||
.ace-monokai .ace_gutter-active-line {\
|
||||
background-color: #272727\
|
||||
}\
|
||||
.ace-monokai .ace_marker-layer .ace_selected-word {\
|
||||
border: 1px solid #49483E\
|
||||
}\
|
||||
.ace-monokai .ace_invisible {\
|
||||
color: #52524d\
|
||||
}\
|
||||
.ace-monokai .ace_entity.ace_name.ace_tag,\
|
||||
.ace-monokai .ace_keyword,\
|
||||
.ace-monokai .ace_meta.ace_tag,\
|
||||
.ace-monokai .ace_storage {\
|
||||
color: #F92672\
|
||||
}\
|
||||
.ace-monokai .ace_punctuation,\
|
||||
.ace-monokai .ace_punctuation.ace_tag {\
|
||||
color: #fff\
|
||||
}\
|
||||
.ace-monokai .ace_constant.ace_character,\
|
||||
.ace-monokai .ace_constant.ace_language,\
|
||||
.ace-monokai .ace_constant.ace_numeric,\
|
||||
.ace-monokai .ace_constant.ace_other {\
|
||||
color: #AE81FF\
|
||||
}\
|
||||
.ace-monokai .ace_invalid {\
|
||||
color: #F8F8F0;\
|
||||
background-color: #F92672\
|
||||
}\
|
||||
.ace-monokai .ace_invalid.ace_deprecated {\
|
||||
color: #F8F8F0;\
|
||||
background-color: #AE81FF\
|
||||
}\
|
||||
.ace-monokai .ace_support.ace_constant,\
|
||||
.ace-monokai .ace_support.ace_function {\
|
||||
color: #66D9EF\
|
||||
}\
|
||||
.ace-monokai .ace_fold {\
|
||||
background-color: #A6E22E;\
|
||||
border-color: #F8F8F2\
|
||||
}\
|
||||
.ace-monokai .ace_storage.ace_type,\
|
||||
.ace-monokai .ace_support.ace_class,\
|
||||
.ace-monokai .ace_support.ace_type {\
|
||||
font-style: italic;\
|
||||
color: #66D9EF\
|
||||
}\
|
||||
.ace-monokai .ace_entity.ace_name.ace_function,\
|
||||
.ace-monokai .ace_entity.ace_other,\
|
||||
.ace-monokai .ace_entity.ace_other.ace_attribute-name,\
|
||||
.ace-monokai .ace_variable {\
|
||||
color: #A6E22E\
|
||||
}\
|
||||
.ace-monokai .ace_variable.ace_parameter {\
|
||||
font-style: italic;\
|
||||
color: #FD971F\
|
||||
}\
|
||||
.ace-monokai .ace_string {\
|
||||
color: #E6DB74\
|
||||
}\
|
||||
.ace-monokai .ace_comment {\
|
||||
color: #75715E\
|
||||
}\
|
||||
.ace-monokai .ace_indent-guide {\
|
||||
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ0FD0ZXBzd/wPAAjVAoxeSgNeAAAAAElFTkSuQmCC) right repeat-y\
|
||||
}";
|
||||
|
||||
var dom = require("../lib/dom");
|
||||
dom.importCssString(exports.cssText, exports.cssClass);
|
||||
});
|
||||
(function() {
|
||||
ace.require(["ace/theme/monokai"], function(m) {
|
||||
if (typeof module == "object" && typeof exports == "object" && module) {
|
||||
module.exports = m;
|
||||
}
|
||||
});
|
||||
})();
|
2
html/base.js
Normal file
@ -0,0 +1,2 @@
|
||||
var brws=(typeof browser=="undefined"?chrome:browser)
|
||||
document.querySelectorAll("[data-message]").forEach(e=>e.textContent=brws.i18n.getMessage(e.getAttribute("data-message")))
|
@ -1 +0,0 @@
|
||||
/*basic.css v1.1 | (c)2017-2018, Hellsh Ltd. | https://storage.hellsh.com/assets/basic.css*/body{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:1rem}h1,h2,h3,h4,h5,h6,p{margin:.5rem 0;font-family:inherit;font-weight:400}h1{font-size:2.5rem}h2{font-size:2rem}h3{font-size:1.75rem}h4{font-size:1.5rem}h5{font-size:1.25rem}h6{font-size:1rem}p{margin:5px 0}a{color:#0288D1;text-decoration:none}hr{border:none;border-bottom:1px solid #000;margin:10px 0}
|
17
html/before-navigate.html
Normal file
@ -0,0 +1,17 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title data-message="beforeNavigate"></title>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<link rel="stylesheet" href="style.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1 data-message="beforeNavigate"></h1>
|
||||
<p data-message="beforeNavigateDestination"></p>
|
||||
<br>
|
||||
<p><span data-message="beforeNavigateInfo"></span> <a href="options.html" target="_blank" data-message="optionsLink"></a></p>
|
||||
<script src="base.js"></script>
|
||||
<script src="before-navigate.js"></script>
|
||||
</body>
|
||||
</html>
|
16
html/before-navigate.js
Normal file
@ -0,0 +1,16 @@
|
||||
let params=new URLSearchParams(location.search)
|
||||
if(params.has("target"))
|
||||
{
|
||||
brws.storage.sync.get(["instant_navigation"],res=>{
|
||||
if(res&&res.instant_navigation&&res.instant_navigation==="true")
|
||||
location.href=params.get("target")
|
||||
})
|
||||
let i=document.querySelector('[data-message="beforeNavigateDestination"]')
|
||||
i.innerHTML=i.innerHTML.replace("%",'<a></a>')
|
||||
let a=i.querySelector("a")
|
||||
a.href=a.textContent=params.get("target")
|
||||
}
|
||||
else
|
||||
{
|
||||
history.back()
|
||||
}
|
14
html/blocked.html
Normal file
@ -0,0 +1,14 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title data-message="blockedTitle"></title>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<link rel="stylesheet" href="style.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1 data-message="blockedTitle"></h1>
|
||||
<p><span data-message="blockedSubtitle"></span> <a href="options.html" target="_blank" data-message="optionsLink"></a></p>
|
||||
<script src="base.js"></script>
|
||||
</body>
|
||||
</html>
|
17
html/crowd-bypassed.html
Normal file
@ -0,0 +1,17 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title data-message="crowdBypassed"></title>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<link rel="stylesheet" href="style.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1 data-message="crowdBypassed"></h1>
|
||||
<p data-message="crowdBypassedInfo"></p>
|
||||
<br>
|
||||
<p><a id="ignore" href="#" data-message="crowdBypassedIgnore"></a></p>
|
||||
<script src="base.js"></script>
|
||||
<script src="crowd-bypassed.js"></script>
|
||||
</body>
|
||||
</html>
|
14
html/crowd-bypassed.js
Normal file
@ -0,0 +1,14 @@
|
||||
let params=new URLSearchParams(location.search)
|
||||
if(params.has("target")&¶ms.has("back"))
|
||||
{
|
||||
let i=document.querySelector('[data-message="crowdBypassedInfo"]')
|
||||
i.innerHTML=i.innerHTML.replace("%",'<a></a>')
|
||||
let a=i.querySelector("a")
|
||||
a.setAttribute("target","_blank")
|
||||
a.href=a.textContent=params.get("target")
|
||||
document.getElementById("ignore").href=params.get("back")+"#ignoreCrowdBypass"
|
||||
}
|
||||
else
|
||||
{
|
||||
history.back()
|
||||
}
|
18
html/firstrun-noscript.html
Normal file
@ -0,0 +1,18 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title data-message="firstrunTitle"></title>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<link rel="stylesheet" href="style.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1 data-message="firstrunTitle"></h1>
|
||||
<p data-message="firstrunSubtitle"></p>
|
||||
<br>
|
||||
<p data-message="firstrunNoScript"></p>
|
||||
<hr>
|
||||
<p>Copyright (c) 2018-19 Tim "timmyRS" Speckhals</p>
|
||||
<script src="base.js"></script>
|
||||
</body>
|
||||
</html>
|
@ -3,19 +3,18 @@
|
||||
<head>
|
||||
<title data-message="firstrunTitle"></title>
|
||||
<meta charset="UTF-8">
|
||||
<link rel="stylesheet" href="basic.css">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<link rel="stylesheet" href="style.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1 data-message="firstrunTitle"></h1>
|
||||
<p data-message="firstrunSubtitle"></p>
|
||||
<hr>
|
||||
<p data-message="firstrunWhatnow"></p>
|
||||
<ul>
|
||||
<li><a href="https://twitter.com/unibypass" target="_blank" data-message="firstrunTwitter"></a></li>
|
||||
<li><a href="options.html" target="_blank" data-message="firstrunOptions"></a></li>
|
||||
<li><a href="options.html" target="_blank" data-message="options"></a></li>
|
||||
<li><a href="https://universal-bypass.org/faq" target="_blank" data-message="faq"></a></li>
|
||||
</ul>
|
||||
<hr>
|
||||
<p>Copyright (c) 2018, <a href="https://hellsh.com" target="_blank">Hellsh Ltd.</a></p>
|
||||
<script src="translations.js"></script>
|
||||
<p>Copyright (c) 2018-19 Tim "timmyRS" Speckhals</p>
|
||||
<script src="base.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
@ -1,38 +1,30 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title data-message="options"></title>
|
||||
<title>Universal Bypass</title>
|
||||
<meta charset="UTF-8">
|
||||
<link rel="stylesheet" href="basic.css">
|
||||
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
|
||||
<style>body{padding:20px}#custom-bypass-editor{font-family:"DejaVu Sans Mono",monospace;min-height:500px;min-height:calc(100vh - 370px)}</style>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<link rel="stylesheet" href="style.css">
|
||||
</head>
|
||||
<body>
|
||||
<h1 data-message="options"></h1>
|
||||
<br>
|
||||
<p><input type="checkbox" id="option-notifications"> <label for="option-notifications" data-message="optionsNotifications"></label></li></p>
|
||||
<h1>Universal Bypass</h1>
|
||||
<p><a href="https://universal-bypass.org/faq" target="_blank" data-message="faq"></a></p>
|
||||
<h2 data-message="options"></h2>
|
||||
<p>
|
||||
<input type="checkbox" id="option-enabled"> <label for="option-enabled" data-message="optionsEnabled"></label><br>
|
||||
<input type="checkbox" id="option-instant-navigation"> <label for="option-instant-navigation" data-message="optionsInstantNavigation"></label><br>
|
||||
<input type="checkbox" id="option-tracker-bypass"> <label for="option-tracker-bypass"><span data-message="optionsTrackerBypass"></span> (Bit.ly, Goo.gl, T.co, ...)</label> (<a href="https://apimon.de/privacy" target="_blank" data-message="privacyPolicy"></a>)<br>
|
||||
<input type="checkbox" id="option-block-ip-loggers"> <label for="option-block-ip-loggers" data-message="optionsBlockIPLoggers"></label><br>
|
||||
<input type="checkbox" id="option-crowd-bypass"> <label for="option-crowd-bypass" data-message="optionsCrowdBypass"></label> (<a href="https://github.com/timmyrs/Universal-Bypass/blob/master/PRIVACY.md" target="_blank" data-message="privacyPolicy"></a>)
|
||||
</ul>
|
||||
<h2 data-message="optionsUserscripts"></h2>
|
||||
<a name="userscripts"></a>
|
||||
<p><span data-message="optionsUserscriptsSubtitle"></span> <a href="https://github.com/hellshltd/Universal-Bypass" target="_blank">https://github.com/hellshltd/Universal-Bypass</a></p>
|
||||
<div class="row">
|
||||
<div class="col-lg-3">
|
||||
<div class="list-group" id="custom-bypasses-list"></div>
|
||||
</div>
|
||||
<div class="col-lg-9">
|
||||
<div id="custom-bypass-edit-container">
|
||||
<p><input type="text" id="custom-bypass-name" class="form-control" data-placeholder="optionsUserscriptsName"></p>
|
||||
<p><input type="text" id="custom-bypass-domains" class="form-control" data-placeholder="optionsUserscriptsDomains"></p>
|
||||
<p><textarea id="custom-bypass-editor" class="form-control"></textarea></p>
|
||||
<p>
|
||||
<a href="#userscripts" id="save-custom-bypass" class="btn btn-primary" data-message="save"></a>
|
||||
<a href="#" id="delete-custom-bypass" class="btn btn-outline-danger" data-message="optionsUserscriptsDelete"></a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<p><span data-message="optionsUserscriptsSubtitle"></span></p>
|
||||
<div id="userscript" style="font-family:'DejaVu Sans Mono',monospace;min-height:440px;height:calc(100vh - 400px)"></div>
|
||||
<hr>
|
||||
<p>Copyright (c) 2018, <a href="https://hellsh.com" target="_blank">Hellsh Ltd.</a></p>
|
||||
<script src="translations.js"></script>
|
||||
<p>Copyright (c) 2018-19 Tim "timmyRS" Speckhals</p>
|
||||
<script src="base.js"></script>
|
||||
<script src="ace/ace.js"></script>
|
||||
<script src="options.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
194
html/options.js
@ -1,96 +1,108 @@
|
||||
chrome.storage.local.get(["custom_bypasses"],(result)=>{
|
||||
let customBypasses=(result&&result.custom_bypasses)?JSON.parse(result.custom_bypasses):{},
|
||||
customBypassesList=document.getElementById("custom-bypasses-list"),
|
||||
customBypassName=document.getElementById("custom-bypass-name"),
|
||||
customBypassDomains=document.getElementById("custom-bypass-domains"),
|
||||
bypassEditor=document.getElementById("custom-bypass-editor"),
|
||||
editingBypass="",
|
||||
reloadCustomBypassList=()=>{
|
||||
customBypassesList.innerHTML=""
|
||||
customBypasses["+ Add"]={}
|
||||
if(editingBypass)
|
||||
document.getElementById("custom-bypass-edit-container").style.display="block"
|
||||
else
|
||||
document.getElementById("custom-bypass-edit-container").style.display="none"
|
||||
for(let name in customBypasses)
|
||||
{
|
||||
let a=document.createElement("a")
|
||||
a.id="custom-bypass-"+name
|
||||
a.href="#userscripts"
|
||||
a.className="list-group-item list-group-item-action"+(editingBypass==name?" active":"")
|
||||
a.textContent=name
|
||||
a.onclick=function()
|
||||
{
|
||||
let _active=document.querySelector(".list-group-item.active")
|
||||
if(_active)
|
||||
_active.className="list-group-item list-group-item-action"
|
||||
editingBypass=this.id.substr(14)
|
||||
if(editingBypass=="+ Add")
|
||||
{
|
||||
customBypasses[editingBypass="Untitled Bypass"]={
|
||||
domains:"example.com,example.org",
|
||||
content:'let b=document.getElementById("button")\nif(b&&b.href)\n location.href=b.href'
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
this.className="list-group-item list-group-item-action active"
|
||||
}
|
||||
customBypassName.value=editingBypass
|
||||
customBypassDomains.value=customBypasses[editingBypass].domains
|
||||
bypassEditor.textContent=customBypasses[editingBypass].content
|
||||
saveCustomBypass()
|
||||
}
|
||||
customBypassesList.appendChild(a)
|
||||
}
|
||||
delete customBypasses["+ Add"]
|
||||
},
|
||||
saveCustomBypass=()=>{
|
||||
if(customBypassName.value!=editingBypass)
|
||||
{
|
||||
if(customBypassName.value)
|
||||
{
|
||||
customBypasses[customBypassName.value]=customBypasses[editingBypass]
|
||||
delete customBypasses[editingBypass]
|
||||
editingBypass=customBypassName.value
|
||||
}
|
||||
else
|
||||
{
|
||||
if(confirm("Do you really want to delete this bypass?"))
|
||||
{
|
||||
delete customBypasses[editingBypass]
|
||||
editingBypass=""
|
||||
}
|
||||
else
|
||||
customBypassName.value=editingBypass
|
||||
}
|
||||
}
|
||||
if(editingBypass!="")
|
||||
{
|
||||
customBypasses[editingBypass].domains=customBypassDomains.value
|
||||
customBypasses[editingBypass].content=bypassEditor.value
|
||||
}
|
||||
chrome.storage.local.set({custom_bypasses:JSON.stringify(customBypasses)},reloadCustomBypassList);
|
||||
}
|
||||
reloadCustomBypassList()
|
||||
document.getElementById("save-custom-bypass").onclick=saveCustomBypass
|
||||
document.getElementById("delete-custom-bypass").onclick=()=>{
|
||||
customBypassName.value=""
|
||||
saveCustomBypass()
|
||||
}
|
||||
})
|
||||
chrome.storage.sync.get(["no_notifications"],(result)=>{
|
||||
let notificationsCheckbox=document.getElementById("option-notifications")
|
||||
if(!result||!result.no_notifications||result.no_notifications!=="true")
|
||||
var example=`//Some examples of what you can do with custom bypasses:
|
||||
domainBypass("example.com", function()
|
||||
{
|
||||
ensureDomLoaded(function()
|
||||
{
|
||||
notificationsCheckbox.setAttribute("checked","checked")
|
||||
let button = document.getElementById("skip-button")
|
||||
if(button != null)
|
||||
{
|
||||
button.click()
|
||||
}
|
||||
})
|
||||
})
|
||||
hrefBypass(/example\\.(com|org)/, function()
|
||||
{
|
||||
// This bypass won't trigger on example.com because
|
||||
// we have already defined a bypass for example.com.
|
||||
sI(function()
|
||||
{
|
||||
// sI is a copy of window.setInterval.
|
||||
// You may also use sT (setTimeout), ev (eval),
|
||||
// and safelyNavigate(url) in your bypasses.
|
||||
console.log("A second has passed")
|
||||
}, 1000)
|
||||
})
|
||||
// Feel free to replace this with your own code now!
|
||||
// Changes are automatically saved.
|
||||
`,saveTimer,editor=ace.edit("userscript",{mode:"ace/mode/javascript",theme:"ace/theme/monokai"}),
|
||||
span=document.querySelector("[data-message='optionsUserscriptsSubtitle']")
|
||||
span.innerHTML=span.textContent.replace("GitHub","<a href='https://github.com/timmyrs/Universal-Bypass/blob/master/content_script.js' target='_blank'>GitHub</a>")
|
||||
brws.storage.local.get(["userscript"],res=>{
|
||||
if(res&&res.userscript)
|
||||
{
|
||||
editor.setValue(res.userscript)
|
||||
}
|
||||
notificationsCheckbox.onchange=()=>{
|
||||
notificationsCheckbox.setAttribute("disabled","disabled")
|
||||
chrome.storage.sync.set({
|
||||
no_notifications:(!notificationsCheckbox.checked).toString()
|
||||
},()=>{
|
||||
notificationsCheckbox.removeAttribute("disabled")
|
||||
else
|
||||
{
|
||||
editor.setValue(example)
|
||||
brws.storage.local.set({
|
||||
userscript: example
|
||||
})
|
||||
}
|
||||
editor.resize()
|
||||
editor.clearSelection()
|
||||
editor.on("change", ()=>{
|
||||
clearInterval(saveTimer)
|
||||
saveTimer=setTimeout(()=>{
|
||||
brws.storage.local.set({
|
||||
userscript: editor.getValue()
|
||||
})
|
||||
},500)
|
||||
})
|
||||
})
|
||||
brws.storage.sync.get(["disable","instant_navigation","no_tracker_bypass","allow_ip_loggers","crowd_bypass_opt_out"],res=>{
|
||||
if(res==undefined)
|
||||
{
|
||||
res={}
|
||||
}
|
||||
let enabledCheckbox=document.getElementById("option-enabled"),
|
||||
instantNavigationCheckbox=document.getElementById("option-instant-navigation"),
|
||||
trackerBypassCheckbox=document.getElementById("option-tracker-bypass"),
|
||||
blockIPLoggersCheckbox=document.getElementById("option-block-ip-loggers"),
|
||||
crowdBypassCheckbox=document.getElementById("option-crowd-bypass")
|
||||
if(!res.disable||res.disable!=="true")
|
||||
{
|
||||
enabledCheckbox.setAttribute("checked","checked")
|
||||
}
|
||||
if(res.instant_navigation&&res.instant_navigation==="true")
|
||||
{
|
||||
instantNavigationCheckbox.setAttribute("checked","checked")
|
||||
}
|
||||
if(!res.no_tracker_bypass||res.no_tracker_bypass!=="true")
|
||||
{
|
||||
trackerBypassCheckbox.setAttribute("checked","checked")
|
||||
}
|
||||
if(!res.allow_ip_loggers||res.allow_ip_loggers!=="true")
|
||||
{
|
||||
blockIPLoggersCheckbox.setAttribute("checked","checked")
|
||||
}
|
||||
if(!res.crowd_bypass_opt_out||res.crowd_bypass_opt_out!=="true")
|
||||
{
|
||||
crowdBypassCheckbox.setAttribute("checked","checked")
|
||||
}
|
||||
enabledCheckbox.onchange=()=>{
|
||||
brws.storage.sync.set({
|
||||
disable:(!enabledCheckbox.checked).toString()
|
||||
})
|
||||
}
|
||||
instantNavigationCheckbox.onchange=()=>{
|
||||
brws.storage.sync.set({
|
||||
instant_navigation:instantNavigationCheckbox.checked.toString()
|
||||
})
|
||||
}
|
||||
trackerBypassCheckbox.onchange=()=>{
|
||||
brws.storage.sync.set({
|
||||
no_tracker_bypass:(!trackerBypassCheckbox.checked).toString()
|
||||
})
|
||||
}
|
||||
blockIPLoggersCheckbox.onchange=()=>{
|
||||
brws.storage.sync.set({
|
||||
allow_ip_loggers:(!blockIPLoggersCheckbox.checked).toString()
|
||||
})
|
||||
}
|
||||
crowdBypassCheckbox.onchange=()=>{
|
||||
brws.storage.sync.set({
|
||||
crowd_bypass_opt_out:(!crowdBypassCheckbox.checked).toString()
|
||||
})
|
||||
}
|
||||
})
|
||||
|
@ -1,19 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<link rel="stylesheet" href="basic.css">
|
||||
<style>body{min-width:400px}</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Universal Bypass</h1>
|
||||
<p data-message="appDesc"></p>
|
||||
<ul>
|
||||
<li><a href="options.html" target="_blank" data-message="popupOptions"></a></li>
|
||||
<li><a href="https://universal-bypass.org" target="_blank" data-message="homepage"></a></li>
|
||||
<li><a href="https://twitter.com/unibypass" target="_blank">Twitter</a></li>
|
||||
</ul>
|
||||
<p>Copyright (c) 2018, <a href="https://hellsh.com" target="_blank">Hellsh Ltd.</a></p>
|
||||
<script src="translations.js"></script>
|
||||
</body>
|
||||
</html>
|
1
html/style.css
Normal file
@ -0,0 +1 @@
|
||||
body{font-family:-apple-system,BlinkMacSystemFont,segoe ui,Roboto,helvetica neue,Arial,sans-serif,apple color emoji,segoe ui emoji,segoe ui symbol;font-size:1rem;direction:__MSG_@@bidi_dir__;padding:0 7px 3px 7px;min-width:650px}h1,h2,h3,h4,h5,h6,p{margin:.5rem 0;font-family:inherit;font-weight:400}h1{font-size:2.5rem}h2{font-size:2rem}h3{font-size:1.75rem}h4{font-size:1.5rem}h5{font-size:1.25rem}h6{font-size:1rem}p{margin:5px 0}a{color:#0288d1;text-decoration:none}hr{border:0;border-bottom:1px solid #000;margin:10px 0}
|
@ -1,14 +0,0 @@
|
||||
let elms=document.querySelectorAll("[data-message]")
|
||||
for(let i in elms)
|
||||
{
|
||||
let elm=elms[i]
|
||||
if(elm instanceof HTMLElement)
|
||||
elm.textContent=chrome.i18n.getMessage(elm.getAttribute("data-message"))
|
||||
}
|
||||
elms=document.querySelectorAll("[data-placeholder]")
|
||||
for(let i in elms)
|
||||
{
|
||||
let elm=elms[i]
|
||||
if(elm instanceof HTMLElement)
|
||||
elm.setAttribute("placeholder",chrome.i18n.getMessage(elm.getAttribute("data-placeholder")))
|
||||
}
|
BIN
icon/128.png
Normal file
After Width: | Height: | Size: 2.9 KiB |
BIN
icon/150.png
Normal file
After Width: | Height: | Size: 4.6 KiB |
BIN
icon/176.png
Normal file
After Width: | Height: | Size: 5.1 KiB |
BIN
icon/40.png
Normal file
After Width: | Height: | Size: 744 B |
BIN
icon/48.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
icon/512.png
Normal file
After Width: | Height: | Size: 3.5 KiB |
Before Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 6.2 KiB |
Before Width: | Height: | Size: 13 KiB |
@ -1,43 +1,55 @@
|
||||
{
|
||||
"manifest_version": 2,
|
||||
"icons": {
|
||||
"128": "icon/icon_128.png",
|
||||
"256": "icon/icon_256.png",
|
||||
"512": "icon/icon_512.png"
|
||||
"40": "icon/40.png",
|
||||
"48": "icon/48.png",
|
||||
"128": "icon/128.png",
|
||||
"150": "icon/150.png",
|
||||
"176": "icon/176.png",
|
||||
"512": "icon/512.png"
|
||||
},
|
||||
"default_locale": "en",
|
||||
"name": "Universal Bypass",
|
||||
"description": "__MSG_appDesc__",
|
||||
"homepage_url": "https://universal-bypass.org/",
|
||||
"version": "4.0.2",
|
||||
"author": "timmyRS",
|
||||
"minimum_chrome_version": "41",
|
||||
"version": "9.6.5",
|
||||
"author": "Tim \"timmyRS\" Speckhals",
|
||||
"permissions": [
|
||||
"storage",
|
||||
"webRequest",
|
||||
"webRequestBlocking",
|
||||
"<all_urls>"
|
||||
],
|
||||
"options_ui": {
|
||||
"page": "html/options.html",
|
||||
"open_in_tab": true
|
||||
},
|
||||
"permissions": [
|
||||
"storage"
|
||||
],
|
||||
"browser_action": {
|
||||
"default_icon": {
|
||||
"128": "icon/icon_128.png",
|
||||
"256": "icon/icon_256.png",
|
||||
"512": "icon/icon_512.png"
|
||||
"40": "icon/40.png",
|
||||
"48": "icon/48.png",
|
||||
"128": "icon/128.png",
|
||||
"150": "icon/150.png",
|
||||
"176": "icon/176.png",
|
||||
"512": "icon/512.png"
|
||||
},
|
||||
"default_popup": "html/popup.html"
|
||||
"default_popup": "html/options.html"
|
||||
},
|
||||
"background": {
|
||||
"scripts": ["background.js"],
|
||||
"persistent": false
|
||||
"scripts": ["background.js"]
|
||||
},
|
||||
"content_scripts": [
|
||||
{
|
||||
"matches": ["*://*/*"],
|
||||
"js": [
|
||||
"content_script.js"
|
||||
],
|
||||
"matches": ["<all_urls>"],
|
||||
"js": ["content_script.js"],
|
||||
"run_at": "document_start"
|
||||
}
|
||||
],
|
||||
"web_accessible_resources": [
|
||||
"html/before-navigate.html",
|
||||
"html/blocked.html",
|
||||
"html/crowd-bypassed.html",
|
||||
"html/firstrun.html",
|
||||
"html/firstrun-noscript.html"
|
||||
]
|
||||
}
|
||||
}
|