This commit is contained in:
Kekskurse 2021-01-12 15:49:45 +01:00
parent a690563db2
commit ca4e731dcc
572 changed files with 6959 additions and 143 deletions

View File

@ -7,7 +7,9 @@
<sourceFolder url="file://$MODULE_DIR$/database/seeders" isTestSource="false" packagePrefix="Database\Seeders\" />
<sourceFolder url="file://$MODULE_DIR$/app" isTestSource="false" packagePrefix="App\" />
<sourceFolder url="file://$MODULE_DIR$/database/factories" isTestSource="false" packagePrefix="Database\Factories\" />
<excludeFolder url="file://$MODULE_DIR$/vendor/almasaeed2010/adminlte" />
<excludeFolder url="file://$MODULE_DIR$/vendor/asm89/stack-cors" />
<excludeFolder url="file://$MODULE_DIR$/vendor/aws/aws-sdk-php" />
<excludeFolder url="file://$MODULE_DIR$/vendor/brick/math" />
<excludeFolder url="file://$MODULE_DIR$/vendor/composer" />
<excludeFolder url="file://$MODULE_DIR$/vendor/dnoegel/php-xdg-base-dir" />
@ -24,6 +26,7 @@
<excludeFolder url="file://$MODULE_DIR$/vendor/filp/whoops" />
<excludeFolder url="file://$MODULE_DIR$/vendor/fruitcake/laravel-cors" />
<excludeFolder url="file://$MODULE_DIR$/vendor/graham-campbell/result-type" />
<excludeFolder url="file://$MODULE_DIR$/vendor/gumlet/php-image-resize" />
<excludeFolder url="file://$MODULE_DIR$/vendor/guzzlehttp/guzzle" />
<excludeFolder url="file://$MODULE_DIR$/vendor/guzzlehttp/promises" />
<excludeFolder url="file://$MODULE_DIR$/vendor/guzzlehttp/psr7" />
@ -33,9 +36,11 @@
<excludeFolder url="file://$MODULE_DIR$/vendor/laravel/tinker" />
<excludeFolder url="file://$MODULE_DIR$/vendor/league/commonmark" />
<excludeFolder url="file://$MODULE_DIR$/vendor/league/flysystem" />
<excludeFolder url="file://$MODULE_DIR$/vendor/league/flysystem-aws-s3-v3" />
<excludeFolder url="file://$MODULE_DIR$/vendor/league/mime-type-detection" />
<excludeFolder url="file://$MODULE_DIR$/vendor/mockery/mockery" />
<excludeFolder url="file://$MODULE_DIR$/vendor/monolog/monolog" />
<excludeFolder url="file://$MODULE_DIR$/vendor/mtdowling/jmespath.php" />
<excludeFolder url="file://$MODULE_DIR$/vendor/myclabs/deep-copy" />
<excludeFolder url="file://$MODULE_DIR$/vendor/nesbot/carbon" />
<excludeFolder url="file://$MODULE_DIR$/vendor/nikic/php-parser" />

View File

@ -108,6 +108,11 @@
<path value="$PROJECT_DIR$/vendor/mockery/mockery" />
<path value="$PROJECT_DIR$/vendor/filp/whoops" />
<path value="$PROJECT_DIR$/vendor/theseer/tokenizer" />
<path value="$PROJECT_DIR$/vendor/almasaeed2010/adminlte" />
<path value="$PROJECT_DIR$/vendor/league/flysystem-aws-s3-v3" />
<path value="$PROJECT_DIR$/vendor/aws/aws-sdk-php" />
<path value="$PROJECT_DIR$/vendor/mtdowling/jmespath.php" />
<path value="$PROJECT_DIR$/vendor/gumlet/php-image-resize" />
</include_path>
</component>
<component name="PhpUnit">

View File

@ -0,0 +1,79 @@
<?php
namespace App\Console\Commands;
use App\Models\Gallery;
use App\Models\Image;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
class CalculateSpace extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'calculate:space';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Command description';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
$day = date("Y-m-d");
$day = "2021-01-11";
$galleries = Gallery::query()->get();
for ($i = 0; $i <= 24; $i++) {
foreach ($galleries as $gallery) {
//Get file size for that hour for that gallery
$start = $day." ".$i.":00:00";
$end = $day." ".$i.":59:59";
$sql = "SELECT SUM(size) AS size FROM `go-mysql-admin`.images WHERE gallery = ".$gallery->id." AND uploaded_at < \"".$start."\" AND (deleted_at > \"".$end."\" OR deleted_at IS NULL);";
$size = DB::select($sql)[0]->size;
$split = explode("-", $day);
$storage = \App\Models\Storage::query()
->where("gallery", "=", $gallery->id)
->where("tenant", "=", $gallery->tenant)
->where("date", "=", $day)
->where("hour", "=", $i)
->first();
if(is_null($storage)) {
$storage = new \App\Models\Storage();
$storage->date = $day;
$storage->year = $split[0];
$storage->month = $split[1];
$storage->day = $split[2];
$storage->hour = $i;
$storage->gallery = $gallery->id;
$storage->tenant = $gallery->tenant;
}
if($storage->size != $size) {
$storage->size = $size;
$storage->saveOrFail();
}
}
}
}
}

View File

@ -0,0 +1,83 @@
<?php
namespace App\Console\Commands;
use App\Models\Access;
use App\Models\Traffic;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
class CalculateTraffic extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'calculate:traffic';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Recalculate the Traffic for all Access Data';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
$result = [];
$res = DB::select("SELECT * FROM access");
foreach($res as $r) {
$key = $r->tenant."-".$r->gallery."-".$r->year."-".$r->month."-".$r->day."-".$r->hour;
if(isset($result[$key])) {
$result[$key] = $result[$key] + $r->size;
} else {
$result[$key] = $r->size;
}
}
//Save result in db
var_dump($result);
foreach ($result as $key => $trafficSize) {
$split = explode("-", $key);
$traffic = Traffic::query()
->where("tenant", "=", (int)$split[0])
->where("gallery", "=", (int)$split[1])
->where("year", "=", (int)$split[2])
->where("month", "=", (int)$split[3])
->where("day", "=", (int)$split[4])
->where("hour", "=", (int)$split[5])
->first();
if($traffic == null) {
$traffic = new Traffic();
$traffic->tenant = $split[0];
$traffic->gallery = $split[1];
$traffic->year = $split[2];
$traffic->month =$split[3];
$traffic->day = $split[4];
$traffic->hour = $split[5];
$traffic->date = $split[2]."-".$split[3]."-".$split[4];
}
if($traffic->traffic != $trafficSize) {
$traffic->traffic = $trafficSize;
$traffic->saveOrFail();
}
}
}
}

View File

@ -0,0 +1,61 @@
<?php
namespace App\Http\Controllers;
use App\Models\Tenant;
use App\Models\User;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Auth;
class AccountController extends BaseController
{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
public function registerView() {
return view("account.register");
}
public function register(Request $request) {
$validated = $request->validate([
'username' => 'required|unique:users|unique:tenants,url|regex:/^[a-z0-9]{8,30}$/i',
'email' => 'required|unique:users|email:rfc,dns',
'password' => 'required|min:8|confirmed',
]);
$user = new User();
$user->password = Hash::make($validated["password"]);
$user->username = $validated["username"];
$user->email = $validated["email"];
$user->saveOrFail();
$tenant = new Tenant();
$tenant->name = $validated["username"];
$tenant->url = $validated["username"];
$tenant->template = "default";
$tenant->owner = $user->id;
$tenant->saveOrFail();
return redirect("/login");
}
public function loginView() {
return view("account.login");
}
public function login(Request $request) {
$credentials = $request->only('username', 'password');
if (Auth::attempt($credentials)) {
$request->session()->regenerate();
return redirect("/d");
}
return back()->withErrors([
'username' => 'The provided credentials do not match our records.',
]);
}
}

View File

@ -0,0 +1,38 @@
<?php
namespace App\Http\Controllers;
use App\Models\Storage;
use App\Models\Traffic;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Support\Facades\DB;
class DashboardController extends BaseController
{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
public function dashboardView() {
$currentSize = DB::select("SELECT SUM(size) AS `size` FROM images LEFT JOIN galleries ON images.gallery = galleries.id WHERE galleries.tenant = 1;")[0]->size;
$currentTraffic = DB::select("SELECT SUM(size) AS size FROM `go-mysql-admin`.access WHERE tenant = 1 AND created_at >= NOW() - INTERVAL 1 DAY;")[0]->size;
$monthlyTraffic = DB::select("SELECT SUM(traffic) AS `traffic` FROM traffic WHERE `year` = 2021 AND `month` = 1 and tenant = 1;")[0]->traffic;
$lastDaysTreffic = Traffic::getLastDays(7);
$lastDaysSize = Storage::getLastDays(7);
return view("dashboard.index", [
"currentSize" => $this->human_filesize($currentSize),
"currentTraffic" => $this->human_filesize($currentTraffic),
"monthlyTraffic" => $this->human_filesize($monthlyTraffic),
"lastDaysTreffic" => $lastDaysTreffic,
"lastDaysSize" => $lastDaysSize
]);
}
private function human_filesize($bytes, $decimals = 2) {
$size = array('B','kB','MB','GB','TB','PB','EB','ZB','YB');
$factor = floor((strlen($bytes) - 1) / 3);
return sprintf("%.{$decimals}f", $bytes / pow(1024, $factor)) . @$size[$factor];
}
}

View File

@ -0,0 +1,128 @@
<?php
namespace App\Http\Controllers;
use App\Models\Gallery;
use App\Models\Image;
use App\Models\Tenant;
use App\Rules\dateOrNull;
use App\Rules\urlOrNull;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Support\Facades\Redirect;
use Illuminate\Support\Facades\Storage;
class GalleryController extends BaseController
{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
public function listView() {
$galleries = Gallery::query()->where("tenant", "=", session("current_tenant_id"))->orderByDesc("gallery_create_time")->orderByDesc("id")->get();
$tenant = Tenant::query()->where("id", "=", session("current_tenant_id"))->firstOrFail();
return view("gallery.index", ["galleries" => $galleries, "tenant" => $tenant]);
}
public function newView() {
return view("gallery.new");
}
public function newGallery(Request $request) {
$validated = $request->validate([
'name' => 'required|max:255',
'description' => 'max:15000000',
'url' => [new urlOrNull()],
'date' => [new dateOrNull()],
]);
//Check if Gallery Date is in the feature
if(!empty($validated["date"])) {
$t = new \DateTime($validated["date"]);
if($t > (new \DateTime())) {
return Redirect::back()->withErrors(["date" => "Gallery date can't be in the feature"])->withInput($validated);
}
}
if(empty($validated["url"])) {
$prepairdName = strtolower($validated["name"]);
$prepairdName = str_replace(" ", "-", $prepairdName);
$prepairdName = str_replace("ö", "oe", $prepairdName);
$prepairdName = str_replace("ü", "üe", $prepairdName);
$prepairdName = str_replace("ö", "oe", $prepairdName);
$prepairdName = str_replace("ß", "ss", $prepairdName);
while (strlen($prepairdName) < 8) {
$prepairdName = $prepairdName."0";
}
preg_match_all("@[a-z0-9\-]@", $prepairdName, $matches);
$newUrl = "";
foreach($matches[0] as $letter) {
$newUrl .= $letter;
}
$baseUrl = $newUrl;
$i = 1;
while (true) {
$r = Gallery::getByTenantAndUrl(session("current_tenant_id"), $newUrl);
if($r == null) {
break;
}
$newUrl = $baseUrl.$i;
$i++;
}
} else {
$newUrl = $validated["url"];
}
//Check if url is free
$galleryTMP = Gallery::getByTenantAndUrl(session("current_tenant_id"), $newUrl);
if(!empty($galleryTMP)) {
return Redirect::back()->withErrors(["url" => "URL is already used"])->withInput($validated);
}
$gallery = new Gallery();
$gallery->name = $validated["name"];
$gallery->url = $newUrl;
$gallery->description = $validated["description"];
$gallery->tenant = session("current_tenant_id");
if(!empty($validated["date"])) {
$gallery->gallery_create_time = $validated["date"];
}
$gallery->saveOrFail();
return \redirect("/g/".$gallery->url."/upload");
}
public function imagesUploadView($name) {
return view("gallery.upload");
}
public function imageUpload($name, Request $request) {
$gallery = Gallery::getByTenantAndUrl(session("current_tenant_id"), $name);
$validated = $request->validate([
'files.0' => 'required|image'
]);
$path = $validated["files"][0]->store("uploads/".session("current_tenant_id")."/".$name);
$image = new Image();
$image->path = $path;
$image->driver = env('FILESYSTEM_DRIVER', 'local');
$image->filename = $validated["files"][0]->getClientOriginalName();
$image->gallery = $gallery->id;
$image->size = $validated["files"][0]->getSize();
$image->saveOrFail();
if(is_null($gallery->main_image)) {
$gallery->main_image = $image->id;
$gallery->saveOrFail();
}
return $name;
}
}

View File

@ -0,0 +1,101 @@
<?php
namespace App\Http\Controllers;
use App\Models\Access;
use App\Models\Gallery;
use App\Models\Image;
use App\Models\Tenant;
use Gumlet\ImageResize;
use Illuminate\Http\Request;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Storage;
use phpDocumentor\Reflection\Types\Integer;
class PublicController extends BaseController
{
const SIZE_SMALL = 300;
const SIZE_MEDIUM = 600;
const SIZE_BIG = 1200;
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
public function listGalleriesView($name) {
$tenant = Tenant::query()->where("url", "=", $name)->firstOrFail();
$galleries = Gallery::query()->where("tenant", "=", $tenant->id)->get();
return view("themes.tenant.default.list", ["galleries" => $galleries, "tenant" => $tenant]);
}
public function listGalleryImagesView($tenant, $gallery) {
$tenant = Tenant::query()->where("url", "=", $tenant)->firstOrFail();
$gallery = Gallery::getByTenantAndUrl($tenant->id, $gallery);
$images = Image::query()->where("gallery", "=", $gallery->id)->get();
return view("themes.gallery.default.list", ["gallery" => $gallery, "tenant" => $tenant, "images" => $images]);
}
public function returnImageFile($tenant, $gallery, $image, Request $request) {
$tenant = Tenant::query()->where("url", "=", $tenant)->firstOrFail();
$gallery = Gallery::getByTenantAndUrl($tenant->id, $gallery);
$image = Image::query()->where("gallery", "=", $gallery->id)->where("id", "=", $image)->firstOrFail();
$size = $request->input("size", "medium");
$cacheName = "cache_".$tenant->id."_".$gallery->id."_".$image->id;
//File exists in the right size
if (Storage::disk('cache')->exists($cacheName."_".$size)) {
Log::info("Get from Cache");
$this->addAccessLog($tenant->id, $gallery->id, $image->id, "Cache", Storage::disk('cache')->size($cacheName."_".$size));
return Storage::disk('cache')->response($cacheName."_".$size);
}
//ORginal File exists need to be resized
$file = null;
if (Storage::disk('cache')->exists($cacheName."_orginal")) {
Log::info("Get orginal size from Cache");
$file = Storage::disk("cache")->get($cacheName."_orginal");
$this->addAccessLog($tenant->id, $gallery->id, $image->id, "Cache", $image->size);
return Storage::disk('cache')->response($cacheName."_".$size);
} else {
Log::info("Get from S3");
$this->addAccessLog($tenant->id, $gallery->id, $image->id, "Access", $image->size);
$file = Storage::disk($image->driver)->get($image->path);
Storage::disk("cache")->put($cacheName."_orginal", $file);
}
//Resize
$image = ImageResize::createFromString($file);
$image->resizeToLongSide(self::SIZE_SMALL);
Storage::disk("cache")->put($cacheName."_small", $image->getImageAsString());
$image = ImageResize::createFromString($file);
$image->resizeToLongSide(self::SIZE_MEDIUM);
Storage::disk("cache")->put($cacheName."_medium", $image->getImageAsString());
$image = ImageResize::createFromString($file);
$image->resizeToLongSide(self::SIZE_BIG);
Storage::disk("cache")->put($cacheName."_big", $image->getImageAsString());
return Storage::disk('cache')->response($cacheName."_orginal");
}
private function addAccessLog(int $tenant, int $gallery, int $image, string $typ, int $size) {
$access = new Access();
$access->year = date("Y");
$access->month = date("m");
$access->day = date("d");
$access->hour = date("H");
$access->image = $image;
$access->gallery = $gallery;
$access->tenant = $tenant;
$access->typ = $typ;
$access->size = $size;
$access->saveOrFail();
}
}

View File

@ -0,0 +1,55 @@
<?php
namespace App\Http\Controllers;
use App\Models\Tenant;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Redirect;
class TenantController extends BaseController
{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
public function newView() {
return view("tenant.new");
}
public function newTenant(Request $request) {
$validated = $request->validate([
'name' => 'required|max:255',
'url' => 'required|unique:tenants|regex:/^[a-z0-9]{8,30}$/i'
]);
$tenant = new Tenant();
$tenant->name = $validated["name"];
$tenant->url = $validated["url"];
$tenant->template = "default";
$tenant->owner = Auth::user()->id;
$tenant->saveOrFail();
$this->switchTenantById($tenant->id);
return redirect("/d");
}
public function switchTenant($url, Request $request) {
$tenant = Tenant::getByUrl($url);
if($tenant->owner == Auth::id()) {
$this->switchTenantById($tenant->id);
return Redirect::back();
} else {
return Redirect::back()->with(["msg" => "No Access to given Tenant"]);
}
}
private function switchTenantById($id) {
session(["current_tenant_id" => $id]);
}
}

View File

@ -0,0 +1,27 @@
<?php
namespace App\Http\Middleware;
use App\Models\Tenant;
use Closure;
use Illuminate\Support\Facades\Auth;
class TenanMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if(Auth::check()) {
view()->share('user_tenants', Tenant::getTenantPerUser(Auth::id()));
}
return $next($request);
}
}

View File

@ -12,6 +12,6 @@ class VerifyCsrfToken extends Middleware
* @var array
*/
protected $except = [
//
'/g/*/upload'
];
}

44
app/Models/Access.php Normal file
View File

@ -0,0 +1,44 @@
<?php
namespace App\Models;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class Access extends Authenticatable
{
use HasFactory, Notifiable;
protected $table = "access";
public $timestamps = false;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'image',
'typ',
'size'
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
];
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
];
}

48
app/Models/Gallery.php Normal file
View File

@ -0,0 +1,48 @@
<?php
namespace App\Models;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class Gallery extends Authenticatable
{
use HasFactory, Notifiable;
protected $table = "galleries";
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name',
'url',
'description',
'tenant',
'gallery_create_time'
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
];
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
];
public static function getByTenantAndUrl($tenant_id, $url) {
return Gallery::query()->where("tenant", "=", $tenant_id)->where("url", "=", $url)->first();
}
}

45
app/Models/Image.php Normal file
View File

@ -0,0 +1,45 @@
<?php
namespace App\Models;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class Image extends Authenticatable
{
use HasFactory, Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'path',
'driver',
'filename',
'gallery',
'size',
'uploaded_at',
'deleted_at'
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
];
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
];
}

64
app/Models/Storage.php Normal file
View File

@ -0,0 +1,64 @@
<?php
namespace App\Models;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Support\Facades\DB;
class Storage extends Authenticatable
{
use HasFactory, Notifiable;
protected $table = "storage";
public $timestamps = true;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
];
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
];
public static function getLastDays(int $days = 7) {
$sql = "SELECT `date`, `tenant`, (sum(size)/24) AS size FROM `storage` WHERE `tenant` = 1 GROUP BY `date`, `tenant` ORDER BY `date` DESC LIMIT ".$days.";";
$res = DB::select($sql);
$now = new \DateTime( $days." days ago", new \DateTimeZone('UTC'));
$interval = new \DateInterval( 'P1D'); // 1 Day interval
$period = new \DatePeriod( $now, $interval, $days); // 7 Days
$result = [];
foreach( $period as $day) {
$key = $day->format('Y-m-d');
$result[$day->format('Y-m-d')] = 0;
foreach($res as $r) {
if($r->date == $day->format('Y-m-d')) {
$result[$day->format('Y-m-d')] = $r->size / 1000 / 1000;
}
}
}
return $result;
}
}

49
app/Models/Tenant.php Normal file
View File

@ -0,0 +1,49 @@
<?php
namespace App\Models;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class Tenant extends Authenticatable
{
use HasFactory, Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name',
'url',
'template',
'owner'
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
];
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
];
public static function getTenantPerUser(int $user_id) {
return Tenant::query()->where("owner", "=", $user_id)->get();
}
public static function getByUrl(string $url) {
return Tenant::query()->where("url", "=", $url)->firstOrFail();
}
}

70
app/Models/Traffic.php Normal file
View File

