change bib type
This commit is contained in:
parent
4b29ddd944
commit
f5f3d85150
@ -2,7 +2,7 @@
|
||||
kile_livePreviewEnabled=true
|
||||
kile_livePreviewStatusUserSpecified=true
|
||||
kile_livePreviewTool=LivePreview-XeLaTeX
|
||||
lastDocument=thesis.tex
|
||||
lastDocument=content/preparation.tex
|
||||
|
||||
[document-settings,item:../../thesis-template-latex/src/thesis.tex]
|
||||
Bookmarks=
|
||||
@ -112,36 +112,36 @@ open=true
|
||||
order=0
|
||||
|
||||
[item:content/acknowledgement.tex]
|
||||
open=true
|
||||
open=false
|
||||
order=1
|
||||
|
||||
[item:content/appendices.tex]
|
||||
open=true
|
||||
order=2
|
||||
order=6
|
||||
|
||||
[item:content/closing.tex]
|
||||
open=true
|
||||
order=3
|
||||
order=5
|
||||
|
||||
[item:content/create-functions.tex]
|
||||
open=true
|
||||
open=false
|
||||
order=4
|
||||
|
||||
[item:content/introduction.tex]
|
||||
open=true
|
||||
order=5
|
||||
order=1
|
||||
|
||||
[item:content/preparation.tex]
|
||||
open=true
|
||||
order=6
|
||||
order=3
|
||||
|
||||
[item:content/results.tex]
|
||||
open=true
|
||||
order=7
|
||||
order=4
|
||||
|
||||
[item:content/theory.tex]
|
||||
open=true
|
||||
order=8
|
||||
order=2
|
||||
|
||||
[item:thesis.kilepr]
|
||||
open=false
|
||||
@ -149,7 +149,7 @@ order=-1
|
||||
|
||||
[item:thesis.tex]
|
||||
open=true
|
||||
order=9
|
||||
order=7
|
||||
|
||||
[view-settings,view=0,item:../../thesis-template-latex/src/thesis.tex]
|
||||
CursorColumn=32
|
||||
@ -160,8 +160,8 @@ TextFolding=[]
|
||||
ViMarks=
|
||||
|
||||
[view-settings,view=0,item:content/abstract.tex]
|
||||
CursorColumn=0
|
||||
CursorLine=0
|
||||
CursorColumn=113
|
||||
CursorLine=12
|
||||
Dynamic Word Wrap=false
|
||||
JumpList=
|
||||
TextFolding=[]
|
||||
@ -176,28 +176,28 @@ TextFolding=[]
|
||||
ViMarks=
|
||||
|
||||
[view-settings,view=0,item:content/appendices.tex]
|
||||
CursorColumn=0
|
||||
CursorLine=0
|
||||
CursorColumn=29
|
||||
CursorLine=12
|
||||
Dynamic Word Wrap=false
|
||||
JumpList=
|
||||
TextFolding=[]
|
||||
ViMarks=
|
||||
ViMarks=.,12,28,[,12,28,],12,28
|
||||
|
||||
[view-settings,view=0,item:content/closing.tex]
|
||||
CursorColumn=0
|
||||
CursorLine=0
|
||||
CursorColumn=46
|
||||
CursorLine=4
|
||||
Dynamic Word Wrap=false
|
||||
JumpList=
|
||||
TextFolding=[]
|
||||
ViMarks=
|
||||
ViMarks=.,17,51,[,17,47,],17,51
|
||||
|
||||
[view-settings,view=0,item:content/create-functions.tex]
|
||||
CursorColumn=0
|
||||
CursorLine=0
|
||||
CursorLine=56
|
||||
Dynamic Word Wrap=false
|
||||
JumpList=
|
||||
TextFolding=[]
|
||||
ViMarks=
|
||||
ViMarks=.,32,310,[,32,307,],32,310
|
||||
|
||||
[view-settings,view=0,item:content/introduction.tex]
|
||||
CursorColumn=4
|
||||
@ -208,33 +208,33 @@ TextFolding=[]
|
||||
ViMarks=.,0,0,[,0,0,],0,26
|
||||
|
||||
[view-settings,view=0,item:content/preparation.tex]
|
||||
CursorColumn=0
|
||||
CursorLine=0
|
||||
CursorColumn=86
|
||||
CursorLine=20
|
||||
Dynamic Word Wrap=false
|
||||
JumpList=
|
||||
TextFolding=[]
|
||||
ViMarks=
|
||||
ViMarks=.,22,0,[,22,0,],22,0
|
||||
|
||||
[view-settings,view=0,item:content/results.tex]
|
||||
CursorColumn=0
|
||||
CursorLine=0
|
||||
CursorColumn=28
|
||||
CursorLine=4
|
||||
Dynamic Word Wrap=false
|
||||
JumpList=
|
||||
TextFolding=[]
|
||||
ViMarks=
|
||||
ViMarks=.,4,28,[,4,28,],4,28
|
||||
|
||||
[view-settings,view=0,item:content/theory.tex]
|
||||
CursorColumn=57
|
||||
CursorLine=28
|
||||
CursorColumn=20
|
||||
CursorLine=170
|
||||
Dynamic Word Wrap=false
|
||||
JumpList=
|
||||
TextFolding=[]
|
||||
ViMarks=.,115,0,[,115,0,],115,0
|
||||
ViMarks=.,168,203,[,168,203,],168,213
|
||||
|
||||
[view-settings,view=0,item:thesis.tex]
|
||||
CursorColumn=0
|
||||
CursorLine=3
|
||||
CursorColumn=29
|
||||
CursorLine=74
|
||||
Dynamic Word Wrap=false
|
||||
JumpList=
|
||||
TextFolding=[]
|
||||
ViMarks=.,3,0,[,3,0,],3,0
|
||||
ViMarks=.,102,0,[,102,0,],102,0
|
||||
|
@ -21,7 +21,7 @@
|
||||
title = {Docker overview}
|
||||
}
|
||||
|
||||
@manual{linux-namespaces,
|
||||
@misc{linux-namespaces,
|
||||
howpublished = {http://man7.org/linux/man-pages/man7/namespaces.7.html},
|
||||
note = {Megtekintve 2019-12-04},
|
||||
title = {namespaces - overview of Linux namespaces}
|
||||
@ -40,55 +40,55 @@
|
||||
title = {A microservice architekt{\'u}r{\'a}r{\'o}l di{\'o}h{\'e}jban}
|
||||
}
|
||||
|
||||
@manual{kubernetes-pods,
|
||||
@misc{kubernetes-pods,
|
||||
howpublished = {https://kubernetes.io/docs/concepts/workloads/pods/pod/},
|
||||
note = {Megtekintve 2019-12-04},
|
||||
title = {Pods}
|
||||
}
|
||||
|
||||
@manual{kubernetes-replicaset,
|
||||
@misc{kubernetes-replicaset,
|
||||
howpublished = {https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/},
|
||||
note = {Megtekintve 2019-12-04},
|
||||
title = {ReplicaSet}
|
||||
}
|
||||
|
||||
@manual{kubernetes-deployment,
|
||||
@misc{kubernetes-deployment,
|
||||
howpublished = {https://kubernetes.io/docs/concepts/workloads/controllers/deployment/},
|
||||
note = {Megtekintve 2019-12-04},
|
||||
title = {Deployments}
|
||||
}
|
||||
|
||||
@manual{kubernetes-crd,
|
||||
@misc{kubernetes-crd,
|
||||
howpublished = {https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/},
|
||||
note = {Megtekintve 2019-12-04},
|
||||
title = {Extend the Kubernetes API with CustomResourceDefinitions}
|
||||
}
|
||||
|
||||
@manual{kubernetes-hpa,
|
||||
@misc{kubernetes-hpa,
|
||||
howpublished = {https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/},
|
||||
note = {Megtekintve 2019-12-04},
|
||||
title = {Horizontal Pod Autoscaler}
|
||||
}
|
||||
|
||||
@manual{kubeless-http,
|
||||
@misc{kubeless-http,
|
||||
howpublished = {https://kubeless.io/docs/http-triggers/},
|
||||
note = {Megtekintve 2019-12-04},
|
||||
title = {Expose and secure Kubeless functions}
|
||||
}
|
||||
|
||||
@manual{kubeless-pubsub,
|
||||
@misc{kubeless-pubsub,
|
||||
howpublished = {https://kubeless.io/docs/pubsub-functions/},
|
||||
note = {Megtekintve 2019-12-04},
|
||||
title = {PubSub events}
|
||||
}
|
||||
|
||||
@manual{kubernetes-ingress,
|
||||
@misc{kubernetes-ingress,
|
||||
howpublished = {https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/},
|
||||
note = {Megtekintve 2019-12-04},
|
||||
title = {Ingress Controllers}
|
||||
}
|
||||
|
||||
@manual{kubernetes-nginx,
|
||||
@misc{kubernetes-nginx,
|
||||
howpublished = {https://kubernetes.github.io/ingress-nginx/},
|
||||
note = {Megtekintve 2019-12-04},
|
||||
title = {NGINX Ingress Controller}
|
||||
@ -100,7 +100,7 @@
|
||||
title = {Metrics server issue with hostname resolution of kubelet and apiserver unable to communicate with metric-server clusterIP}
|
||||
}
|
||||
|
||||
@manual{kubeless-quickstart,
|
||||
@misc{kubeless-quickstart,
|
||||
howpublished = {https://kubeless.io/docs/quick-start/},
|
||||
note = {Megtekintve 2019-12-04},
|
||||
title = {Installation}
|
||||
@ -118,31 +118,31 @@
|
||||
title = {Modern HTTP benchmarking tool}
|
||||
}
|
||||
|
||||
@manual{docker-logging,
|
||||
@misc{docker-logging,
|
||||
howpublished = {https://docs.docker.com/config/containers/logging/configure/},
|
||||
note = {Megtekintve 2019-12-04},
|
||||
title = {Configure logging drivers}
|
||||
}
|
||||
|
||||
@manual{kubernetes-ephemeral-storage,
|
||||
@misc{kubernetes-ephemeral-storage,
|
||||
howpublished = {https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/\#local-ephemeral-storage},
|
||||
note = {Megtekintve 2019-12-04},
|
||||
title = {Managing Compute Resources for Containers - Local ephemeral storage}
|
||||
}
|
||||
|
||||
@manual{kubernetes-eviction,
|
||||
@misc{kubernetes-eviction,
|
||||
howpublished = {https://kubernetes.io/docs/tasks/administer-cluster/out-of-resource/\#eviction-policy},
|
||||
note = {Megtekintve 2019-12-04},
|
||||
title = {Configure Out of Resource Handling - Eviction Policy}
|
||||
}
|
||||
|
||||
@manual{kubernetes-nodes,
|
||||
@misc{kubernetes-nodes,
|
||||
howpublished = {https://kubernetes.io/docs/concepts/architecture/nodes/},
|
||||
note = {Megtekintve 2019-12-04},
|
||||
title = {Nodes}
|
||||
}
|
||||
|
||||
@manual{kubernetes-kubelet,
|
||||
@misc{kubernetes-kubelet,
|
||||
howpublished = {https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/},
|
||||
note = {Megtekintve 2019-12-04},
|
||||
title = {kubelet}
|
||||
@ -184,85 +184,85 @@
|
||||
title = {Operating System (OS) Virtualization}
|
||||
}
|
||||
|
||||
@manual{docker-layers,
|
||||
@misc{docker-layers,
|
||||
howpublished = {https://medium.com/@jessgreb01/digging-into-docker-layers-c22f948ed612},
|
||||
note = {Megtekintve 2019-12-04},
|
||||
title = {Digging into Docker layers}
|
||||
}
|
||||
|
||||
@manual{kubernetes-runtimes,
|
||||
@misc{kubernetes-runtimes,
|
||||
howpublished = {https://kubernetes.io/docs/setup/production-environment/container-runtimes/},
|
||||
note = {Megtekintve 2019-12-04},
|
||||
title = {Container runtimes}
|
||||
}
|
||||
|
||||
@manual{kubernetes-concepts,
|
||||
@misc{kubernetes-concepts,
|
||||
howpublished = {https://kubernetes.io/docs/concepts/},
|
||||
note = {Megtekintve 2019-12-04},
|
||||
title = {Concepts}
|
||||
}
|
||||
|
||||
@manual{kube-apiserver,
|
||||
@misc{kube-apiserver,
|
||||
howpublished = {https://kubernetes.io/docs/reference/command-line-tools-reference/kube-apiserver/},
|
||||
note = {Megtekintve 2019-12-04},
|
||||
title = {kube-apiserver}
|
||||
}
|
||||
|
||||
@manual{etcd,
|
||||
@misc{etcd,
|
||||
howpublished = {https://etcd.io/docs/v3.4.0/learning/data\_model/},
|
||||
note = {Megtekintve 2019-12-04},
|
||||
title = {Data model}
|
||||
}
|
||||
|
||||
@manual{kubernetes-api,
|
||||
@misc{kubernetes-api,
|
||||
howpublished = {https://kubernetes.io/docs/concepts/overview/kubernetes-api/},
|
||||
note = {Megtekintve 2019-12-04},
|
||||
title = {The Kubernetes API}
|
||||
}
|
||||
|
||||
@manual{kuebrnetes-controller,
|
||||
@misc{kuebrnetes-controller,
|
||||
howpublished = {https://kubernetes.io/docs/concepts/architecture/controller/},
|
||||
note = {Megtekintve 2019-12-04},
|
||||
title = {Controllers}
|
||||
}
|
||||
|
||||
@manual{kubernetes-node-controller,
|
||||
@misc{kubernetes-node-controller,
|
||||
howpublished = {https://unofficial-kubernetes.readthedocs.io/en/latest/concepts/nodes/node/\#node-controller},
|
||||
note = {Megtekintve 2019-12-04},
|
||||
title = {Node - Node Controller}
|
||||
}
|
||||
|
||||
@manual{kuebrnetes-components,
|
||||
@misc{kuebrnetes-components,
|
||||
howpublished = {https://kubernetes.io/docs/concepts/overview/components/},
|
||||
note = {Megtekintve 2019-12-04},
|
||||
title = {Kubernetes Components}
|
||||
}
|
||||
|
||||
@manual{kubernetes-scheduler,
|
||||
@misc{kubernetes-scheduler,
|
||||
howpublished = {https://kubernetes.io/docs/concepts/scheduling/kube-scheduler/},
|
||||
note = {Megtekintve 2019-12-04},
|
||||
title = {Kubernetes Scheduler}
|
||||
}
|
||||
|
||||
@manual{kubernetes-kube-proxy,
|
||||
@misc{kubernetes-kube-proxy,
|
||||
howpublished = {https://kubernetes.io/docs/reference/command-line-tools-reference/kube-proxy/},
|
||||
note = {Megtekintve 2019-12-04},
|
||||
title = {kube-proxy}
|
||||
}
|
||||
|
||||
@manual{kubernetes-service,
|
||||
@misc{kubernetes-service,
|
||||
howpublished = {https://kubernetes.io/docs/concepts/services-networking/service/},
|
||||
note = {Megtekintve 2019-12-04},
|
||||
title = {Service}
|
||||
}
|
||||
|
||||
@manual{kubernetes-volume,
|
||||
@misc{kubernetes-volume,
|
||||
howpublished = {https://kubernetes.io/docs/concepts/storage/volumes/},
|
||||
note = {Megtekintve 2019-12-04},
|
||||
title = {Volumes}
|
||||
}
|
||||
|
||||
@manual{kubernetes-ingress-resource,
|
||||
@misc{kubernetes-ingress-resource,
|
||||
howpublished = {https://kubernetes.io/docs/concepts/services-networking/ingress/},
|
||||
note = {Megtekintve 2019-12-04},
|
||||
title = {Ingress}
|
||||
@ -274,31 +274,31 @@
|
||||
title = {Kubeless --- Kubernetes Native Serverless Framework}
|
||||
}
|
||||
|
||||
@manual{kubeless-api-deploy,
|
||||
@misc{kubeless-api-deploy,
|
||||
howpublished = {https://kubeless.io/docs/advanced-function-deployment/},
|
||||
note = {Megtekintve 2019-12-04},
|
||||
title = {Deploying Kubeless Functions using Kubernetes API}
|
||||
}
|
||||
|
||||
@manual{kubeless-build,
|
||||
@misc{kubeless-build,
|
||||
howpublished = {https://kubeless.io/docs/building-functions/},
|
||||
note = {Megtekintve 2019-12-04},
|
||||
title = {Build process for functions}
|
||||
}
|
||||
|
||||
@manual{istio-service-mesh,
|
||||
@misc{istio-service-mesh,
|
||||
howpublished = {https://istio.io/docs/concepts/what-is-istio/},
|
||||
note = {Megtekintve 2019-12-04},
|
||||
title = {What is Istio?}
|
||||
}
|
||||
|
||||
@manual{istio-observer,
|
||||
@misc{istio-observer,
|
||||
howpublished = {https://istio.io/docs/concepts/observability/},
|
||||
note = {Megtekintve 2019-12-04},
|
||||
title = {Observability}
|
||||
}
|
||||
|
||||
@manual{istio-mgmt,
|
||||
@misc{istio-mgmt,
|
||||
howpublished = {https://istio.io/docs/concepts/traffic-management/},
|
||||
note = {Megtekintve 2019-12-04},
|
||||
title = {Traffic Management}
|
||||
@ -310,13 +310,13 @@
|
||||
title = {What is Knative, and What Can It Do for You?}
|
||||
}
|
||||
|
||||
@manual{knative-serving,
|
||||
@misc{knative-serving,
|
||||
howpublished = {https://knative.dev/docs/serving/},
|
||||
note = {Megtekintve 2019-12-04},
|
||||
title = {Knative Serving}
|
||||
}
|
||||
|
||||
@manual{knative-eventing,
|
||||
@misc{knative-eventing,
|
||||
howpublished = {https://knative.dev/docs/eventing/},
|
||||
note = {Megtekintve 2019-12-04},
|
||||
title = {Knative Eventing}
|
||||
@ -328,19 +328,19 @@
|
||||
title = {Knative serverless Kubernetes bypasses FaaS to revive PaaS}
|
||||
}
|
||||
|
||||
@manual{knative-gateweay,
|
||||
@misc{knative-gateweay,
|
||||
howpublished = {https://knative.dev/v0.9-docs/serving/samples/knative-routing-go/},
|
||||
note = {Megtekintve 2019-12-04},
|
||||
title = {Routing across multiple Knative services - Go}
|
||||
}
|
||||
|
||||
@manual{knative-autoscaler,
|
||||
@misc{knative-autoscaler,
|
||||
howpublished = {https://knative.dev/docs/serving/configuring-the-autoscaler/},
|
||||
note = {Megtekintve 2019-12-04},
|
||||
title = {Configuring the Autoscaler}
|
||||
}
|
||||
|
||||
@manual{knative-autoscaler-component,
|
||||
@misc{knative-autoscaler-component,
|
||||
howpublished = {https://github.com/knative/serving/blob/master/docs/scaling/DEVELOPMENT.md},
|
||||
note = {Megtekintve 2019-12-04},
|
||||
title = {Autoscaling}
|
||||
@ -352,13 +352,13 @@
|
||||
title = {Gloo, by Solo.io, is the first alternative to Istio on Knative}
|
||||
}
|
||||
|
||||
@manual{knative-monitoring,
|
||||
@misc{knative-monitoring,
|
||||
howpublished = {https://github.com/knative/docs/blob/master/docs/serving/accessing-metrics.md},
|
||||
note = {Megtekintve 2019-12-04},
|
||||
title = {Accessing Metrics}
|
||||
}
|
||||
|
||||
@manual{knative-crd,
|
||||
@misc{knative-crd,
|
||||
howpublished = {https://github.com/knative/serving/blob/master/docs/spec/overview.md},
|
||||
note = {Megtekintve 2019-12-04},
|
||||
title = {Resource Types}
|
||||
|
@ -54,7 +54,7 @@ Az API-Server szolgálja ki a Kubernetes API-t \cite{kubernetes-api} , amelyen k
|
||||
A CoreOS által fejlesztett, nyílt forráskódú elosztott kulcs-érték tár \cite{etcd} . Itt kerül tárolásra, illetve innen lehet lekérdezni a klaszter, valamint az egyes komponensek állapotát. Egyes komponensek figyelik az itt található, nekik fontos kulcsokhoz tartozó értékeket, változás esetén elvégzik az esetleges módosításokat.
|
||||
|
||||
\subsection{Controller Manager}
|
||||
Logikailag különböző kontrollereket összefoglaló komponens \cite{kubernetes-controller} . Az alábbi kontrollereket a komplexitás csökkentése érdekében fordították egy binárisba:
|
||||
Logikailag különböző kontrollereket összefoglaló komponens \cite{kuebrnetes-controller} . Az alábbi kontrollereket a komplexitás csökkentése érdekében fordították egy binárisba:
|
||||
|
||||
\begin{itemize}
|
||||
\item Node Controller \cite{kubernetes-node-controller} : Egyes Node-ok \cite{kubernetes-nodes} elérhetetlenné válásának figyeléséért, erre történő reagálásért felelős.
|
||||
@ -156,7 +156,7 @@ Szakdolgozatomban, közvetve, az Istio terheléskiegyenlítő szolgáltatását
|
||||
\section{Knative}
|
||||
A Knative \cite{knative} egy nyílt forráskódú, a Google által fejlesztett keretrendszer, amely a Kubernetesnél magasabb szintű absztrakciókat nyújt. Számos komponenséből a szakdolgozatban a serverless applikációk Kubernetes-be telepítését, futtatását megkönnyítő, úgynevezett Serving \cite{knative-serving} modult vizsgálom. Ezen kívül létezik még egy Eventing \cite{knative-eventing} komponens, amely eseményvezérelt alkalmazások fejlesztéséhez biztosít segédeszközöket, valamint megold bizonyos gyakori problémákat.
|
||||
|
||||
Nem kifejezetten Function as a Service megoldásról van szó \cite{kubeless-thoughts} , a nullára skálázás miatt emlegetik a Platform as a Service infrastruktúrák következő generációjaként, de funkcionalitása és működése remekül illeszkedik a FaaS szolgáltatásmodellhez is. Emellett a Kubernetesben már futó alkalmazásokat Knative-ba átrakni nem jelent szignifikáns munkát. Az érintett komponensek módosítására nincs szükség, csupán a Deploymenteket kell Knative Service-ekre átírni. Ezzel szemben a plusz funkciók, melyeket az átállással ki lehet használni jelentős előnyt jelentenek.
|
||||
Nem kifejezetten Function as a Service megoldásról van szó \cite{knative-thoughts} , a nullára skálázás miatt emlegetik a Platform as a Service infrastruktúrák következő generációjaként, de funkcionalitása és működése remekül illeszkedik a FaaS szolgáltatásmodellhez is. Emellett a Kubernetesben már futó alkalmazásokat Knative-ba átrakni nem jelent szignifikáns munkát. Az érintett komponensek módosítására nincs szükség, csupán a Deploymenteket kell Knative Service-ekre átírni. Ezzel szemben a plusz funkciók, melyeket az átállással ki lehet használni jelentős előnyt jelentenek.
|
||||
|
||||
Lényeges újítás a tradicionális Kubernetes-hez képest az egyes alkalmazáskomponensek nullára skálázása, valamint a konkurencia alapú skálázás. Mindkettőt a magasabb szintű absztrakció teszi lehetővé, ugyanis bár ezek Knative nélkül is elképzelhető funkciók, ezek megvalósítása számos extra komponens bevezetését igényelné. A nullára skálázáshoz szükséges egy perzisztensen létező egység, a Knative esetében az Istio, valamint a Knative Shared Gateway \cite{knative-gateweay} nevű komponens töltik be ezen egység szerepét. Konkurencia alapú skálázás esetében is ugyanez a komponens végzi a kérések elosztását. Az egy Podra eső átlagos konkurens kérések megfigyeléséért egy úgynevezett Knative Autoscaler \cite{knative-autoscaler} felel. Ez az egység hozza a fel és leskálázási döntéseket, valamint a megfigyelt konkurencia érték alapján a pánik ablak kezdetét és végét.
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
[General]
|
||||
bib_extensions=.bib
|
||||
bibliographyBackendAutoDetected=
|
||||
bibliographyBackendUserOverride=
|
||||
bibliographyBackendUserOverride=BibTeX
|
||||
def_graphic_ext=
|
||||
img_extIsRegExp=false
|
||||
img_extensions=.eps .jpg .jpeg .png .pdf .ps .fig .gif
|
||||
|
Loading…
Reference in New Issue
Block a user