<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JETBRA.IN CHECKER | IPFS</title>
<meta name="apple-mobile-web-app-capable" content="yes"/>
<meta name="mobile-web-app-capable" content="yes"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<link type="text/css" rel="stylesheet" href="https://3.jetbra.in/tachyons.min.css"/>
<link type="text/css" rel="stylesheet" href="https://3.jetbra.in/ipfs.css"/>
<link type="text/css" rel="stylesheet" href="https://3.jetbra.in/styles.css?v=230914"/>
</head>
<body id="checker" class="sans-serif charcoal bg-snow-muted">
<header class='flex-l items-center pa3 bg-navy bb bw3 border-aqua tc tl-l'>
<h1 class='f3 fw2 montserrat aqua ttu ma0'>JETBRA.IN CHECKER | IPFS</h1>
<div class='flex-auto'>
</div>
<div class='pt2 pt0-l ma0 inline-flex items-center'>
<div class='pl3'>
<a href='https://github.com/ipfs/public-gateway-checker' target='_blank' rel="noopener noreferrer"
aria-label='View source on GitHub'>
<svg xmlns='http://www.w3.org/2000/svg' height='24' viewBox='0 0 32.58 31.77'>
<path fill='#7f8491'
d='M16.29 0a16.29 16.29 0 00-5.15 31.75c.82.15 1.11-.36 1.11-.79v-2.77C7.7 29.18 6.74 26 6.74 26a4.36 4.36 0 00-1.81-2.39c-1.47-1 .12-1 .12-1a3.43 3.43 0 012.49 1.68 3.48 3.48 0 004.74 1.36 3.46 3.46 0 011-2.18c-3.62-.41-7.42-1.81-7.42-8a6.3 6.3 0 011.67-4.37 5.94 5.94 0 01.16-4.31s1.37-.44 4.48 1.67a15.41 15.41 0 018.16 0c3.11-2.11 4.47-1.67 4.47-1.67a5.91 5.91 0 01.2 4.28 6.3 6.3 0 011.67 4.37c0 6.26-3.81 7.63-7.44 8a3.85 3.85 0 011.11 3v4.47c0 .53.29.94 1.12.78A16.29 16.29 0 0016.29 0z'/>
</svg>
</a>
</div>
</div>
</header>
<div class="ph4-l pt4-l">
<div id="origin-warning" class="f5 pa2 tl">
<p>NOTES</p>
<ul class="pl3">
<li>Pick a link that looks great and <strong style="color: green">just click it</strong> to visit the page(230914).</li>
</ul>
</div>
<div id="checker.stats" class="Stats monospace f6"></div>
<div id="checker.results" class="Results monospace f6">
<div class="Node Header">
<div class="Status" title="Online status: is it possible to read data?" style="cursor: help">Online</div>
<div class="Cors" title="Allows Cross-Origin Resource Sharing (CORS fetch)">CORS</div>
<div class="Link">Hostname</div>
<div class="Took">T</div>
</div>
</div>
</div>
<script src="https://3.jetbra.in/ipfs-http-client.min.js"></script>
<script>
(function(root, factory) {
(typeof module === 'object' && module.exports) ? module.exports = factory() : root.IpfsPublicGatewayChecker = factory()
}(typeof self !== 'undefined' ? self : this, function() {
var IpfsPublicGatewayChecker = (()=>{
var ut = Object.create;
var W = Object.defineProperty;
var dt = Object.getOwnPropertyDescriptor;
var mt = Object.getOwnPropertyNames;
var yt = Object.getPrototypeOf
, gt = Object.prototype.hasOwnProperty;
var wt = h=>W(h, "__esModule", {
value: !0
});
var _t = (h,s)=>()=>(s || h((s = {
exports: {}
}).exports, s),
s.exports);
var bt = (h,s,a)=>{
if (s && typeof s == "object" || typeof s == "function")
for (let n of mt(s))
!gt.call(h, n) && n !== "default" && W(h, n, {
get: ()=>s[n],
enumerable: !(a = dt(s, n)) || a.enumerable
});
return h
}
, vt = h=>bt(wt(W(h != null ? ut(yt(h)) : {}, "default", h && h.__esModule && "default"in h ? {
get: ()=>h.default,
enumerable: !0
} : {
value: h,
enumerable: !0
})), h);
var at = _t((M,Z)=>{
(function(h) {
"use strict";
function s(a) {
var n = a && a.Promise || h.Promise
, d = a && a.XMLHttpRequest || h.XMLHttpRequest;
return function() {
var b = Object.create(h, {
fetch: {
value: void 0,
writable: !0
}
});
return function(g, o) {
typeof M == "object" && typeof Z != "undefined" ? o(M) : typeof define == "function" && define.amd ? define(["exports"], o) : o(g.WHATWGFetch = {})
}(this, function(g) {
"use strict";
var o = typeof b != "undefined" && b || typeof self != "undefined" && self || typeof o != "undefined" && o
, w = {
searchParams: "URLSearchParams"in o,
iterable: "Symbol"in o && "iterator"in Symbol,
blob: "FileReader"in o && "Blob"in o && function() {
try {
return new Blob,
!0
} catch (t) {
return !1
}
}(),
formData: "FormData"in o,
arrayBuffer: "ArrayBuffer"in o
};
function G(t) {
return t && DataView.prototype.isPrototypeOf(t)
}
if (w.arrayBuffer)
var x = ["[object Int8Array]", "[object Uint8Array]", "[object Uint8ClampedArray]", "[object Int16Array]", "[object Uint16Array]", "[object Int32Array]", "[object Uint32Array]", "[object Float32Array]", "[object Float64Array]"]
, U = ArrayBuffer.isView || function(t) {
return t && x.indexOf(Object.prototype.toString.call(t)) > -1
}
;
function T(t) {
if (typeof t != "string" && (t = String(t)),
/[^a-z0-9\-#$%&'*+.^_`|~!]/i.test(t) || t === "")
throw new TypeError("Invalid character in header field name");
return t.toLowerCase()
}
function B(t) {
return typeof t != "string" && (t = String(t)),
t
}
function r(t) {
var i = {
next: function() {
var l = t.shift();
return {
done: l === void 0,
value: l
}
}
};
return w.iterable && (i[Symbol.iterator] = function() {
return i
}
),
i
}
function p(t) {
this.map = {},
t instanceof p ? t.forEach(function(i, l) {
this.append(l, i)
}, this) : Array.isArray(t) ? t.forEach(function(i) {
this.append(i[0], i[1])
}, this) : t && Object.getOwnPropertyNames(t).forEach(function(i) {
this.append(i, t[i])
}, this)
}
p.prototype.append = function(t, i) {
t = T(t),
i = B(i);
var l = this.map[t];
this.map[t] = l ? l + ", " + i : i
}
,
p.prototype.delete = function(t) {
delete this.map[T(t)]
}
,
p.prototype.get = function(t) {
return t = T(t),
this.has(t) ? this.map[t] : null
}
,
p.prototype.has = function(t) {
return this.map.hasOwnProperty(T(t))
}
,
p.prototype.set = function(t, i) {
this.map[T(t)] = B(i)
}
,
p.prototype.forEach = function(t, i) {
for (var l in this.map)
this.map.hasOwnProperty(l) && t.call(i, this.map[l], l, this)
}
,
p.prototype.keys = function() {
var t = [];
return this.forEach(function(i, l) {
t.push(l)
}),
r(t)
}
,
p.prototype.values = function() {
var t = [];
return this.forEach(function(i) {
t.push(i)
}),
r(t)
}
,
p.prototype.entries = function() {
var t = [];
return this.forEach(function(i, l) {
t.push([l, i])
}),
r(t)
}
,
w.iterable && (p.prototype[Symbol.iterator] = p.prototype.entries);
function c(t) {
if (t.bodyUsed)
return n.reject(new TypeError("Already read"));
t.bodyUsed = !0
}
function v(t) {
return new n(function(i, l) {
t.onload = function() {
i(t.result)
}
,
t.onerror = function() {
l(t.error)
}
}
)
}
function u(t) {
var i = new FileReader
, l = v(i);
return i.readAsArrayBuffer(t),
l
}
function A(t) {
var i = new FileReader
, l = v(i);
return i.readAsText(t),
l
}
function f(t) {
for (var i = new Uint8Array(t), l = new Array(i.length), y = 0; y < i.length; y++)
l[y] = String.fromCharCode(i[y]);
return l.join("")
}
function P(t) {
if (t.slice)
return t.slice(0);
var i = new Uint8Array(t.byteLength);
return i.set(new Uint8Array(t)),
i.buffer
}
function D() {
return this.bodyUsed = !1,
this._initBody = function(t) {
this.bodyUsed = this.bodyUsed,
this._bodyInit = t,
t ? typeof t == "string" ? this._bodyText = t : w.blob && Blob.prototype.isPrototypeOf(t) ? this._bodyBlob = t : w.formData && FormData.prototype.isPrototypeOf(t) ? this._bodyFormData = t : w.searchParams && URLSearchParams.prototype.isPrototypeOf(t) ? this._bodyText = t.toString() : w.arrayBuffer && w.blob && G(t) ? (this._bodyArrayBuffer = P(t.buffer),
this._bodyInit = new Blob([this._bodyArrayBuffer])) : w.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(t) || U(t)) ? this._bodyArrayBuffer = P(t) : this._bodyText = t = Object.prototype.toString.call(t) : this._bodyText = "",
this.headers.get("content-type") || (typeof t == "string" ? this.headers.set("content-type", "text/plain;charset=UTF-8") : this._bodyBlob && this._bodyBlob.type ? this.headers.set("content-type", this._bodyBlob.type) : w.searchParams && URLSearchParams.prototype.isPrototypeOf(t) && this.headers.set("content-type", "application/x-www-form-urlencoded;charset=UTF-8"))
}
,
w.blob && (this.blob = function() {
var t = c(this);
if (t)
return t;
if (this._bodyBlob)
return n.resolve(this._bodyBlob);
if (this._bodyArrayBuffer)
return n.resolve(new Blob([this._bodyArrayBuffer]));
if (this._bodyFormData)
throw new Error("could not read FormData body as blob");
return n.resolve(new Blob([this._bodyText]))
}
,
this.arrayBuffer = function() {
if (this._bodyArrayBuffer) {
var t = c(this);
return t || (ArrayBuffer.isView(this._bodyArrayBuffer) ? n.resolve(this._bodyArrayBuffer.buffer.slice(this._bodyArrayBuffer.byteOffset, this._bodyArrayBuffer.byteOffset + this._bodyArrayBuffer.byteLength)) : n.resolve(this._bodyArrayBuffer))
} else
return this.blob().then(u)
}
),
this.text = function() {
var t = c(this);
if (t)
return t;
if (this._bodyBlob)
return A(this._bodyBlob);
if (this._bodyArrayBuffer)
return n.resolve(f(this._bodyArrayBuffer));
if (this._bodyFormData)
throw new Error("could not read FormData body as text");
return n.resolve(this._bodyText)
}
,
w.formData && (this.formData = function() {
return this.text().then(j)
}
),
this.json = function() {
return this.text().then(JSON.parse)
}
,
this
}
var X = ["DELETE", "GET", "HEAD", "OPTIONS", "POST", "PUT"];
function e(t) {
var i = t.toUpperCase();
return X.indexOf(i) > -1 ? i : t
}
function R(t, i) {
if (!(this instanceof R))
throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.');
i = i || {};
var l = i.body;
if (t instanceof R) {
if (t.bodyUsed)
throw new TypeError("Already read");
this.url = t.url,
this.credentials = t.credentials,
i.headers || (this.headers = new p(t.headers)),
this.method = t.method,
this.mode = t.mode,
this.signal = t.signal,
!l && t._bodyInit != null && (l = t._bodyInit,
t.bodyUsed = !0)
} else
this.url = String(t);
if (this.credentials = i.credentials || this.credentials || "same-origin",
(i.headers || !this.headers) && (this.headers = new p(i.headers)),
this.method = e(i.method || this.method || "GET"),
this.mode = i.mode || this.mode || null,
this.signal = i.signal || this.signal,
this.referrer = null,
(this.method === "GET" || this.method === "HEAD") && l)
throw new TypeError("Body not allowed for GET or HEAD requests");
if (this._initBody(l),
(this.method === "GET" || this.method === "HEAD") && (i.cache === "no-store" || i.cache === "no-cache")) {
var y = /([?&])_=[^&]*/;
if (y.test(this.url))
this.url = this.url.replace(y, "$1_=" + new Date().getTime());
else {
var _ = /\?/;
this.url += (_.test(this.url) ? "&" : "?") + "_=" + new Date().getTime()
}
}
}
R.prototype.clone = function() {
return new R(this,{
body: this._bodyInit
})
}
;
function j(t) {
var i = new FormData;
return t.trim().split("&").forEach(function(l) {
if (l) {
var y = l.split("=")
, _ = y.shift().replace(/\+/g, " ")
, m = y.join("=").replace(/\+/g, " ");
i.append(decodeURIComponent(_), decodeURIComponent(m))
}
}),
i
}
function q(t) {
var i = new p
, l = t.replace(/\r?\n[\t ]+/g, " ");
return l.split("\r").map(function(y) {
return y.indexOf(`
`) === 0 ? y.substr(1, y.length) : y
}).forEach(function(y) {
var _ = y.split(":")
, m = _.shift().trim();
if (m) {
var F = _.join(":").trim();
i.append(m, F)
}
}),
i
}
D.call(R.prototype);
function k(t, i) {
if (!(this instanceof k))
throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.');
i || (i = {}),
this.type = "default",
this.status = i.status === void 0 ? 200 : i.status,
this.ok = this.status >= 200 && this.status < 300,
this.statusText = "statusText"in i ? i.statusText : "",
this.headers = new p(i.headers),
this.url = i.url || "",
this._initBody(t)
}
D.call(k.prototype),
k.prototype.clone = function() {
return new k(this._bodyInit,{
status: this.status,
statusText: this.statusText,
headers: new p(this.headers),
url: this.url
})
}
,
k.error = function() {
var t = new k(null,{
status: 0,
statusText: ""
});
return t.type = "error",
t
}
;
var $ = [301, 302, 303, 307, 308];
k.redirect = function(t, i) {
if ($.indexOf(i) === -1)
throw new RangeError("Invalid status code");
return new k(null,{
status: i,
headers: {
location: t
}
})
}
,
g.DOMException = o.DOMException;
try {
new g.DOMException
} catch (t) {
g.DOMException = function(i, l) {
this.message = i,
this.name = l;
var y = Error(i);
this.stack = y.stack
}
,
g.DOMException.prototype = Object.create(Error.prototype),
g.DOMException.prototype.constructor = g.DOMException
}
function N(t, i) {
return new n(function(l, y) {
var _ = new R(t,i);
if (_.signal && _.signal.aborted)
return y(new g.DOMException("Aborted","AbortError"));
var m = new d;
function F() {
m.abort()
}
m.onload = function() {
var E = {
status: m.status,
statusText: m.statusText,
headers: q(m.getAllResponseHeaders() || "")
};
E.url = "responseURL"in m ? m.responseURL : E.headers.get("X-Request-URL");
var z = "response"in m ? m.response : m.responseText;
setTimeout(function() {
l(new k(z,E))
}, 0)
}
,
m.onerror = function() {
setTimeout(function() {
y(new TypeError("Network request failed"))
}, 0)
}
,
m.ontimeout = function() {
setTimeout(function() {
y(new TypeError("Network request failed"))
}, 0)
}
,
m.onabort = function() {
setTimeout(function() {
y(new g.DOMException("Aborted","AbortError"))
}, 0)
}
;
function ct(E) {
try {
return E === "" && o.location.href ? o.location.href : E
} catch (z) {
return E
}
}
m.open(_.method, ct(_.url), !0),
_.credentials === "include" ? m.withCredentials = !0 : _.credentials === "omit" && (m.withCredentials = !1),
"responseType"in m && (w.blob ? m.responseType = "blob" : w.arrayBuffer && _.headers.get("Content-Type") && _.headers.get("Content-Type").indexOf("application/octet-stream") !== -1 && (m.responseType = "arraybuffer")),
i && typeof i.headers == "object" && !(i.headers instanceof p) ? Object.getOwnPropertyNames(i.headers).forEach(function(E) {
m.setRequestHeader(E, B(i.headers[E]))
}) : _.headers.forEach(function(E, z) {
m.setRequestHeader(z, E)
}),
_.signal && (_.signal.addEventListener("abort", F),
m.onreadystatechange = function() {
m.readyState === 4 && _.signal.removeEventListener("abort", F)
}
),
m.send(typeof _._bodyInit == "undefined" ? null : _._bodyInit)
}
)
}
N.polyfill = !0,
o.fetch || (o.fetch = N,
o.Headers = p,
o.Request = R,
o.Response = k),
g.Headers = p,
g.Request = R,
g.Response = k,
g.fetch = N,
Object.defineProperty(g, "__esModule", {
value: !0
})
}),
{
fetch: b.fetch,
Headers: b.Headers,
Request: b.Request,
Response: b.Response,
DOMException: b.DOMException
}
}()
}
typeof define == "function" && define.amd ? define(function() {
return s
}) : typeof M == "object" ? Z.exports = s : h.fetchPonyfill = s
}
)(typeof globalThis != "undefined" ? globalThis : typeof self != "undefined" ? self : typeof globalThis != "undefined" ? globalThis : M)
}
);
function kt() {
var h = Object.create(null);
h.ftp = 21,
h.file = 0,
h.gopher = 70,
h.http = 80,
h.https = 443,
h.ws = 80,
h.wss = 443;
var s = Object.create(null);
s["%2e"] = ".",
s[".%2e"] = "..",
s["%2e."] = "..",
s["%2e%2e"] = "..";
function a(r) {
return h[r] !== void 0
}
function n() {
U.call(this),
this._isInvalid = !0
}
function d(r) {
return r == "" && n.call(this),
r.toLowerCase()
}
function b(r) {
var p = r.charCodeAt(0);
return p > 32 && p < 127 && [34, 35, 60, 62, 63, 96].indexOf(p) == -1 ? r : encodeURIComponent(r)
}
function g(r) {
var p = r.charCodeAt(0);
return p > 32 && p < 127 && [34, 35, 60, 62, 96].indexOf(p) == -1 ? r : encodeURIComponent(r)
}
var o = void 0
, w = /[a-zA-Z]/
, G = /[a-zA-Z0-9\+\-\.]/;
function x(r, p, c) {
function v(i) {
X.push(i)
}
var u = p || "scheme start"
, A = 0
, f = ""
, P = !1
, D = !1
, X = [];
t: for (; (r[A - 1] != o || A == 0) && !this._isInvalid; ) {
var e = r[A];
switch (u) {
case "scheme start":
if (e && w.test(e))
f += e.toLowerCase(),
u = "scheme";
else if (p) {
v("Invalid scheme.");
break t
} else {
f = "",
u = "no scheme";
continue
}
break;
case "scheme":
if (e && G.test(e))
f += e.toLowerCase();
else if (e == ":") {
if (this._scheme = f,
f = "",
p)
break t;
a(this._scheme) && (this._isRelative = !0),
this._scheme == "file" ? u = "relative" : this._isRelative && c && c._scheme == this._scheme ? u = "relative or authority" : this._isRelative ? u = "authority first slash" : u = "scheme data"
} else if (p) {
if (o == e)
break t;
v("Code point not allowed in scheme: " + e);
break t
} else {
f = "",
A = 0,
u = "no scheme";
continue
}
break;
case "scheme data":
e == "?" ? (this._query = "?",
u = "query") : e == "#" ? (this._fragment = "#",
u = "fragment") : o != e && e != " " && e != `
` && e != "\r" && (this._schemeData += b(e));
break;
case "no scheme":
if (!c || !a(c._scheme))
v("Missing scheme."),
n.call(this);
else {
u = "relative";
continue
}
break;
case "relative or authority":
if (e == "/" && r[A + 1] == "/")
u = "authority ignore slashes";
else {
v("Expected /, got: " + e),
u = "relative";
continue
}
break;
case "relative":
if (this._isRelative = !0,
this._scheme != "file" && (this._scheme = c._scheme),
o == e) {
this._host = c._host,
this._port = c._port,
this._path = c._path.slice(),
this._query = c._query,
this._username = c._username,
this._password = c._password;
break t
} else if (e == "/" || e == "\\")
e == "\\" && v("\\ is an invalid code point."),
u = "relative slash";
else if (e == "?")
this._host = c._host,
this._port = c._port,
this._path = c._path.slice(),
this._query = "?",
this._username = c._username,
this._password = c._password,
u = "query";
else if (e == "#")
this._host = c._host,
this._port = c._port,
this._path = c._path.slice(),
this._query = c._query,
this._fragment = "#",
this._username = c._username,
this._password = c._password,
u = "fragment";
else {
var R = r[A + 1]
, j = r[A + 2];
(this._scheme != "file" || !w.test(e) || R != ":" && R != "|" || o != j && j != "/" && j != "\\" && j != "?" && j != "#") && (this._host = c._host,
this._port = c._port,
this._username = c._username,
this._password = c._password,
this._path = c._path.slice(),
this._path.pop()),
u = "relative path";
continue
}
break;
case "relative slash":
if (e == "/" || e == "\\")
e == "\\" && v("\\ is an invalid code point."),
this._scheme == "file" ? u = "file host" : u = "authority ignore slashes";
else {
this._scheme != "file" && (this._host = c._host,
this._port = c._port,
this._username = c._username,
this._password = c._password),
u = "relative path";
continue
}
break;
case "authority first slash":
if (e == "/")
u = "authority second slash";
else {
v("Expected '/', got: " + e),
u = "authority ignore slashes";
continue
}
break;
case "authority second slash":
if (u = "authority ignore slashes",
e != "/") {
v("Expected '/', got: " + e);
continue
}
break;
case "authority ignore slashes":
if (e != "/" && e != "\\") {
u = "authority";
continue
} else
v("Expected authority, got: " + e);
break;
case "authority":
if (e == "@") {
P && (v("@ already seen."),
f += "%40"),
P = !0;
for (var q = 0; q < f.length; q++) {
var k = f[q];
if (k == " " || k == `
` || k == "\r") {
v("Invalid whitespace in authority.");
continue
}
if (k == ":" && this._password === null) {
this._password = "";
continue
}
var $ = b(k);
this._password !== null ? this._password += $ : this._username += $
}
f = ""
} else if (o == e || e == "/" || e == "\\" || e == "?" || e == "#") {
A -= f.length,
f = "",
u = "host";
continue
} else
f += e;
break;
case "file host":
if (o == e || e == "/" || e == "\\" || e == "?" || e == "#") {
f.length == 2 && w.test(f[0]) && (f[1] == ":" || f[1] == "|") ? u = "relative path" : (f.length == 0 || (this._host = d.call(this, f),
f = ""),
u = "relative path start");
continue
} else
e == " " || e == `
` || e == "\r" ? v("Invalid whitespace in file host.") : f += e;
break;
case "host":
case "hostname":
if (e == ":" && !D) {
if (this._host = d.call(this, f),
f = "",
u = "port",
p == "hostname")
break t
} else if (o == e || e == "/" || e == "\\" || e == "?" || e == "#") {
if (this._host = d.call(this, f),
f = "",
u = "relative path start",
p)
break t;
continue
} else
e != " " && e != `
` && e != "\r" ? (e == "[" ? D = !0 : e == "]" && (D = !1),
f += e) : v("Invalid code point in host/hostname: " + e);
break;
case "port":
if (/[0-9]/.test(e))
f += e;
else if (o == e || e == "/" || e == "\\" || e == "?" || e == "#" || p) {
if (f != "") {
var N = parseInt(f, 10);
N != h[this._scheme] && (this._port = N + ""),
f = ""
}
if (p)
break t;
u = "relative path start";
continue
} else
e == " " || e == `
` || e == "\r" ? v("Invalid code point in port: " + e) : n.call(this);
break;
case "relative path start":
if (e == "\\" && v("'\\' not allowed in path."),
u = "relative path",
e != "/" && e != "\\")
continue;
break;
case "relative path":
if (o == e || e == "/" || e == "\\" || !p && (e == "?" || e == "#")) {
e == "\\" && v("\\ not allowed in relative path.");
var t;
(t = s[f.toLowerCase()]) && (f = t),
f == ".." ? (this._path.pop(),
e != "/" && e != "\\" && this._path.push("")) : f == "." && e != "/" && e != "\\" ? this._path.push("") : f != "." && (this._scheme == "file" && this._path.length == 0 && f.length == 2 && w.test(f[0]) && f[1] == "|" && (f = f[0] + ":"),
this._path.push(f)),
f = "",
e == "?" ? (this._query = "?",
u = "query") : e == "#" && (this._fragment = "#",
u = "fragment")
} else
e != " " && e != `
` && e != "\r" && (f += b(e));
break;
case "query":
!p && e == "#" ? (this._fragment = "#",
u = "fragment") : o != e && e != " " && e != `
` && e != "\r" && (this._query += g(e));
break;
case "fragment":
o != e && e != " " && e != `
` && e != "\r" && (this._fragment += e);
break
}
A++
}
}
function U() {
this._scheme = "",
this._schemeData = "",
this._username = "",
this._password = null,
this._host = "",
this._port = "",
this._path = [],
this._query = "",
this._fragment = "",
this._isInvalid = !1,
this._isRelative = !1
}
function T(r, p) {
p !== void 0 && !(p instanceof T) && (p = new T(String(p))),
r = String(r),
this._url = r,
U.call(this);
var c = r.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g, "");
x.call(this, c, null, p)
}
T.prototype = {
toString: function() {
return this.href
},
get href() {
if (this._isInvalid)
return this._url;
var r = "";
return (this._username != "" || this._password != null) && (r = this._username + (this._password != null ? ":" + this._password : "") + "@"),
this.protocol + (this._isRelative ? "//" + r + this.host : "") + this.pathname + this._query + this._fragment
},
set href(r) {
U.call(this),
x.call(this, r)
},
get protocol() {
return this._scheme + ":"
},
set protocol(r) {
this._isInvalid || x.call(this, r + ":", "scheme start")
},
get host() {
return this._isInvalid ? "" : this._port ? this._host + ":" + this._port : this._host
},
set host(r) {
this._isInvalid || !this._isRelative || x.call(this, r, "host")
},
get hostname() {
return this._host
},
set hostname(r) {
this._isInvalid || !this._isRelative || x.call(this, r, "hostname")
},
get port() {
return this._port
},
set port(r) {
this._isInvalid || !this._isRelative || x.call(this, r, "port")
},
get pathname() {
return this._isInvalid ? "" : this._isRelative ? "/" + this._path.join("/") : this._schemeData
},
set pathname(r) {
this._isInvalid || !this._isRelative || (this._path = [],
x.call(this, r, "relative path start"))
},
get search() {
return this._isInvalid || !this._query || this._query == "?" ? "" : this._query
},
set search(r) {
this._isInvalid || !this._isRelative || (this._query = "?",
r[0] == "?" && (r = r.slice(1)),
x.call(this, r, "query"))
},
get hash() {
return this._isInvalid || !this._fragment || this._fragment == "#" ? "" : this._fragment
},
set hash(r) {
this._isInvalid || (this._fragment = "#",
r[0] == "#" && (r = r.slice(1)),
x.call(this, r, "fragment"))
},
get origin() {
var r;
if (this._isInvalid || !this._scheme)
return "";
switch (this._scheme) {
case "data":
case "file":
case "javascript":
case "mailto":
return "null"
}
return r = this.host,
r ? this._scheme + "://" + r : ""
}
};
var B = self.URL;
return B && (T.createObjectURL = function(r) {
return B.createObjectURL.apply(B, arguments)
}
,
T.revokeObjectURL = function(r) {
B.revokeObjectURL(r)
}
),
T
}
var V = kt();
var nt = vt(at());
var C;
(function(o) {
o.empty = "",
o.pending = "\u{1F551}",
o.successful = "\u2705",
o.caution = "\u26A0\uFE0F",
o.failed = "\u274C",
o.global = "\u{1F30D}",
o.asterisk = "*"
}
)(C || (C = {}));
var H = class {
constructor(s="div", a=void 0, n=C.pending) {
let d = document.createElement(s);
this.element = d,
a != null && (this.className = a),
this.textContent = n
}
static fromElement(s) {
let a = new H("div");
return a.element = s,
a
}
asterisk() {
this.textContent = C.asterisk
}
lose() {
this.textContent = C.failed
}
win(s) {
if (s != null) {
this.textContent = C.empty;
let a = document.createElement("a");
a.href = s,
a.target = "_blank",
a.textContent = C.successful,
this.element.title = s,
this.element.appendChild(a)
} else
this.textContent = C.successful
}
global() {
this.textContent = C.global
}
err() {
this.textContent = C.caution
}
empty() {
this.textContent = C.empty
}
get style() {
return this.element.style
}
append(s) {
return s instanceof H && (s = s.element),
this.element.append(s)
}
get classList() {
return this.element.classList
}
set title(s) {
this.element.title = s
}
set className(s) {
this.element.className = s
}
set textContent(s) {
this.element.textContent = s
}
}
;
var I = class {
constructor(s, ...a) {
this.parent = s;
this.tag = new H(...a)
}
};
var J = class extends I {
constructor(s, ...a) {
super(s, ...a);
this.parent = s;
this._className = "Not-set";
this._tagName = "Not-set"
}
get className() {
return this._className
}
get tagName() {
return this._tagName
}
check() {}
checked() {}
onerror() {
this.tag.err()
}
};
var O = "bafybeiatyghkzrrtodzt3stm652rkrjxndg4hq2ublfdmifk7plg5k5brq"
, ot = O
, ht = "<title>Some keys for testing - jetbra.in</title>";
var L = class {
constructor(s) {
this.namespace = s
}
log(s, ...a) {
let[n,...d] = a
, b = this.namespace != null ? `${this.namespace}.${s}: ` : "";
console[s](`${b}${n}`, ...d)
}
debug(...s) {
this.log("debug", ...s)
}
info(...s) {
this.log("info", ...s)
}
warn(...s) {
this.log("warn", ...s)
}
error(...s) {}
}
;
var {fetch: xt} = (0,
nt.default)()
, Q = new L("Cors")
, K = class extends J {
constructor(s) {
super(s, "div", "Cors");
this.parent = s;
this._className = "Cors";
this._tagName = "div"
}
async check() {
let s = Date.now()
, n = `${this.parent.gateway.replace(":hash", O)}?now=${s}#x-ipfs-companion-no-redirect`;
try {
let d = new AbortController
, b = setTimeout(()=>d.abort(), 1e4)
, g = await xt(n, {
signal: d.signal
})
, {status: o} = g
, w = await g.text();
if (this.tag.title = `Response code: ${o}`,
clearTimeout(b),
w.trim().includes(ht))
this.tag.asterisk(),
this.parent.tag.classList.add("cors");
else
throw Q.debug("The response text did not match the expected string"),
this.onerror(),
new Error(`URL '${n} does not support CORS`)
} catch (d) {
throw Q.error(d),
this.onerror(),
d
}
}
checked() {
Q.warn("Not implemented yet")
}
onerror() {
this.tag.empty()
}
}
;
async function pt(h) {
let s = 1e4;
return await new Promise((a,n)=>{
let d = new Image
, b = setTimeout(()=>{
n(new Error(`Timeout when attempting to load img from '${d.src}`))
}
, s)
, g = (o,w,G,x,U)=>{
clearTimeout(b),
U == null ? n(new Error(`Unknown Error when attempting to load img from '${d.src}`)) : n(U)
};
d.onerror = g,
d.onload = ()=>{
clearTimeout(b),
a()
},
d.src = h.toString()
}
)
}
var Tt = new L("Status")
, Y = class extends I {
constructor(s) {
super(s, "div", "Status");
this.parent = s;
this._up = !1;
this._down = !1
}
async check() {
let s = this.parent.gateway.replace(":hash", ot)
, a = new V(`${s}1x1.png?now=${Date.now()}#x-ipfs-companion-no-redirect`);
await pt(a).catch(n=>{
throw n != null && Tt.error(this.parent.gateway, n),
n
}
)
}
get down() {
return this._down
}
set down(s) {
!this.up && !this.down && (this._down = !0,
this.tag.lose())
}
get up() {
return this._up
}
set up(s) {
!this.up && !this.down && (this._up = !0,
this.tag.global(),
this.parent.tag.classList.add("online"))
}
onerror() {
throw new Error("Not implemented")
}
};
function tt(h) {
let s = h.toString();
return h?.hostname != null && (s = h.hostname.toString()),
s.replace(`${O}.ipfs.`, "").replace(`${O}.`, "")
}
var S = new L("GatewayNode")
, et = class extends I {
constructor(s, a, n) {
super(s, "div", "Node");
this.parent = s;
this.atLeastOneSuccess = !1;
this.tag.empty(),
this.tag.style.order = Date.now().toString(),
this.status = new Y(this),
this.tag.append(this.status.tag),
this.cors = new K(this),
this.tag.append(this.cors.tag),
this.link = document.createElement("div");
let d = a.replace(":hash", O);
this.link.url = new V(d),
this.link.textContent = tt(this.link.url),
this.link.className = "Link",
this.tag.append(this.link),
this.took = document.createElement("div"),
this.took.className = "Took",
this.tag.append(this.took),
this.gateway = a,
this.index = n,
this.checkingTime = 0
}
async check() {
this.checkingTime = Date.now();
let s = [this.status.check().then(()=>S.debug(this.gateway, "Status success")).then(this.onSuccessfulCheck.bind(this)), this.cors.check().then(()=>S.debug(this.gateway, "CORS success")).then(this.onSuccessfulCheck.bind(this))];
await Promise.allSettled(s).then(a=>a.map(n=>n.status)).then(a=>{
a.includes("fulfilled") ? (S.debug(`For gateway '${this.gateway}', at least one promise was successfully fulfilled`),
S.debug(this.gateway, "this.status.up: ", this.status.up),
S.debug(this.gateway, "this.status.down: ", this.status.down),
this.status.up = !0,
S.debug(this.gateway, "this.status.up: ", this.status.up),
S.debug(this.gateway, "this.status.down: ", this.status.down)) : (this.status.down = !0,
S.debug(`For gateway '${this.gateway}', all promises were rejected`))
}
)
}
onSuccessfulCheck() {
if (!this.atLeastOneSuccess) {
S.info(`For gateway '${this.gateway}', at least one check was successful`),
this.atLeastOneSuccess = !0,
this.status.up = !0;
let s = this.link.url;
if (s != null) {
let d = tt(s);
this.link.innerHTML = `<a title="${d}" href="${s.toString()}" target="_blank">${d}</a>`
}
let a = Date.now() - this.checkingTime;
this.tag.style.order = a.toString();
let n = (a / 1e3).toFixed(2);
this.took.textContent = `${n}s`
}
}
onerror() {
this.tag.err()
}
};
var st = class {
constructor(s) {
this.parent = s;
let a = document.getElementById("checker.results");
if (a == null)
throw new Error('Element with Id "checker.results" not found.');
this.element = a
}
append(s) {
this.element.append(s.element)
}
};
var it = class extends I {
constructor(s) {
super(s);
this.parent = s;
let a = document.getElementById("checker.stats");
if (a == null)
throw new Error('Could not find element with Id "checker.stats"');
this.tag = H.fromElement(a),
this.gateways = document.createElement("div"),
this.gateways.textContent = "0/0 tested",
this.gateways.className = "Gateways",
this.tag.append(this.gateways),
this.totals = document.createElement("div"),
this.totals.textContent = "0 online",
this.totals.className = "Totals",
this.tag.append(this.totals)
}
update() {
let s = 0
, a = 0;
for (let n of this.parent.nodes)
n.status.up ? s += 1 : n.status.down && (a += 1);
this.gateways.textContent = `${s + a}/${this.parent.nodes.length} tested`,
this.totals.textContent = `${s} online`
}
};
var Et = new L("Checker")
, rt = class {
constructor() {
this.nodes = [];
let s = document.getElementById("checker");
if (s == null)
throw new Error('Element with Id "checker" not found.');
this.element = s,
this.stats = new it(this),
this.results = new st(this),
this.updateStats = this.updateStats.bind(this)
}
updateStats() {
this.stats.update()
}
async checkGateways(s) {
let a = [];
for (let n of s) {
let d = new et(this.results,n,this.nodes.length);
this.nodes.push(d),
this.results.append(d.tag),
setTimeout(()=>{
a.push(d.check().catch(b=>Et.error(b)).finally(this.updateStats))
}
, 100 * this.nodes.length)
}
}
};
var ft = ["https://ipfs.io/ipfs/:hash/", "https://dweb.link/ipfs/:hash/", "https://gateway.ipfs.io/ipfs/:hash/", "https://ipfs.infura.io/ipfs/:hash/", "https://infura-ipfs.io/ipfs/:hash/", "https://ninetailed.ninja/ipfs/:hash/", "https://via0.com/ipfs/:hash/", "https://ipfs.eternum.io/ipfs/:hash/", "https://hardbin.com/ipfs/:hash/", "https://gateway.blocksec.com/ipfs/:hash/", "https://cloudflare-ipfs.com/ipfs/:hash/", "https://astyanax.io/ipfs/:hash/", "https://cf-ipfs.com/ipfs/:hash/", "https://ipns.co/ipfs/:hash/", "https://ipfs.mrh.io/ipfs/:hash/", "https://gateway.originprotocol.com/ipfs/:hash/", "https://gateway.pinata.cloud/ipfs/:hash/", "https://ipfs.doolta.com/ipfs/:hash/", "http://147.75.38.111/ipfs/:hash/", "http://147.28.147.227/ipfs/:hash/", "http://139.178.88.239/ipfs/:hash/", "http://86.109.7.107/ipfs/:hash/", "http://145.40.117.11/ipfs/:hash/", "http://145.40.93.119/ipfs/:hash/", "http://145.40.88.35/ipfs/:hash/", "http://147.75.108.157/ipfs/:hash/", "http://147.28.147.245/ipfs/:hash/", "http://147.28.128.243/ipfs/:hash/", "http://145.40.71.73/ipfs/:hash/", "http://147.75.109.125/ipfs/:hash/", "http://136.144.48.213/ipfs/:hash/", "https://ipfs.sloppyta.co/ipfs/:hash/", "https://ipfs.busy.org/ipfs/:hash/", "https://ipfs.greyh.at/ipfs/:hash/", "https://gateway.serph.network/ipfs/:hash/", "https://jorropo.net/ipfs/:hash/", "https://ipfs.fooock.com/ipfs/:hash/", "https://cdn.cwinfo.net/ipfs/:hash/", "https://aragon.ventures/ipfs/:hash/", "https://ipfs-cdn.aragon.ventures/ipfs/:hash/", "https://permaweb.io/ipfs/:hash/", "https://ipfs.best-practice.se/ipfs/:hash/", "https://storjipfs-gateway.com/ipfs/:hash/", "https://ipfs.runfission.com/ipfs/:hash/", "https://ipfs.trusti.id/ipfs/:hash/", "https://ipfs.overpi.com/ipfs/:hash/", "https://gateway.ipfs.lc/ipfs/:hash/", "https://ipfs.ink/ipfs/:hash/", "https://ipfsgateway.makersplace.com/ipfs/:hash/", "https://gateway.ravenland.org/ipfs/:hash/", "https://ipfs.funnychain.co/ipfs/:hash/", "https://ipfs.telos.miami/ipfs/:hash/", "https://ipfs.mttk.net/ipfs/:hash/", "https://ipfs.fleek.co/ipfs/:hash/", "https://ipfs.jbb.one/ipfs/:hash/", "https://ipfs.yt/ipfs/:hash/", "https://hashnews.k1ic.com/ipfs/:hash/", "https://ipfs.vip/ipfs/:hash/", "https://ipfs.drink.cafe/ipfs/:hash/", "https://ipfs.azurewebsites.net/ipfs/:hash/", "https://gw.ipfspin.com/ipfs/:hash/", "https://ipfs.kavin.rocks/ipfs/:hash/", "https://ipfs.denarius.io/ipfs/:hash/", "https://ipfs.mihir.ch/ipfs/:hash/", "https://crustwebsites.net/ipfs/:hash/", "https://ipfs0.sjc.cloudsigma.com/ipfs/:hash/", "http://ipfs.genenetwork.org/ipfs/:hash/", "https://ipfs.eth.aragon.network/ipfs/:hash/", "https://ipfs.smartholdem.io/ipfs/:hash/", "https://ipfs.xoqq.ch/ipfs/:hash/", "http://natoboram.mynetgear.com:8080/ipfs/:hash/", "https://video.oneloveipfs.com/ipfs/:hash/", "http://ipfs.anonymize.com/ipfs/:hash/", "https://ipfs.taxi/ipfs/:hash/", "https://ipfs.scalaproject.io/ipfs/:hash/", "https://search.ipfsgate.com/ipfs/:hash/", "https://ipfs.decoo.io/ipfs/:hash/", "https://ivoputzer.xyz/ipfs/:hash/", "https://alexdav.id/ipfs/:hash/", "https://ipfs.uploads.nu/ipfs/:hash/", "https://hub.textile.io/ipfs/:hash/", "https://ipfs1.pixura.io/ipfs/:hash/", "https://ravencoinipfs-gateway.com/ipfs/:hash/", "https://konubinix.eu/ipfs/:hash/", "https://3cloud.ee/ipfs/:hash/", "https://ipfs.tubby.cloud/ipfs/:hash/", "https://ipfs.lain.la/ipfs/:hash/", "https://ipfs.adatools.io/ipfs/:hash/", "https://ipfs.kaleido.art/ipfs/:hash/", "https://ipfs.slang.cx/ipfs/:hash/", "https://ipfs.arching-kaos.com/ipfs/:hash/", "https://storry.tv/ipfs/:hash/", "https://ipfs.kxv.io/ipfs/:hash/", "https://ipfs.1-2.dev/ipfs/:hash/", "https://ipfs-nosub.stibarc.com/ipfs/:hash/", "https://dweb.eu.org/ipfs/:hash/", "https://permaweb.eu.org/ipfs/:hash/", "https://ipfs.namebase.io/ipfs/:hash/", "https://ipfs.tribecap.co/ipfs/:hash/", "https://ipfs.kinematiks.com/ipfs/:hash/", "https://c4rex.co/ipfs/:hash/", "https://nftstorage.link/ipfs/:hash/", "https://gravity.jup.io/ipfs/:hash/", "http://fzdqwfb5ml56oadins5jpuhe6ki6bk33umri35p5kt2tue4fpws5efid.onion/ipfs/:hash/", "https://tth-ipfs.com/ipfs/:hash/", "https://ipfs.chisdealhd.co.uk/ipfs/:hash/", "https://ipfs.alloyxuast.tk/ipfs/:hash/", "https://ipfs.litnet.work/ipfs/:hash/", "https://ipfs.hexide.com/ipfs/:hash/", "https://10.via0.com/ipfs/:hash/", "https://gateway.temporal.cloud/ipfs/:hash/", "https://hashnews.k1ic.com/ipfs/:hash/", "https://ipfs.2read.net/ipfs/:hash/", "https://ipfs.cf-ipfs.com/ipfs/:hash/", "https://jacl.tech/ipfs/:hash/", "https://ipfs.jeroendeneef.com/ipfs/:hash/", "https://ipfs.k1ic.com/ipfs/:hash/", "https://ipfs.lc/ipfs/:hash/", "https://ipfs.moonicorn.network/ipfs/:hash/", "https://ipfs.smartsignature.io/ipfs/:hash/", "https://ipfs.stibarc.com/ipfs/:hash/", "https://jorropo.ovh/ipfs/:hash/", "https://robotizing.net/ipfs/:hash/", "https://trusti.id/ipfs/:hash/", "https://siderus.io/ipfs/:hash/", "https://snap1.d.tube/ipfs/:hash/", "https://coinsh.red/ipfs/:hash/", "https://ipns.co/:hash/", "https://ipfs.oceanprotocol.com/ipfs/:hash/", "https://cloudfront.net/ipfs/:hash/", "https://ipfs.oxerr.net/ipfs/:hash/", "https://ipfs.privacytools.io/ipfs/:hash/", "https://ipfs.renehsz.com/ipfs/:hash/", "https://ipfs.com/ipfs/:hash/", "https://ipfs.cosmos-ink.net/ipfs/:hash/", "https://rx14.co.uk/ipfs/:hash/", "https://2read.net/ipfs/:hash/", "https://filecoin.io/ipfs/:hash/", "https://ipfs.3box.io/ipfs/:hash/", "https://ipfs.globalupload.io/:hash/", "https://ipfs.globalupload.io/ipfs/:hash/", "https://ipfs.dweb.link/ipfs/:hash/", "https://ipfs.infura-ipfs.io/ipfs/:hash/", "https://ipfs.wa.hle.rs/ipfs/:hash/", "https://ipfs.stibarc.gq/ipfs/:hash/", "https://ipfs.jacl.tech/ipfs/:hash/", "https://ipfs.jes.xxx/ipfs/:hash/", "https://ipfs.leiyun.org/ipfs/:hash/", "https://ap.siderus.io/ipfs/:hash/", "https://api.wisdom.sh/ipfs/:hash/", "https://catalunya.network/ipfs/:hash/", "https://coinsh.red/:hash/", "https://d26g9c7mfuzstv.cloudfront.net/ipfs/:hash/", "https://eu.siderus.io/ipfs/:hash/", "https://gateway.swedneck.xyz/ipfs/:hash/", "https://ipfs.dapps.earth/ipfs/:hash/", "https://ipfs.deo.moe/ipfs/:hash/", "https://ipfs.macholibre.org/ipfs/:hash/", "https://ipfs.netw0rk.io/ipfs/:hash/", "https://ipfs.works/ipfs/:hash/", "https://ipfstube.erindachtler.me/ipfs/:hash/", "https://na.siderus.io/ipfs/:hash/", "https://upload.global/ipfs/:hash/"];
var lt = new L("App index");
window.checker = new rt;
window.checker.checkGateways(ft).catch(h=>{
lt.error("Unexpected error"),
lt.error(h)
}
);
}
)();
return IpfsPublicGatewayChecker
}));
</script>
</body>
</html>
hash取值:
var O = "bafybeiatyghkzrrtodzt3stm652rkrjxndg4hq2ublfdmifk7plg5k5brq";//220801
var O = "bafybeia4nrbuvpfd6k7lkorzgjw3t6totaoko7gmvq5pyuhl2eloxnfiri";//230914