@ -0,0 +1,70 @@
<?php
namespace App\Models;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Support\Facades\DB;
class Traffic extends Authenticatable
{
use HasFactory, Notifiable;
protected $table = "traffic";
public $timestamps = true;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'tenant',
'gallery',
'year',
'month',
'day',
'hour',
'traffic'
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
];
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
];
public static function getLastDays(int $days = 7) {
$sql = "SELECT year, month, day, SUM(traffic) AS `traffic` FROM traffic WHERE tenant = 1 GROUP BY year, month, day ORDER BY date DESC LIMIT ".$days.";";
$res = DB::select($sql);
$now = new \DateTime( $days." days ago", new \DateTimeZone('UTC'));
$interval = new \DateInterval( 'P1D'); // 1 Day interval
$period = new \DatePeriod( $now, $interval, $days); // 7 Days
$result = [];
foreach( $period as $day) {
$key = $day->format('Y-m-d');
$result[$day->format('Y-m-d')] = 0;
foreach($res as $r) {
if($r->year == $day->format('Y') && $r->month == $day->format('m') && $r->day == $day->format('d')) {
$result[$day->format('Y-m-d')] = $r->traffic / 1000 / 1000;
}
}
}
return $result;
}
}

View File

@ -17,7 +17,7 @@ class User extends Authenticatable
* @var array
*/
protected $fillable = [
'name',
'username',
'email',
'password',
];

44
app/Rules/dateOrNull.php Normal file
View File

