inital commit
This commit is contained in:
6
templates/template_1/Main File/NeuralSync/assets/css/bootstrap.min.css
vendored
Normal file
6
templates/template_1/Main File/NeuralSync/assets/css/bootstrap.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
@@ -0,0 +1,65 @@
|
||||
@media only screen and (max-width : 2500px) {
|
||||
.page-wrapper{
|
||||
overflow:hidden;
|
||||
}
|
||||
|
||||
}
|
||||
@media screen and (min-width: 1200px) and (max-width: 1399px){
|
||||
.stat-number {
|
||||
font-size: 3rem;
|
||||
}
|
||||
.breadcrumb-title{
|
||||
font-size:44px;
|
||||
}
|
||||
|
||||
}
|
||||
@media screen and (min-width: 992px) and (max-width: 1199px){
|
||||
.stat-number {
|
||||
font-size: 2.5rem;
|
||||
}
|
||||
.breadcrumb-title{
|
||||
font-size:44px;
|
||||
}
|
||||
}
|
||||
@media only screen and (max-width : 1199px) {
|
||||
.mt-xl-40{
|
||||
margin-top:40px;
|
||||
}
|
||||
.mb-xl-40{
|
||||
margin-bottom:40px;
|
||||
}
|
||||
}
|
||||
@media only screen and (max-width : 991px) {
|
||||
.mt-lg-40{
|
||||
margin-top:40px;
|
||||
}
|
||||
.mb-lg-40{
|
||||
margin-bottom:40px;
|
||||
}
|
||||
.stat-number {
|
||||
font-size: 2.5rem;
|
||||
}
|
||||
.breadcrumb-title{
|
||||
font-size:36px;
|
||||
letter-spacing:0;
|
||||
line-height:1.3;
|
||||
}
|
||||
|
||||
}
|
||||
@media only screen and (max-width: 767px) {
|
||||
|
||||
.mt-lg-40{
|
||||
margin-top:25px;
|
||||
}
|
||||
.mb-lg-40{
|
||||
margin-bottom:25px;
|
||||
}
|
||||
|
||||
}
|
||||
@media screen and (min-width: 320px) and (max-width: 575px){
|
||||
.faq-question {
|
||||
font-size: 1.2rem ! important;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
}
|
||||
2
templates/template_1/Main File/NeuralSync/assets/css/slick.min.css
vendored
Normal file
2
templates/template_1/Main File/NeuralSync/assets/css/slick.min.css
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
.slick-slider{position:relative;display:block;box-sizing:border-box;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none;-khtml-user-select:none;-ms-touch-action:pan-y;touch-action:pan-y;-webkit-tap-highlight-color:transparent}.slick-list{position:relative;display:block;overflow:hidden;margin:0;padding:0}.slick-list:focus{outline:0}.slick-list.dragging{cursor:pointer;cursor:hand}.slick-slider .slick-list,.slick-slider .slick-track{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.slick-track{position:relative;top:0;left:0;display:block;margin-left:auto;margin-right:auto}.slick-track:after,.slick-track:before{display:table;content:''}.slick-track:after{clear:both}.slick-loading .slick-track{visibility:hidden}.slick-slide{display:none;float:left;height:100%;min-height:1px}[dir=rtl] .slick-slide{float:right}.slick-slide img{display:block}.slick-slide.slick-loading img{display:none}.slick-slide.dragging img{pointer-events:none}.slick-initialized .slick-slide{display:block}.slick-loading .slick-slide{visibility:hidden}.slick-vertical .slick-slide{display:block;height:auto;border:1px solid transparent}.slick-arrow.slick-hidden{display:none}
|
||||
/*# sourceMappingURL=slick.min.css.map */
|
||||
1259
templates/template_1/Main File/NeuralSync/assets/css/style.css
Normal file
1259
templates/template_1/Main File/NeuralSync/assets/css/style.css
Normal file
File diff suppressed because it is too large
Load Diff
1
templates/template_1/Main File/NeuralSync/assets/css/theme-spacing.min.css
vendored
Normal file
1
templates/template_1/Main File/NeuralSync/assets/css/theme-spacing.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
5
templates/template_1/Main File/NeuralSync/assets/fonts/bootstrap-icons.min.css
vendored
Normal file
5
templates/template_1/Main File/NeuralSync/assets/fonts/bootstrap-icons.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
16
templates/template_1/Main File/NeuralSync/assets/fonts/font-awesome.min.css
vendored
Normal file
16
templates/template_1/Main File/NeuralSync/assets/fonts/font-awesome.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 5.2 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 5.3 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 14 KiB |
7
templates/template_1/Main File/NeuralSync/assets/js/bootstrap.min.js
vendored
Normal file
7
templates/template_1/Main File/NeuralSync/assets/js/bootstrap.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
255
templates/template_1/Main File/NeuralSync/assets/js/gsap.js
Normal file
255
templates/template_1/Main File/NeuralSync/assets/js/gsap.js
Normal file
@@ -0,0 +1,255 @@
|
||||
/*
|
||||
|-----------------------------------------------------
|
||||
| Template Name: NeuralSync - AI-Powered SaaS Solutions for Modern Businesses HTML Template
|
||||
| Developer: Themesfamily
|
||||
| Version: 1.0.0
|
||||
|-----------------------------------------------------
|
||||
*/
|
||||
/***************************************************
|
||||
==================== JS ======================
|
||||
****************************************************
|
||||
00. Configuration Check
|
||||
01. GSAP Plugin Registration
|
||||
02. LENIS SMOOTH SCROLLING
|
||||
03. TEAM Social Icon Toggle
|
||||
04. GSAP Custom Cursor Implementation
|
||||
05. GSAP Text Split Animation
|
||||
06. GSAP Image Spread / Reveal Animation
|
||||
07. GSAP 3D Scale and Fade Animation
|
||||
08. GSAP Dynamic Fade-In Animations (General)
|
||||
09. GSAP Parallax Zoom Animation
|
||||
10. MAIN INITIALIZATION FUNCTION
|
||||
****************************************************/
|
||||
|
||||
(function ($) {
|
||||
"use strict";
|
||||
|
||||
// 00. Configuration Check
|
||||
if (typeof gsap === 'undefined' || typeof jQuery === 'undefined' || typeof Lenis === 'undefined') {
|
||||
console.error("Required libraries (GSAP, jQuery, or Lenis) are not loaded. Skipping all animations.");
|
||||
return;
|
||||
}
|
||||
|
||||
// 01. GSAP Plugin Registration
|
||||
if (typeof SplitText !== 'undefined' && typeof ScrollTrigger !== 'undefined') {
|
||||
gsap.registerPlugin(ScrollTrigger, SplitText);
|
||||
} else {
|
||||
console.warn("GSAP plugins (SplitText or ScrollTrigger) are not loaded. Some animations may be skipped.");
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------------
|
||||
// 02. LENIS SMOOTH SCROLLING
|
||||
// ----------------------------------------------------------------------------------
|
||||
new Lenis({
|
||||
autoRaf: true
|
||||
});
|
||||
// ----------------------------------------------------------------------------------
|
||||
// 05. GSAP Text Split Animation
|
||||
// ----------------------------------------------------------------------------------
|
||||
function initSplitTextAnimations() {
|
||||
const st = $(".split-content");
|
||||
if (st.length > 0 && typeof SplitText !== 'undefined') {
|
||||
st.each(function (index, el) {
|
||||
el.split = new SplitText(el, {
|
||||
type: "lines,words,chars",
|
||||
linesClass: "atf-split-line",
|
||||
});
|
||||
|
||||
// Set initial position based on class (end, start, up, down)
|
||||
let initialProps = { opacity: 0 };
|
||||
if ($(el).hasClass("end")) initialProps.x = "50";
|
||||
else if ($(el).hasClass("start")) initialProps.x = "-50";
|
||||
else if ($(el).hasClass("up")) initialProps.y = "80";
|
||||
else if ($(el).hasClass("down")) initialProps.y = "-80";
|
||||
|
||||
gsap.set(el.split.chars, initialProps);
|
||||
gsap.set(el, { perspective: 400 });
|
||||
|
||||
// Create ScrollTrigger animation timeline
|
||||
gsap.to(el.split.chars, {
|
||||
scrollTrigger: {
|
||||
trigger: el,
|
||||
start: "top 85%",
|
||||
end: "bottom 65%",
|
||||
scrub: 1,
|
||||
},
|
||||
x: "0",
|
||||
y: "0",
|
||||
rotateX: "0",
|
||||
scale: 1,
|
||||
opacity: 1,
|
||||
autoAlpha: 1,
|
||||
duration: 1,
|
||||
ease: 'power2.out',
|
||||
stagger: 0.03,
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------------
|
||||
// 06. GSAP Image Spread / Reveal Animation
|
||||
// ----------------------------------------------------------------------------------
|
||||
function initImageSpreadAnimations() {
|
||||
document.querySelectorAll(".spread").forEach((container) => {
|
||||
let image = container.querySelector("img");
|
||||
if (!image) return;
|
||||
|
||||
let tl = gsap.timeline({
|
||||
scrollTrigger: {
|
||||
trigger: container,
|
||||
toggleActions: "play none none none",
|
||||
},
|
||||
});
|
||||
|
||||
tl.set(container, { autoAlpha: 1 });
|
||||
|
||||
if (container.classList.contains("zoom-out")) {
|
||||
tl.from(image, { duration: 1.5, scale: 1.4, ease: "power2.out" });
|
||||
} else if (container.classList.contains("start") || container.classList.contains("end")) {
|
||||
let xPercent = container.classList.contains("start") ? -100 : 100;
|
||||
|
||||
tl.from(container, {
|
||||
duration: 1.5,
|
||||
xPercent,
|
||||
ease: Power2.out,
|
||||
});
|
||||
tl.from(image, {
|
||||
duration: 1.5,
|
||||
xPercent: -xPercent,
|
||||
scale: 1,
|
||||
delay: -1.5,
|
||||
ease: Power2.out,
|
||||
});
|
||||
}
|
||||
else if (container.classList.contains("up") || container.classList.contains("down")) {
|
||||
let yPercent = container.classList.contains("up") ? 100 : -100;
|
||||
|
||||
tl.from(container, {
|
||||
duration: 1.5,
|
||||
yPercent,
|
||||
ease: Power2.out,
|
||||
});
|
||||
tl.from(image, {
|
||||
duration: 1.5,
|
||||
yPercent: -yPercent,
|
||||
scale: 1,
|
||||
delay: -1.5,
|
||||
ease: Power2.out,
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------------
|
||||
// 07. GSAP 3D Scale and Fade Animation
|
||||
// ----------------------------------------------------------------------------------
|
||||
function initScale3DAnimations() {
|
||||
gsap.utils.toArray(".item-3d").forEach((el) => {
|
||||
// Initial 3D transform set
|
||||
gsap.set(el, {
|
||||
opacity: 0.7,
|
||||
transform: "perspective(2500px) translate3d(0,0,0) rotateX(90deg) scale(0.5)",
|
||||
});
|
||||
|
||||
// ScrollTrigger timeline to reveal 3D item
|
||||
gsap.timeline({
|
||||
scrollTrigger: {
|
||||
trigger: el,
|
||||
start: "top bottom+=50",
|
||||
end: "bottom center",
|
||||
scrub: 2,
|
||||
},
|
||||
}).to(el, {
|
||||
scale: 1,
|
||||
rotateX: 0,
|
||||
opacity: 1,
|
||||
duration: 1.3,
|
||||
ease: "power2.out",
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------------
|
||||
// 08. GSAP Dynamic Fade-In Animations (General)
|
||||
// ----------------------------------------------------------------------------------
|
||||
function initDynamicFadeAnimations() {
|
||||
[
|
||||
".fadeInUp", ".fadeInLeft", ".fadeInRight", ".zoomIn", ".zoomOut", ".bounceIn"
|
||||
].forEach((selector) => {
|
||||
gsap.utils.toArray(selector).forEach((el) => {
|
||||
let offset = el.getAttribute("data-fade-offset") || 40;
|
||||
let duration = el.getAttribute("data-duration") || 0.8;
|
||||
let from = el.getAttribute("data-fade-from") || (
|
||||
selector === ".fadeInLeft" ? "left" :
|
||||
selector === ".fadeInRight" ? "right" :
|
||||
selector.includes("zoom") || selector === ".bounceIn" ? "center" :
|
||||
"bottom"
|
||||
);
|
||||
let onScroll = el.getAttribute("data-on-scroll") || 1;
|
||||
let delay = el.getAttribute("data-delay") || 0.15;
|
||||
|
||||
let props = {
|
||||
opacity: 0,
|
||||
duration,
|
||||
delay,
|
||||
ease: el.getAttribute("data-ease") || (
|
||||
selector === ".bounceIn" ? "bounce.out" : "power2.out"
|
||||
),
|
||||
x: from === "left" ? -offset : from === "right" ? offset : 0,
|
||||
y: from === "top" ? -offset : from === "bottom" ? offset : 0,
|
||||
scale: selector === ".zoomIn" ? 0.5 : selector === ".zoomOut" ? 1.5 : 1,
|
||||
};
|
||||
|
||||
// Add ScrollTrigger if onScroll is enabled
|
||||
if (onScroll == 1) {
|
||||
props.scrollTrigger = { trigger: el, start: "top 85%" };
|
||||
}
|
||||
|
||||
gsap.from(el, props);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------------
|
||||
// 09. GSAP Parallax Zoom Animation
|
||||
// ----------------------------------------------------------------------------------
|
||||
function initParallaxZoom() {
|
||||
document.querySelectorAll(".item-up-image").forEach((wrap) => {
|
||||
gsap.timeline({
|
||||
scrollTrigger: {
|
||||
trigger: wrap,
|
||||
start: "top center",
|
||||
end: "bottom center",
|
||||
scrub: 1,
|
||||
},
|
||||
}).to(wrap.querySelector(".item-up"), {
|
||||
scale: 1.10,
|
||||
duration: 1,
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------------
|
||||
// 10. MAIN INITIALIZATION FUNCTION
|
||||
// ----------------------------------------------------------------------------------
|
||||
function initAllScripts() {
|
||||
// Initialize all DOM-dependent functions
|
||||
initSplitTextAnimations();
|
||||
initImageSpreadAnimations();
|
||||
initScale3DAnimations();
|
||||
initDynamicFadeAnimations();
|
||||
initParallaxZoom();
|
||||
|
||||
console.log("All NeuralSync animations initialized successfully.");
|
||||
}
|
||||
|
||||
// Execute the main function (assuming script is placed before </body>)
|
||||
initAllScripts();
|
||||
|
||||
|
||||
|
||||
|
||||
})(jQuery);
|
||||
2
templates/template_1/Main File/NeuralSync/assets/js/jquery.min.js
vendored
Normal file
2
templates/template_1/Main File/NeuralSync/assets/js/jquery.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
238
templates/template_1/Main File/NeuralSync/assets/js/main.js
Normal file
238
templates/template_1/Main File/NeuralSync/assets/js/main.js
Normal file
@@ -0,0 +1,238 @@
|
||||
/* =====================================================
|
||||
NovaAI - Premium Template Script
|
||||
Clean | Optimized | Reviewer Ready
|
||||
===================================================== */
|
||||
|
||||
(function ($) {
|
||||
"use strict";
|
||||
|
||||
/* ===============================
|
||||
Helper: Safe Query Selector
|
||||
=============================== */
|
||||
const $select = (selector) => document.querySelector(selector);
|
||||
const $selectAll = (selector) => document.querySelectorAll(selector);
|
||||
|
||||
/* ===============================
|
||||
Sticky Navbar + Scroll Top
|
||||
=============================== */
|
||||
const navbar = $select('.navbar');
|
||||
const scrollTopBtn = $select('.scroll-top');
|
||||
|
||||
window.addEventListener('scroll', function () {
|
||||
|
||||
// Sticky Navbar
|
||||
if (navbar) {
|
||||
if (window.scrollY > 50) {
|
||||
navbar.classList.add('scrolled');
|
||||
} else {
|
||||
navbar.classList.remove('scrolled');
|
||||
}
|
||||
}
|
||||
|
||||
// Scroll Top Button Visibility
|
||||
if (scrollTopBtn) {
|
||||
if (window.scrollY > 300) {
|
||||
scrollTopBtn.classList.add('visible');
|
||||
} else {
|
||||
scrollTopBtn.classList.remove('visible');
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Scroll To Top Click
|
||||
if (scrollTopBtn) {
|
||||
scrollTopBtn.addEventListener('click', function () {
|
||||
window.scrollTo({
|
||||
top: 0,
|
||||
behavior: 'smooth'
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/* ===============================
|
||||
Preloader
|
||||
=============================== */
|
||||
$(window).on("load", function () {
|
||||
$(".status").fadeOut();
|
||||
$(".preloader").delay(300).fadeOut("slow");
|
||||
});
|
||||
|
||||
/* ===============================
|
||||
Smooth Scroll (Anchor Links)
|
||||
=============================== */
|
||||
$selectAll('a[href^="#"]').forEach(anchor => {
|
||||
anchor.addEventListener('click', function (e) {
|
||||
|
||||
const targetID = this.getAttribute('href');
|
||||
|
||||
if (targetID.length > 1) {
|
||||
const target = $select(targetID);
|
||||
|
||||
if (target) {
|
||||
e.preventDefault();
|
||||
target.scrollIntoView({
|
||||
behavior: 'smooth',
|
||||
block: 'start'
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
/* ===============================
|
||||
Fade In Animation (IntersectionObserver)
|
||||
=============================== */
|
||||
const fadeElements = $selectAll('.fade-in');
|
||||
|
||||
if (fadeElements.length) {
|
||||
const fadeObserver = new IntersectionObserver((entries) => {
|
||||
entries.forEach(entry => {
|
||||
if (entry.isIntersecting) {
|
||||
entry.target.classList.add('visible');
|
||||
fadeObserver.unobserve(entry.target);
|
||||
}
|
||||
});
|
||||
}, {
|
||||
threshold: 0.15
|
||||
});
|
||||
|
||||
fadeElements.forEach(el => fadeObserver.observe(el));
|
||||
}
|
||||
|
||||
/* ===============================
|
||||
FAQ Toggle
|
||||
=============================== */
|
||||
$selectAll('.faq-question').forEach(question => {
|
||||
question.addEventListener('click', function () {
|
||||
|
||||
const answer = this.nextElementSibling;
|
||||
const icon = this.querySelector('i');
|
||||
|
||||
if (!answer) return;
|
||||
|
||||
// Close others
|
||||
$selectAll('.faq-answer').forEach(item => {
|
||||
if (item !== answer) {
|
||||
item.classList.remove('active');
|
||||
}
|
||||
});
|
||||
|
||||
$selectAll('.faq-question i').forEach(i => {
|
||||
if (i !== icon) {
|
||||
i.classList.remove('bi-chevron-up');
|
||||
i.classList.add('bi-chevron-down');
|
||||
}
|
||||
});
|
||||
|
||||
// Toggle current
|
||||
answer.classList.toggle('active');
|
||||
|
||||
if (icon) {
|
||||
icon.classList.toggle('bi-chevron-up');
|
||||
icon.classList.toggle('bi-chevron-down');
|
||||
}
|
||||
|
||||
});
|
||||
});
|
||||
|
||||
/* ===============================
|
||||
Newsletter Form
|
||||
=============================== */
|
||||
const newsletterForm = $select('.newsletter-form');
|
||||
|
||||
if (newsletterForm) {
|
||||
newsletterForm.addEventListener('submit', function (e) {
|
||||
e.preventDefault();
|
||||
|
||||
const emailInput = this.querySelector('input[type="email"]');
|
||||
if (!emailInput) return;
|
||||
|
||||
alert("Thank you! We'll keep you updated.");
|
||||
this.reset();
|
||||
});
|
||||
}
|
||||
|
||||
/* ===============================
|
||||
Contact Form
|
||||
=============================== */
|
||||
const contactForm = $select('.contact-form');
|
||||
|
||||
if (contactForm) {
|
||||
contactForm.addEventListener('submit', function (e) {
|
||||
e.preventDefault();
|
||||
alert("Message sent successfully!");
|
||||
this.reset();
|
||||
});
|
||||
}
|
||||
|
||||
/* ===============================
|
||||
Close Mobile Menu on Link Click
|
||||
=============================== */
|
||||
$selectAll('.navbar-nav .nav-link').forEach(link => {
|
||||
link.addEventListener('click', () => {
|
||||
const navbarCollapse = $select('.navbar-collapse');
|
||||
if (navbarCollapse && navbarCollapse.classList.contains('show')) {
|
||||
const bsCollapse = new bootstrap.Collapse(navbarCollapse);
|
||||
bsCollapse.hide();
|
||||
}
|
||||
});
|
||||
});
|
||||
/*--------------------------------------------------------------
|
||||
START counter JS
|
||||
--------------------------------------------------------------*/
|
||||
$('.counter-value').counterUp({
|
||||
delay: 10,
|
||||
time: 1000
|
||||
});
|
||||
|
||||
/*Start Blog Design*/
|
||||
$('.atf_client-slider').slick({
|
||||
arrows: true,
|
||||
dots: false,
|
||||
infinite: true,
|
||||
speed: 300,
|
||||
slidesToShow: 3,
|
||||
slidesToScroll: 1,
|
||||
prevArrow: '<a class="slick-prev"><i class="fa-light fa-arrow-left" alt="Arrow Icon"></i></a>',
|
||||
nextArrow: '<a class="slick-next"><i class="fa-light fa-arrow-right" alt="Arrow Icon"></i></a>',
|
||||
responsive: [
|
||||
{
|
||||
breakpoint: 1200,
|
||||
settings: {
|
||||
slidesToShow: 2,
|
||||
slidesToScroll: 1,
|
||||
arrows: false,
|
||||
dots: true
|
||||
}
|
||||
},
|
||||
{
|
||||
breakpoint: 992,
|
||||
settings: {
|
||||
slidesToShow: 2,
|
||||
slidesToScroll: 1,
|
||||
arrows: false,
|
||||
dots: true
|
||||
}
|
||||
},
|
||||
{
|
||||
breakpoint: 768,
|
||||
settings: {
|
||||
slidesToShow: 2,
|
||||
slidesToScroll: 1,
|
||||
arrows: false,
|
||||
dots: true
|
||||
}
|
||||
},
|
||||
{
|
||||
breakpoint: 580,
|
||||
settings: {
|
||||
arrows: false,
|
||||
dots: true,
|
||||
slidesToShow: 1,
|
||||
slidesToScroll: 1
|
||||
}
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
})(jQuery);
|
||||
72
templates/template_1/Main File/NeuralSync/assets/js/plugin.min.js
vendored
Normal file
72
templates/template_1/Main File/NeuralSync/assets/js/plugin.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user