KEXEL commited on
Commit
9457b5b
·
verified ·
1 Parent(s): 01b7f8c
.gitattributes ADDED
@@ -0,0 +1 @@
 
 
1
+ d-framework/icon/512/favicon.png filter=lfs diff=lfs merge=lfs -text
d-framework/api.json ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "filename": "kexel-speedtest.static.hf.space/index.html",
4
+ "imgshot": "kexel-speedtest.static.hf.space.jpg",
5
+ "rating": 90
6
+ },
7
+ {
8
+ "filename": "kexel-convert.static.hf.space/index.html",
9
+ "imgshot": "kexel-convert.static.hf.space.jpg",
10
+ "rating": 90
11
+ },
12
+ {
13
+ "filename": "kexel-mid.static.hf.space/play-midi.html",
14
+ "imgshot": "kexel-mid.static.hf.space.jpg",
15
+ "rating": 90
16
+ },
17
+ {
18
+ "filename": "kexel-mid.static.hf.space/mid-to-wav.html",
19
+ "imgshot": "kexel-mid.static.hf.spacek.jpg",
20
+ "rating": 90
21
+ },
22
+ {
23
+ "filename": "kexel-design.static.hf.space/index.html",
24
+ "imgshot": "kexel-design.static.hf.space.jpg",
25
+ "rating": 90
26
+ },
27
+ {
28
+ "filename": "enzostvs-deepsite.hf.space/",
29
+ "imgshot": "enzostvs-deepsite.hf.space.jpg",
30
+ "rating": 90
31
+ },
32
+ {
33
+ "filename": "enzostvs-qwensite.hf.space",
34
+ "imgshot": "enzostvs-qwensite.hf.space.jpg",
35
+ "rating": 90
36
+ },
37
+ {
38
+ "filename": "not-lain-background-removal.hf.space",
39
+ "imgshot": "not-lain-background-removal.hf.space.jpg",
40
+ "rating": 90
41
+ },
42
+ {
43
+ "filename": "qwen-qwen3-demo.hf.space",
44
+ "imgshot": "qwen-qwen3-demo.hf.space.jpg",
45
+ "rating": 90
46
+ },
47
+ {
48
+ "filename": "kexel-gallery.static.hf.space",
49
+ "imgshot": "kexel-gallery.static.hf.space.jpg",
50
+ "rating": 10
51
+ }
52
+ ]
d-framework/icon/144/favicon.png ADDED
d-framework/icon/192/favicon.png ADDED
d-framework/icon/36/favicon.png ADDED
d-framework/icon/48/favicon.png ADDED
d-framework/icon/512/favicon.png ADDED

Git LFS Details

  • SHA256: c61526ea231beb4e4b31f816a781336947e8713f520c425e48837fdb3a72f3be
  • Pointer size: 131 Bytes
  • Size of remote file: 252 kB