@ -0,0 +1,44 @@
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class dateOrNull implements Rule
{
/**
* Create a new rule instance.
*
* @return void
*/
public function __construct()
{
}
/**
* Determine if the validation rule passes.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
{
if(empty($value)) {
return true;
}
return preg_match('/^\d{4}-\d{2}-\d{2}$/i', $value);
}
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
return 'Date must be yyyy-mm-dd';
}
}

44
app/Rules/urlOrNull.php Normal file
View File

@ -0,0 +1,44 @@
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class urlOrNull implements Rule
{
/**
* Create a new rule instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Determine if the validation rule passes.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
{
if(empty($value)) {
return true;
}
return preg_match('/^[a-z0-9\-]{8,30}$/i', $value);
}
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
return 'URL is not valide';
}
}

View File

@ -13,7 +13,10 @@
"fruitcake/laravel-cors": "^2.0",
"guzzlehttp/guzzle": "^7.0.1",
"laravel/framework": "^8.12",
"laravel/tinker": "^2.5"
"laravel/tinker": "^2.5",
"almasaeed2010/adminlte": "^3.0",
"league/flysystem-aws-s3-v3": "~1.0",
"gumlet/php-image-resize": "1.9.*"
},
"require-dev": {
"facade/ignition": "^2.5",

306
composer.lock generated
View File

@ -4,8 +4,51 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "4a16c3c541bd99241cab1c21ce8e83ac",
"content-hash": "8920d6f3aab6ae8aa7942dbb536e37b6",
"packages": [
{
"name": "almasaeed2010/adminlte",
"version": "v3.0.5",
"source": {
"type": "git",
"url": "https://github.com/ColorlibHQ/AdminLTE.git",
"reference": "6b8b69261f1aacbb4be037c934f3c3652e6dff27"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/ColorlibHQ/AdminLTE/zipball/6b8b69261f1aacbb4be037c934f3c3652e6dff27",
"reference": "6b8b69261f1aacbb4be037c934f3c3652e6dff27",
"shasum": ""
},
"type": "library",
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Colorlib"
}
],
"description": "AdminLTE - admin control panel and dashboard that's based on Bootstrap 4",
"homepage": "http://adminlte.io/",
"keywords": [
"JS",
"admin",
"back-end",
"css",
"less",
"responsive",
"template",
"theme",
"web"
],
"support": {
"issues": "https://github.com/ColorlibHQ/AdminLTE/issues",
"source": "https://github.com/ColorlibHQ/AdminLTE/tree/v3.0.5"
},
"time": "2020-05-19T20:41:11+00:00"
},
{
"name": "asm89/stack-cors",
"version": "v2.0.2",
@ -62,6 +105,96 @@
},
"time": "2020-10-29T16:03:21+00:00"
},
{
"name": "aws/aws-sdk-php",
"version": "3.171.15",
"source": {
"type": "git",
"url": "https://github.com/aws/aws-sdk-php.git",
"reference": "26c7f2deb05110c62e38cc867658f1ef89123365"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/26c7f2deb05110c62e38cc867658f1ef89123365",
"reference": "26c7f2deb05110c62e38cc867658f1ef89123365",
"shasum": ""
},
"require": {
"ext-json": "*",
"ext-pcre": "*",
"ext-simplexml": "*",
"guzzlehttp/guzzle": "^5.3.3|^6.2.1|^7.0",
"guzzlehttp/promises": "^1.0",
"guzzlehttp/psr7": "^1.4.1",
"mtdowling/jmespath.php": "^2.5",
"php": ">=5.5"
},
"require-dev": {
"andrewsville/php-token-reflection": "^1.4",
"aws/aws-php-sns-message-validator": "~1.0",
"behat/behat": "~3.0",
"doctrine/cache": "~1.4",
"ext-dom": "*",
"ext-openssl": "*",
"ext-pcntl": "*",
"ext-sockets": "*",
"nette/neon": "^2.3",
"paragonie/random_compat": ">= 2",
"phpunit/phpunit": "^4.8.35|^5.4.3",
"psr/cache": "^1.0",
"psr/simple-cache": "^1.0",
"sebastian/comparator": "^1.2.3"
},
"suggest": {
"aws/aws-php-sns-message-validator": "To validate incoming SNS notifications",
"doctrine/cache": "To use the DoctrineCacheAdapter",
"ext-curl": "To send requests using cURL",
"ext-openssl": "Allows working with CloudFront private distributions and verifying received SNS messages",
"ext-sockets": "To use client-side monitoring"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.0-dev"
}
},
"autoload": {
"psr-4": {
"Aws\\": "src/"
},
"files": [
"src/functions.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"Apache-2.0"
],
"authors": [
{
"name": "Amazon Web Services",
"homepage": "http://aws.amazon.com"
}
],
"description": "AWS SDK for PHP - Use Amazon Web Services in your PHP project",
"homepage": "http://aws.amazon.com/sdkforphp",
"keywords": [
"amazon",
"aws",
"cloud",
"dynamodb",
"ec2",
"glacier",
"s3",
"sdk"
],
"support": {
"forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80",
"issues": "https://github.com/aws/aws-sdk-php/issues",
"source": "https://github.com/aws/aws-sdk-php/tree/3.171.15"
},
"time": "2021-01-11T19:28:59+00:00"
},
{
"name": "brick/math",
"version": "0.9.1",
@ -660,6 +793,65 @@
],
"time": "2020-04-13T13:17:36+00:00"
},
{
"name": "gumlet/php-image-resize",
"version": "1.9.2",
"source": {
"type": "git",
"url": "https://github.com/gumlet/php-image-resize.git",
"reference": "06339a9c1b167acd58173db226f57957a6617547"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/gumlet/php-image-resize/zipball/06339a9c1b167acd58173db226f57957a6617547",
"reference": "06339a9c1b167acd58173db226f57957a6617547",
"shasum": ""
},
"require": {
"ext-fileinfo": "*",
"ext-gd": "*",
"php": ">=5.5.0"
},
"require-dev": {
"apigen/apigen": "^4.1",
"ext-exif": "*",
"ext-gd": "*",
"php-coveralls/php-coveralls": "^2.1",
"phpunit/phpunit": "^4.8"
},
"suggest": {
"ext-exif": "Auto-rotate jpeg files"
},
"type": "library",
"autoload": {
"psr-4": {
"Gumlet\\": "lib/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Aditya Patadia",
"homepage": "http://aditya.patadia.org/"
}
],
"description": "PHP class to re-size and scale images",
"homepage": "https://github.com/gumlet/php-image-resize",
"keywords": [
"image",
"php",
"resize",
"scale"
],
"support": {
"issues": "https://github.com/gumlet/php-image-resize/issues",
"source": "https://github.com/gumlet/php-image-resize/tree/master"
},
"time": "2019-01-01T13:53:00+00:00"
},
{
"name": "guzzlehttp/guzzle",
"version": "7.2.0",
@ -1323,6 +1515,57 @@
],
"time": "2020-08-23T07:39:11+00:00"
},
{
"name": "league/flysystem-aws-s3-v3",
"version": "1.0.29",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/flysystem-aws-s3-v3.git",
"reference": "4e25cc0582a36a786c31115e419c6e40498f6972"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/4e25cc0582a36a786c31115e419c6e40498f6972",
"reference": "4e25cc0582a36a786c31115e419c6e40498f6972",
"shasum": ""
},
"require": {
"aws/aws-sdk-php": "^3.20.0",
"league/flysystem": "^1.0.40",
"php": ">=5.5.0"
},
"require-dev": {
"henrikbjorn/phpspec-code-coverage": "~1.0.1",
"phpspec/phpspec": "^2.0.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0-dev"
}
},
"autoload": {
"psr-4": {
"League\\Flysystem\\AwsS3v3\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Frank de Jonge",
"email": "info@frenky.net"
}
],
"description": "Flysystem adapter for the AWS S3 SDK v3.x",
"support": {
"issues": "https://github.com/thephpleague/flysystem-aws-s3-v3/issues",
"source": "https://github.com/thephpleague/flysystem-aws-s3-v3/tree/1.0.29"
},
"time": "2020-10-08T18:58:37+00:00"
},
{
"name": "league/mime-type-detection",
"version": "1.5.1",
@ -1474,6 +1717,67 @@
],
"time": "2020-12-14T13:15:25+00:00"
},
{
"name": "mtdowling/jmespath.php",
"version": "2.6.0",
"source": {
"type": "git",
"url": "https://github.com/jmespath/jmespath.php.git",
"reference": "42dae2cbd13154083ca6d70099692fef8ca84bfb"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/42dae2cbd13154083ca6d70099692fef8ca84bfb",
"reference": "42dae2cbd13154083ca6d70099692fef8ca84bfb",
"shasum": ""
},
"require": {
"php": "^5.4 || ^7.0 || ^8.0",
"symfony/polyfill-mbstring": "^1.17"
},
"require-dev": {
"composer/xdebug-handler": "^1.4",
"phpunit/phpunit": "^4.8.36 || ^7.5.15"
},
"bin": [
"bin/jp.php"
],
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.6-dev"
}
},
"autoload": {
"psr-4": {
"JmesPath\\": "src/"
},
"files": [
"src/JmesPath.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Michael Dowling",
"email": "mtdowling@gmail.com",
"homepage": "https://github.com/mtdowling"
}
],
"description": "Declaratively specify how to extract elements from a JSON document",
"keywords": [
"json",
"jsonpath"
],
"support": {
"issues": "https://github.com/jmespath/jmespath.php/issues",
"source": "https://github.com/jmespath/jmespath.php/tree/2.6.0"
},
"time": "2020-07-31T21:01:56+00:00"
},
{
"name": "nesbot/carbon",
"version": "2.43.0",

View File

@ -35,11 +35,9 @@ return [
'root' => storage_path('app'),
],
'public' => [
'cache' => [
'driver' => 'local',
'root' => storage_path('app/public'),
'url' => env('APP_URL').'/storage',
'visibility' => 'public',
'root' => storage_path('cache'),
],
's3' => [

View File

@ -15,12 +15,13 @@ class CreateUsersTable extends Migration
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->timestamps();
$table->string('username');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}

View File

@ -0,0 +1,37 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class Tenant extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('tenants', function (Blueprint $table) {
$table->id();
$table->timestamps();
$table->string('name');
$table->string('url');
$table->string("template");
$table->unsignedBigInteger("owner");
$table->foreign('owner')->references('id')->on('users');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('tenant');
}
}

View File

@ -0,0 +1,40 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class Gallery extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('galleries', function (Blueprint $table) {
$table->id();
$table->timestamps();
$table->string('name');
$table->string('url');
$table->mediumText("description")->nullable();
$table->unsignedBigInteger("tenant");
$table->date("gallery_create_time")->default(\Illuminate\Support\Facades\DB::raw('CURRENT_DATE'));
$table->foreign('tenant')->references('id')->on('tenants');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists("galleries");
}
}

View File

@ -0,0 +1,40 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class Image extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('images', function (Blueprint $table) {
$table->id();
$table->timestamps();
$table->string("path");
$table->string("driver");
$table->string("filename");
$table->integer("size");
$table->timestamp("uploaded_at")->default(\Illuminate\Support\Facades\DB::raw('CURRENT_TIMESTAMP'));
$table->timestamp("deleted_at")->nullable();
$table->unsignedBigInteger("gallery");
$table->foreign('gallery')->references('id')->on('galleries');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists("images");
}
}

View File

@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class GalleryMainImage extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table("galleries", function (Blueprint $table) {
$table->unsignedBigInteger("main_image")->nullable()->default(null);
$table->foreign('main_image')->references('id')->on('images');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
//
}
}

View File

@ -0,0 +1,44 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class Access extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create("access", function(Blueprint $table) {
$table->id();
$table->timestamp("created_at")->default(\Illuminate\Support\Facades\DB::raw('CURRENT_TIMESTAMP'));
$table->smallInteger("year");
$table->tinyInteger("month");
$table->tinyInteger("day");
$table->tinyInteger("hour");
$table->unsignedBigInteger("image");
$table->unsignedBigInteger("gallery");
$table->unsignedBigInteger("tenant");
$table->enum("typ", ["Access", "Cache"]);
$table->integer("size");
$table->foreign('image')->references('id')->on('images');
$table->foreign('gallery')->references('id')->on('galleries');
$table->foreign('tenant')->references('id')->on('tenants');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists("access");
}
}

View File

@ -0,0 +1,43 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class Traffic extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create("traffic", function (Blueprint $table) {
$table->id();
$table->timestamps();
$table->smallInteger("year");
$table->tinyInteger("month");
$table->tinyInteger("day");
$table->tinyInteger("hour");
$table->date("date");
$table->unsignedBigInteger("tenant");
$table->unsignedBigInteger("gallery");
$table->bigInteger("traffic");
$table->foreign('gallery')->references('id')->on('galleries');
$table->foreign('tenant')->references('id')->on('tenants');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
//
}
}

View File

@ -0,0 +1,43 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class StorageLog extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create("storage", function (Blueprint $table) {
$table->id();
$table->timestamps();
$table->smallInteger("year");
$table->tinyInteger("month");
$table->tinyInteger("day");
$table->tinyInteger("hour");
$table->date("date");
$table->unsignedBigInteger("tenant");
$table->unsignedBigInteger("gallery");
$table->bigInteger("size");
$table->foreign('gallery')->references('id')->on('galleries');
$table->foreign('tenant')->references('id')->on('tenants');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists("storage");
}
}

1
public/assets Symbolic link
View File

@ -0,0 +1 @@
../resources/assets

1
public/css Symbolic link
View File

@ -0,0 +1 @@
../resources/css

1
public/dist Symbolic link
View File

@ -0,0 +1 @@
../vendor/almasaeed2010/adminlte/dist

1
public/images Symbolic link
View File

@ -0,0 +1 @@
../resources/images

1
public/js Symbolic link
View File

@ -0,0 +1 @@
../resources/js

1
public/plugins Symbolic link
View File

@ -0,0 +1 @@
../vendor/almasaeed2010/adminlte/plugins

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,283 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<!--
2015-1-20: Created.
-->
<svg xmlns="http://www.w3.org/2000/svg">
<metadata>
Created by FontForge 20120731 at Tue Jan 20 14:13:11 2015
By Iulian Galciuc,,,
Created by Iulian Galciuc,,, with FontForge 2.0 (http://fontforge.sf.net)
</metadata>
<defs>
<font id="jquery-filer" horiz-adv-x="512" >
<font-face
font-family="jquery-filer"
font-weight="500"
font-stretch="normal"
units-per-em="512"
panose-1="2 0 6 9 0 0 0 0 0 0"
ascent="448"
descent="-64"
bbox="-0.361328 -64.8438 512.331 448.844"
underline-thickness="25.6"
underline-position="-51.2"
unicode-range="U+F2F6-F344"
/>
<missing-glyph />
<glyph glyph-name="uniF32B" unicode="&#xf32b;"
d="M480 192c0 -29 -10 -55.7917 -30 -80.375c-20 -24.5833 -47.1667 -44 -81.5 -58.25s-71.8333 -21.375 -112.5 -21.375c-11.6667 0 -23.75 0.666668 -36.25 2c-33 -29.1667 -71.3333 -49.3333 -115 -60.5c-8.16666 -2.33333 -17.6667 -4.16667 -28.5 -5.5
c-2.83334 -0.333454 -5.375 0.416546 -7.625 2.25c-2.25 1.83333 -3.70834 4.25 -4.375 7.25v0.25c-0.5 0.666666 -0.541668 1.66667 -0.125 3c0.416664 1.3333 0.583336 2.16663 0.5 2.5c-0.0833359 0.333303 0.291664 1.12497 1.125 2.375l1.5 2.25l1.75 2.125l2 2.25
c1.16666 1.33333 3.75 4.20833 7.75 8.625s6.875 7.58333 8.625 9.5s4.33334 5.20833 7.75 9.875s6.125 8.91667 8.125 12.75c2 3.83333 4.25 8.75 6.75 14.75s4.66666 12.3333 6.5 19c-26.1667 14.8334 -46.7917 33.1667 -61.875 55
c-15.0833 21.8333 -22.625 45.25 -22.625 70.25c0 21.6667 5.91667 42.375 17.75 62.125s27.75 36.7917 47.75 51.125c20.0001 14.3333 43.8334 25.7083 71.5 34.125c27.6667 8.41666 56.6667 12.625 87 12.625c40.6667 0 78.1667 -7.125 112.5 -21.375
s61.5 -33.6667 81.5 -58.25c20 -24.5833 30 -51.375 30 -80.375z" />
<glyph glyph-name="uniF30C" unicode="&#xf30c;"
d="M385 232.5c0 4.66667 -1.5 8.5 -4.5 11.5l-22.75 22.5c-3.16666 3.16666 -6.91666 4.75 -11.25 4.75s-8.08334 -1.58334 -11.25 -4.75l-102 -101.75l-56.5 56.5c-3.16667 3.16667 -6.91667 4.75 -11.25 4.75s-8.08333 -1.58333 -11.25 -4.75l-22.75 -22.5
c-3 -3 -4.5 -6.83333 -4.5 -11.5c0 -4.5 1.5 -8.25 4.5 -11.25l90.5 -90.5c3.16667 -3.16666 6.91667 -4.75 11.25 -4.75c4.5 0 8.33333 1.58334 11.5 4.75l135.75 135.75c3 3 4.5 6.75 4.5 11.25zM448 192c0 -34.8333 -8.58334 -66.9583 -25.75 -96.375
c-17.1674 -29.4167 -40.4591 -52.7083 -69.875 -69.875c-29.4167 -17.1667 -61.5417 -25.75 -96.375 -25.75c-34.8333 0 -66.9583 8.58333 -96.375 25.75c-29.4167 17.1667 -52.7083 40.4583 -69.875 69.875c-17.1667 29.4167 -25.75 61.5417 -25.75 96.375
c0 34.8333 8.58334 66.9583 25.75 96.375s40.4583 52.7083 69.875 69.875s61.5417 25.75 96.375 25.75c34.8333 0 66.9583 -8.58334 96.375 -25.75c29.4167 -17.1673 52.7083 -40.459 69.875 -69.875c17.1667 -29.4168 25.75 -61.5418 25.75 -96.375z" />
<glyph glyph-name="uniF33F" unicode="&#xf33f;"
d="M288 72v48c0 2.33334 -0.75 4.25 -2.25 5.75s-3.41666 2.25 -5.75 2.25h-48c-2.33333 0 -4.25 -0.75 -5.75 -2.25s-2.25 -3.41666 -2.25 -5.75v-48c0 -2.33334 0.75 -4.25 2.25 -5.75s3.41667 -2.25 5.75 -2.25h48c2.33334 0 4.25 0.75 5.75 2.25s2.25 3.41666 2.25 5.75
zM352 240c0 14.6667 -4.625 28.25 -13.875 40.75s-20.7917 22.1667 -34.625 29s-28 10.25 -42.5 10.25c-40.5 0 -71.4167 -17.75 -92.75 -53.25c-2.5 -4 -1.83333 -7.5 2 -10.5l33 -25c1.16667 -1 2.75 -1.5 4.75 -1.5c2.66667 0 4.75 1 6.25 3
c8.83333 11.3333 16 19 21.5 23c5.66713 4 12.8338 6 21.5 6c8 0 15.125 -2.16666 21.375 -6.5c6.25 -4.33333 9.375 -9.25 9.375 -14.75c0 -6.33356 -1.66666 -11.4169 -5 -15.25c-3.33334 -3.83333 -9 -7.58333 -17 -11.25
c-10.5 -4.66667 -20.125 -11.875 -28.875 -21.625s-13.125 -20.2083 -13.125 -31.375v-9c0 -2.33333 0.75 -4.25 2.25 -5.75s3.41667 -2.25 5.75 -2.25h48c2.33334 0 4.25 0.75 5.75 2.25s2.25 3.41667 2.25 5.75c0 3.16667 1.79166 7.29167 5.375 12.375
s8.125 9.20833 13.625 12.375c5.33572 3 9.41907 5.375 12.25 7.125c2.83456 1.75 6.66791 4.66667 11.5 8.75c4.83591 4.08333 8.54425 8.08333 11.125 12c2.58859 3.91747 4.92194 8.95914 7 15.125c2.08334 6.16667 3.125 12.9167 3.125 20.25zM448 192
c0 -34.8333 -8.58334 -66.9583 -25.75 -96.375c-17.1674 -29.4167 -40.4591 -52.7083 -69.875 -69.875c-29.4167 -17.1667 -61.5417 -25.75 -96.375 -25.75c-34.8333 0 -66.9583 8.58333 -96.375 25.75c-29.4167 17.1667 -52.7083 40.4583 -69.875 69.875
c-17.1667 29.4167 -25.75 61.5417 -25.75 96.375c0 34.8333 8.58334 66.9583 25.75 96.375s40.4583 52.7083 69.875 69.875s61.5417 25.75 96.375 25.75c34.8333 0 66.9583 -8.58334 96.375 -25.75c29.4167 -17.1673 52.7083 -40.459 69.875 -69.875
c17.1667 -29.4168 25.75 -61.5418 25.75 -96.375z" />
<glyph glyph-name="uniF2F8" unicode="&#xf2f8;"
d="M340.8 365v0c59.1006 0 107.2 -48.2998 107.2 -107.7c0 -29.5996 -11.7998 -57.2002 -32.7998 -77.5l-148.3 -149.8l-10.9004 -11l-10.9004 11l-151.199 152.7c-19.3008 20.2002 -29.9004 46.7002 -29.9004 74.5996c0 59.4004 48.0996 107.7 107.2 107.7
c33.7998 0 64.7998 -15.7998 84.7998 -41.7998c20 26 51 41.7998 84.7998 41.7998z" />
<glyph glyph-name="uniF30D" unicode="&#xf30d;"
d="M256 320c-34 0 -65.7917 -5.79166 -95.375 -17.375c-29.5834 -11.5833 -53.0834 -27.2083 -70.5 -46.875c-17.4167 -19.6667 -26.125 -40.9167 -26.125 -63.75c0 -18.6667 5.95834 -36.4583 17.875 -53.375c11.9167 -16.9167 28.7083 -31.5417 50.375 -43.875
l21.75 -12.5l-6.75 -24c-4 -15.1667 -9.83333 -29.5 -17.5 -43c25.3333 10.5 48.25 24.75 68.75 42.75l10.75 9.5l14.25 -1.5c11.5 -1.33334 22.3333 -2 32.5 -2c34 -3.8147e-06 65.7917 5.79166 95.375 17.375s53.0833 27.2083 70.5 46.875
c17.4167 19.6667 26.125 40.9167 26.125 63.75s-8.70834 44.0833 -26.125 63.75c-17.4167 19.6667 -40.9167 35.2917 -70.5 46.875s-61.375 17.375 -95.375 17.375zM480 192c0 -29 -10 -55.7917 -30 -80.375c-20 -24.5833 -47.1667 -44 -81.5 -58.25
s-71.8333 -21.375 -112.5 -21.375c-11.6667 0 -23.75 0.666668 -36.25 2c-33 -29.1667 -71.3333 -49.3333 -115 -60.5c-8.16666 -2.33333 -17.6667 -4.16667 -28.5 -5.5h-1.25c-2.5 0 -4.75 0.875 -6.75 2.625s-3.33334 4.04167 -4 6.875v0.25
c-0.5 0.666666 -0.541668 1.66667 -0.125 3c0.416664 1.3333 0.583336 2.16663 0.5 2.5c-0.0833359 0.333303 0.291664 1.12497 1.125 2.375l1.5 2.25l1.75 2.125l2 2.25c1.16666 1.33333 3.75 4.20833 7.75 8.625s6.875 7.58333 8.625 9.5s4.33334 5.20833 7.75 9.875
s6.125 8.91667 8.125 12.75c2 3.83333 4.25 8.75 6.75 14.75s4.66666 12.3333 6.5 19c-26.1667 14.8334 -46.7917 33.1667 -61.875 55c-15.0833 21.8333 -22.625 45.25 -22.625 70.25c0 29 10 55.7917 30 80.375c20 24.5833 47.1667 44 81.5 58.25
s71.8333 21.375 112.5 21.375c40.6667 0 78.1667 -7.125 112.5 -21.375s61.5 -33.6667 81.5 -58.25c20 -24.5833 30 -51.375 30 -80.375z" />
<glyph glyph-name="uniF330" unicode="&#xf330;"
d="M384 184v-80c0 -19.8333 -7.04166 -36.7917 -21.125 -50.875s-31.0417 -21.125 -50.875 -21.125h-208c-19.8333 0 -36.7917 7.04167 -50.875 21.125c-14.0833 14.0834 -21.125 31.0417 -21.125 50.875v208c0 19.834 7.04167 36.7923 21.125 50.875
c14.0834 14.0833 31.0417 21.125 50.875 21.125h176c2.33334 0 4.25 -0.75 5.75 -2.25s2.25 -3.41666 2.25 -5.75v-16c0 -2.33334 -0.75 -4.25 -2.25 -5.75s-3.41666 -2.25 -5.75 -2.25h-176c-11 0 -20.4167 -3.91666 -28.25 -11.75s-11.75 -17.25 -11.75 -28.25v-208
c-3.8147e-06 -11 3.91666 -20.4167 11.75 -28.25s17.25 -11.75 28.25 -11.75h208c11 -3.8147e-06 20.4167 3.91666 28.25 11.75s11.75 17.25 11.75 28.25v80c0 2.33333 0.75 4.25 2.25 5.75s3.41666 2.25 5.75 2.25h16c2.33334 0 4.25 -0.75 5.75 -2.25
s2.25 -3.41667 2.25 -5.75zM480 400v-128c0 -4.33334 -1.58334 -8.08334 -4.75 -11.25c-3.16666 -3.16669 -6.91666 -4.75002 -11.25 -4.75c-4.33334 0 -8.08334 1.58334 -11.25 4.75l-44 44l-163 -163c-1.66667 -1.66667 -3.58333 -2.5 -5.75 -2.5
s-4.08333 0.833328 -5.75 2.5l-28.5 28.5c-1.66667 1.66798 -2.5 3.58466 -2.5 5.75c0 2.16803 0.833328 4.0847 2.5 5.75l163 163l-44 44c-3.16666 3.16666 -4.75 6.91666 -4.75 11.25s1.58334 8.08334 4.75 11.25s6.91666 4.75 11.25 4.75h128
c4.33334 0 8.08334 -1.58334 11.25 -4.75s4.75 -6.91666 4.75 -11.25z" />
<glyph glyph-name="uniF342" unicode="&#xf342;"
d="M0 237.177v210.823h210.823v-210.823h-210.823zM30.1172 417.883v-150.589h150.589v150.589h-150.589zM301.177 448h210.823v-210.823h-210.823v210.823zM481.883 267.294v150.589h-150.589v-150.589h150.589zM0 -64v210.823h210.823v-210.823h-210.823zM30.1172 116.706
v-150.589h150.589v150.589h-150.589zM301.177 -64v210.823h210.823v-210.823h-210.823zM331.294 116.706v-150.589h150.589v150.589h-150.589z" />
<glyph glyph-name="uniF31F" unicode="&#xf31f;"
d="M291.147 448l160.617 -159.864v-352.136h-391.529v512h230.912zM301.177 395.535v-98.123h98.5752zM90.3525 -33.8828h331.295v301.177h-150.589v150.589h-180.706v-451.766zM273.581 291.056v108.06h58.3184v-108.06h-58.3184zM289.876 286.768v46.3115h112.349
v-46.3115h-112.349zM320.75 317.642v51.457h44.5967v-51.457h-44.5967z" />
<glyph glyph-name="uniF30B" unicode="&#xf30b;"
d="M421.647 387.765h90.3525v-451.765h-512v451.765h90.3525v30.1182h90.3535v-30.1182h150.588v30.1182h90.3535v-30.1182zM361.412 387.765v-60.2354h30.1172v60.2354h-30.1172zM120.471 387.765v-60.2354h30.1172v60.2354h-30.1172zM481.883 -33.8828v268.68h-451.766
v-268.68h451.766zM30.1172 264.915h451.766v92.7324h-60.2354v-60.2354h-90.3535v60.2354h-150.588v-60.2354h-90.3535v60.2354h-60.2354v-92.7324z" />
<glyph glyph-name="uniF307" unicode="&#xf307;"
d="M512 -48.5801l0.331055 -15.4199h-512.692l0.361328 15.4199c1.89746 81.8604 84.9014 151.673 199.288 169.412v38.6406c-16.6846 14.9082 -28.1895 38.8818 -35.5088 59.1816c-8.94434 4.90918 -16.9863 14.3662 -22.5576 26.8652
c-9.78809 22.0459 -7.40918 43.2783 5.39062 52.3135c-0.511719 6.62598 -0.782227 13.0713 -0.782227 19.2451l-0.0908203 11.1143c-0.391602 34.2734 -0.842773 76.9199 50.7178 81.5283c0 0.150391 1.3252 2.68066 2.31934 4.54785
c7.95117 15.5107 19.8174 32.165 59.3623 33.5811l7.95117 0.150391c56.9521 0 95.6533 -21.1123 108.965 -59.4521c3.70508 -10.6621 0 -20.1191 -3.19238 -28.4609c-3.88477 -9.93945 -8.22168 -21.2334 -5.84277 -41.2012
c0.933594 -7.28809 0.391602 -14.6074 -0.451172 -21.7754c10.6006 -9.21582 13.3721 -28.3408 6.2041 -49.0615c-5.12012 -14.9688 -13.915 -26.1123 -23.9141 -31.1113c-6.89648 -18.8535 -17.4375 -40.96 -32.2559 -55.2061v-41.3818
c112.73 -18.3711 194.5 -88.0029 196.397 -168.93zM31.7441 -33.8828v-0.0292969h448.542c-11.7158 62.3135 -84.9014 114.176 -181.609 126.253l-13.1914 1.65625v82.1006l5.96289 4.51758c10.8125 8.16211 21.8652 27.5576 30.3887 53.248l3.43359 10.3008h10.8428
c-0.151367 0.481445 4.21582 4.96875 7.1377 13.6729c2.13867 6.11426 2.5 11.084 2.25879 14.2158l-13.2822 -1.44531l2.68066 24.2441c0.994141 7.55957 1.92773 14.668 1.20508 20.3301c-3.31348 27.5273 3.28223 44.5439 7.64941 55.8076
c1.14453 2.95117 2.71094 6.9873 2.71094 8.28223c-11.7461 33.5215 -55.417 38.6113 -80.3838 38.6113l-6.83691 -0.121094c-25.2988 -0.933594 -29.2139 -8.49316 -33.7324 -17.2871c-3.73438 -7.22852 -9.96875 -19.3057 -26.3828 -20.751
c-21.7451 -1.95801 -23.7324 -10.7822 -23.2803 -51.1699l0.0898438 -11.4453c0 -9.00488 0.663086 -18.6729 1.92773 -28.6113l2.89062 -22.5586l-15.3594 4.30762c0.241211 -3.10254 1.11426 -7.43945 3.37305 -12.499c3.6748 -8.28223 8.34277 -12.3184 9.93848 -12.8906
l8.85449 -1.53613l2.5 -8.46289c9.00586 -27.2266 20.9922 -47.5557 32.8281 -55.748l6.50586 -4.51758v-80.293l-13.2822 -1.56641c-98.2734 -11.5352 -172.574 -63.5488 -184.38 -126.615z" />
<glyph glyph-name="uniF2F6" unicode="&#xf2f6;"
d="M449.75 274.5c0 -6.6687 -2.33334 -12.3354 -7 -17l-181 -181l-34 -34c-4.66667 -4.66667 -10.3333 -7 -17 -7s-12.3333 2.33333 -17 7l-34 34l-90.5 90.5c-4.66679 4.66733 -7.00012 10.334 -7 17c0 6.6674 2.33334 12.3341 7 17l34 34c4.66666 4.66667 10.3333 7 17 7
s12.3333 -2.33333 17 -7l73.5 -73.75l164 164.25c4.66666 4.66666 10.3333 7 17 7s12.3333 -2.33334 17 -7l34 -34c4.66666 -4.66776 7 -10.3344 7 -17z" />
<glyph glyph-name="uniF32D" unicode="&#xf32d;"
d="M304 104v-56c0 -4.33333 -1.58334 -8.08333 -4.75 -11.25s-6.91666 -4.75 -11.25 -4.75h-64c-4.33333 -1.90735e-06 -8.08333 1.58333 -11.25 4.75s-4.75 6.91667 -4.75 11.25v56c0 4.33334 1.58333 8.08334 4.75 11.25s6.91667 4.75 11.25 4.75h64
c4.33334 0 8.08334 -1.58334 11.25 -4.75s4.75 -6.91666 4.75 -11.25zM311.5 368l-7 -192c-0.166656 -4.33333 -1.875 -8.08333 -5.125 -11.25s-7.04166 -4.75 -11.375 -4.75h-64c-4.33333 0 -8.125 1.58333 -11.375 4.75s-4.95833 6.91667 -5.125 11.25l-7 192
c-0.166672 4.33334 1.29167 8.08334 4.375 11.25s6.79167 4.75 11.125 4.75h80c4.33563 0 8.04398 -1.58334 11.125 -4.75c3.08807 -3.16666 4.54642 -6.91666 4.375 -11.25z" />
<glyph glyph-name="uniF33D" unicode="&#xf33d;"
d="M481.883 161.883c0 -124.567 -101.316 -225.883 -225.883 -225.883s-225.883 101.315 -225.883 225.883c0 105.352 74.5713 198.144 177.333 220.642l6.44531 -29.4248c-89.0273 -19.4863 -153.66 -99.9004 -153.66 -191.217
c0 -107.942 87.8232 -195.766 195.765 -195.766s195.765 87.8232 195.765 195.766c0 91.1953 -64.542 171.61 -153.479 191.187l6.47559 29.4248c102.641 -22.6182 177.122 -115.381 177.122 -220.611zM271.059 448v-301.177h-30.1172v301.177h30.1172z" />
<glyph glyph-name="uniF2F7" unicode="&#xf2f7;"
d="M448 176c-25.3333 39.3333 -57.0833 68.75 -95.25 88.25c10.1667 -17.3333 15.25 -36.0833 15.25 -56.25c0 -30.8333 -10.9583 -57.2083 -32.875 -79.125c-21.9167 -21.9167 -48.2917 -32.875 -79.125 -32.875c-30.8333 0 -57.2083 10.9583 -79.125 32.875
c-21.9167 21.9167 -32.875 48.2917 -32.875 79.125c0 20.1667 5.08333 38.9167 15.25 56.25c-38.1667 -19.5 -69.9167 -48.9167 -95.25 -88.25c22.1667 -34.1667 49.9583 -61.375 83.375 -81.625s69.625 -30.375 108.625 -30.375s75.2083 10.125 108.625 30.375
c33.4167 20.2501 61.2083 47.4584 83.375 81.625zM268 272c0 3.33755 -1.16666 6.1709 -3.5 8.5c-2.33334 2.33334 -5.16666 3.5 -8.5 3.5c-20.8333 0 -38.7083 -7.45834 -53.625 -22.375c-14.9167 -14.9167 -22.375 -32.7917 -22.375 -53.625
c0 -3.33488 1.16667 -6.16821 3.5 -8.5c2.33333 -2.33333 5.16667 -3.5 8.5 -3.5s6.16667 1.16667 8.5 3.5s3.5 5.16667 3.5 8.5c0 14.3333 5.08333 26.5833 15.25 36.75s22.4167 15.25 36.75 15.25c3.33731 0 6.17065 1.16666 8.5 3.5c2.33334 2.3374 3.5 5.17075 3.5 8.5z
M480 176c0 -5.66667 -1.66666 -11.4167 -5 -17.25c-23.3333 -38.3333 -54.7083 -69.0417 -94.125 -92.125s-81.0417 -34.625 -124.875 -34.625c-43.8333 0 -85.4583 11.5833 -124.875 34.75s-70.7917 53.8333 -94.125 92c-3.33334 5.83333 -5 11.5833 -5 17.25
c0 5.66667 1.66667 11.4167 5 17.25c23.3334 38.1667 54.7084 68.8333 94.125 92c39.4167 23.1667 81.0417 34.75 124.875 34.75c43.8333 0 85.4583 -11.5833 124.875 -34.75s70.7917 -53.8333 94.125 -92c3.33334 -5.83333 5 -11.5833 5 -17.25z" />
<glyph glyph-name="uniF344" unicode="&#xf344;"
d="M291.147 448l160.617 -159.864v-352.136h-391.529v512h230.912zM301.177 395.535v-98.123h98.5752zM90.3525 -33.8828h331.295v301.177h-150.589v150.589h-60.2354v-30.1182h-30.1172v30.1182h-90.3535v-451.766zM150.588 207.059h30.1182v-30.1172h-30.1182v30.1172z
M180.706 207.059v30.1182h30.1172v-30.1182h-30.1172zM180.706 267.294v30.1182h30.1172v-30.1182h-30.1172zM150.588 267.294h30.1182v-30.1172h-30.1182v30.1172zM150.588 327.529h30.1182v-30.1172h-30.1182v30.1172zM180.706 327.529v30.1182h30.1172v-30.1182h-30.1172
zM150.588 387.765h30.1182v-30.1172h-30.1182v30.1172zM180.706 165.226c33.2197 0 60.2354 -27.0156 60.2354 -60.2354c0 -9.93848 -2.53027 -19.6064 -7.5293 -28.7324c-9.42676 -17.1973 -26.6543 -28.7627 -46.1104 -30.9004
c-2.95117 -0.391602 -4.72852 -0.602539 -6.5957 -0.602539c-33.2197 0 -60.2354 27.0156 -60.2354 60.2354s27.0156 60.2354 60.2354 60.2354zM206.999 90.6846c2.5293 4.66797 3.82422 9.48633 3.82422 14.2754c0 16.5947 -13.5225 30.1182 -30.1172 30.1182
s-30.1182 -13.5234 -30.1182 -30.1182s13.4932 -30.1172 30.0879 -30.1172l3.37305 0.420898c9.66797 1.05469 18.251 6.83691 22.9502 15.4209z" />
<glyph glyph-name="uniF32E" unicode="&#xf32e;"
d="M256 384c34.8333 0 66.9583 -8.58334 96.375 -25.75c29.4167 -17.1673 52.7083 -40.459 69.875 -69.875c17.1667 -29.4168 25.75 -61.5418 25.75 -96.375c0 -34.8333 -8.58334 -66.9583 -25.75 -96.375c-17.1674 -29.4167 -40.4591 -52.7083 -69.875 -69.875
c-29.4167 -17.1667 -61.5417 -25.75 -96.375 -25.75c-34.8333 0 -66.9583 8.58333 -96.375 25.75c-29.4167 17.1667 -52.7083 40.4583 -69.875 69.875c-17.1667 29.4167 -25.75 61.5417 -25.75 96.375c0 34.8333 8.58334 66.9583 25.75 96.375
s40.4583 52.7083 69.875 69.875s61.5417 25.75 96.375 25.75zM288 72.25v47.5c0 2.3338 -0.75 4.29214 -2.25 5.875c-1.5 1.58334 -3.33334 2.375 -5.5 2.375h-48c-2.16667 0 -4.08333 -0.833336 -5.75 -2.5c-1.66667 -1.66714 -2.5 -3.5838 -2.5 -5.75v-47.5
c0 -2.16693 0.833328 -4.0836 2.5 -5.75c1.66841 -1.66667 3.58508 -2.5 5.75 -2.5h48c2.16666 -3.8147e-06 4 0.791664 5.5 2.375c1.5 1.5836 2.25 3.54193 2.25 5.875zM287.5 158.25l4.5 155.25c0 2 -0.833344 3.5 -2.5 4.5c-1.66666 1.33334 -3.66666 2 -6 2h-55
c-2.33333 0 -4.33333 -0.666656 -6 -2c-1.66667 -1 -2.5 -2.5 -2.5 -4.5l4.25 -155.25c0 -1.66667 0.833328 -3.125 2.5 -4.375s3.66667 -1.875 6 -1.875h46.25c2.33765 0 4.29599 0.625 5.875 1.875c1.58334 1.25 2.45834 2.70833 2.625 4.375z" />
<glyph glyph-name="uniF33E" unicode="&#xf33e;"
d="M304 102v-60c0 -2.66667 -1 -5 -3 -7s-4.33334 -3 -7 -3h-60c-2.66667 0 -5 1 -7 3s-3 4.33333 -3 7v60c0 2.66666 1 5 3 7s4.33333 3 7 3h60c2.66666 0 5 -1 7 -3s3 -4.33334 3 -7zM383 252c0 -9 -1.29166 -17.4167 -3.875 -25.25s-5.5 -14.2083 -8.75 -19.125
s-7.83334 -9.875 -13.75 -14.875c-5.918 -5 -10.7097 -8.625 -14.375 -10.875c-3.66666 -2.25 -8.75 -5.20833 -15.25 -8.875c-6.83334 -3.83333 -12.5417 -9.25 -17.125 -16.25s-6.875 -12.5833 -6.875 -16.75c0 -2.83347 -1 -5.54179 -3 -8.125
c-2 -2.58334 -4.33334 -3.87501 -7 -3.875h-60c-2.5 0 -4.625 1.54167 -6.375 4.625s-2.625 6.20833 -2.625 9.375v11.25c0 13.8333 5.41667 26.875 16.25 39.125s22.75 21.2917 35.75 27.125c9.83334 4.5 16.8333 9.16667 21 14s6.25 11.1667 6.25 19
c0 7 -3.875 13.1667 -11.625 18.5s-16.7083 8 -26.875 8c-10.8333 0 -19.8333 -2.41666 -27 -7.25c-5.83333 -4.16666 -14.75 -13.75 -26.75 -28.75c-2.16667 -2.66667 -4.75 -4 -7.75 -4c-2 0 -4.08333 0.666672 -6.25 2l-41 31.25
c-2.16667 1.66666 -3.45833 3.75 -3.875 6.25s0.0416718 4.83334 1.375 7c26.6668 44.3333 65.3334 66.5 116 66.5c13.3333 0 26.75 -2.58334 40.25 -7.75c13.5 -5.16699 25.6667 -12.0836 36.5 -20.75c10.8347 -8.66666 19.6681 -19.2917 26.5 -31.875
c6.83334 -12.5833 10.25 -25.7917 10.25 -39.625z" />
<glyph glyph-name="uniF343" unicode="&#xf343;"
d="M150.588 448h361.412v-120.471h-361.412v120.471zM481.883 357.647v60.2354h-301.177v-60.2354h301.177zM150.588 146.823v120.471h361.412v-120.471h-361.412zM180.706 237.177v-60.2354h301.177v60.2354h-301.177zM150.588 -33.8828v120.471h361.412v-120.471h-361.412
zM180.706 56.4707v-60.2354h301.177v60.2354h-301.177zM0 327.529v120.471h120.471v-120.471h-120.471zM30.1172 417.883v-60.2354h60.2354v60.2354h-60.2354zM0 146.823v120.471h120.471v-120.471h-120.471zM30.1172 237.177v-60.2354h60.2354v60.2354h-60.2354z
M0 -33.8828v120.471h120.471v-120.471h-120.471zM30.1172 56.4707v-60.2354h60.2354v60.2354h-60.2354z" />
<glyph glyph-name="uniF33C" unicode="&#xf33c;"
d="M431 69.75c0 -19.5 -6.58334 -35.8333 -19.75 -49c-13.1667 -13.1667 -29.5 -19.75 -49 -19.75c-22.5 0 -42.0833 8.33333 -58.75 25l-194.25 194c-18.8333 19.1667 -28.25 41.75 -28.25 67.75c0 26.5 9.16666 49 27.5 67.5s40.75 27.75 67.25 27.75
c26.3333 0 49.0833 -9.41666 68.25 -28.25l151.25 -151.5c1.66666 -1.66667 2.5 -3.5 2.5 -5.5c0 -2.66667 -2.54166 -6.54167 -7.625 -11.625s-8.95834 -7.625 -11.625 -7.625c-2.17239 0 -4.08905 0.833328 -5.75 2.5l-151.5 151.75
c-13.1667 12.8333 -28.25 19.25 -45.25 19.25c-17.6667 0 -32.5833 -6.25 -44.75 -18.75c-12.1667 -12.5 -18.25 -27.5833 -18.25 -45.25c0 -17.5 6.33334 -32.5833 19 -45.25l194 -194.25c10.5 -10.5 22.5833 -15.75 36.25 -15.75c10.6667 0 19.5 3.5 26.5 10.5
s10.5 15.8333 10.5 26.5c0 13.6667 -5.25 25.75 -15.75 36.25l-145.25 145.25c-4.33333 4 -9.33333 6 -15 6c-4.83333 0 -8.83333 -1.58333 -12 -4.75s-4.75 -7.16667 -4.75 -12c0 -5.33333 2.08333 -10.25 6.25 -14.75l102.5 -102.5c1.66666 -1.66666 2.5 -3.5 2.5 -5.5
c0 -2.66689 -2.58334 -6.58355 -7.75 -11.75c-5.16898 -5.16666 -9.08563 -7.75 -11.75 -7.75c-2 0 -3.83334 0.833336 -5.5 2.5l-102.5 102.5c-10.5 10.1671 -15.75 22.5838 -15.75 37.25c0 13.6667 4.75 25.25 14.25 34.75s21.0833 14.25 34.75 14.25
c14.6671 0 27.0838 -5.25 37.25 -15.75l145.25 -145.25c16.6667 -16.3333 25 -35.9167 25 -58.75z" />
<glyph glyph-name="uniF31E" unicode="&#xf31e;"
d="M430.1 256c17.7002 0 18.6006 -7 17.7002 -18.2002l-12.0996 -185.3c-1 -11.2998 -3.10059 -20.5 -21.1006 -20.5h-316.199c-17.6006 0 -20.2002 9.2998 -21.1006 20.5l-13 183c-1 11.2998 -0.0996094 20.5 17.6006 20.5h348.199zM426.2 304.7l1.59961 -32.7002h-343.399
c0.5 6.2002 4 46.7002 5.5 63.4004c1.59961 18.0996 7.7998 16.5996 25.1992 16.5996h75.3008c28.2998 0 22.8994 0.200195 36.5996 -14.5996c16.5 -17.7002 19.0996 -17.4004 40.9004 -17.4004h143.199c10.6006 0 14.6006 -2.90039 15.1006 -15.2998z" />
<glyph glyph-name="uniF318" unicode="&#xf318;"
d="M288 0c-8.83203 0 -16 7.16797 -16 16v192c0 8.83203 7.16797 16 16 16s16 -7.16797 16 -16v-192c0 -8.83203 -7.16797 -16 -16 -16zM384 384c17.6797 0 32 -14.3203 32 -32v-32c0 -17.6641 -14.3203 -32 -32 -32v-288c0 -35.3438 -28.6562 -64 -64 -64h-224
c-35.3438 0 -64 28.6562 -64 64v288c-17.6797 0 -32 14.3359 -32 32v32c0 17.6797 14.3203 32 32 32h96v32c0 17.6797 14.3203 32 32 32h96c17.6797 0 32 -14.3203 32 -32v-32h96zM160 400v-16h96v16c0 8.83203 -7.16797 16 -16 16h-64c-8.83203 0 -16 -7.16797 -16 -16z
M352 0v288h-288v-288c0 -17.6641 14.3203 -32 32 -32h224c17.6797 0 32 14.3359 32 32zM368 320c8.83203 0 16 7.16797 16 16s-7.16797 16 -16 16h-320c-8.83203 0 -16 -7.16797 -16 -16s7.16797 -16 16 -16h320zM128 0c-8.83203 0 -16 7.16797 -16 16v192
c0 8.83203 7.16797 16 16 16s16 -7.16797 16 -16v-192c0 -8.83203 -7.16797 -16 -16 -16zM208 0c-8.83203 0 -16 7.16797 -16 16v192c0 8.83203 7.16797 16 16 16s16 -7.16797 16 -16v-192c0 -8.83203 -7.16797 -16 -16 -16z" />
<glyph glyph-name="uniF331" unicode="&#xf331;"
d="M180.706 440.019l331.294 -64.8125v-353.461l-0.210938 0.0605469c-1.05371 -47.4658 -39.8154 -85.8057 -87.5518 -85.8057c-48.3994 0 -87.7627 39.3936 -87.7627 87.7627s39.3633 87.7627 87.7627 87.7627c22.166 0 42.1943 -8.52344 57.6455 -22.1064v140.529
l-271.06 53.0371v-183.537c0.0302734 -1.02344 0.271484 -1.95703 0.271484 -3.04199c0 -1.08398 -0.271484 -2.04785 -0.301758 -3.07129v-0.180664v0c-1.74609 -46.8633 -40.1465 -84.541 -87.4307 -84.541c-48.3994 0 -87.7637 39.3945 -87.7637 87.7637
c0 48.3682 39.3643 87.7627 87.7637 87.7627c22.0156 0 41.9229 -8.43359 57.3438 -21.8662v277.745zM123.362 38.7314c30.75 0 55.7168 24.2441 57.3438 54.6035v6.11328c-1.62695 30.3291 -26.5938 54.5732 -57.3438 54.5732
c-31.8047 0 -57.6455 -25.8408 -57.6455 -57.6445c0 -31.8047 25.8408 -57.6455 57.6455 -57.6455zM210.823 313.646l271.06 -53.0078v89.751l-271.06 53.0674v-89.8105zM424.237 -33.8828c31.8037 0 57.6455 25.8418 57.6455 57.6455
c0 31.8047 -25.8418 57.6455 -57.6455 57.6455c-31.8047 0 -57.6455 -25.8408 -57.6455 -57.6455c0 -31.8037 25.8408 -57.6455 57.6455 -57.6455z" />
<glyph glyph-name="uniF303" unicode="&#xf303;"
d="M384 144c0 -4.33333 -1.58334 -8.08333 -4.75 -11.25l-112 -112c-3.16666 -3.16667 -6.91666 -4.75 -11.25 -4.75c-4.33333 0 -8.08333 1.58333 -11.25 4.75l-112 112c-3.16667 3.16667 -4.75 6.91667 -4.75 11.25c-7.62939e-06 4.33333 1.58333 8.08333 4.75 11.25
s6.91667 4.75 11.25 4.75h224c4.33334 0 8.08334 -1.58333 11.25 -4.75s4.75 -6.91667 4.75 -11.25zM384 240c0 -4.33333 -1.58334 -8.08333 -4.75 -11.25s-6.91666 -4.75 -11.25 -4.75h-224c-4.33333 0 -8.08333 1.58333 -11.25 4.75s-4.75 6.91667 -4.75 11.25
c-7.62939e-06 4.33333 1.58333 8.08333 4.75 11.25l112 112c3.16667 3.16666 6.91667 4.75 11.25 4.75c4.33334 0 8.08334 -1.58334 11.25 -4.75l112 -112c3.16666 -3.16667 4.75 -6.91667 4.75 -11.25z" />
<glyph glyph-name="uniF2FF" unicode="&#xf2ff;"
d="M467.697 361.954c17.6182 -17.6191 17.6182 -46.291 -0.0302734 -63.8799l-272.716 -272.745l-158.057 -53.1582l51.8623 159.263l272.775 272.806c17.0771 17.0459 46.8936 17.0459 63.9092 0zM93.1836 47.6162l18.5527 -18.5527l59.1211 19.8779l-58.2471 58.2773z
M131.162 131.223l63.5488 -63.5781l165.466 165.466l-63.5781 63.5488zM317.892 317.982l63.5781 -63.5488l21.9561 21.9561l-63.5781 63.5479zM446.403 319.367c5.87305 5.87305 5.87305 15.3906 -0.0292969 21.2939l-42.2559 42.2852
c-5.69141 5.69141 -15.6006 5.69141 -21.293 0l-21.6846 -21.7148l63.5781 -63.5488z" />
<glyph glyph-name="uniF339" unicode="&#xf339;"
d="M320 72v40c0 2.33334 -0.75 4.25 -2.25 5.75s-3.41666 2.25 -5.75 2.25h-24v128c0 2.33333 -0.75 4.25 -2.25 5.75s-3.41666 2.25 -5.75 2.25h-80c-2.33333 0 -4.25 -0.75 -5.75 -2.25s-2.25 -3.41667 -2.25 -5.75v-40c0 -2.33333 0.75 -4.25 2.25 -5.75
s3.41667 -2.25 5.75 -2.25h24v-80h-24c-2.33333 0 -4.25 -0.75 -5.75 -2.25s-2.25 -3.41666 -2.25 -5.75v-40c0 -2.33334 0.75 -4.25 2.25 -5.75s3.41667 -2.25 5.75 -2.25h112c2.33334 0 4.25 0.75 5.75 2.25s2.25 3.41666 2.25 5.75zM288 296v40
c0 2.33334 -0.75 4.25 -2.25 5.75s-3.41666 2.25 -5.75 2.25h-48c-2.33333 0 -4.25 -0.75 -5.75 -2.25s-2.25 -3.41666 -2.25 -5.75v-40c0 -2.33334 0.75 -4.25 2.25 -5.75s3.41667 -2.25 5.75 -2.25h48c2.33334 0 4.25 0.75 5.75 2.25s2.25 3.41666 2.25 5.75zM448 192
c0 -34.8333 -8.58334 -66.9583 -25.75 -96.375c-17.1674 -29.4167 -40.4591 -52.7083 -69.875 -69.875c-29.4167 -17.1667 -61.5417 -25.75 -96.375 -25.75c-34.8333 0 -66.9583 8.58333 -96.375 25.75c-29.4167 17.1667 -52.7083 40.4583 -69.875 69.875
c-17.1667 29.4167 -25.75 61.5417 -25.75 96.375c0 34.8333 8.58334 66.9583 25.75 96.375s40.4583 52.7083 69.875 69.875s61.5417 25.75 96.375 25.75c34.8333 0 66.9583 -8.58334 96.375 -25.75c29.4167 -17.1673 52.7083 -40.459 69.875 -69.875
c17.1667 -29.4168 25.75 -61.5418 25.75 -96.375z" />
<glyph glyph-name="uniF317" unicode="&#xf317;"
d="M351.25 135.5c0 4.33333 -1.58334 8.08333 -4.75 11.25l-45.25 45.25l45.25 45.25c3.16666 3.16667 4.75 6.91667 4.75 11.25c0 4.5 -1.58334 8.33334 -4.75 11.5l-22.5 22.5c-3.16666 3.16666 -7 4.75 -11.5 4.75c-4.33334 0 -8.08334 -1.58334 -11.25 -4.75
l-45.25 -45.25l-45.25 45.25c-3.16667 3.16666 -6.91667 4.75 -11.25 4.75c-4.5 0 -8.33333 -1.58334 -11.5 -4.75l-22.5 -22.5c-3.16667 -3.16763 -4.75 -7.00096 -4.75 -11.5c0 -4.33333 1.58333 -8.08333 4.75 -11.25l45.25 -45.25l-45.25 -45.25
c-3.16667 -3.16667 -4.75 -6.91667 -4.75 -11.25c0 -4.5 1.58333 -8.33334 4.75 -11.5l22.5 -22.5c3.16667 -3.16666 7 -4.75 11.5 -4.75c4.33333 0 8.08333 1.58334 11.25 4.75l45.25 45.25l45.25 -45.25c3.16666 -3.16666 6.91666 -4.75 11.25 -4.75
c4.5 0 8.33334 1.58334 11.5 4.75l22.5 22.5c3.16666 3.16666 4.75 7 4.75 11.5zM448 192c0 -34.8333 -8.58334 -66.9583 -25.75 -96.375c-17.1674 -29.4167 -40.4591 -52.7083 -69.875 -69.875c-29.4167 -17.1667 -61.5417 -25.75 -96.375 -25.75
c-34.8333 0 -66.9583 8.58333 -96.375 25.75c-29.4167 17.1667 -52.7083 40.4583 -69.875 69.875c-17.1667 29.4167 -25.75 61.5417 -25.75 96.375c0 34.8333 8.58334 66.9583 25.75 96.375s40.4583 52.7083 69.875 69.875s61.5417 25.75 96.375 25.75
c34.8333 0 66.9583 -8.58334 96.375 -25.75c29.4167 -17.1673 52.7083 -40.459 69.875 -69.875c17.1667 -29.4168 25.75 -61.5418 25.75 -96.375z" />
<glyph glyph-name="uniF336" unicode="&#xf336;"
d="M340.8 349.6c-38.2002 0 -71 -23.5 -84.7002 -56.7998c-13.8994 33.4004 -46.5996 56.7998 -84.7998 56.7998c-50.7998 0 -91.8994 -41.2998 -91.8994 -92.2998c0 -24.7998 9.7998 -47.2998 25.5996 -63.8994l151 -152.5l148.4 149.8
c17.3994 16.7998 28.2998 40.3994 28.2998 66.5996c0 51 -41.2002 92.2998 -91.9004 92.2998zM340.8 365v0c59.1006 0 107.2 -48.2998 107.2 -107.7c0 -29.5996 -11.7998 -57.2002 -32.7998 -77.5l-148.3 -149.8l-10.9004 -11l-10.9004 11l-151.199 152.7
c-19.3008 20.2002 -29.9004 46.7002 -29.9004 74.5996c0 59.4004 48.0996 107.7 107.2 107.7c33.7998 0 64.7998 -15.7998 84.7998 -41.7998c20 26 51 41.7998 84.7998 41.7998z" />
<glyph glyph-name="uniF312" unicode="&#xf312;"
d="M368 176v32c0 4.33333 -1.58334 8.08333 -4.75 11.25s-6.91666 4.75 -11.25 4.75h-64v64c0 4.33334 -1.58334 8.08334 -4.75 11.25s-6.91666 4.75 -11.25 4.75h-32c-4.33333 0 -8.08333 -1.58334 -11.25 -4.75s-4.75 -6.91666 -4.75 -11.25v-64h-64
c-4.33333 0 -8.08333 -1.58333 -11.25 -4.75s-4.75 -6.91667 -4.75 -11.25v-32c0 -4.33333 1.58333 -8.08333 4.75 -11.25s6.91667 -4.75 11.25 -4.75h64v-64c0 -4.33334 1.58333 -8.08334 4.75 -11.25s6.91667 -4.75 11.25 -4.75h32c4.33334 0 8.08334 1.58334 11.25 4.75
s4.75 6.91666 4.75 11.25v64h64c4.33334 0 8.08334 1.58333 11.25 4.75s4.75 6.91667 4.75 11.25zM448 192c0 -34.8333 -8.58334 -66.9583 -25.75 -96.375c-17.1674 -29.4167 -40.4591 -52.7083 -69.875 -69.875c-29.4167 -17.1667 -61.5417 -25.75 -96.375 -25.75
c-34.8333 0 -66.9583 8.58333 -96.375 25.75c-29.4167 17.1667 -52.7083 40.4583 -69.875 69.875c-17.1667 29.4167 -25.75 61.5417 -25.75 96.375c0 34.8333 8.58334 66.9583 25.75 96.375s40.4583 52.7083 69.875 69.875s61.5417 25.75 96.375 25.75
c34.8333 0 66.9583 -8.58334 96.375 -25.75c29.4167 -17.1673 52.7083 -40.459 69.875 -69.875c17.1667 -29.4168 25.75 -61.5418 25.75 -96.375z" />
<glyph glyph-name="uniF333" unicode="&#xf333;"
d="M351.383 448l160.617 -159.864v-352.136h-376.471v30.1172h346.354v301.177h-150.589v150.589h-210.342v-29.6367h14.126c24.9072 0 45.1758 -20.2686 45.1758 -45.1758v-258.561l-74.21 -149.354l-75.9268 149.264v258.65c0 24.9072 20.2695 45.1758 45.1768 45.1758
h15.541v59.7539h260.548zM117.7 26.293l32.4062 65.2646v176.219h-29.6357v-181.52h-30.1182v181.52h-30.1172v-176.128l33.25 -65.3555h24.2148zM150.106 343.07c0 8.28223 -6.74609 15.0586 -15.0586 15.0586h-59.7539c-8.28223 0 -15.0586 -6.77637 -15.0586 -15.0586
v-45.1768h89.8711v45.1768zM361.412 395.535v-98.123h98.5742z" />
<glyph glyph-name="uniF328" unicode="&#xf328;"
d="M392 192.75c0 26.8333 -7.25 51.4167 -21.75 73.75l-188.5 -188.25c22.8333 -14.8333 47.5833 -22.25 74.25 -22.25c18.5 0 36.125 3.625 52.875 10.875s31.2083 16.9583 43.375 29.125s21.8333 26.7083 29 43.625c7.16666 16.9167 10.75 34.625 10.75 53.125z
M142.25 118l188.75 188.5c-22.5 15.1667 -47.5 22.75 -75 22.75c-24.6667 0 -47.4167 -6.08334 -68.25 -18.25s-37.3333 -28.75 -49.5 -49.75c-12.1667 -21 -18.25 -43.8333 -18.25 -68.5c0 -27 7.41666 -51.9167 22.25 -74.75zM448 192.75
c0 -26.1667 -5.08334 -51.1667 -15.25 -75c-10.1667 -23.8333 -23.7917 -44.3333 -40.875 -61.5c-17.0833 -17.1667 -37.5 -30.8333 -61.25 -41c-23.75 -10.1667 -48.625 -15.25 -74.625 -15.25c-26 -4.76837e-07 -50.875 5.08333 -74.625 15.25
c-23.75 10.1667 -44.1667 23.8333 -61.25 41c-17.0833 17.1667 -30.7083 37.6667 -40.875 61.5c-10.1667 23.8333 -15.25 48.8333 -15.25 75c0 26.1667 5.08334 51.125 15.25 74.875s23.7917 44.2083 40.875 61.375c17.0833 17.1667 37.5 30.8333 61.25 41
s48.625 15.25 74.625 15.25s50.875 -5.08334 74.625 -15.25c23.75 -10.1668 44.1667 -23.8335 61.25 -41c17.0833 -17.1667 30.7083 -37.625 40.875 -61.375s15.25 -48.7083 15.25 -74.875z" />
<glyph glyph-name="uniF335" unicode="&#xf335;"
d="M376.38 448l135.62 -125.952v-295.695h-151.101v30.1182h120.983v240.941h-120.471v120.471h-150.589v-30.4189h-30.1172v60.5361h195.674zM391.529 392.824v-65.2949h70.3252zM0 357.647h195.675l135.619 -125.952v-295.695h-331.294v421.647zM210.823 302.472v-65.2949
h70.3252zM30.1172 -33.8828h271.06v240.941h-120.471v120.471h-150.589v-361.412z" />
<glyph glyph-name="uniF2FB" unicode="&#xf2fb;"
d="M512 207.059c0 -66.4395 -54.0312 -120.471 -120.471 -120.471c-36.0508 0 -69.5713 16.0225 -92.582 43.7314l-0.0595703 -0.0302734l-0.421875 0.541992c-0.331055 0.421875 -0.783203 0.692383 -1.14453 1.14453l0.120117 0.0898438l-109.447 134.987
c-17.1367 19.2754 -41.7432 30.3594 -67.5234 30.3594c-49.8145 0 -90.3535 -40.5391 -90.3535 -90.3535s40.5391 -90.3525 90.3535 -90.3525c27.5576 0 53.2783 12.3477 70.5352 33.8818l0.271484 -0.210938l24.6055 30.4795l23.4316 -18.9141l-24.7861 -30.6895
l-0.301758 0.240234c-22.9795 -28.5205 -57.1328 -44.9053 -93.7559 -44.9053c-66.4395 0 -120.471 54.0312 -120.471 120.471s54.0312 120.471 120.471 120.471c33.7314 0 65.8369 -14.3662 88.6357 -39.1826l0.241211 0.180664l1.26465 -1.56641l111.375 -137.337
c17.2578 -20.8711 42.4365 -32.918 69.542 -32.918c49.8145 0 90.3535 40.5381 90.3535 90.3525s-40.5391 90.3535 -90.3535 90.3535c-25.4795 0 -49.6943 -10.9033 -66.8613 -29.7871l-28.5518 -35.3877l-23.4307 18.9141l28.5508 35.3877l-0.120117 0.0908203
c22.8896 25.9912 55.8682 40.8994 90.4131 40.8994c66.4395 0 120.471 -54.0312 120.471 -120.471z" />
<glyph glyph-name="uniF329" unicode="&#xf329;"
d="M384 312.471c70.5654 0 128 -57.4346 128 -128s-57.4346 -128 -128 -128h-286.117c-53.9717 0 -97.8828 43.9111 -97.8828 97.8818c0 55.0254 46.6826 100.051 100.984 97.8223c21.4736 54.5732 73.2158 90.4131 132.428 90.4131
c37.165 0 72.8848 -14.8779 99.6592 -41.1709c16.4141 7.34863 33.5205 11.0537 50.9287 11.0537zM384 86.5879c53.9707 0 97.8828 43.9121 97.8828 97.8828s-43.9121 97.8818 -97.8828 97.8818c-16.0527 0 -31.834 -4.24609 -46.9834 -12.5889l-10.6621 -5.87305
l-7.98047 9.21582c-21.6553 24.998 -52.6465 39.3643 -84.9619 39.3643c-50.0254 0 -93.3047 -32.5273 -107.701 -80.9561l-3.79492 -12.71l-13.1006 2.16895c-3.58398 0.571289 -7.16797 1.14355 -10.9326 1.14355c-37.376 0 -67.7656 -30.3887 -67.7656 -67.7646
s30.3896 -67.7646 67.7656 -67.7646h286.117z" />
<glyph glyph-name="uniF338" unicode="&#xf338;"
d="M320 80v-32c0 -4.33301 -1.58301 -8.08301 -4.75 -11.25s-6.91699 -4.75 -11.25 -4.75h-128c-4.33301 0 -8.08301 1.58301 -11.25 4.75s-4.75 6.91699 -4.75 11.25v32c0 4.33301 1.58301 8.08301 4.75 11.25s6.91699 4.75 11.25 4.75h16v96h-16
c-4.33301 0 -8.08301 1.58301 -11.25 4.75s-4.75 6.91699 -4.75 11.25v32c0 4.33301 1.58301 8.08301 4.75 11.25s6.91699 4.75 11.25 4.75h96c4.33301 0 8.08301 -1.58301 11.25 -4.75s4.75 -6.91699 4.75 -11.25v-144h16c4.33301 0 8.08301 -1.58301 11.25 -4.75
s4.75 -6.91699 4.75 -11.25zM288 368v-48c0 -4.33301 -1.58301 -8.08301 -4.75 -11.25s-6.91699 -4.75 -11.25 -4.75h-64c-4.33301 0 -8.08301 1.58301 -11.25 4.75s-4.75 6.91699 -4.75 11.25v48c0 4.33301 1.58301 8.08301 4.75 11.25s6.91699 4.75 11.25 4.75h64
c4.33301 0 8.08301 -1.58301 11.25 -4.75s4.75 -6.91699 4.75 -11.25z" />
<glyph glyph-name="uniF33B" unicode="&#xf33b;"
d="M368 176v32c0 4.33333 -1.58334 8.08333 -4.75 11.25s-6.91666 4.75 -11.25 4.75h-192c-4.33333 0 -8.08333 -1.58333 -11.25 -4.75s-4.75 -6.91667 -4.75 -11.25v-32c0 -4.33333 1.58333 -8.08333 4.75 -11.25s6.91667 -4.75 11.25 -4.75h192
c4.33334 0 8.08334 1.58333 11.25 4.75s4.75 6.91667 4.75 11.25zM448 192c0 -34.8333 -8.58334 -66.9583 -25.75 -96.375c-17.1674 -29.4167 -40.4591 -52.7083 -69.875 -69.875c-29.4167 -17.1667 -61.5417 -25.75 -96.375 -25.75
c-34.8333 0 -66.9583 8.58333 -96.375 25.75c-29.4167 17.1667 -52.7083 40.4583 -69.875 69.875c-17.1667 29.4167 -25.75 61.5417 -25.75 96.375c0 34.8333 8.58334 66.9583 25.75 96.375s40.4583 52.7083 69.875 69.875s61.5417 25.75 96.375 25.75
c34.8333 0 66.9583 -8.58334 96.375 -25.75c29.4167 -17.1673 52.7083 -40.459 69.875 -69.875c17.1667 -29.4168 25.75 -61.5418 25.75 -96.375z" />
<glyph glyph-name="uniF341" unicode="&#xf341;"
d="M512 244.706c0 -70.5654 -57.4043 -128 -128 -128h-83.0342v30.1172h83.0342c53.9707 0 97.8828 43.9121 97.8828 97.8828s-43.9121 97.8818 -97.8828 97.8818c-16.0225 0 -31.834 -4.24609 -46.9834 -12.5586l-10.6621 -5.87305l-7.98047 9.21582
c-21.6553 24.9678 -52.6465 39.334 -84.9619 39.334c-50.0254 0 -93.335 -32.5273 -107.701 -80.9561l-3.79492 -12.71l-13.1006 2.16797c-3.58398 0.572266 -7.16797 1.14453 -10.9326 1.14453c-37.3467 0 -67.7656 -30.3887 -67.7656 -67.7646
s30.4189 -67.7646 67.7656 -67.7646h111.404v-30.1172h-111.404c-53.9717 0 -97.8828 43.9111 -97.8828 97.8818c0 54.9951 46.0498 100.442 100.984 97.8223c21.4736 54.5732 73.2158 90.4131 132.428 90.4131c37.165 0 72.8848 -14.8779 99.6592 -41.1709
c16.4443 7.34863 33.5205 11.0537 50.9287 11.0537c70.5957 0 128 -57.4346 128 -128zM320.633 181.338l-49.5742 49.6045v-234.707h-30.1172v234.707l-49.6035 -49.5742l-21.2939 21.2939l85.9561 85.9248l85.9258 -85.9551z" />
<glyph glyph-name="uniF32F" unicode="&#xf32f;"
d="M288 72.25v47.5c0 2.3338 -0.791656 4.29214 -2.375 5.875c-1.58334 1.58334 -3.45834 2.375 -5.625 2.375h-48c-2.16667 0 -4.04167 -0.791664 -5.625 -2.375s-2.375 -3.54166 -2.375 -5.875v-47.5c0 -2.33334 0.791672 -4.29166 2.375 -5.875
s3.45833 -2.375 5.625 -2.375h48c2.16666 -3.8147e-06 4.04166 0.791664 5.625 2.375c1.58334 1.5836 2.375 3.54193 2.375 5.875zM287.5 165.75l4.5 114.75c0 2 -0.833344 3.58334 -2.5 4.75c-2.16666 1.83334 -4.16666 2.75 -6 2.75h-55
c-1.83333 0 -3.83333 -0.916656 -6 -2.75c-1.66667 -1.16666 -2.5 -2.91666 -2.5 -5.25l4.25 -114.25c0 -1.66667 0.833328 -3.04167 2.5 -4.125s3.66667 -1.625 6 -1.625h46.25c2.33765 0 4.29599 0.541672 5.875 1.625c1.58334 1.08333 2.45834 2.45833 2.625 4.125z
M284 399.25l192 -352c5.83331 -10.5 5.66666 -21 -0.5 -31.5c-2.83334 -4.83333 -6.70834 -8.66667 -11.625 -11.5c-4.91754 -2.83333 -10.2092 -4.25 -15.875 -4.25h-384c-5.66667 0 -10.9583 1.41667 -15.875 4.25c-4.91667 2.83333 -8.79167 6.66667 -11.625 11.5
c-6.16678 10.5 -6.33345 21 -0.5 31.5l192 352c2.83333 5.16666 6.75 9.25 11.75 12.25s10.4167 4.5 16.25 4.5c5.83334 0 11.25 -1.5 16.25 -4.5s8.91666 -7.08334 11.75 -12.25z" />
<glyph glyph-name="uniF340" unicode="&#xf340;"
d="M256 268.138c41.502 0 75.2939 -33.792 75.2939 -75.2939c0 -41.5029 -33.792 -75.2949 -75.2939 -75.2949s-75.2939 33.792 -75.2939 75.2949c0 41.502 33.792 75.2939 75.2939 75.2939zM256 147.667c24.9072 0 45.1768 20.2686 45.1768 45.1768
c0 24.9072 -20.2695 45.1758 -45.1768 45.1758s-45.1768 -20.2686 -45.1768 -45.1758c0 -24.9082 20.2695 -45.1768 45.1768 -45.1768zM510.193 163.509l-77.9453 -23.3711c-3.61328 -12.1074 -8.37207 -23.7334 -14.2754 -34.6357l38.4902 -71.5596
c-12.2275 -15.3896 -26.1719 -29.334 -41.5625 -41.5928l-71.5596 38.5205c-10.9023 -5.90234 -22.5273 -10.6611 -34.6348 -14.2754l-23.3711 -77.9443c-9.6377 -1.11426 -19.4258 -1.80664 -29.335 -1.80664c-9.9082 0 -19.667 0.692383 -29.335 1.80664l-23.3711 77.9443
c-12.1074 3.61426 -23.7324 8.37305 -34.6348 14.2754l-71.5898 -38.5205c-15.3906 12.2285 -29.335 26.1729 -41.5625 41.5625l38.5205 71.5596c-5.90332 10.9033 -10.6621 22.5283 -14.2754 34.666l-77.9453 23.3711c-1.11426 9.6377 -1.80664 19.3955 -1.80664 29.335
c0 9.93848 0.692383 19.6963 1.80664 29.334l77.9746 23.4316c3.61426 12.1074 8.37305 23.7324 14.2764 34.6357l-38.5205 71.5293c12.1973 15.3896 26.1416 29.334 41.5322 41.5625l71.5898 -38.5508c10.8721 5.93262 22.4971 10.7217 34.6348 14.3057l23.3711 77.9443
c9.6377 1.11426 19.3965 1.80762 29.335 1.80762s19.6973 -0.693359 29.335 -1.80762l23.3711 -77.9443c12.1074 -3.61426 23.7021 -8.37305 34.6348 -14.2754l71.5898 38.5498c15.3906 -12.2578 29.335 -26.2021 41.5625 -41.5615l-38.5205 -71.5898
c5.90332 -10.9023 10.6914 -22.498 14.2754 -34.6055l77.9453 -23.4316c1.11426 -9.66797 1.80664 -19.4258 1.80664 -29.334c0 -9.90918 -0.692383 -19.667 -1.80664 -29.335zM408.034 164.322l73.7275 22.1064c0.0908203 2.16797 0.121094 4.30664 0.121094 6.41504
c0 2.10742 -0.0302734 4.24609 -0.0605469 6.41504l-58.1875 17.498l-15.6006 4.66797l-4.63867 15.6016c-3.01172 10.0889 -6.9873 19.7871 -11.8965 28.8223l-7.74023 14.3057l7.68066 14.3057l28.7021 53.3086c-2.98242 3.16211 -6.08398 6.23438 -9.2168 9.21582
l-67.584 -36.3818l-14.3057 7.67969c-9.06543 4.90918 -18.8232 8.91504 -28.9131 11.9268l-15.6006 4.6377l-4.66797 15.6016l-17.4385 58.1875c-2.16895 0.0595703 -4.30664 0.0898438 -6.41504 0.0898438s-4.24609 -0.0302734 -6.44531 -0.0605469l-17.4375 -58.1865
l-4.66895 -15.6016l-15.6006 -4.6377c-10.1494 -3.01172 -19.8477 -7.01758 -28.793 -11.8965l-14.3359 -7.80078l-67.6738 36.4424c-3.13281 -2.98145 -6.2041 -6.08398 -9.18652 -9.21582l36.3828 -67.6143l-7.70996 -14.3057
c-4.90918 -9.00488 -8.91504 -18.7334 -11.9268 -28.8828l-4.63867 -15.6006l-73.7275 -22.1064c-0.0908203 -2.16895 -0.121094 -4.30762 -0.121094 -6.41504c0 -2.07812 0.0302734 -4.2168 0.121094 -6.38574l73.7578 -22.1064l4.6084 -15.5703
c3.04199 -10.1494 7.04688 -19.8779 11.9268 -28.9131l7.70996 -14.3057l-36.3828 -67.584c2.98242 -3.16211 6.08398 -6.23438 9.2168 -9.21582l67.6133 36.3516l14.3066 -7.70996c9.03516 -4.90918 18.7627 -8.91504 28.8828 -11.9268l15.6006 -4.6377l4.66797 -15.6016
l17.4385 -58.1865c2.16895 -0.0605469 4.30664 -0.0908203 6.41504 -0.0908203s4.24707 0.0302734 6.41504 0.0908203l17.4385 58.1865l4.66797 15.6016l15.6006 4.6377c10.1201 3.04199 19.8477 7.01758 28.9131 11.9268l14.3057 7.70996l67.5547 -36.4121
c3.16211 2.98145 6.23438 6.05371 9.21582 9.21582l-28.6719 53.3086l-7.68066 14.3057l7.70996 14.3057c4.90918 9.00586 8.91504 18.7334 11.9268 28.8828z" />
<glyph glyph-name="uniF332" unicode="&#xf332;"
d="M30.1172 417.883h451.766v-451.766h-451.766v451.766zM451.765 -3.76465v60.2354h-391.529v-60.2354h391.529zM60.2354 86.5879h391.529v301.177h-391.529v-301.177zM427.761 141.854l-20.9922 -21.5947l-72.7939 70.7461l-46.8027 -50.4766l-74.873 132.969
l-102.43 -149.835l-24.877 16.9863l129.807 189.831l78.4268 -139.203l39.665 42.8271z" />
<glyph glyph-name="uniF316" unicode="&#xf316;"
d="M404.5 85.5c0 -6.66674 -2.33334 -12.3334 -7 -17l-34 -34c-4.66803 -4.66667 -10.3347 -7 -17 -7c-6.66925 0 -12.3359 2.33333 -17 7l-73.5 73.5l-73.5 -73.5c-4.66667 -4.66667 -10.3333 -7 -17 -7s-12.3333 2.33333 -17 7l-34 34c-4.66666 4.66666 -7 10.3333 -7 17
s2.33334 12.3333 7 17l73.5 73.5l-73.5 73.5c-4.66666 4.66667 -7 10.3333 -7 17s2.33334 12.3333 7 17l34 34c4.66696 4.66666 10.3336 7 17 7c6.66733 0 12.334 -2.33334 17 -7l73.5 -73.5l73.5 73.5c4.66666 4.66666 10.3333 7 17 7s12.3333 -2.33334 17 -7l34 -34
c4.66666 -4.66772 7 -10.3344 7 -17c0 -6.66666 -2.33334 -12.3333 -7 -17l-73.5 -73.5l73.5 -73.5c4.66666 -4.66685 7 -10.3335 7 -17z" />
<glyph glyph-name="uniF300" unicode="&#xf300;"
d="M180.706 207.059h-180.706v180.706h30.1172v-123.753c30.5098 96.165 121.556 165.165 225.883 165.165c105.593 0 199.409 -71.0781 228.111 -172.846l-29.0039 -8.16211c-25.0576 88.8477 -106.947 150.92 -199.107 150.92
c-97.1592 -0.0302734 -181.188 -68.5479 -202.029 -161.912h126.735v-30.1182zM331.294 176.941h180.706v-180.706h-30.1172v123.724c-30.8711 -96.4375 -121.706 -165.105 -225.883 -165.105c-105.623 0 -199.439 71.0781 -228.111 172.846l29.0039 8.16113
c25.0273 -88.8467 106.887 -150.919 199.107 -150.919c97.25 0 181.157 68.4873 202.029 161.882h-126.735v30.1182z" />
<glyph glyph-name="uniF32C" unicode="&#xf32c;"
d="M512 244.706c0 -70.5654 -57.4043 -128 -128 -128h-83.0342v30.1172h83.0342c53.9707 0 97.8828 43.9121 97.8828 97.8828s-43.9121 97.8818 -97.8828 97.8818c-16.0225 0 -31.834 -4.24609 -46.9834 -12.5586l-10.6621 -5.87305l-7.98047 9.21582
c-21.6553 24.9678 -52.6465 39.334 -84.9619 39.334c-50.0254 0 -93.335 -32.5273 -107.701 -80.9561l-3.79492 -12.71l-13.1006 2.16797c-3.58398 0.572266 -7.16797 1.14453 -10.9326 1.14453c-37.3467 0 -67.7656 -30.3887 -67.7656 -67.7646
s30.4189 -67.7646 67.7656 -67.7646h111.404v-30.1172h-111.404c-53.9717 0 -97.8828 43.9111 -97.8828 97.8818c0 54.9951 45.5078 100.442 100.984 97.8223c21.4736 54.5732 73.2158 90.4131 132.428 90.4131c37.165 0 72.8848 -14.8779 99.6592 -41.1709
c16.4443 7.34863 33.5205 11.0537 50.9287 11.0537c70.5957 0 128 -57.4346 128 -128zM271.059 34.4844l49.6035 49.6045l21.2939 -21.2939l-85.9561 -85.9551l-85.9258 85.9258l21.293 21.293l49.5742 -49.5742v232.81h30.1172v-232.81z" />
<glyph glyph-name="uniF311" unicode="&#xf311;"
d="M416 232v-48c0 -6.66699 -2.33301 -12.333 -7 -17c-4.66992 -4.66699 -10.3369 -7 -17 -7h-104v-104c0 -6.66699 -2.33301 -12.333 -7 -17c-4.66895 -4.66699 -10.3359 -7 -17 -7h-48c-6.66699 0 -12.333 2.33301 -17 7s-7 10.333 -7 17v104h-104
c-6.66699 0 -12.334 2.33301 -17 7c-4.66699 4.66699 -7 10.334 -7 17v48c0 6.66797 2.33301 12.334 7 17c4.66699 4.66699 10.333 7 17 7h104v104c0 6.66699 2.33301 12.333 7 17c4.66797 4.66699 10.334 7 17 7h48c6.66699 0 12.333 -2.33301 17 -7
c4.66699 -4.66992 7 -10.3359 7 -17v-104h104c6.66699 0 12.333 -2.33301 17 -7s7 -10.333 7 -17z" />
<glyph glyph-name="uniF31D" unicode="&#xf31d;"
d="M291.147 448l160.617 -159.864v-352.136h-391.529v512h230.912zM301.177 395.535v-98.123h98.5752zM90.3525 -33.8828h331.295v301.177h-150.589v150.589h-180.706v-451.766z" />
<glyph glyph-name="uniF32A" unicode="&#xf32a;"
d="M193.3 187.6l-11.5996 11.6006l74.5 74.2998l74.5 -74.2998l-11.7002 -11.6006l-54.5996 54.6006v-241.8h-16.5v241.8zM399.3 264.4c45.2002 -0.100586 80.7002 -40.1006 80.7002 -85.6006s-37 -82.7998 -82 -82.7998v0h-101v16h97.2998h3.2002
c36.7002 0.200195 66.5 30.2998 66.5 67.0996c0 36.9004 -29 69.8008 -65.5996 70.3008l-15.2002 0.0996094s0.200195 7 0.200195 20.2998c0 55.6006 -45.6006 98.9004 -100.9 98.9004c-38.2998 0 -73.7998 -22.5 -90.4004 -57.4004l-6.5 -13.7002l-13.5 6.80078
c-6.19922 3.19922 -13 4.7998 -19.8994 4.7998c-21.7998 0 -40.2998 -17.7002 -43.9004 -39.2998l-1.5 -8.80078l-8.39941 -2.89941c-30 -10.4004 -50.2002 -39.7998 -50.2002 -71.6006c0 -41.0996 33.2998 -74.5996 74.2002 -74.5996h90.5996v-16h-91.4004
c-49.5 0 -89.5996 40.5 -89.5996 90.2002c0 39.5996 25.4004 74.2002 60.5996 86.2998c4.80078 28.4004 29.3008 52 58.9004 52c9.7002 0 18.7002 -2.2998 26.7998 -6.40039c18.6006 39.2002 58.2998 66.3008 104.4 66.3008c64 0 116.8 -52.1006 116.8 -116.4
c0 -1.2002 -0.200195 -2.40039 -0.200195 -3.59961z" />
<glyph glyph-name="uniF334" unicode="&#xf334;"
d="M391.259 244.706l120.741 83.8174v-303.134l-120.712 83.8174v-67.7949c0 -24.9072 -20.4189 -45.1768 -45.5371 -45.1768h-239.857c-24.9072 0 -45.1768 20.2695 -45.1768 45.1768v165.616h-15.1787c-25.1182 0 -45.5381 20.2695 -45.5381 45.1768v60.2656
c0 24.9072 20.4199 45.1768 45.5381 45.1768h44.8145v15.0586c0 24.9072 20.2695 45.1768 45.1768 45.1768h166.882v-30.1182h-166.882c-8.28223 0 -15.0586 -6.74609 -15.0586 -15.0586v-15.0586h225.25c25.1182 0 45.5381 -20.2695 45.5381 -45.1768v-67.7646z
M481.883 82.9443v187.994l-120.712 -83.8477v125.38c0 8.3125 -6.92676 15.0586 -15.4199 15.0586h-300.213c-8.52344 0 -15.4209 -6.74609 -15.4209 -15.0586v-60.2656c0 -8.3125 6.89746 -15.0586 15.4209 -15.0586h45.2969v-195.734
c0 -8.3125 6.77637 -15.0596 15.0586 -15.0596h239.827c8.52344 0 15.4199 6.74707 15.4199 15.0596v125.35z" />
<glyph glyph-name="uniF33A" unicode="&#xf33a;"
d="M416 232v-48c0 -6.66699 -2.33301 -12.333 -7 -17c-4.66992 -4.66699 -10.3369 -7 -17 -7h-304c-6.66699 0 -12.334 2.33301 -17 7c-4.66699 4.66699 -7 10.334 -7 17v48c0 6.66797 2.33301 12.334 7 17c4.66699 4.66699 10.333 7 17 7h304
c6.66699 0 12.333 -2.33301 17 -7s7 -10.333 7 -17z" />
<glyph glyph-name="uniF337" unicode="&#xf337;"
d="M448 192c0 -26 -5.08334 -50.8333 -15.25 -74.5c-10.1669 -23.6667 -23.8335 -44.0834 -41 -61.25c-17.1674 -17.1667 -37.584 -30.8333 -61.25 -41c-23.6667 -10.1667 -48.5 -15.25 -74.5 -15.25c-28.6667 0 -55.9167 6.04167 -81.75 18.125
c-25.8333 12.0833 -47.8333 29.125 -66 51.125c-1.1683 1.66666 -1.70996 3.54166 -1.625 5.625c0.0837402 2.08363 0.792076 3.79196 2.125 5.125l34.25 34.5c1.66667 1.5 3.75 2.25 6.25 2.25c2.66783 -0.333336 4.5845 -1.33334 5.75 -3
c12.1668 -15.8333 27.0835 -28.0833 44.75 -36.75c17.6667 -8.66667 36.4167 -13 56.25 -13c17.3333 0 33.875 3.375 49.625 10.125s29.375 15.875 40.875 27.375s20.625 25.125 27.375 40.875s10.125 32.2917 10.125 49.625s-3.375 33.875 -10.125 49.625
s-15.875 29.375 -27.375 40.875s-25.125 20.625 -40.875 27.375s-32.2917 10.125 -49.625 10.125c-16.3333 0 -32 -2.95834 -47 -8.875s-28.3333 -14.375 -40 -25.375l34.25 -34.5c5.16826 -5 6.33493 -10.75 3.5 -17.25c-2.83333 -6.66667 -7.75 -10 -14.75 -10h-112
c-4.33334 0 -8.08334 1.58333 -11.25 4.75c-3.16667 3.16667 -4.75 6.91667 -4.75 11.25v112c0 7 3.33334 11.9167 10 14.75c6.5 2.8277 12.25 1.66104 17.25 -3.5l32.5 -32.25c17.8333 16.8333 38.2083 29.875 61.125 39.125s46.625 13.875 71.125 13.875
c26 0 50.8333 -5.08334 74.5 -15.25c23.6667 -10.1668 44.0833 -23.8335 61.25 -41c17.1667 -17.1672 30.8333 -37.5839 41 -61.25c10.1667 -23.6667 15.25 -48.5 15.25 -74.5zM288 264v-112c0 -2.33333 -0.75 -4.25 -2.25 -5.75s-3.41666 -2.25 -5.75 -2.25h-80
c-2.33333 0 -4.25 0.75 -5.75 2.25s-2.25 3.41667 -2.25 5.75v16c0 2.33333 0.75 4.25 2.25 5.75s3.41667 2.25 5.75 2.25h56v88c0 2.33334 0.75 4.25 2.25 5.75s3.41666 2.25 5.75 2.25h16c2.33334 0 4.25 -0.75 5.75 -2.25s2.25 -3.41666 2.25 -5.75z" />
</font>
</defs></svg>

After

Width:  |  Height:  |  Size: 46 KiB

View File

12
resources/css/bootstrap.min.css vendored Normal file

File diff suppressed because one or more lines are too long

415
resources/css/jquery.filer.css vendored Normal file
View File

@ -0,0 +1,415 @@
/*!
* CSS jQuery.filer
* Copyright (c) 2016 CreativeDream
* Version: 1.3 (14-Sep-2016)
*/
@import url('../assets/fonts/jquery.filer-icons/jquery-filer.css');
/*-------------------------
Basic configurations
-------------------------*/
.jFiler * {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
.jFiler {
font-family: sans-serif;
font-size: 14px;
color: #494949;
}
/* Helpers */
.jFiler ul.list-inline li {
display: inline-block;
padding-right: 5px;
padding-left: 5px;
}
.jFiler .pull-left {
float: left;
}
.jFiler .pull-right {
float: right;
}
/* File Icons */
span.jFiler-icon-file {
position: relative;
display: block;
background: #e1e1e1 url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMQAAAEACAYAAADsqNl9AAAD5klEQVR42u3azUqUURjA8bHAEpIK+9hlRBGC0QfVustI+oAo2nQJgYGFFEUhJF1NUVAXEC6iSyhIDCoX5js9Z5xpXmxsRjOdmfP7wfPqwtWZ589xhqlUN2Y5Zi5mJmYi5lzMgZhdFbpavEb32sxsURSfq5mqrPPv52MexYxZrb4NIusoOgoiDudb/JiMGbZSWQSRbRSdBPEqZtQqZRdEllFU2rxPuB8zYI2yDSK7KNYKYinmlvURRG5RVNa4GW5aHUHkGEWrIKasjSByjWJ1EC+tjCByjqKy6qPVI1ZGEDlHUb4h7loXQeQeRSOILzF7rIsgco+iEcS0VRGEKFaCSB+znrQqghDFShDvrYkgRNEM4pk1EYQomkFctiaCEEUziDPWRBCiaAYxYk0EIYpmEIPWRBCiqAeBIEQhCEGIQhBsWxA9E4UNEYQoBCEIUQiC7giiq6OwIYIQhSAEIQpB0H1BdF0UNkQQohCEIEQhCLo7iFoUMZ8EgSC6JAobIghRCEIQohAEvRXEtkRhQwQhCkEIQhSCoHeD2LIobIggRCEIQYhCEPRHEP81ChsiCFEIQhCiEAT9F8SmR2FDBCEKQQhCFIKgv4PYlChsiCD6bZ7/SxQ2RBCiEIQgRCEI8gpiQ1HYEEGIQhCCEIUgyDeIjqOwIYIQhSAEIQpBsBLEKVGsHYUNcUuIQhCCMK2jsB2CEEUpCtshClOKwmYIwpSisBn5BjEqgj+jsBluCVMaWyEKIQiCUhCXhCAI3BKC4K9RXBeEIHBbCALvKwTBRuO4IQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyEi1Wh10ClBrYXd6jDgKqAVxMD3OOgqoBXE+PSYcBdSCuJIeM44CakHMpseco4BKpSiKDymI5Zgxx0Hmt8N4TDX9kjx0JGQexONyEPMxw46FTGPYF7NQDiKZdDRkGsSDRgTlIL7HHHU8ZBbD8ZjFVkEkr2MGHBOZxLAj5m05gNVBJNOOipzeSLcLIn0Me9tx0ecx3KnvetsgkiVR0Ocx/Gy1+GsF0bgppr2noI9C2BnzpNXN0EkQDW9ijjlOejyGEzHv2i17J0EkP2KmYvY6WnoshP31/3QWO1n0ToNoWKhfOeOOmi4P4XTM06Iovq5nwdcbxG/pm4Hp67IxV2MuxByKGfJSsMWLPxRzOOZizLWYF7GbHze6178AQI59RSRyAJkAAAAASUVORK5CYII=') no-repeat;
background-size: cover;
width: 57px;
height: 74px;
line-height: 90px;
text-align: center;
margin: 0 auto;
color: #fff;
font-size: 14px;
font-weight: bold;
overflow: hidden;
}
span.jFiler-icon-file i[class*="icon-jfi-"] {
font-size: 24px;
}
span.jFiler-icon-file.f-image {
background-color: #e15955;
}
span.jFiler-icon-file.f-video {
background-color: #4183d7;
}
span.jFiler-icon-file.f-audio {
background-color: #5bab6e;
}
/* Progress Bar */
.jFiler-jProgressBar {
height: 8px;
background: #f1f1f1;
margin-top: 3px;
margin-bottom: 0;
overflow: hidden;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
}
.jFiler-jProgressBar .bar {
float: left;
width: 0;
height: 100%;
font-size: 12px;
color: #ffffff;
text-align: center;
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
background-color: #50A1E9;
box-sizing: border-box;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
-webkit-transition: width 0.3s ease;
-moz-transition: width 0.3s ease;
-o-transition: width 0.3s ease;
transition: width 0.3s ease;
}
.jFiler-jProgressBar .bar.dark {
background-color: #555;
}
.jFiler-jProgressBar .bar.blue {
background-color: #428bca;
}
.jFiler-jProgressBar .bar.green {
background-color: #5cb85c;
}
.jFiler-jProgressBar .bar.orange {
background-color: #f7a923;
}
.jFiler-jProgressBar .bar.red {
background-color: #d9534f;
}
/* Thumbs */
.jFiler-row:after,
.jFiler-item:after {
display: table;
line-height: 0;
content: "";
clear: both;
}
.jFiler-items ul {
margin: 0;
padding: 0;
list-style: none;
}
/*-------------------------
Default Theme
-------------------------*/
.jFiler-theme-default .jFiler-input {
position: relative;
display: block;
width: 400px;
height: 35px;
margin: 0 0 15px 0;
background: #fefefe;
border: 1px solid #cecece;
font-size: 12px;
font-family: sans-serif;
color: #888;
border-radius: 4px;
cursor: pointer;
overflow: hidden;
-webkit-box-shadow: rgba(0,0,0,.25) 0 4px 5px -5px inset;
-moz-box-shadow: rgba(0,0,0,.25) 0 4px 5px -5px inset;
box-shadow: rgba(0,0,0,.25) 0 4px 5px -5px inset;
}
.jFiler-theme-default .jFiler-input.focused {
outline: none;
-webkit-box-shadow: 0 0 7px rgba(0,0,0,0.1);
-moz-box-shadow: 0 0 7px rgba(0,0,0,0.1);
box-shadow: 0 0 7px rgba(0,0,0,0.1);
}
.jFiler-theme-default .jFiler-input.dragged {
border: 1px dashed #aaaaaa;
background: #f9f9f9;
}
.jFiler-theme-default .jFiler-inpu.draggedt:hover {
background: #FFF8D0;
}
.jFiler-theme-default .jFiler-input.dragged * {
pointer-events: none;
}
.jFiler-theme-default .jFiler-input.dragged .jFiler-input-caption {
width: 100%;
text-align: center;
}
.jFiler-theme-default .jFiler-input.dragged .jFiler-input-button {
display: none;
}
.jFiler-theme-default .jFiler-input-caption {
display: block;
float: left;
height: 100%;
padding-top: 8px;
padding-left: 10px;
text-overflow: ellipsis;
overflow: hidden;
}
.jFiler-theme-default .jFiler-input-button {
display: block;
float: right;
height: 100%;
padding-top: 8px;
padding-left: 15px;
padding-right: 15px;
border-left: 1px solid #ccc;
color: #666666;
text-align: center;
background-color: #fefefe;
background-image: -webkit-gradient(linear,0 0,0 100%,from(#fefefe),to(#f1f1f1));
background-image: -webkit-linear-gradient(top,#fefefe,#f1f1f1);
background-image: -o-linear-gradient(top,#fefefe,#f1f1f1);
background-image: linear-gradient(to bottom,#fefefe,#f1f1f1);
background-image: -moz-linear-gradient(top,#fefefe,#f1f1f1);
-webkit-transition: all .1s ease-out;
-moz-transition: all .1s ease-out;
-o-transition: all .1s ease-out;
transition: all .1s ease-out;
}
.jFiler-theme-default .jFiler-input-button:hover {
-moz-box-shadow: inset 0 0 10px rgba(0,0,0,0.07);
-webkit-box-shadow: inset 0 0 10px rgba(0,0,0,0.07);
box-shadow: inset 0 0 10px rgba(0,0,0,0.07);
}
.jFiler-theme-default .jFiler-input-button:active {
background-image: -webkit-gradient(linear,0 0,0 100%,from(#f1f1f1),to(#fefefe));
background-image: -webkit-linear-gradient(top,#f1f1f1,#fefefe);
background-image: -o-linear-gradient(top,#f1f1f1,#fefefe);
background-image: linear-gradient(to bottom,#f1f1f1,#fefefe);
background-image: -moz-linear-gradient(top,#f1f1f1,#fefefe);
}
/*-------------------------
Thumbnails
-------------------------*/
.jFiler-items-default .jFiler-items {
}
.jFiler-items-default .jFiler-item {
position: relative;
padding: 16px;
margin-bottom: 16px;
background: #f7f7f7;
color: #4d4d4c;
}
.jFiler-items-default .jFiler-item .jFiler-item-icon {
font-size: 32px;
color: #48A0DC;
margin-right: 15px;
margin-top: -3px;
}
.jFiler-items-default .jFiler-item .jFiler-item-title {
font-weight: bold;
}
.jFiler-items-default .jFiler-item .jFiler-item-others {
font-size: 12px;
color: #777;
margin-left: -5px;
margin-right: -5px;
}
.jFiler-items-default .jFiler-item .jFiler-item-others span {
padding-left: 5px;
padding-right: 5px;
}
.jFiler-items-default .jFiler-item-assets {
position: absolute;
display: block;
right: 16px;
top: 50%;
margin-top: -10px;
}
.jFiler-items-default .jFiler-item-assets a {
padding: 8px 9px 8px 12px;
cursor: pointer;
background: #fafafa;
color: #777;
border-radius: 4px;
border: 1px solid #e3e3e3
}
.jFiler-items-default .jFiler-item-assets .jFiler-item-trash-action:hover,
.jFiler-items-default .jFiler-item-assets .jFiler-item-trash-action:active {
color: #d9534f;
}
.jFiler-items-default .jFiler-item-assets .jFiler-item-trash-action:active {
background: transparent;
}
/* Thumbnails: Grid */
.jFiler-items-grid .jFiler-item {
float: left;
}
.jFiler-items-grid .jFiler-item .jFiler-item-container {
position: relative;
margin: 0 20px 30px 0;
padding: 10px;
border: 1px solid #e1e1e1;
border-radius: 3px;
background: #fff;
-webkit-box-shadow: 0px 0px 3px rgba(0,0,0,0.06);
-moz-box-shadow: 0px 0px 3px rgba(0,0,0,0.06);
box-shadow: 0px 0px 3px rgba(0,0,0,0.06);
}
.jFiler-items-grid .jFiler-item .jFiler-item-container .jFiler-item-thumb {
position: relative;
width: 190px;
height: 145px;
min-height: 115px;
border: 1px solid #e1e1e1;
overflow: hidden;
}
.jFiler-items-grid .jFiler-item .jFiler-item-container .jFiler-item-thumb .jFiler-item-thumb-image {
width: 100%;
height: 100%;
text-align: center;
}
.jFiler-item .jFiler-item-container .jFiler-item-thumb img {
max-width: none;
max-height: 100%;
}
.jFiler-items-grid .jFiler-item .jFiler-item-container .jFiler-item-thumb span.jFiler-icon-file {
margin-top: 32px;
}
.jFiler-items-grid .jFiler-item-thumb-image.fi-loading {
background: url('data:image/gif;base64,R0lGODlhIwAjAMQAAP////f39+/v7+bm5t7e3tbW1s7OzsXFxb29vbW1ta2traWlpZycnJSUlIyMjISEhHt7e3Nzc2tra2NjY1paWlJSUkpKSkJCQjo6OjExMSkpKRkZGRAQEAAAAP///wAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFBAAeACwAAAAAIwAjAAAF5CAgjmRpnmiqrmzrvnAsz3Rto4Fwm4EYLIweQHcTKAiAQOPRI0QKRcYiEGA4qI8K9HZoGAIOSOBgCdIGBeLCMUgoBJSJjsBAxAiKRSFAQBCVBwMKGRsNQi8DBwsJhyQVGxMKjTCJk0kPjDI5AlQqBAcICFstBQqmmScFGh0dHBaWKAIEBQQDKQEKDxEQCTMBA5Y/o5oDoZYCHB1PMgIHCQacwCPACRStDTEDBrYABQg5wAgGIg4YYjQCogEGB3wI3J2+oD0G42PfN2Pc7D2JRDb/+In4t8MHwYIIEypcyLChQ4YhAAAh+QQFBAAeACwIAAgAEwATAAAFlqAnjiKSjAFJBscgLos4NIQ6JggAKLHXSDWbp6CoLRgeg0ShGwkIKQ9iITggPJFHaqA4eAYIRK0a9SwK0spl0TQkvEIJJnIlCdDCRk4lEJIGBgcHRn4jBBkciROFKgkNDg51jCJBJJU2ARocD4xNAQsGCBMcGz2FAxwZKQwVDYVwEhwOI02MAxsceJMeOgwaJ7skCX0jIQAh+QQFBAAeACwAAAAAAQABAAAFA6AXAgAh+QQFBAAeACwAAAAAAQABAAAFA6AXAgAh+QQFBAAeACwJAAcAEgAVAAAFjqAnjmJAnihgHChqCACAJKMyoMHBeggSJ40baoC4zTwFB6IlOiwLhkCDMUIYUAUSgiA4RCZLAXPkoDQOsfFosVNjDYaBQiRmWjaaDMTdXDAYbWMJQnwiGBoOBEwmIwVeGhhzKAJ+BBsXIgoSVCcEAxkbAw8enEwAARkaYqluAqliChlLY64aQrNjAT2MKCEAIfkEBQQAHgAsBwAIABQAFAAABZqgJ45jUQBkqorGgQqIsKqteCjyTLbAsBg6UoBA8CgSIoGhGGQNAoXG4zAaNBcPxalJQhS4KwGhUCQgRYHZQGKxVBpgD8CQUCiAYEQTpZpcGFYrBgw5HgkEBg4XFHoqFx10CwMZFCIIDwl8IwscFAQXGR4NGQo6BBocRRUYHgIWGEwqBxoPHgEWoYYXVCsBCTIBqzkHaVwHvCshACH5BAUEAB4ALAAAAAABAAEAAAUDoBcCACH5BAUEAB4ALAcACAAVABQAAAWaoCeOpDECZKqKgRcY7bqanoHI6+EKSIHjCJ2oMPidCgIPQbHwGUkIBoLwJAEM1OpqQBgkC0yjwBGRRBQokfdXOASzo0MjqTrQUwQIpwM/QSYJKQoaHRUKHgtQSgwTEUIeDRcPSRQcHgiBFREiB1IkdAkaEgMUGAILFoE4AxkaRRIVLRIURTIGGQ0iExWcEzQyBzGwI05PV78rIQAh+QQFBAAeACwAAAAAAQABAAAFA6AXAgAh+QQFBAAeACwHAAgAFAAUAAAFlaAnjmRBnmgqCip6kEGbDnJqvmJAsLVIDwgEoTc6JAy0k05VSIoKiSgipgoIaIFKZ8tBVBeNBgORkEwkDt6sYECSBosUwJRybDiqxuOgTmTwCAUKIwAHAwMJDw10CxUNMRIaBQcIAmhPCgYjVAcZDx4REx5lOCoWGCIPER4Bqi0FFwwiEBIxBg9DKpqpEVS5PQUFACohACH5BAUEAB4ALAAAAAABAAEAAAUDoBcCACH5BAUEAB4ALAcACAAUABQAAAWRoCeOpEGeaCoGKmqOQlvKXgId4usR6DA+HA6kQDsxMB0Nr0hSTHxFAgJxIABogpiEI9rgVAiF2ICARCANVovAjsESKoKaNGBkMqrEojA/WDYSHgMIJAVZBwsKSwoSCyIOFx4FJg4LVwQHRCgVDQIOEAEHDi9XJwISFAIADA4iDJ1xEwoiDa2SDFA0rCO5NGwtIQAh+QQFBAAeACwAAAAAAQABAAAFA6AXAgAh+QQFBAAeACwHAAgAEwAUAAAFj6AnisNonqeBLWg7GpwmtAENcc8s6ifyGKJMp1DyIFqNjecxUEiKLpGi4slATcBW4hkdDQ6HbHd048TELtah8XCwxqjAsXXdKSyWuuiAILwmGBBABzUiBDUFCQglCBAJIgsTBAQFAQpzAwZ1BREsCwweBQt+Lg8QNQpvCAqFJwMQc6mGjy6kHrI7cB4DeiIhACH5BAUEAB4ALAAAAAABAAEAAAUDoBcCACH5BAUEAB4ALAcABwASABUAAAWXoCeOI0GQaBpUl5CSRZV4QrYN71hoWBBkGpdISAI4No2BhoNLHRijy8YQmQwOpJMC2BAgIh5fgJZKSDYWYg4FWZMMhkLT7XHYeAW6wrBgLGZ0KQZjgR4IEhFqJIAeBQ8UDQUCeSNzIwcNCCIJDwMDJwgGawSZAQgzBAiWIwELDSIHmh6xOQyiAKciV4oeAHO0IwB0ArweIQAh+QQFBAAeACwAAAAAAQABAAAFA6AXAgAh+QQFBAAeACwHAAcAEAAVAAAFjKAnjuMwkKgnjFJVosSEeMGVrcc1j8TlehVMIIDh7EaMzMKDuTE4k4DHsCiIKJnCI0LYcE6ehMWyPDxGgshyZL5MUqID6uCAowsEwsouWlTGFAR8HgUJCglHgyNWigF0dXYzBAwPCoJgcAUKBnELAgKYcAObHgdyfIYiBQcAdgIJjAanrq0AsoojQyghACH5BAUEAB4ALAAAAAABAAEAAAUDoBcCACH5BAUEAB4ALAcACAAUABQAAAWYoCeKwQhF5aiqA3SIlDVW7yoOlCRKlVhtNZtHYUkIKBfPYoNaFRADUUTWeAwyGYHHAFmIDhIJImBorBIFB6cDSZUnEGEA08k0UiPDQrsSTB58HgEDhEIqAHgIERESVoY2BAcIBwaPlh5Rl04KCnhnKwMJDFCelgMIBAAeT3hBNqoeAggFIgiaX7ZblZoBB5lbqoG3wzbCKyEAIfkEBQQAHgAsBwAHABUAEwAABZygJ46jIJBoSjZPqa6GGEmBZ0zx60Gt90QiSSb3QkgOHskkkMj0UAOkyCEhLBiey2X0SIwMLKRVAPAEHggCY8N5egiKB6OGAmwtC1UhQScFIgt9JAKCKQUICQkxBw2NCycqBhsdlBgBAwUGBgRlKgMPExMSgSSdKmQvBAgIOqwoAgeKkDopBgMiMbOutCgGSLe8IlIeSKbBI1LAKCEAIfkEBQQAHgAsAAAAAAEAAQAABQOgFwIAIfkEBQQAHgAsAAAAAAEAAQAABQOgFwIAIfkECQQAHgAsAAAAACMAIwAABbWgJ45kaZ5oqq5s675wLM90baPBvS6MTgoKgqjxEBEihZuAsRAxHKJHJXk7NAwBB8RzsPRqBYFo4RgkFALKxMhAxAiKBdXtAXgah4Eis2nIBgcLCSgVGxMKNYAoD4MzAgI5KgQHCAhULQUKmgmRJgUaIhwWLwIEBQQDKQEKDxEQCXYxnSUBcjapKAIcHUg+JgkUHRx+YB6zIw4YEMc2QiMBzDB0HgbGvifR19rb3N3e3+Dh4ikhADs=') no-repeat center;
width: 100%;
height: 100%;
}
.jFiler-items-grid .jFiler-item .jFiler-item-container .jFiler-item-thumb-overlay {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
color: #fff;
background: rgba(76, 76, 77, 0.8);
opacity: 0;
filter: alpha(opacity=0);
z-index: 10;
overflow-y: auto;
-webkit-transition: all 0.12s;
-moz-transition: all 0.12s;
transition: all 0.12s;
}
.jFiler-items-grid .jFiler-item .jFiler-item-container .jFiler-item-thumb:hover .jFiler-item-thumb-overlay {
opacity: 1;
filter: aplpha(opacity(100));
}
.jFiler-items-grid .jFiler-item .jFiler-item-container .jFiler-item-info {
display: table;
padding: 0 10px;
overflow: auto;
width: 100%;
height: 100%;
text-align: center;
}
.jFiler-items-grid .jFiler-item .jFiler-item-container .jFiler-item-info .jFiler-item-title {
display: block;
font-weight: bold;
word-break: break-all;
line-height: 1;
}
.jFiler-items-grid .jFiler-item .jFiler-item-container .jFiler-item-info .jFiler-item-others {
display: inline-block;
font-size: 10px;
}
.jFiler-items-grid .jFiler-item .jFiler-item-container .jFiler-item-assets {
margin-top: 10px;
color: #999;
}
.jFiler-items-grid .jFiler-item .jFiler-item-container .jFiler-item-assets .text-success {
color: #3C763D
}
.jFiler-items-grid .jFiler-items-grid .jFiler-item .jFiler-item-container .jFiler-item-assets .text-error {
color: #A94442
}
.jFiler-items-grid .jFiler-item .jFiler-item-container .jFiler-item-assets .jFiler-jProgressBar {
width: 120px;
margin-left: -5px;
}
.jFiler-items-grid .jFiler-item .jFiler-item-container .jFiler-item-assets .jFiler-item-others {
font-size: 12px;
}
.jFiler-items-grid .jFiler-item-trash-action:hover {
cursor: pointer;
color: #d9534f;
}

12
resources/css/jquery.justified.css vendored Normal file
View File

@ -0,0 +1,12 @@
.image-container{
position: relative;
}
.photo-container{
float: left;
position: relative;
overflow: hidden;
}
.image-thumb{
position: relative;
background-color: #eee;
}

110
resources/css/justifiedGallery.min.css vendored Normal file
View File

@ -0,0 +1,110 @@
/*!
* justifiedGallery - v3.8.0
* http://miromannino.github.io/Justified-Gallery/
* Copyright (c) 2020 Miro Mannino
* Licensed under the MIT license.
*/
.justified-gallery {
width: 100%;
position: relative;
overflow: hidden;
}
.justified-gallery > a,
.justified-gallery > div,
.justified-gallery > figure {
position: absolute;
display: inline-block;
overflow: hidden;
/* background: #888888; To have gray placeholders while the gallery is loading with waitThumbnailsLoad = false */
filter: "alpha(opacity=10)";
opacity: 0.1;
margin: 0;
padding: 0;
}
.justified-gallery > a > img,
.justified-gallery > div > img,
.justified-gallery > figure > img,
.justified-gallery > a > a > img,
.justified-gallery > div > a > img,
.justified-gallery > figure > a > img,
.justified-gallery > a > svg,
.justified-gallery > div > svg,
.justified-gallery > figure > svg,
.justified-gallery > a > a > svg,
.justified-gallery > div > a > svg,
.justified-gallery > figure > a > svg {
position: absolute;
top: 50%;
left: 50%;
margin: 0;
padding: 0;
border: none;
filter: "alpha(opacity=0)";
opacity: 0;
}
.justified-gallery > a > .jg-caption,
.justified-gallery > div > .jg-caption,
.justified-gallery > figure > .jg-caption {
display: none;
position: absolute;
bottom: 0;
padding: 5px;
background-color: #000000;
left: 0;
right: 0;
margin: 0;
color: white;
font-size: 12px;
font-weight: 300;
font-family: sans-serif;
}
.justified-gallery > a > .jg-caption.jg-caption-visible,
.justified-gallery > div > .jg-caption.jg-caption-visible,
.justified-gallery > figure > .jg-caption.jg-caption-visible {
display: initial;
filter: "alpha(opacity=70)";
opacity: 0.7;
-webkit-transition: opacity 500ms ease-in;
-moz-transition: opacity 500ms ease-in;
-o-transition: opacity 500ms ease-in;
transition: opacity 500ms ease-in;
}
.justified-gallery > .jg-entry-visible {
filter: "alpha(opacity=100)";
opacity: 1;
background: none;
}
.justified-gallery > .jg-entry-visible > img,
.justified-gallery > .jg-entry-visible > a > img,
.justified-gallery > .jg-entry-visible > svg,
.justified-gallery > .jg-entry-visible > a > svg {
filter: "alpha(opacity=100)";
opacity: 1;
-webkit-transition: opacity 500ms ease-in;
-moz-transition: opacity 500ms ease-in;
-o-transition: opacity 500ms ease-in;
transition: opacity 500ms ease-in;
}
.justified-gallery > .jg-filtered {
display: none;
}
.justified-gallery > .jg-spinner {
position: absolute;
bottom: 0;
margin-left: -24px;
padding: 10px 0 10px 0;
left: 50%;
filter: "alpha(opacity=100)";
opacity: 1;
overflow: initial;
}
.justified-gallery > .jg-spinner > span {
display: inline-block;
filter: "alpha(opacity=0)";
opacity: 0;
width: 8px;
height: 8px;
margin: 0 4px 0 4px;
background-color: #000;
border-radius: 6px;
}

25
resources/css/public.css vendored Normal file
View File

@ -0,0 +1,25 @@
#img {
background-image: url("/images/DSC08544.jpg");
padding: 0px;
margin: 0px;
background-repeat: no-repeat;
background-size: cover;
height: 100%
}
#login {
margin: 0px;
height: 100%;
}
.form-control {
margin-bottom: 10px;
margin-top: 10px;
}
.vertical-center {
margin: 0;
position: absolute;
width: calc(100% - 15px);
top: 50%;
-ms-transform: translateY(-50%);
transform: translateY(-50%);
}

7
resources/css/theme.css vendored Normal file
View File

@ -0,0 +1,7 @@
body {
}
.form-control {
margin-top: 5px;
margin-bottom: 5px;
}

View File

@ -0,0 +1,191 @@
/*!
* CSS jQuery.filer
* Theme: DragDropBox
* Copyright (c) 2016 CreativeDream
* Version: 1.3 (14-Sep-2016)
*/
/*-------------------------
Input
-------------------------*/
.jFiler-input-dragDrop {
display: block;
width: 343px;
margin: 0 auto 25px auto;
padding: 25px;
color: #97A1A8;
background: #F9FBFE;
border: 2px dashed #C8CBCE;
text-align: center;
-webkit-transition: box-shadow 0.3s,
border-color 0.3s;
-moz-transition: box-shadow 0.3s,
border-color 0.3s;
transition: box-shadow 0.3s,
border-color 0.3s;
}
.jFiler .jFiler-input-dragDrop.dragged {
border-color: #aaa;
box-shadow: inset 0 0 20px rgba(0,0,0,.08);
}
.jFiler .jFiler-input-dragDrop.dragged * {
pointer-events: none;
}
.jFiler .jFiler-input-dragDrop.dragged .jFiler-input-icon {
-webkit-transform: rotate(180deg);
-ms-transform: rotate(180deg);
transform: rotate(180deg);
}
.jFiler .jFiler-input-dragDrop.dragged .jFiler-input-text,
.jFiler .jFiler-input-dragDrop.dragged .jFiler-input-choose-btn {
filter: alpha(opacity=30);
opacity: 0.3;
}
.jFiler-input-dragDrop .jFiler-input-icon {
font-size: 48px;
margin-top: -10px;
-webkit-transition: all 0.3s ease;
-moz-transition: all 0.3s ease;
transition: all 0.3s ease;
}
.jFiler-input-text h3 {
margin: 0;
font-size: 18px;
}
.jFiler-input-text span {
font-size: 12px;
}
.jFiler-input-choose-btn {
display: inline-block;
padding: 8px 14px;
outline: none;
cursor: pointer;
text-decoration: none;
text-align: center;
white-space: nowrap;
font-size: 12px;
font-weight: bold;
color: #8d9496;
border-radius: 3px;
border: 1px solid #c6c6c6;
vertical-align: middle;
*background-color: #fff;
box-shadow: 0px 1px 5px rgba(0,0,0,0.05);
-webkit-transition: all 0.2s;
-moz-transition: all 0.2s;
transition: all 0.2s;
}
.jFiler-input-choose-btn:hover,
.jFiler-input-choose-btn:active {
color: inherit;
}
.jFiler-input-choose-btn:active {
background-color: #f5f5f5;
}
/* gray */
.jFiler-input-choose-btn.gray {
background-image: -webkit-gradient(linear,0 0,0 100%,from(#fcfcfc),to(#f5f5f5));
background-image: -webkit-linear-gradient(top,#fcfcfc,#f5f5f5);
background-image: -o-linear-gradient(top,#fcfcfc,#f5f5f5);
background-image: linear-gradient(to bottom,#fcfcfc,#f5f5f5);
background-image: -moz-linear-gradient(top,#fcfcfc,#f5f5f5);
}
.jFiler-input-choose-btn.gray:hover {
filter: alpha(opacity=87);
opacity: 0.87;
}
.jFiler-input-choose-btn.gray:active {
background-color: #f5f5f5;
background-image: -webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#fcfcfc));
background-image: -webkit-linear-gradient(top,#f5f5f5,#fcfcfc);
background-image: -o-linear-gradient(top,#f5f5f5,#fcfcfc);
background-image: linear-gradient(to bottom,#f5f5f5,#fcfcfc);
background-image: -moz-linear-gradient(top,#f5f5f5,#fcfcfc);
}
/* blue */
.jFiler-input-choose-btn.blue {
color: #48A0DC;
border: 1px solid #48A0DC;
}
.jFiler-input-choose-btn.blue:hover {
background: #48A0DC;
}
.jFiler-input-choose-btn.blue:active {
background: #48A0DC;
}
/* green */
.jFiler-input-choose-btn.green {
color: #27ae60;
border: 1px solid #27ae60;
}
.jFiler-input-choose-btn.green:hover {
background: #27ae60;
}
.jFiler-input-choose-btn.green:active {
background: #27ae60;
}
/* red */
.jFiler-input-choose-btn.red {
color: #ed5a5a;
border: 1px solid #ed5a5a;
}
.jFiler-input-choose-btn.red:hover {
background: #ed5a5a;
}
.jFiler-input-choose-btn.red:active {
background: #E05252;
}
/* black */
.jFiler-input-choose-btn.black {
color: #555;
border: 1px solid #555;
}
.jFiler-input-choose-btn.black:hover {
background: #555;
}
.jFiler-input-choose-btn.black:active {
background: #333;
}
.jFiler-input-choose-btn.blue:hover,
.jFiler-input-choose-btn.green:hover,
.jFiler-input-choose-btn.red:hover,
.jFiler-input-choose-btn.black:hover {
border-color: transparent;
color: #fff;
}
.jFiler-input-choose-btn.blue:active,
.jFiler-input-choose-btn.green:active,
.jFiler-input-choose-btn.red:active,
.jFiler-input-choose-btn.black:active {
border-color: transparent;
color: #fff;
filter: alpha(opacity=87);
opacity: 0.87;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 237 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 499 KiB

1
resources/js/app.js vendored
View File

@ -1 +0,0 @@
require('./bootstrap');

7
resources/js/bootstrap.bundle.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -1,28 +0,0 @@
window._ = require('lodash');
/**
* We'll load the axios HTTP library which allows us to easily issue requests
* to our Laravel back-end. This library automatically handles sending the
* CSRF token as a header based on the value of the "XSRF" token cookie.
*/
window.axios = require('axios');
window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
/**
* Echo exposes an expressive API for subscribing to channels and listening
* for events that are broadcast by Laravel. Echo and event broadcasting
* allows your team to easily build robust real-time web applications.
*/
// import Echo from 'laravel-echo';
// window.Pusher = require('pusher-js');
// window.Echo = new Echo({
// broadcaster: 'pusher',
// key: process.env.MIX_PUSHER_APP_KEY,
// cluster: process.env.MIX_PUSHER_APP_CLUSTER,
// forceTLS: true
// });

2
resources/js/jquery-3.5.1.min.js vendored Normal file

File diff suppressed because one or more lines are too long

2
resources/js/jquery-3.5.1.slim.min.js vendored Normal file

File diff suppressed because one or more lines are too long

1113
resources/js/jquery.filer.js vendored Normal file

File diff suppressed because it is too large Load Diff

8
resources/js/jquery.filer.min.js vendored Normal file

File diff suppressed because one or more lines are too long

1606
resources/js/jquery.fileupload.js vendored Normal file

File diff suppressed because it is too large Load Diff

1
resources/js/jquery.justified.min.js vendored Normal file
View File

@ -0,0 +1 @@
!function(t,i,h,e){"use strict";function o(i,h){this.element=i,this.$el=t(i),this._name=s,this.init(h)}var s="justifiedImages";o.prototype={defaults:{template:function(t){return'<div class="photo-container" style="height:'+t.displayHeight+"px;margin-right:"+t.marginRight+'px;"><img class="image-thumb" src="'+t.src+'" style="width:'+t.displayWidth+"px;height:"+t.displayHeight+'px;" ></div>'},appendBlocks:function(){return[]},rowHeight:150,maxRowHeight:350,handleResize:!1,margin:1,imageSelector:"image-thumb",imageContainer:"photo-container"},init:function(i){this.options=t.extend({},this.defaults,i),this.displayImages(),this.options.handleResize&&this.handleResize()},getBlockInRow:function(t){for(var i=this.options.appendBlocks(),h=0;h<i.length;h++){var e=i[h];if(e.rowNum===t)return e}},displayImages:function(){var i=this,h=[],e=0,o=0,s=this.options.images.length,n=this.options.images,a=[],r=0,p=this.options.appendBlocks(),l=this.$el.width(),d=parseInt(this.options.margin,10),g=this.$el,c=parseInt(this.options.rowHeight,10);t.each(this.options.images,function(t,e){var o=i.options.getSize(e),s=parseInt(o.width,10),n=parseInt(o.height,10);n!==c&&(s=Math.floor(s*(c/n))),r+=s,h.push(s)}),t.each(p,function(t,i){r+=i.width});var m=r/Math.ceil(r/l);console.log("rows",Math.ceil(r/l));for(var f=0;s>o;){var w={width:0,photos:[]},u=0,v=this.getBlockInRow(a.length+1);for(v&&(w.width+=v.width,f+=v.width);f+h[o+u]/2<=m*(a.length+1)&&s>o+u;)f+=h[o+u],w.width+=h[o+u],w.photos.push({width:h[o+u],photo:n[o+u]}),u++;o+=u,a.push(w)}console.log(a.length,a);for(var y=0;y<a.length;y++){var w=a[y],R=!1;if(e=y+1,this.options.maxRows&&e>this.options.maxRows)break;y===a.length-1&&(R=!0),f=-1*d;var I=this.getBlockInRow(R?-1:e),x=l;I&&(x-=I.width,f=0);var b=x/w.width,u=w.photos.length,k=Math.min(Math.floor(c*b),parseInt(this.options.maxRowHeight,10));b=k/this.options.rowHeight;var H=t("<div/>",{"class":"picrow"});H.height(k+d),g.append(H);for(var M="",B=0;B<w.photos.length;B++){var j=w.photos[B].photo,z=Math.floor(w.photos[B].width*b);f+=z+d,M+=this.renderPhoto(j,{src:this.options.thumbnailPath(j,z,k),width:z,height:k},I?!1:B===w.photos.length-1)}if(""!==M){if(H.html(M),Math.abs(f-x)<.05*x){for(var C=0;x>f;){var S=H.find("."+this.options.imageContainer+":nth-child("+(C+1)+")"),$=S.find("."+this.options.imageSelector);$.width($.width()+1),C=(C+1)%u,f++}for(C=0;f>x;){var P=H.find("."+this.options.imageContainer+":nth-child("+(C+1)+")"),_=P.find("."+this.options.imageSelector);_.width(_.width()-1),C=(C+1)%u,f--}}else if(x-f>.05*x)for(var O=x-f,W=0,q=H.find("."+this.options.imageContainer),A=0,N=0;N<q.length;N++){var Q=O/q.length,T=q.eq(N),D=T.find("."+this.options.imageSelector),E=D.width(),F=D.height();y===q.length-1&&(Q=O-W),D.width(E+Q),D.height(F/E*(E+Q)),A=(F-D.height())/2,D.css("margin-top",A),W+=Q}I&&t("<div />",{"class":this.options.imageContainer+" added-block",css:{width:I.width,height:k},html:I.html}).appendTo(H)}else H.remove()}},renderPhoto:function(i,h,e){var o={},s;return s=t.extend({},i,{src:h.src,displayWidth:h.width,displayHeight:h.height,marginRight:e?0:this.options.margin}),this.options.dataObject?o[this.options.dataObject]=s:o=s,this.options.template(o)},handleResize:function(){},refresh:function(i){this.options=t.extend({},this.defaults,i),this.$el.empty(),this.displayImages()}},t.fn[s]=function(i){var h=arguments,e;return this.each(function(){var n=t(this),a=t.data(this,"plugin_"+s),r="object"==typeof i&&i;a?"string"==typeof i?e=a[i].apply(a,Array.prototype.slice.call(h,1)):a.refresh.call(a,r):n.data("plugin_"+s,a=new o(this,r))}),e||this}}(jQuery,window,document);

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,43 @@
<head>
<link rel="stylesheet" href="/css/bootstrap.min.css">
<link rel="stylesheet" href="/css/theme.css">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
</head>
<body>
<div class="wrapper">
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
<a class="navbar-brand" href="#">Kuvia</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarColor02" aria-controls="navbarColor02" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarColor02">
<ul class="navbar-nav mr-auto">
<li class="nav-item active">
<a class="nav-link" href="/d">Dashboard</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/g">Gallery</a>
</li>
</ul>
<ul class="nav navbar-nav float-md-right">
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">Tenant</a>
<div class="dropdown-menu dropdown-menu-right">
<a class="dropdown-item" href="#">Sample</a>
<a class="dropdown-item" href="#">FooBar Bla</a>
<a class="dropdown-item" href="#">Something else here</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="#">New Tenant</a>
</div>
</li>
</ul>
</div>
</nav>
</div>
<script src="/js/jquery-3.5.1.slim.min.js"></script>
<script src="/js/bootstrap.bundle.min.js"></script>
</body>

View File

@ -0,0 +1,27 @@
<head>
<link rel="stylesheet" href="/css/bootstrap.min.css">
<link rel="stylesheet" href="/css/public.css">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
</head>
<body>
<div class="row" style="height: 100%;width: 100%;">
<div class="col-md-9" id="img" >
</div>
<div class="col-md-3" id="login" >
<div class="vertical-center">
<h3>Login</h3>
<form method="post" style="margin-top: 20px;">
@csrf
<input name="username" value="{{ old('username') }}" class="form-control" placeholder="Username">
<input name="password" type="password" class="form-control" placeholder="Password">
<input type="submit" class="btn btn-outline-success" style="width: 100%" value="Login">
<a style="float: right;" href="/register">Register</a>
</form>
</div>
</div>
</div>
<script src="/js/jquery-3.5.1.slim.min.js"></script>
<script src="/js/bootstrap.bundle.min.js"></script>
</body>

View File

@ -0,0 +1,38 @@
<head>
<link rel="stylesheet" href="/css/bootstrap.min.css">
<link rel="stylesheet" href="/css/public.css">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
</head>
<body>
<div class="row" style="height: 100%;width: 100%;">
<div class="col-md-9" id="img" >
</div>
<div class="col-md-3" id="login" >
<div class="vertical-center">
<h3>Register</h3>
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<form method="post" style="margin-top: 20px;">
@csrf
<input name="username" value="{{ old('username') }}" class="form-control" placeholder="Username">
<input name="email" value="{{ old('email') }}" type="email" class="form-control" placeholder="E-Mail">
<input name="password" type="password" class="form-control" placeholder="Password">
<input name="password_confirmation" type="password" class="form-control" placeholder="Password (Again)">
<input type="submit" class="btn btn-outline-success" style="width: 100%" value="Register">
<a style="float: right;" href="/login">Login</a>
</form>
</div>
</div>
</div>
<script src="/js/jquery-3.5.1.slim.min.js"></script>
<script src="/js/bootstrap.bundle.min.js"></script>
</body>

View File

@ -0,0 +1,101 @@
@extends('layout/template')
@section('content')
<div class="row">
<div class="col-md-12">
<h1>Dashboard</h1>
<div class="alert alert-danger" role="alert">
This system is in development mode, all data will be removed!
</div>
</div>
</div>
<div class="row">
<div class="col-md-8">
<div class="row">
<div class="col-md-6">
<div class="card bg-secondary" style="">
<div class="card-header">Storage</div>
<div class="card-body">
<canvas id="storageChart" width="200" height="100"></canvas>
<p class="card-text">Currently you use {{ $currentSize }} of Storage.</p>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card bg-secondary">
<div class="card-header">Traffic</div>
<div class="card-body">
<canvas id="myChart" width="200" height="100"></canvas>
<p class="card-text">In the last 24 Hours you use {{ $currentTraffic }} Traffic, this month you used already {{ $monthlyTraffic }}</p>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-4">
FAQ
</div>
</div>
@endsection
@section('js')
<script src="https://cdn.jsdelivr.net/npm/chart.js@2.9.4/dist/Chart.min.js"></script>
<script>
var data = {
labels: [@foreach($lastDaysTreffic as $date => $traffic)
"{{ $date }}",
@endforeach],
datasets: [
{
label: "Traffic per Day",
fillColor: "rgba(220,220,220,0.2)",
strokeColor: "rgba(220,220,220,1)",
pointColor: "rgba(220,220,220,1)",
pointStrokeColor: "#fff",
pointHighlightFill: "#fff",
pointHighlightStroke: "rgba(220,220,220,1)",
data: [
@foreach($lastDaysTreffic as $traffic)
{{ $traffic }},
@endforeach
]
}
]
};
var ctx = document.getElementById('myChart').getContext('2d');
var myChart = new Chart(ctx, {
type: 'line',
data: data
});
var datastorage = {
labels: [@foreach($lastDaysSize as $date => $traffic)
"{{ $date }}",
@endforeach],
datasets: [
{
label: "Storage per Day",
fillColor: "rgba(220,220,220,0.2)",
strokeColor: "rgba(220,220,220,1)",
pointColor: "rgba(220,220,220,1)",
pointStrokeColor: "#fff",
pointHighlightFill: "#fff",
pointHighlightStroke: "rgba(220,220,220,1)",
data: [
@foreach($lastDaysSize as $traffic)
{{ $traffic }},
@endforeach
]
}
]
};
var ctxstorage = document.getElementById('storageChart').getContext('2d');
var myChartstorage = new Chart(ctxstorage, {
type: 'line',
data: datastorage
});
</script>
@endsection

View File

@ -0,0 +1,45 @@
@extends('layout/template')
@section('content')
<a href="/g/new" class="btn btn-outline-success" style="float: right;">New Gallery</a>
<h1>Gallery</h1>
<div style="clear: both; margin-bottom: 10px;"></div>
<div class="col-md-12">
<table class="table table-striped">
<tr>
<th>#</th>
<th>Preview</th>
<th>Name</th>
<th>Create Date</th>
<th></th>
</tr>
@foreach($galleries as $gallery)
<tr>
<td>{{ $gallery->id }}</td>
<td style="padding-top:5px;padding-bottom: 5px;">
@if($gallery->main_image == null)
<img src="/images/lens-3114729_1920.jpg" height="87px;">
@else
<img src="/{{ $tenant->url }}/{{ $gallery->url }}/{{ $gallery->main_image }}/file?size=small" height="87px;">
@endif
</td>
<td>{{ $gallery->name }}</td>
<td>{{ $gallery->gallery_create_time }}</td>
<td>
<div class="dropdown">
<button class="btn btn-primary dropdown-toggle" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Actions
</button>
<div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
<a class="dropdown-item" href="/g/{{$gallery->url}}/upload">Upload Images</a>
<a class="dropdown-item" href="#">Bilder</a>
<a class="dropdown-item" href="#">Delete</a>
</div>
</div>
</td>
</tr>
@endforeach
</table>
</div>
@endsection

View File

@ -0,0 +1,44 @@
@extends('layout/template')
@section('content')
<h1>Gallery</h1>
<div style="clear: both; margin-bottom: 10px;"></div>
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<div class="col-md-12">
<form method="post">
@csrf
<input name="name" value="{{ old('name') }}" placeholder="Name" class="form-control">
<textarea name="description" value="{{ old('description') }}" placeholder="Description" class="form-control"></textarea>
<div class="accordion" id="accordionExample">
<div class="card">
<div class="card-header" id="headingTwo">
<h2 class="mb-0">
<button class="btn btn-link btn-block text-left collapsed" type="button" data-toggle="collapse" data-target="#collapseTwo" aria-expanded="false" aria-controls="collapseTwo">
Advanced Settings
</button>
</h2>
</div>
<div id="collapseTwo" class="collapse" aria-labelledby="headingTwo" data-parent="#accordionExample">
<div class="card-body">
<input name="date" value="{{ old('date') }}" class="form-control" placeholder="Create Date (yyyy-mm-dd, today if empty)">
<input name="url" value="{{ old('url') }}" placeholder="URL" class="form-control">
</div>
</div>
</div>
</div>
<input type="submit" class="btn btn-outline-success" value="Create" style="margin-top: 10px;">
</form>
</div>
@endsection

View File

@ -0,0 +1,49 @@
@extends('layout/template')
@section('content')
<h1>Images</h1>
<p>Add Images to your gallery</p>
<div class="col-md-12">
<form action="php/upload.html" method="post" enctype="multipart/form-data">
<input type="file" name="files[]" id="filer_input" multiple="multiple">
</form>
<a href="#" class="btn btn-outline-success">Publish Gallery</a>
</div>
@endsection
@section('js')
<link href="/css/jquery.filer.css" type="text/css" rel="stylesheet" />
<link href="/css/themes/jquery.filer-dragdropbox-theme.css" type="text/css" rel="stylesheet" />
<script src="/js/jquery.filer.min.js"></script>
<script>
$(document).ready(function() {
$('#filer_input').filer({
addMore: true,
showThumbs: true,
fileMaxSize: 10,
uploadFile: {
url: null, //URL to which the request is sent {String}
data: null, //Data to be sent to the server {Object}
type: 'POST', //The type of request {String}
enctype: 'multipart/form-data', //Request enctype {String}
synchron: false, //Upload synchron the files
beforeSend: null, //A pre-request callback function {Function}
success: null, //A function to be called if the request succeeds {Function}
error: null, //A function to be called if the request fails {Function}
statusCode: null, //An object of numeric HTTP codes {Object}
onProgress: null, //A function called while uploading file with progress percentage {Function}
onComplete: null, //A function called when all files were uploaded {Function}
},
onRemove: function () {
alert("ToDo this feature dont work");
return false;
}
});
});
</script>
@endsection

View File

@ -0,0 +1,53 @@
<head>
<link rel="stylesheet" href="/css/bootstrap.min.css">
<link rel="stylesheet" href="/css/theme.css">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
</head>
<body>
<div class="wrapper">
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
<a class="navbar-brand" href="#">Kuvia</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarColor02" aria-controls="navbarColor02" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarColor02">
@auth
<ul class="navbar-nav mr-auto">
<li class="nav-item active">
<a class="nav-link" href="/d">Dashboard</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/g">Gallery</a>
</li>
</ul>
@endauth
<ul class="nav navbar-nav float-md-right">
@auth
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">Tenant</a>
<div class="dropdown-menu dropdown-menu-right">
@foreach($user_tenants as $tenant)
<a class="dropdown-item" href="/t/select/{{ $tenant->url }}">{{ $tenant->name }}</a>
@endforeach
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="/t/new">New Tenant</a>
</div>
</li>
@endauth
</ul>
</div>
</nav>
<div class="container-fluid" style="margin-top: 20px;">
@yield('content')
</div>
</div>
<script src="/js/jquery-3.5.1.min.js"></script>
<script src="/js/bootstrap.bundle.min.js"></script>
@yield('js')
</body>

View File

@ -1,102 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>AdminLTE 2 | Registration Page</title>
<!-- Tell the browser to be responsive to screen width -->
<meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
<!-- Bootstrap 3.3.7 -->
<link rel="stylesheet" href="../../bower_components/bootstrap/dist/css/bootstrap.min.css">
<!-- Font Awesome -->
<link rel="stylesheet" href="../../bower_components/font-awesome/css/font-awesome.min.css">
<!-- Ionicons -->
<link rel="stylesheet" href="../../bower_components/Ionicons/css/ionicons.min.css">
<!-- Theme style -->
<link rel="stylesheet" href="/assets/css/adminlte.min.css">
<!-- iCheck -->
<link rel="stylesheet" href="../../plugins/iCheck/square/blue.css">
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
<!-- Google Font -->
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,300italic,400italic,600italic">
</head>
<body class="hold-transition register-page">
<div class="register-box">
<div class="register-logo">
<a href="../../index2.html"><b>Admin</b>LTE</a>
</div>
<div class="register-box-body">
<p class="login-box-msg">Register a new membership</p>
<form action="../../index.html" method="post">
<div class="form-group has-feedback">
<input type="text" class="form-control" placeholder="Full name">
<span class="glyphicon glyphicon-user form-control-feedback"></span>
</div>
<div class="form-group has-feedback">
<input type="email" class="form-control" placeholder="Email">
<span class="glyphicon glyphicon-envelope form-control-feedback"></span>
</div>
<div class="form-group has-feedback">
<input type="password" class="form-control" placeholder="Password">
<span class="glyphicon glyphicon-lock form-control-feedback"></span>
</div>
<div class="form-group has-feedback">
<input type="password" class="form-control" placeholder="Retype password">
<span class="glyphicon glyphicon-log-in form-control-feedback"></span>
</div>
<div class="row">
<div class="col-xs-8">
<div class="checkbox icheck">
<label>
<input type="checkbox"> I agree to the <a href="#">terms</a>
</label>
</div>
</div>
<!-- /.col -->
<div class="col-xs-4">
<button type="submit" class="btn btn-primary btn-block btn-flat">Register</button>
</div>
<!-- /.col -->
</div>
</form>
<div class="social-auth-links text-center">
<p>- OR -</p>
<a href="#" class="btn btn-block btn-social btn-facebook btn-flat"><i class="fa fa-facebook"></i> Sign up using
Facebook</a>
<a href="#" class="btn btn-block btn-social btn-google btn-flat"><i class="fa fa-google-plus"></i> Sign up using
Google+</a>
</div>
<a href="login.html" class="text-center">I already have a membership</a>
</div>
<!-- /.form-box -->
</div>
<!-- /.register-box -->
<!-- jQuery 3 -->
<script src="../../bower_components/jquery/dist/jquery.min.js"></script>
<!-- Bootstrap 3.3.7 -->
<script src="../../bower_components/bootstrap/dist/js/bootstrap.min.js"></script>
<!-- iCheck -->
<script src="../../plugins/iCheck/icheck.min.js"></script>
<script>
$(function () {
$('input').iCheck({
checkboxClass: 'icheckbox_square-blue',
radioClass: 'iradio_square-blue',
increaseArea: '20%' /* optional */
});
});
</script>
</body>
</html>

View File

@ -0,0 +1,34 @@
@extends('layout/template')
@section('content')
<h1>New Tenant</h1>
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<form method="post">
<p>A Tenant contains a URL which can be called its www.kuvia.cloud/yourURL. Each Tenant is get seperate information about used space and used traffic.</p>
<p>Your default Tenant is the same like your username. You can create unlimited tenants.</p>
@csrf
<input class="form-control" value="{{ old('name') }}" name="name" placeholder="Name">
<input class="form-control" value="{{ old('url') }}" name="url" placeholder="URL">
<input type="submit" class="btn btn-outline-success" value="Create">
</form>
<div class="alert alert-dismissible alert-info">
<p>Idears for later:</p>
<ul>
<li>Tenants without url, just access via api</li>
<li>Private Tenants</li>
<li>Themes per Tenant</li>
<li>Multi users per tenant</li>
<li>Disabled Tenants for default user, they just get one when register, less confusion</li>
</ul>
</div>
@endsection

View File

@ -0,0 +1,28 @@
@extends('layout/template')
@section('content')
<div class="row">
<div class="col-md-12">
<h1>Galleries {{ $gallery->name }}</h1>
<div id="mygallery">
@foreach($images as $image)
<a href="/{{ $tenant->url }}/{{ $gallery->url }}/{{ $image->id }}/file">
<img style="height: 200px;" alt="{{ $image->filename }}" src="/{{ $tenant->url }}/{{ $gallery->url }}/{{ $image->id }}/file"/>
</a>
@endforeach
</div>
</div>
</div>
@endsection
@section('js')
<link rel="stylesheet" href="/css/jquery.justified.css" />
<script src="/js/jquery.justified.min.js"></script>
<script>
$("#mygallery").justifiedGallery({
rowHeight: 120,
});
</script>
@endsection

View File

@ -0,0 +1,10 @@
@extends('layout/template')
@section('content')
<h1>Galleries</h1>
@foreach($galleries as $gallery)
<ul>
<li><a href="/{{ $tenant->url }}/{{ $gallery->url }}">{{ $gallery->name }}</a></li>
</ul>
@endforeach
@endsection

View File

@ -2,6 +2,8 @@
use Illuminate\Support\Facades\Route;
/*
|--------------------------------------------------------------------------
| Web Routes
@ -13,6 +15,37 @@ use Illuminate\Support\Facades\Route;
|
*/
Route::get('/', function () {
return view('public.register');
$middlewareGroups = [
'private' => [
\App\Http\Middleware\TenanMiddleware::class
],
];
Route::get("/register", [\App\Http\Controllers\AccountController::class, 'registerView']);
Route::post("/register", [\App\Http\Controllers\AccountController::class, 'register']);
Route::get("/login", [\App\Http\Controllers\AccountController::class, 'loginView']);
Route::post("/login", [\App\Http\Controllers\AccountController::class, 'login']);
Route::middleware([\App\Http\Middleware\TenanMiddleware::class])->group(function () {
Route::get("/d", [\App\Http\Controllers\DashboardController::class, 'dashboardView']);
Route::get("/t/new", [\App\Http\Controllers\TenantController::class, 'newView']);
Route::post("/t/new", [\App\Http\Controllers\TenantController::class, 'newTenant']);
Route::get("/t/select/{name}", [\App\Http\Controllers\TenantController::class, 'switchTenant']);
Route::get("/g", [\App\Http\Controllers\GalleryController::class, 'listView']);
Route::get("/g/new", [\App\Http\Controllers\GalleryController::class, 'newView']);
Route::post("/g/new", [\App\Http\Controllers\GalleryController::class, 'newGallery']);
Route::get("/g/{url}/upload", [\App\Http\Controllers\GalleryController::class, 'imagesUploadView']);
Route::post("/g/{url}/upload", [\App\Http\Controllers\GalleryController::class, 'imageUpload']);
});
Route::get("/{name}", [\App\Http\Controllers\PublicController::class, 'listGalleriesView'])->middleware([\App\Http\Middleware\TenanMiddleware::class]);
Route::get("/{tenant}/{gallery}", [\App\Http\Controllers\PublicController::class, 'listGalleryImagesView'])->middleware([\App\Http\Middleware\TenanMiddleware::class]);
Route::get("/{tenant}/{gallery}/{image}/file", [\App\Http\Controllers\PublicController::class, 'returnImageFile']);
Route::get('/', function () {
return redirect("/login");
});

BIN
storage/cache/cache_1_1_10_big vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 KiB

BIN
storage/cache/cache_1_1_10_medium vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

BIN
storage/cache/cache_1_1_10_orginal vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 347 KiB

BIN
storage/cache/cache_1_1_10_small vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
storage/cache/cache_1_1_11_big vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 222 KiB

BIN
storage/cache/cache_1_1_11_medium vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

BIN
storage/cache/cache_1_1_11_orginal vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 338 KiB

BIN
storage/cache/cache_1_1_11_small vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
storage/cache/cache_1_1_12_big vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 159 KiB

BIN
storage/cache/cache_1_1_12_medium vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

BIN
storage/cache/cache_1_1_12_orginal vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 237 KiB

BIN
storage/cache/cache_1_1_12_small vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
storage/cache/cache_1_1_13_big vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 209 KiB

BIN
storage/cache/cache_1_1_13_medium vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

BIN
storage/cache/cache_1_1_13_orginal vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 303 KiB

BIN
storage/cache/cache_1_1_13_small vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
storage/cache/cache_1_1_14_big vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 214 KiB

BIN
storage/cache/cache_1_1_14_medium vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

BIN
storage/cache/cache_1_1_14_orginal vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 316 KiB

BIN
storage/cache/cache_1_1_14_small vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

BIN
storage/cache/cache_1_1_15_big vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 197 KiB

BIN
storage/cache/cache_1_1_15_medium vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

BIN
storage/cache/cache_1_1_15_orginal vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 283 KiB

BIN
storage/cache/cache_1_1_15_small vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Some files were not shown because too many files have changed in this diff Show More