d-framework/icon/72/favicon.png ADDED
d-framework/icon/96/favicon.png ADDED
d-framework/screenshot/enzostvs-deepsite.hf.space.jpg ADDED
d-framework/screenshot/enzostvs-qwensite.hf.space.jpg ADDED
d-framework/screenshot/kexel-convert.static.hf.space.jpg ADDED
d-framework/screenshot/kexel-design.static.hf.space.jpg ADDED
d-framework/screenshot/kexel-mid.static.hf.space.jpg ADDED
d-framework/screenshot/kexel-mid.static.hf.spacek.jpg ADDED
d-framework/screenshot/kexel-speedtest.static.hf.space.jpg ADDED
d-framework/screenshot/not-lain-background-removal.hf.space.jpg ADDED
d-framework/screenshot/qwen-qwen3-demo.hf.space.jpg ADDED
d-framework/screenshot/thum.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ https://image.thum.io/get/width/600/crop/700/maxAge/20/allowJPG/https://kexel-speedtest.static.hf.space/index.html?
index.html ADDED
@@ -0,0 +1,344 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="pt-br">
3
+
4
+ <head>
5
+ <meta charset="UTF-8">
6
+ <title>KEXEL GALLERY</title>
7
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
8
+ <meta name="description" content="KEXEL GALLERY COM A BASE EM NAVEGADOR PARA PLATAFORMAS MODERNAS..." />
9
+ <meta name="mobile-web-app-capable" content="yes" />
10
+ <meta name="apple-mobile-web-app-capable" content="yes" />
11
+ <meta name="application-name" content="KEXEL GALLERY" />
12
+ <meta name="apple-mobile-web-app-title" content="KEXEL GALLERY" />
13
+ <meta name="msapplication-starturl" content="/?Installed=kexel" />
14
+ <meta name="theme-color" content="#602ab6" />
15
+ <meta name="msapplication-navbutton-color" content="#602ab6" />
16
+ <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
17
+ <meta name="apple-touch-fullscreen" content="yes" />
18
+ <meta name="robots" content="index, follow" />
19
+ <meta name="googlebot" content="index, follow" />
20
+ <meta property="og:image" content="./d-framework/icon/icon/512/favicon.png" />
21
+ <link rel="icon" type="image/png" sizes="512x512" href="./d-framework/icon/512/favicon.png" />
22
+ <link rel="apple-touch-icon" type="image/png" sizes="512x512" href="./d-framework/icon/512/favicon.png" />
23
+ <link rel="icon" type="image/png" sizes="192x192" href="./d-framework/icon/192/favicon.png" />
24
+ <link rel="apple-touch-icon" type="image/png" sizes="192x192" href="./d-framework/icon/192/favicon.png" />
25
+ <link rel="icon" type="image/png" sizes="144x144" href="./d-framework/icon/144/favicon.png" />
26
+ <link rel="apple-touch-icon" type="image/png" sizes="144x144" href="./d-framework/icon/144/favicon.png" />
27
+ <link rel="icon" type="image/png" sizes="96x96" href="./d-framework/icon/96/favicon.png" />
28
+ <link rel="apple-touch-icon" type="image/png" sizes="96x96" href="./d-framework/icon/96/favicon.png" />
29
+ <link rel="icon" type="image/png" sizes="72x72" href="./d-framework/icon/72/favicon.png" />
30
+ <link rel="apple-touch-icon" type="image/png" sizes="72x72" href="./d-framework/icon/72/favicon.png" />
31
+ <link rel="icon" type="image/png" sizes="48x48" href="./d-framework/icon/48/favicon.png" />
32
+ <link rel="apple-touch-icon" type="image/png" sizes="48x48" href="./d-framework/icon/48/favicon.png" />
33
+ <link rel="icon" type="image/png" sizes="36x36" href="./d-framework/icon/36/favicon.png" />
34
+ <link rel="apple-touch-icon" type="image/png" sizes="36x36" href="./d-framework/icon/36/favicon.png" />
35
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6/css/all.min.css" />
36
+ <script src="https://cdn.jsdelivr.net/gh/davserv/d-framework@refs/heads/cdn.tailwindcss/tailwindcss.js"></script>
37
+
38
+ <script src="data:application/javascript;charset=utf-8;base64,dmFyIGNvbG9iZD0iIzJiMzAzNWM3Iixjb2xvbGlzPSIjNzI2ZDNiIixjb2xvdHh0PSIjZmZmOSIKZG9jdW1lbnQud3JpdGUoIjxzdHlsZT4ucGFjZXtwb2ludGVyLWV2ZW50czpub25lO3VzZXItc2VsZWN0Om5vbmU7ei1pbmRleDo5OTk5OTk5O3Bvc2l0aW9uOmZpeGVkO3RvcDowO2xlZnQ6MDtyaWdodDowO2JvdHRvbTowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCU7YmFja2dyb3VuZDoiK2NvbG9iZCsnO292ZXJmbG93OmhpZGRlbn0ucGFjZTo6YmVmb3Jle2NvbnRlbnQ6IkNBUlJFR0FORE8uLi4iO2NvbG9yOicrY29sb3R4dCsiO3Bvc2l0aW9uOmFic29sdXRlO3RvcDo0NyU7bGVmdDo1MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLC01MCUpfS5wYWNlIC5wYWNlLXByb2dyZXNze2JveC1zaXppbmc6Ym9yZGVyLWJveDt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwwLDApO21heC13aWR0aDoxMDAlO3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MjAwMDtkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO2JvdHRvbTo1MCU7cmlnaHQ6MTAwJTtoZWlnaHQ6NXB4O3dpZHRoOjEwMCU7YmFja2dyb3VuZDoiK2NvbG9saXMrIn0ucGFjZS5wYWNlLWluYWN0aXZle2Rpc3BsYXk6bm9uZX08L3N0eWxlPiIpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0LmFwcGx5KGUsYXJndW1lbnRzKX19ZnVuY3Rpb24gZSgpe31mdW5jdGlvbiBuKCl7cmV0dXJuIG4uX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiByKCl7dGhpcy5wcm9ncmVzcz0wfWZ1bmN0aW9uIHMoKXt0aGlzLmJpbmRpbmdzPXt9fWZ1bmN0aW9uIG8oKXt2YXIgdCxlPXRoaXMKby5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpLHQ9ZnVuY3Rpb24odCl7dmFyIG49dC5vcGVuCnJldHVybiB0Lm9wZW49ZnVuY3Rpb24ocixzLG8pe3JldHVybiBEKHIpJiZlLnRyaWdnZXIoInJlcXVlc3QiLHt0eXBlOnIsdXJsOnMscmVxdWVzdDp0fSksbi5hcHBseSh0LGFyZ3VtZW50cyl9fSx3aW5kb3cuWE1MSHR0cFJlcXVlc3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9bmV3IEsoZSksdChlKSxlfQp0cnl7Tyh3aW5kb3cuWE1MSHR0cFJlcXVlc3QsSyl9Y2F0Y2gobil7fWlmKG51bGwhPUope3dpbmRvdy5YRG9tYWluUmVxdWVzdD1mdW5jdGlvbigpe3ZhciBlPW5ldyBKCnJldHVybiB0KGUpLGV9CnRyeXtPKHdpbmRvdy5YRG9tYWluUmVxdWVzdCxKKX1jYXRjaChuKXt9fWlmKG51bGwhPUImJl8uYWpheC50cmFja1dlYlNvY2tldHMpe3dpbmRvdy5XZWJTb2NrZXQ9ZnVuY3Rpb24odCxuKXt2YXIgcj1udWxsIT1uP25ldyBCKHQsbik6bmV3IEIodCkKcmV0dXJuIEQoInNvY2tldCIpJiZlLnRyaWdnZXIoInJlcXVlc3QiLHt0eXBlOiJzb2NrZXQiLHVybDp0LHByb3RvY29sczpuLHJlcXVlc3Q6cn0pLHJ9CnRyeXtPKHdpbmRvdy5XZWJTb2NrZXQsQil9Y2F0Y2gobil7fX19ZnVuY3Rpb24gaSgpe3RoaXMuY29tcGxldGU9dCh0aGlzLmNvbXBsZXRlLHRoaXMpCnZhciBlPXRoaXMKdGhpcy5lbGVtZW50cz1bXSxBKCkub24oInJlcXVlc3QiLGZ1bmN0aW9uKCl7cmV0dXJuIGUud2F0Y2guYXBwbHkoZSxhcmd1bWVudHMpfSl9ZnVuY3Rpb24gYShlKXt2YXIgbixyLHMsbwpmb3IobnVsbD09ZSYmKGU9e30pLHRoaXMuY29tcGxldGU9dCh0aGlzLmNvbXBsZXRlLHRoaXMpLHRoaXMuZWxlbWVudHM9W10sbnVsbD09ZS5zZWxlY3RvcnMmJihlLnNlbGVjdG9ycz1bXSkscj0wLHM9KG89ZS5zZWxlY3RvcnMpLmxlbmd0aDtzPnI7cisrKW49b1tyXSx0aGlzLmVsZW1lbnRzLnB1c2gobmV3IGcobix0aGlzLmNvbXBsZXRlKSl9ZnVuY3Rpb24gdSh0LGUpe3RoaXMuc2VsZWN0b3I9dCx0aGlzLmNvbXBsZXRlQ2FsbGJhY2s9ZSx0aGlzLnByb2dyZXNzPTAsdGhpcy5jaGVjaygpfWZ1bmN0aW9uIGMoKXt2YXIgdCxlLG49dGhpcwp0aGlzLnByb2dyZXNzPW51bGwhPShlPXRoaXMuc3RhdGVzW2RvY3VtZW50LnJlYWR5U3RhdGVdKT9lOjEwMCx0PWRvY3VtZW50Lm9ucmVhZHlzdGF0ZWNoYW5nZSxkb2N1bWVudC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9bi5zdGF0ZXNbZG9jdW1lbnQucmVhZHlTdGF0ZV0mJihuLnByb2dyZXNzPW4uc3RhdGVzW2RvY3VtZW50LnJlYWR5U3RhdGVdKSwiZnVuY3Rpb24iPT10eXBlb2YgdD90LmFwcGx5KG51bGwsYXJndW1lbnRzKTp2b2lkIDB9fWZ1bmN0aW9uIGwodCl7dGhpcy5zb3VyY2U9dCx0aGlzLmxhc3Q9dGhpcy5zaW5jZUxhc3RVcGRhdGU9MCx0aGlzLnJhdGU9Xy5pbml0aWFsUmF0ZSx0aGlzLmNhdGNodXA9MCx0aGlzLnByb2dyZXNzPXRoaXMubGFzdFByb2dyZXNzPTAsbnVsbCE9dGhpcy5zb3VyY2UmJih0aGlzLnByb2dyZXNzPVUodGhpcy5zb3VyY2UsInByb2dyZXNzIikpfXZhciBwLGgsZyxmLGQsbSx5LHYsdyxiLGsseCxTLHEsTCxSLFAsVCxPLGosQSxFLEMsTSxOLF8sRixVLFcsWCx6LEQsSCxJLEcsQixKLEssUSxWLFksWiwkLHR0LGV0LG50PVtdLnNsaWNlLHJ0PXt9Lmhhc093blByb3BlcnR5LHN0PWZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1mb3IodmFyIHIgaW4gZSlydC5jYWxsKGUscikmJih0W3JdPWVbcl0pCnJldHVybiBuLnByb3RvdHlwZT1lLnByb3RvdHlwZSx0LnByb3RvdHlwZT1uZXcgbix0Ll9fc3VwZXJfXz1lLnByb3RvdHlwZSx0fSxvdD1bXS5pbmRleE9mfHxmdW5jdGlvbih0KXtmb3IodmFyIGU9MCxuPXRoaXMubGVuZ3RoO24+ZTtlKyspaWYoZSBpbiB0aGlzJiZ0aGlzW2VdPT09dClyZXR1cm4gZQpyZXR1cm4tMX0KZm9yKFA9e2NsYXNzTmFtZToiIixjYXRjaHVwVGltZToxMDAsaW5pdGlhbFJhdGU6LjAzLG1pblRpbWU6MjUwLGdob3N0VGltZToxMDAsbWF4UHJvZ3Jlc3NQZXJGcmFtZToyMCxlYXNlRmFjdG9yOjEuMjUsc3RhcnRPblBhZ2VMb2FkOiEwLHJlc3RhcnRPblB1c2hTdGF0ZTohMCxyZXN0YXJ0T25SZXF1ZXN0QWZ0ZXI6NTAwLHRhcmdldDoiYm9keSIsZWxlbWVudHM6e2NoZWNrSW50ZXJ2YWw6MTAwLHNlbGVjdG9yczpbImJvZHkiXX0sZXZlbnRMYWc6e21pblNhbXBsZXM6MTAsc2FtcGxlQ291bnQ6MyxsYWdUaHJlc2hvbGQ6M30sYWpheDp7dHJhY2tNZXRob2RzOlsiR0VUIl0sdHJhY2tXZWJTb2NrZXRzOiEwLGlnbm9yZVVSTHM6W119fSxOPWZ1bmN0aW9uKCl7dmFyIHQKcmV0dXJuIG51bGwhPSh0PSJ1bmRlZmluZWQiIT10eXBlb2YgcGVyZm9ybWFuY2UmJm51bGwhPT1wZXJmb3JtYW5jZSYmImZ1bmN0aW9uIj09dHlwZW9mIHBlcmZvcm1hbmNlLm5vdz9wZXJmb3JtYW5jZS5ub3coKTp2b2lkIDApP3Q6K25ldyBEYXRlfSxGPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy5tc1JlcXVlc3RBbmltYXRpb25GcmFtZSxSPXdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZXx8d2luZG93Lm1vekNhbmNlbEFuaW1hdGlvbkZyYW1lLGs9ZnVuY3Rpb24odCxlLG4pe3JldHVybigiZnVuY3Rpb24iPT10eXBlb2YgdC5hZGRFdmVudExpc3RlbmVyP3QuYWRkRXZlbnRMaXN0ZW5lcihlLG4sITEpOnZvaWQgMCl8fCh0WyJvbiIrZV09bil9LG51bGw9PUYmJihGPWZ1bmN0aW9uKHQpe3JldHVybiBzZXRUaW1lb3V0KHQsNTApfSxSPWZ1bmN0aW9uKHQpe3JldHVybiBjbGVhclRpbWVvdXQodCl9KSxXPWZ1bmN0aW9uKHQpe3ZhciBlPU4oKSxuPWZ1bmN0aW9uKCl7dmFyIHI9TigpLWUKcmV0dXJuIDMzPnI/c2V0VGltZW91dChuLDMzLXIpOihlPU4oKSx0KHIsZnVuY3Rpb24oKXtyZXR1cm4gRihuKX0pKX0KcmV0dXJuIG4oKX0sVT1mdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXSxuPTM+YXJndW1lbnRzLmxlbmd0aD9bXTpudC5jYWxsKGFyZ3VtZW50cywyKQpyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdFtlXT90W2VdLmFwcGx5KHQsbik6dFtlXX0sVD1mdW5jdGlvbigpe2Zvcih2YXIgdCxlLG4scj1hcmd1bWVudHNbMF0scz0yPmFyZ3VtZW50cy5sZW5ndGg/W106bnQuY2FsbChhcmd1bWVudHMsMSksbz0wLGk9cy5sZW5ndGg7aT5vO28rKylpZihlPXNbb10pZm9yKHQgaW4gZSlydC5jYWxsKGUsdCkmJihuPWVbdF0sbnVsbCE9clt0XSYmIm9iamVjdCI9PXR5cGVvZiByW3RdJiZudWxsIT1uJiYib2JqZWN0Ij09dHlwZW9mIG4/VChyW3RdLG4pOnJbdF09bikKcmV0dXJuIHJ9LFM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG4scj1lPTAscz0wLG89dC5sZW5ndGg7bz5zO3MrKyluPXRbc10scis9TWF0aC5hYnMobiksZSsrCnJldHVybiByL2V9LGo9ZnVuY3Rpb24odCxlKXt2YXIgbixyCmlmKG51bGw9PXQmJih0PSJvcHRpb25zIiksbnVsbD09ZSYmKGU9ITApLHI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiW2RhdGEtcGFjZS0iK3QrIl0iKSl7aWYobj1yLmdldEF0dHJpYnV0ZSgiZGF0YS1wYWNlLSIrdCksIWUpcmV0dXJuIG4KdHJ5e3JldHVybiBKU09OLnBhcnNlKG4pfWNhdGNoKHQpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgY29uc29sZSYmbnVsbCE9PWNvbnNvbGU/Y29uc29sZS5lcnJvcigiRXJyb3IgcGFyc2luZyBpbmxpbmUgcGFjZSBvcHRpb25zIix0KTp2b2lkIDB9fX0sZS5wcm90b3R5cGUub249ZnVuY3Rpb24odCxlLG4scil7dmFyIHMKcmV0dXJuIG51bGw9PXImJihyPSExKSxudWxsPT10aGlzLmJpbmRpbmdzJiYodGhpcy5iaW5kaW5ncz17fSksbnVsbD09KHM9dGhpcy5iaW5kaW5ncylbdF0mJihzW3RdPVtdKSx0aGlzLmJpbmRpbmdzW3RdLnB1c2goe2hhbmRsZXI6ZSxjdHg6bixvbmNlOnJ9KX0sZS5wcm90b3R5cGUub25jZT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHRoaXMub24odCxlLG4sITApfSxlLnByb3RvdHlwZS5vZmY9ZnVuY3Rpb24odCxlKXt2YXIgbixyLHMKaWYobnVsbCE9KG51bGwhPShyPXRoaXMuYmluZGluZ3MpP3JbdF06dm9pZCAwKSl7aWYobnVsbD09ZSlyZXR1cm4gZGVsZXRlIHRoaXMuYmluZGluZ3NbdF0KZm9yKG49MCxzPVtdO248dGhpcy5iaW5kaW5nc1t0XS5sZW5ndGg7KXRoaXMuYmluZGluZ3NbdF1bbl0uaGFuZGxlcj09PWU/cy5wdXNoKHRoaXMuYmluZGluZ3NbdF0uc3BsaWNlKG4sMSkpOnMucHVzaChuKyspCnJldHVybiBzfX0sZS5wcm90b3R5cGUudHJpZ2dlcj1mdW5jdGlvbigpe3ZhciB0LGUsbixyLHMsbyxpPWFyZ3VtZW50c1swXSxhPTI+YXJndW1lbnRzLmxlbmd0aD9bXTpudC5jYWxsKGFyZ3VtZW50cywxKQppZihudWxsIT0ocj10aGlzLmJpbmRpbmdzKSYmcltpXSl7Zm9yKG49MCxvPVtdO248dGhpcy5iaW5kaW5nc1tpXS5sZW5ndGg7KWU9KHM9dGhpcy5iaW5kaW5nc1tpXVtuXSkuaGFuZGxlcix0PXMuY3R4LHM9cy5vbmNlLGUuYXBwbHkobnVsbCE9dD90OnRoaXMsYSkscz9vLnB1c2godGhpcy5iaW5kaW5nc1tpXS5zcGxpY2UobiwxKSk6by5wdXNoKG4rKykKcmV0dXJuIG99fSxldD1lLGQ9d2luZG93LlBhY2V8fHt9LHdpbmRvdy5QYWNlPWQsVChkLGV0LnByb3RvdHlwZSksXz1kLm9wdGlvbnM9VCh7fSxQLHdpbmRvdy5wYWNlT3B0aW9ucyxqKCkpLFE9MCxZPSgkPVsiYWpheCIsImRvY3VtZW50IiwiZXZlbnRMYWciLCJlbGVtZW50cyJdKS5sZW5ndGg7WT5RO1ErKykhMD09PV9bSD0kW1FdXSYmKF9bSF09UFtIXSkKZXQ9RXJyb3Isc3QobixldCksZj1uLHIucHJvdG90eXBlLmdldEVsZW1lbnQ9ZnVuY3Rpb24oKXt2YXIgdCxlCmlmKG51bGw9PXRoaXMuZWwpe2lmKCEodD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKF8udGFyZ2V0KSkpdGhyb3cgbmV3IGYKdGhpcy5lbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmVsLmNsYXNzTmFtZT0icGFjZSBwYWNlLWFjdGl2ZSIsZG9jdW1lbnQuYm9keS5jbGFzc05hbWU9ZG9jdW1lbnQuYm9keS5jbGFzc05hbWUucmVwbGFjZSgvKHBhY2UtZG9uZSApfC8sInBhY2UtcnVubmluZyAiKSxlPSIiIT09Xy5jbGFzc05hbWU/IiAiK18uY2xhc3NOYW1lOiIiLHRoaXMuZWwuaW5uZXJIVE1MPSc8ZGl2IGNsYXNzPSJwYWNlLXByb2dyZXNzJytlKyciPjxkaXYgY2xhc3M9InBhY2UtcHJvZ3Jlc3MtaW5uZXIiPjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9InBhY2UtYWN0aXZpdHkiPjwvZGl2PicsbnVsbCE9dC5maXJzdENoaWxkP3QuaW5zZXJ0QmVmb3JlKHRoaXMuZWwsdC5maXJzdENoaWxkKTp0LmFwcGVuZENoaWxkKHRoaXMuZWwpfXJldHVybiB0aGlzLmVsfSxyLnByb3RvdHlwZS5maW5pc2g9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldEVsZW1lbnQoKQpyZXR1cm4gdC5jbGFzc05hbWU9dC5jbGFzc05hbWUucmVwbGFjZSgicGFjZS1hY3RpdmUiLCJwYWNlLWluYWN0aXZlIiksZG9jdW1lbnQuYm9keS5jbGFzc05hbWU9ZG9jdW1lbnQuYm9keS5jbGFzc05hbWUucmVwbGFjZSgicGFjZS1ydW5uaW5nICIsInBhY2UtZG9uZSAiKX0sci5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnByb2dyZXNzPXQsZC50cmlnZ2VyKCJwcm9ncmVzcyIsdCksdGhpcy5yZW5kZXIoKX0sci5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RyeXt0aGlzLmdldEVsZW1lbnQoKS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZ2V0RWxlbWVudCgpKX1jYXRjaCh0KXtmPXR9cmV0dXJuIHRoaXMuZWw9dm9pZCAwfSxyLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgdCxlLG4scixzLG8saQppZihudWxsPT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKF8udGFyZ2V0KSlyZXR1cm4hMQpmb3IodD10aGlzLmdldEVsZW1lbnQoKSxyPSJ0cmFuc2xhdGUzZCgiK3RoaXMucHJvZ3Jlc3MrIiUsIDAsIDApIixzPTAsbz0oaT1bIndlYmtpdFRyYW5zZm9ybSIsIm1zVHJhbnNmb3JtIiwidHJhbnNmb3JtIl0pLmxlbmd0aDtvPnM7cysrKWU9aVtzXSx0LmNoaWxkcmVuWzBdLnN0eWxlW2VdPXIKcmV0dXJuKCF0aGlzLmxhc3RSZW5kZXJlZFByb2dyZXNzfHx0aGlzLmxhc3RSZW5kZXJlZFByb2dyZXNzfDAhPT10aGlzLnByb2dyZXNzfDApJiYodC5jaGlsZHJlblswXS5zZXRBdHRyaWJ1dGUoImRhdGEtcHJvZ3Jlc3MtdGV4dCIsKDB8dGhpcy5wcm9ncmVzcykrIiUiKSwxMDA+dGhpcy5wcm9ncmVzcz8obj10aGlzLnByb2dyZXNzPDEwPyIwIjoiIixuKz0wfHRoaXMucHJvZ3Jlc3MpOm49Ijk5Iix0LmNoaWxkcmVuWzBdLnNldEF0dHJpYnV0ZSgiZGF0YS1wcm9ncmVzcyIsIiIrbikpLGQudHJpZ2dlcigiY2hhbmdlIix0aGlzLnByb2dyZXNzKSx0aGlzLmxhc3RSZW5kZXJlZFByb2dyZXNzPXRoaXMucHJvZ3Jlc3N9LHIucHJvdG90eXBlLmRvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gMTAwPD10aGlzLnByb2dyZXNzfSxoPXIscy5wcm90b3R5cGUudHJpZ2dlcj1mdW5jdGlvbih0LGUpe3ZhciBuLHIscyxvLGkKaWYobnVsbCE9dGhpcy5iaW5kaW5nc1t0XSl7Zm9yKGk9W10scj0wLHM9KG89dGhpcy5iaW5kaW5nc1t0XSkubGVuZ3RoO3M+cjtyKyspbj1vW3JdLGkucHVzaChuLmNhbGwodGhpcyxlKSkKcmV0dXJuIGl9fSxzLnByb3RvdHlwZS5vbj1mdW5jdGlvbih0LGUpe3ZhciBuCnJldHVybiBudWxsPT0obj10aGlzLmJpbmRpbmdzKVt0XSYmKG5bdF09W10pLHRoaXMuYmluZGluZ3NbdF0ucHVzaChlKX0saj1zLEs9d2luZG93LlhNTEh0dHBSZXF1ZXN0LEo9d2luZG93LlhEb21haW5SZXF1ZXN0LEI9d2luZG93LldlYlNvY2tldCxPPWZ1bmN0aW9uKHQsZSl7dmFyIG4scj1bXQpmb3IobiBpbiBlLnByb3RvdHlwZSl0cnl7bnVsbD09dFtuXSYmImZ1bmN0aW9uIiE9dHlwZW9mIGVbbl0/ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0eT9yLnB1c2goT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbix7Z2V0OmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlLnByb3RvdHlwZVt0XX19KG4pLGNvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwfSkpOnIucHVzaCh0W25dPWUucHJvdG90eXBlW25dKTpyLnB1c2godm9pZCAwKX1jYXRjaCh0KXt9cmV0dXJuIHJ9LEM9W10sZC5pZ25vcmU9ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHNbMF0sZT0yPmFyZ3VtZW50cy5sZW5ndGg/W106bnQuY2FsbChhcmd1bWVudHMsMSkKcmV0dXJuIEMudW5zaGlmdCgiaWdub3JlIiksZT10LmFwcGx5KG51bGwsZSksQy5zaGlmdCgpLGV9LGQudHJhY2s9ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHNbMF0sZT0yPmFyZ3VtZW50cy5sZW5ndGg/W106bnQuY2FsbChhcmd1bWVudHMsMSkKcmV0dXJuIEMudW5zaGlmdCgidHJhY2siKSxlPXQuYXBwbHkobnVsbCxlKSxDLnNoaWZ0KCksZX0sRD1mdW5jdGlvbih0KXtpZihudWxsPT10JiYodD0iR0VUIiksInRyYWNrIj09PUNbMF0pcmV0dXJuImZvcmNlIgppZighQy5sZW5ndGgmJl8uYWpheCl7aWYoInNvY2tldCI9PT10JiZfLmFqYXgudHJhY2tXZWJTb2NrZXRzKXJldHVybiEwCmlmKHQ9dC50b1VwcGVyQ2FzZSgpLDA8PW90LmNhbGwoXy5hamF4LnRyYWNrTWV0aG9kcyx0KSlyZXR1cm4hMH1yZXR1cm4hMX0sc3QobyxqKSxtPW8sVj1udWxsLHo9ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49Xy5hamF4Lmlnbm9yZVVSTHMscj0wLHM9bi5sZW5ndGg7cz5yO3IrKylpZigic3RyaW5nIj09dHlwZW9mKGU9bltyXSkpe2lmKC0xIT09dC5pbmRleE9mKGUpKXJldHVybiEwfWVsc2UgaWYoZS50ZXN0KHQpKXJldHVybiEwCnJldHVybiExfSwoQT1mdW5jdGlvbigpe3JldHVybiBudWxsPT1WJiYoVj1uZXcgbSksVn0pKCkub24oInJlcXVlc3QiLGZ1bmN0aW9uKHQpe3ZhciBlLG49dC50eXBlLHI9dC5yZXF1ZXN0LHM9dC51cmwKcmV0dXJuIHoocyk/dm9pZCAwOmQucnVubmluZ3x8ITE9PT1fLnJlc3RhcnRPblJlcXVlc3RBZnRlciYmImZvcmNlIiE9PUQobik/dm9pZCAwOihlPWFyZ3VtZW50cywiYm9vbGVhbiI9PXR5cGVvZihzPV8ucmVzdGFydE9uUmVxdWVzdEFmdGVyfHwwKSYmKHM9MCksc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciB0LHMsbyxpLGE9InNvY2tldCI9PT1uP3IucmVhZHlTdGF0ZTwxOjA8KGE9ci5yZWFkeVN0YXRlKSYmND5hCmlmKGEpe2ZvcihkLnJlc3RhcnQoKSxpPVtdLHQ9MCxzPShvPWQuc291cmNlcykubGVuZ3RoO3M+dDt0Kyspe2lmKChIPW9bdF0paW5zdGFuY2VvZiBwKXtILndhdGNoLmFwcGx5KEgsZSkKYnJlYWt9aS5wdXNoKHZvaWQgMCl9cmV0dXJuIGl9fSxzKSl9KSxpLnByb3RvdHlwZS53YXRjaD1mdW5jdGlvbih0KXt2YXIgZT10LnR5cGUsbj10LnJlcXVlc3QsdD10LnVybApyZXR1cm4geih0KT92b2lkIDA6KG49bmV3KCJzb2NrZXQiPT09ZT93OmIpKG4sdGhpcy5jb21wbGV0ZSksdGhpcy5lbGVtZW50cy5wdXNoKG4pKX0saS5wcm90b3R5cGUuY29tcGxldGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWxlbWVudHM9dGhpcy5lbGVtZW50cy5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGUhPT10fSl9LHA9aSxiPWZ1bmN0aW9uKHQsZSl7dmFyIG4scixzLG8saT10aGlzCmlmKHRoaXMucHJvZ3Jlc3M9MCxudWxsIT13aW5kb3cuUHJvZ3Jlc3NFdmVudClmb3Ioayh0LCJwcm9ncmVzcyIsZnVuY3Rpb24odCl7cmV0dXJuIHQubGVuZ3RoQ29tcHV0YWJsZT9pLnByb2dyZXNzPTEwMCp0LmxvYWRlZC90LnRvdGFsOmkucHJvZ3Jlc3M9aS5wcm9ncmVzcysoMTAwLWkucHJvZ3Jlc3MpLzJ9KSxuPTAscj0obz1bImxvYWQiLCJhYm9ydCIsInRpbWVvdXQiLCJlcnJvciJdKS5sZW5ndGg7cj5uO24rKylrKHQsb1tuXSxmdW5jdGlvbigpe3JldHVybiBlKGkpLGkucHJvZ3Jlc3M9MTAwfSkKZWxzZSBzPXQub25yZWFkeXN0YXRlY2hhbmdlLHQub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7dmFyIG4KcmV0dXJuIDA9PT0obj10LnJlYWR5U3RhdGUpfHw0PT09bj8oZShpKSxpLnByb2dyZXNzPTEwMCk6Mz09PXQucmVhZHlTdGF0ZSYmKGkucHJvZ3Jlc3M9NTApLCJmdW5jdGlvbiI9PXR5cGVvZiBzP3MuYXBwbHkobnVsbCxhcmd1bWVudHMpOnZvaWQgMH19LHc9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4scj10aGlzLHM9dGhpcy5wcm9ncmVzcz0wLG89KG49WyJlcnJvciIsIm9wZW4iXSkubGVuZ3RoO28+cztzKyspayh0LG5bc10sZnVuY3Rpb24oKXtyZXR1cm4gZShyKSxyLnByb2dyZXNzPTEwMH0pfSxhLnByb3RvdHlwZS5jb21wbGV0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lbGVtZW50cz10aGlzLmVsZW1lbnRzLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gZSE9PXR9KX0sZXQ9YSx1LnByb3RvdHlwZS5jaGVjaz1mdW5jdGlvbigpe3ZhciB0PXRoaXMKcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5zZWxlY3Rvcik/dGhpcy5kb25lKCk6c2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybiB0LmNoZWNrKCl9LF8uZWxlbWVudHMuY2hlY2tJbnRlcnZhbCl9LHUucHJvdG90eXBlLmRvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb21wbGV0ZUNhbGxiYWNrKHRoaXMpLHRoaXMuY29tcGxldGVDYWxsYmFjaz1udWxsLHRoaXMucHJvZ3Jlc3M9MTAwfSxnPXUsYy5wcm90b3R5cGUuc3RhdGVzPXtsb2FkaW5nOjAsaW50ZXJhY3RpdmU6NTAsY29tcGxldGU6MTAwfSxzdD1jLGo9ZnVuY3Rpb24oKXt2YXIgdCxlLG4scixzLG89dGhpcwp0aGlzLnByb2dyZXNzPTAscz1bXSxyPTAsbj1OKCksZT1zZXRJbnRlcnZhbChmdW5jdGlvbigpe3ZhciBpPU4oKS1uLTUwCnJldHVybiBuPU4oKSxzLnB1c2goaSkscy5sZW5ndGg+Xy5ldmVudExhZy5zYW1wbGVDb3VudCYmcy5zaGlmdCgpLHQ9UyhzKSwrK3I+PV8uZXZlbnRMYWcubWluU2FtcGxlcyYmdDxfLmV2ZW50TGFnLmxhZ1RocmVzaG9sZD8oby5wcm9ncmVzcz0xMDAsY2xlYXJJbnRlcnZhbChlKSk6by5wcm9ncmVzcz0zLyh0KzMpKjEwMH0sNTApfSxsLnByb3RvdHlwZS50aWNrPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PWUmJihlPVUodGhpcy5zb3VyY2UsInByb2dyZXNzIikpLGU+PTEwMCYmKHRoaXMuZG9uZT0hMCksZT09PXRoaXMubGFzdD90aGlzLnNpbmNlTGFzdFVwZGF0ZSs9dDoodGhpcy5zaW5jZUxhc3RVcGRhdGUmJih0aGlzLnJhdGU9KGUtdGhpcy5sYXN0KS90aGlzLnNpbmNlTGFzdFVwZGF0ZSksdGhpcy5jYXRjaHVwPShlLXRoaXMucHJvZ3Jlc3MpL18uY2F0Y2h1cFRpbWUsdGhpcy5zaW5jZUxhc3RVcGRhdGU9MCx0aGlzLmxhc3Q9ZSksZT50aGlzLnByb2dyZXNzJiYodGhpcy5wcm9ncmVzcys9dGhpcy5jYXRjaHVwKnQpLGU9MS1NYXRoLnBvdyh0aGlzLnByb2dyZXNzLzEwMCxfLmVhc2VGYWN0b3IpLHRoaXMucHJvZ3Jlc3MrPWUqdGhpcy5yYXRlKnQsdGhpcy5wcm9ncmVzcz1NYXRoLm1pbih0aGlzLmxhc3RQcm9ncmVzcytfLm1heFByb2dyZXNzUGVyRnJhbWUsdGhpcy5wcm9ncmVzcyksdGhpcy5wcm9ncmVzcz1NYXRoLm1heCgwLHRoaXMucHJvZ3Jlc3MpLHRoaXMucHJvZ3Jlc3M9TWF0aC5taW4oMTAwLHRoaXMucHJvZ3Jlc3MpLHRoaXMubGFzdFByb2dyZXNzPXRoaXMucHJvZ3Jlc3MsdGhpcy5wcm9ncmVzc30sdj1sLEw9eD1HPXE9WD1JPW51bGwsZC5ydW5uaW5nPSExLEU9ZnVuY3Rpb24oKXtyZXR1cm4gXy5yZXN0YXJ0T25QdXNoU3RhdGU/ZC5yZXN0YXJ0KCk6dm9pZCAwfSxudWxsIT13aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUmJihaPXdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZSx3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gRSgpLFouYXBwbHkod2luZG93Lmhpc3RvcnksYXJndW1lbnRzKX0pLG51bGwhPXdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSYmKHR0PXdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSx3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gRSgpLHR0LmFwcGx5KHdpbmRvdy5oaXN0b3J5LGFyZ3VtZW50cyl9KSx5PXthamF4OnAsZWxlbWVudHM6ZXQsZG9jdW1lbnQ6c3QsZXZlbnRMYWc6an0sKE09ZnVuY3Rpb24oKXt2YXIgdCxlLG4scixzLG8saSxhCmZvcihkLnNvdXJjZXM9ST1bXSxlPTAscj0obz1bImFqYXgiLCJlbGVtZW50cyIsImRvY3VtZW50IiwiZXZlbnRMYWciXSkubGVuZ3RoO3I+ZTtlKyspITEhPT1fW3Q9b1tlXV0mJkkucHVzaChuZXcgeVt0XShfW3RdKSkKZm9yKG49MCxzPShhPW51bGwhPShpPV8uZXh0cmFTb3VyY2VzKT9pOltdKS5sZW5ndGg7cz5uO24rKylIPWFbbl0sSS5wdXNoKG5ldyBIKF8pKQpyZXR1cm4gZC5iYXI9cT1uZXcgaCxYPVtdLEc9bmV3IHZ9KSgpLGQuc3RvcD1mdW5jdGlvbigpe3JldHVybiBkLnRyaWdnZXIoInN0b3AiKSxkLnJ1bm5pbmc9ITEscS5kZXN0cm95KCksTD0hMCxudWxsIT14JiYoImZ1bmN0aW9uIj09dHlwZW9mIFImJlIoeCkseD1udWxsKSxNKCl9LGQucmVzdGFydD1mdW5jdGlvbigpe3JldHVybiBkLnRyaWdnZXIoInJlc3RhcnQiKSxkLnN0b3AoKSxkLnN0YXJ0KCl9LGQuZ289ZnVuY3Rpb24oKXt2YXIgdApyZXR1cm4gZC5ydW5uaW5nPSEwLHEucmVuZGVyKCksdD1OKCksTD0hMSx4PVcoZnVuY3Rpb24oZSxuKXtxLnByb2dyZXNzCmZvcih2YXIgcixzLG8saSxhLHUsYyxsLHAsaCxnPXU9MCxmPSEwLG09Yz0wLHk9SS5sZW5ndGg7eT5jO209KytjKWZvcihIPUlbbV0sYT1udWxsIT1YW21dP1hbbV06WFttXT1bXSxvPWw9MCxwPShzPW51bGwhPShoPUguZWxlbWVudHMpP2g6W0hdKS5sZW5ndGg7cD5sO289KytsKWk9c1tvXSxmJj0oaT1udWxsIT1hW29dP2Fbb106YVtvXT1uZXcgdihpKSkuZG9uZSxpLmRvbmV8fChnKyssdSs9aS50aWNrKGUpKQpyZXR1cm4gcj11L2cscS51cGRhdGUoRy50aWNrKGUscikpLHEuZG9uZSgpfHxmfHxMPyhxLnVwZGF0ZSgxMDApLGQudHJpZ2dlcigiZG9uZSIpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gcS5maW5pc2goKSxkLnJ1bm5pbmc9ITEsZC50cmlnZ2VyKCJoaWRlIil9LE1hdGgubWF4KF8uZ2hvc3RUaW1lLE1hdGgubWF4KF8ubWluVGltZS0oTigpLXQpLDApKSkpOm4oKX0pfSxkLnN0YXJ0PWZ1bmN0aW9uKHQpe1QoXyx0KSxkLnJ1bm5pbmc9ITAKdHJ5e3EucmVuZGVyKCl9Y2F0Y2godCl7Zj10fXJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIucGFjZSIpPyhkLnRyaWdnZXIoInN0YXJ0IiksZC5nbygpKTpzZXRUaW1lb3V0KGQuc3RhcnQsNTApfSwiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShmdW5jdGlvbigpe3JldHVybiBkfSk6Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzP21vZHVsZS5leHBvcnRzPWQ6Xy5zdGFydE9uUGFnZUxvYWQmJmQuc3RhcnQoKX0uY2FsbCh0aGlzKQ"></script>
39
+
40
+ <script> if (navigator.serviceWorker) { navigator.serviceWorker.register } </script>
41
+ <link rel="manifest" href="./manifest.json" />
42
+
43
+ <style>
44
+ .boxdbshadow {
45
+ box-shadow: 0 0 4px rgba(0, 0, 0, 0.14), 0 4px 8px rgba(0, 0, 0, 0.28) !important;
46
+ }
47
+
48
+ .bg-hover:hover,
49
+ .bg-hover:focus,
50
+ .bg-hover:active,
51
+ .bg-hover:target {
52
+ opacity: 0.45 !important;
53
+ }
54
+
55
+ html,
56
+ body {
57
+ height: 100%;
58
+ margin: 0;
59
+ padding: 0;
60
+ background-color: #1a202c;
61
+ }
62
+
63
+ .grid-item {
64
+ border-radius: 12px;
65
+ }
66
+
67
+ .grid-item:hover {
68
+ filter: brightness(1.2);
69
+ }
70
+ </style>
71
+ </head>
72
+
73
+ <body class="bg-gray-900 text-gray-100">
74
+
75
+ <!-- MENU -->
76
+ <div class="fixed top-0 left-0 z-50 w-72 h-screen bg-gray-800 text-white transform -translate-x-full transition-transform duration-300 ease-in-out"
77
+ id="offcanvasmenu" aria-labelledby="offcanvasmenuLabel">
78
+ <div class="flex justify-between items-center p-4 shadow-xl bg-gray-800">
79
+ <h5 class="text-lg font-bold flex items-center" id="offcanvasmenuLabel">
80
+ <svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6 mr-3" fill="none" viewBox="0 0 24 24"
81
+ stroke="currentColor">
82
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16m-7 6h7">
83
+ </path>
84
+ </svg>
85
+ MENU
86
+ </h5>
87
+ <button type="button" class="text-white hover:text-gray-400"
88
+ onclick="document.getElementById('offcanvasmenu').classList.add('-translate-x-full')">
89
+ <svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24"
90
+ stroke="currentColor">
91
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12">
92
+ </path>
93
+ </svg>
94
+ </button>
95
+ </div>
96
+ <div class="p-4 overflow-y-auto">
97
+ <div class="text-sm font-light uppercase">
98
+ ❝ Aplicativos para várias plataformas by Developer Davidsonbpe.❞
99
+ </div>
100
+ <hr class="my-4 border-gray-700">
101
+ <div class="space-y-2">
102
+
103
+ <button onclick="window.open('https://huggingface.co/KEXEL')"
104
+ class="w-full py-2 px-4 bg-gray-700 hover:bg-gray-600 text-left text-sm uppercase text-gray-400 rounded-none opacity-75 shadow">
105
+ <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 inline-block mr-3" fill="none"
106
+ viewBox="0 0 24 24" stroke="currentColor">
107
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
108
+ d="M4 6h16M4 12h16m-7 6h7"></path>
109
+ </svg>
110
+ HuggingFace
111
+ </button>
112
+
113
+ <button onclick="window.open('https://github.com/davidsonbpe')"
114
+ class="w-full py-2 px-4 bg-gray-700 hover:bg-gray-600 text-left text-sm uppercase text-gray-400 rounded-none opacity-75 shadow">
115
+ <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 inline-block mr-3" fill="none"
116
+ viewBox="0 0 24 24" stroke="currentColor">
117
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
118
+ d="M4 6h16M4 12h16m-7 6h7"></path>
119
+ </svg>
120
+ GitHub
121
+ </button>
122
+ <button onclick="window.open('https://codepen.io/davidsonbpe')"
123
+ class="w-full py-2 px-4 bg-gray-700 hover:bg-gray-600 text-left text-sm uppercase text-gray-400 rounded-none opacity-75 shadow">
124
+ <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 inline-block mr-3" fill="none"
125
+ viewBox="0 0 24 24" stroke="currentColor">
126
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
127
+ d="M4 6h16M4 12h16m-7 6h7"></path>
128
+ </svg>
129
+ CodePen
130
+ </button>
131
+ <button onclick="window.open('https://pag.ae/7Y3uUnhg8')"
132
+ class="w-full py-2 px-4 bg-gray-700 hover:bg-gray-600 text-left text-sm uppercase text-gray-400 rounded-none opacity-75 shadow">
133
+ <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 inline-block mr-3" fill="none"
134
+ viewBox="0 0 24 24" stroke="currentColor">
135
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
136
+ d="M4 6h16M4 12h16m-7 6h7"></path>
137
+ </svg>
138
+ Doar com
139
+ </button>
140
+ <button
141
+ onclick="alert(document.title + ' | ' + document.querySelector('meta[name=description]').getAttribute('content'))"
142
+ class="w-full py-2 px-4 bg-gray-700 hover:bg-gray-600 text-left text-sm uppercase text-gray-400 rounded-none opacity-75 shadow">
143
+ <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 inline-block mr-3" fill="none"
144
+ viewBox="0 0 24 24" stroke="currentColor">
145
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
146
+ d="M4 6h16M4 12h16m-7 6h7"></path>
147
+ </svg>
148
+ Informar
149
+ </button>
150
+ <button onclick="window.open('https://davidsonbpe.blogspot.com/')"
151
+ class="w-full py-2 px-4 bg-gray-700 hover:bg-gray-600 text-left text-sm uppercase text-gray-400 rounded-none opacity-75 shadow">
152
+ <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 inline-block mr-3" fill="none"
153
+ viewBox="0 0 24 24" stroke="currentColor">
154
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
155
+ d="M4 6h16M4 12h16m-7 6h7"></path>
156
+ </svg>
157
+ Developer
158
+ </button>
159
+ <button onclick="sharesbutton()"
160
+ class="w-full py-2 px-4 bg-gray-700 hover:bg-gray-600 text-left text-sm uppercase text-gray-400 rounded-none opacity-75 shadow">
161
+ <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 inline-block mr-3" fill="none"
162
+ viewBox="0 0 24 24" stroke="currentColor">
163
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
164
+ d="M4 6h16M4 12h16m-7 6h7"></path>
165
+ </svg>
166
+ Compartilhar
167
+ </button>
168
+ </div>
169
+ </div>
170
+ <div class="p-4 border-t border-gray-700 absolute bottom-0 w-full inset-shadow-sm">
171
+ <button onclick="document.getElementById('offcanvasmenu').classList.add('-translate-x-full')"
172
+ class="float-right py-2 px-4 bg-gray-700 hover:bg-gray-600 text-sm uppercase text-gray-400 rounded-none opacity-75 shadow">
173
+ Sair
174
+ </button>
175
+ </div>
176
+ </div>
177
+
178
+ <div class="fixed top-0 left-0 z-40 w-full flex items-center bg-gray-800 text-white boxdbshadow">
179
+ <img src="./d-framework/icon/192/favicon.png"
180
+ alt="Menu" class="w-14 h-14 cursor-pointer hover:bg-gray-700 bg-gray-600"
181
+ onclick="document.getElementById('offcanvasmenu').classList.remove('-translate-x-full')" />
182
+ <div class="flex-grow">
183
+ <select id="mySelects"
184
+ class="w-full py-2 px-4 bg-gray-800 text-white text-xl uppercase border-none focus:outline-none font-sans truncate bg-hover">
185
+ <option value="javascript:location.reload();">KEXEL GALLERY</option>
186
+ <option value="javascript:sharesbutton();">COMPARTILHAR</option>
187
+ <option value="javascript:window.open('https://dpripol.pages.dev/?='+document.title+'');">PRIVACY POLICY
188
+ </option>
189
+ <option value="javascript:window.open('https://pag.ae/7Y3uUnhg8');">DOAR COM</option>
190
+ </select>
191
+ </div>
192
+ <button onclick="sharesbutton()"
193
+ class="py-2 px-4 bg-gray-800 hover:bg-gray-700 text-yellow-500 text-xl border-l border-gray-700">
194
+ <svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" height="24px" viewBox="0 0 24 24" width="24px"
195
+ fill="#31c214">
196
+ <path d="M0 0h24v24H0z" fill="none" />
197
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
198
+ d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81 1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9c-1.66 0-3 1.34-3 3s1.34 3 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.16c-.05.21-.08.43-.08.65 0 1.61 1.31 2.92 2.92 2.92 1.61 0 2.92-1.31 2.92-2.92s-1.31-2.92-2.92-2.92z" />
199
+ </svg>
200
+ </button>
201
+ </div>
202
+
203
+ <div class="container mt-14"></div>
204
+
205
+ <div id="screenshot-grid" class="grid grid-cols-2 sm:grid-cols-3 2xl:grid-cols-4 gap-2 p-4">
206
+ </div>
207
+
208
+ <div class="flex-grow container mx-auto px-4 py-8">
209
+
210
+ <div class="max-w-3xl mx-auto bg-white rounded-xl shadow-md overflow-hidden p-6 mt-8">
211
+ <div class="flex flex-col md:flex-row md:items-center md:justify-between gap-4">
212
+ <p class="text-lg md:text-xl font-medium text-gray-800">
213
+ <i class="fas fa-shield-alt text-emerald-500 mr-2"></i>
214
+ Política de privacidade para usar nosso Serviço e as escolhas que você tem associado!
215
+ </p>
216
+ <button onclick="javascript:window.open('https://dpripol.pages.dev/?='+document.title+'')"
217
+ title="PRIVACY POLICY"
218
+ class="btn-hover-effect btn-active-effect transition-all duration-300 bg-emerald-500 hover:bg-emerald-600 text-white font-semibold px-8 py-3 rounded-full shadow-md focus:outline-none focus:ring-2 focus:ring-emerald-500 focus:ring-opacity-50">
219
+ <i class="fas fa-lock-open mr-2"></i>
220
+ PRIVACY POLICY
221
+ </button>
222
+ </div>
223
+ </div>
224
+ </div>
225
+
226
+ <footer class="bg-white shadow-sm py-4 mt-2">
227
+ <div class="container mx-auto px-4 text-center text-gray-500 text-sm uppercase">
228
+ <p>© <span id="datacedencer">2009</span> KEXEL GALLERY | Todos os direitos reservados</p>
229
+ </div>
230
+ </footer>
231
+
232
+ <script>
233
+ async function loadScreenshots() {
234
+ try {
235
+ const response = await fetch('d-framework/api.json');
236
+ if (!response.ok) {
237
+ throw new Error(`HTTP error! status: ${response.status}`);
238
+ }
239
+ // Read the JSON body ONCE
240
+ const screenshotsData = await response.json();
241
+
242
+ const grid = document.getElementById('screenshot-grid');
243
+ grid.innerHTML = ''; // Clear existing content
244
+ const fragment = document.createDocumentFragment(); // Create a fragment
245
+
246
+ // No need to filter/sort here, assuming screenshots.json is already sorted and correct
247
+ if (!Array.isArray(screenshotsData)) {
248
+ throw new Error("screenshots.json is not a valid array.");
249
+ }
250
+
251
+ // Build elements in the fragment
252
+ screenshotsData.forEach(item => {
253
+ if (!item || typeof item.filename !== 'string' || !item.imgshot) {
254
+ console.warn("Skipping invalid item in screenshots.json:", item);
255
+ return;
256
+ }
257
+
258
+ // --- Filter by rating ---
259
+ if (typeof item.rating !== 'number' || item.rating < 50) {
260
+ // console.log(`Skipping ${item.filename} due to rating: ${item.rating}`);
261
+ return; // Skip items with rating below 50 or invalid rating
262
+ }
263
+ // --- End filter ---
264
+
265
+ const filename = item.filename;
266
+ const imgshot = item.imgshot;
267
+ // const rating = item.rating; // Rating is available if needed for display
268
+
269
+ const gridItem = document.createElement('div');
270
+ gridItem.className = 'grid-item relative'; // Added relative for potential badge positioning
271
+
272
+ const img = document.createElement('img');
273
+ img.src = `d-framework/screenshot/${imgshot}`;
274
+ //img.src = `https://image.thum.io/get/width/500/crop/800/maxAge/20/allowJPG/https://${filename}`;
275
+ //img.src = `https://image.thum.io/get/width/500/crop/800/maxAge/20/allowJPG/https://${filename}.static.hf.space/${imgshot}`;
276
+ img.loading = 'lazy'; // Lazy load images
277
+ img.decoding = 'async'; // Hint for async decoding
278
+ img.className = 'w-full h-auto object-cover rounded-lg shadow-md'; // Added some styling
279
+
280
+ // Create the link element
281
+ const link = document.createElement('a');
282
+
283
+ link.href = `https://${filename}`;
284
+ //link.href = `https://${filename}.static.hf.space/${imgshot}`;
285
+ link.target = '_blank'; // Open in new tab
286
+ link.rel = 'noopener noreferrer'; // Security best practice
287
+ link.appendChild(img); // Place the image inside the link
288
+ gridItem.appendChild(link); // Place the link (with image) inside the grid item
289
+ fragment.appendChild(gridItem); // Add the item to the fragment
290
+ });
291
+
292
+ // Append the fragment to the grid once
293
+ grid.appendChild(fragment);
294
+
295
+ } catch (error) {
296
+ console.error('Failed to load screenshots:', error);
297
+ const grid = document.getElementById('screenshot-grid');
298
+ grid.innerHTML = '<p class="text-red-500 text-center col-span-3">Failed to load screenshots. Check console for details.</p>';
299
+ }
300
+ }
301
+
302
+ document.addEventListener('DOMContentLoaded', loadScreenshots);
303
+
304
+
305
+ fetch("https://dav7.pages.dev/api/serve.json")
306
+ .then((response) => response.json())
307
+ .then((data) => {
308
+ const sites = data.sites;
309
+ const mySelects = document.getElementById("mySelects");
310
+ sites.forEach((sites) => {
311
+ const preElement = document.createElement("option");
312
+ preElement.value = `${sites.properties.links}`;
313
+ preElement.textContent = `${sites.properties.title}`;
314
+ mySelects.appendChild(preElement);
315
+ });
316
+ })
317
+ .catch((error) => {
318
+ console.log("ERROR", error);
319
+ });
320
+ const select = document.getElementById("mySelects");
321
+ select.addEventListener("change", function () {
322
+ const url = this.value;
323
+ if (url) {
324
+ window.location = url;
325
+ }
326
+ });
327
+ /*shared*/
328
+ function sharesbutton() {
329
+ navigator.share({
330
+ title: document.title,
331
+ text: "Compartilhar" + document.title,
332
+ url: window.location.href
333
+ });
334
+ }
335
+ var creditsyear = new Date();
336
+ document.getElementById("datacedencer").innerHTML = creditsyear.getFullYear();
337
+
338
+ </script>
339
+
340
+ <script src="https://redek-dp.github.io/servdevanalytics/v1/app.id.js"></script>
341
+
342
+ </body>
343
+
344
+ </html>
manifest.json ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "KEXEL GALLERY",
3
+ "short_name": "KEXEL GALLERY",
4
+ "lang": "pt-BR",
5
+ "description": "KEXEL GALLERY COM A BASE EM NAVEGADOR PARA PLATAFORMAS MODERNAS. APLICATIVO BY DEVELOPER DAVIDSONBPE.",
6
+ "theme_color": "#602ab6",
7
+ "background_color": "#602ab6",
8
+ "display": "standalone",
9
+ "orientation": "any",
10
+ "start_url": "/?Installe=kexel",
11
+ "id": "kexel",
12
+ "iarc_rating_id": "KO45-UB78-BR44-LK33-RY12-JD72-DK66-RM34-2025",
13
+ "dir": "auto",
14
+ "display_override": [
15
+ "standalone"
16
+ ],
17
+ "categories": [
18
+ "books"
19
+ ],
20
+ "icons": [
21
+ {
22
+ "src": "./d-framework/icon/144/favicon.png",
23
+ "sizes": "144x144",
24
+ "type": "image/png"
25
+ },
26
+ {
27
+ "src": "./d-framework/icon/36/favicon.png",
28
+ "sizes": "36x36",
29
+ "type": "image/png"
30
+ },
31
+ {
32
+ "src": "./d-framework/icon/48/favicon.png",
33
+ "sizes": "48x48",
34
+ "type": "image/png"
35
+ },
36
+ {
37
+ "src": "./d-framework/icon/72/favicon.png",
38
+ "sizes": "72x72",
39
+ "type": "image/png"
40
+ },
41
+ {
42
+ "src": "./d-framework/icon/96/favicon.png",
43
+ "sizes": "96x96",
44
+ "type": "image/png"
45
+ },
46
+ {
47
+ "src": "./d-framework/icon/192/favicon.png",
48
+ "sizes": "192x192",
49
+ "type": "image/png",
50
+ "purpose": "any maskable monochrome"
51
+ },
52
+ {
53
+ "src": "./d-framework/icon/512/favicon.png",
54
+ "sizes": "512x512",
55
+ "type": "image/png"
56
+ }
57
+ ],
58
+ "screenshots": [
59
+ {
60
+ "src": "./d-framework/icon/512/favicon.png",
61
+ "sizes": "512x512",
62
+ "type": "image/png",
63
+ "platform": "wide"
64
+ }
65
+ ]
66
+ }