Commit d3504139 authored by Amy Qualls's avatar Amy Qualls Committed by Craig Norris

Resolve yet more spelling issues

Whatever's needed: fix spelling, wrap in code tags, add words to
exceptions file, rephrase. Just get it done.
parent eb88ec5b
...@@ -582,11 +582,14 @@ swimlane ...@@ -582,11 +582,14 @@ swimlane
swimlanes swimlanes
syncable syncable
Sysbench Sysbench
syscall
syscalls
syslog syslog
tanuki tanuki
tcpdump tcpdump
templated templated
Thanos Thanos
Thoughtbot
throughputs throughputs
Tiller Tiller
timebox timebox
...@@ -605,6 +608,7 @@ toolkits ...@@ -605,6 +608,7 @@ toolkits
tooltip tooltip
tooltips tooltips
transpile transpile
transpiled
transpiles transpiles
transpiling transpiling
Trello Trello
...@@ -636,6 +640,7 @@ unchecks ...@@ -636,6 +640,7 @@ unchecks
uncomment uncomment
uncommented uncommented
uncommenting uncommenting
uncordon
unencode unencode
unencoded unencoded
unencoder unencoder
......
...@@ -88,7 +88,7 @@ and they will assist you with any issues you are having. ...@@ -88,7 +88,7 @@ and they will assist you with any issues you are having.
- Minimal configuration that can be used to [test a Kubernetes Helm chart](https://gitlab.com/gitlab-org/charts/gitlab/-/issues/620). - Minimal configuration that can be used to [test a Kubernetes Helm chart](https://gitlab.com/gitlab-org/charts/gitlab/-/issues/620).
- Tailing logs of a separate pod. An example for a Webservice pod: - Tailing logs of a separate pod. An example for a `webservice` pod:
```shell ```shell
kubectl logs gitlab-webservice-54fbf6698b-hpckq -c webservice kubectl logs gitlab-webservice-54fbf6698b-hpckq -c webservice
......
...@@ -302,7 +302,7 @@ listed in the descriptions of the relevant settings. ...@@ -302,7 +302,7 @@ listed in the descriptions of the relevant settings.
| `housekeeping_incremental_repack_period` | integer | required by: `housekeeping_enabled` | Number of Git pushes after which an incremental `git repack` is run. | | `housekeeping_incremental_repack_period` | integer | required by: `housekeeping_enabled` | Number of Git pushes after which an incremental `git repack` is run. |
| `html_emails_enabled` | boolean | no | Enable HTML emails. | | `html_emails_enabled` | boolean | no | Enable HTML emails. |
| `import_sources` | array of strings | no | Sources to allow project import from, possible values: `github`, `bitbucket`, `bitbucket_server`, `gitlab`, `fogbugz`, `git`, `gitlab_project`, `gitea`, `manifest`, and `phabricator`. | | `import_sources` | array of strings | no | Sources to allow project import from, possible values: `github`, `bitbucket`, `bitbucket_server`, `gitlab`, `fogbugz`, `git`, `gitlab_project`, `gitea`, `manifest`, and `phabricator`. |
| `invisible_captcha_enabled` | boolean | no | Enable Invisible Captcha spam detection during sign-up. Disabled by default. | | `invisible_captcha_enabled` | boolean | no | <!-- vale gitlab.Spelling = NO --> Enable Invisible Captcha <!-- vale gitlab.Spelling = YES --> spam detection during sign-up. Disabled by default. |
| `issues_create_limit` | integer | no | Max number of issue creation requests per minute per user. Disabled by default.| | `issues_create_limit` | integer | no | Max number of issue creation requests per minute per user. Disabled by default.|
| `local_markdown_version` | integer | no | Increase this value when any cached Markdown should be invalidated. | | `local_markdown_version` | integer | no | Increase this value when any cached Markdown should be invalidated. |
| `maintenance_mode_message` | string | no | **(PREMIUM)** Message displayed when instance is in maintenance mode | | `maintenance_mode_message` | string | no | **(PREMIUM)** Message displayed when instance is in maintenance mode |
......
...@@ -6,7 +6,9 @@ type: reference ...@@ -6,7 +6,9 @@ type: reference
--- ---
<!-- markdownlint-disable MD044 --> <!-- markdownlint-disable MD044 -->
<!-- vale gitlab.Spelling = NO -->
# Keyword reference for the .gitlab-ci.yml file # Keyword reference for the .gitlab-ci.yml file
<!-- vale gitlab.Spelling = YES -->
<!-- markdownlint-enable MD044 --> <!-- markdownlint-enable MD044 -->
This document lists the configuration options for your GitLab `.gitlab-ci.yml` file. This document lists the configuration options for your GitLab `.gitlab-ci.yml` file.
...@@ -1403,7 +1405,7 @@ job: ...@@ -1403,7 +1405,7 @@ job:
- spec/**.rb - spec/**.rb
``` ```
Glob patterns are interpreted with Ruby [File.fnmatch](https://docs.ruby-lang.org/en/2.7.0/File.html#method-c-fnmatch) Glob patterns are interpreted with Ruby [`File.fnmatch`](https://docs.ruby-lang.org/en/2.7.0/File.html#method-c-fnmatch)
with the flags `File::FNM_PATHNAME | File::FNM_DOTMATCH | File::FNM_EXTGLOB`. with the flags `File::FNM_PATHNAME | File::FNM_DOTMATCH | File::FNM_EXTGLOB`.
For performance reasons, GitLab matches a maximum of 10,000 `exists` patterns. After the 10,000th check, rules with patterned globs always match. For performance reasons, GitLab matches a maximum of 10,000 `exists` patterns. After the 10,000th check, rules with patterned globs always match.
......
...@@ -146,7 +146,7 @@ As we increase the number of runners in the pool we also increase the chances of ...@@ -146,7 +146,7 @@ As we increase the number of runners in the pool we also increase the chances of
## The definition of "Job" in GitLab CI/CD ## The definition of "Job" in GitLab CI/CD
"Job" in GitLab CI context refers a task to drive Continuous Integartion, Delivery and Deployment. "Job" in GitLab CI context refers a task to drive Continuous Integration, Delivery and Deployment.
Typically, a pipeline contains multiple stages, and a stage contains multiple jobs. Typically, a pipeline contains multiple stages, and a stage contains multiple jobs.
In Active Record modeling, Job is defined as `CommitStatus` class. In Active Record modeling, Job is defined as `CommitStatus` class.
...@@ -164,4 +164,4 @@ we should use "Job" in general, instead of "Build". ...@@ -164,4 +164,4 @@ we should use "Job" in general, instead of "Build".
We have a few inconsistencies in our codebase that should be refactored. We have a few inconsistencies in our codebase that should be refactored.
For example, `CommitStatus` should be `Ci::Job` and `Ci::JobArtifact` should be `Ci::BuildArtifact`. For example, `CommitStatus` should be `Ci::Job` and `Ci::JobArtifact` should be `Ci::BuildArtifact`.
Please read [this isse](https://gitlab.com/gitlab-org/gitlab/-/issues/16111) for the full refactoring plan. See [this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/16111) for the full refactoring plan.
...@@ -36,7 +36,7 @@ validations and index creation while it allows reads and writes). ...@@ -36,7 +36,7 @@ validations and index creation while it allows reads and writes).
### Exceptions ### Exceptions
Text columns used by `attr_encrypted` are not required to have a limit, becuase the length of the Text columns used by `attr_encrypted` are not required to have a limit, because the length of the
text after encryption may be longer than the text itself. Instead, you can use an Active Record text after encryption may be longer than the text itself. Instead, you can use an Active Record
length validation on the attribute. length validation on the attribute.
......
...@@ -166,9 +166,9 @@ still having access the class's implementation with `super`. ...@@ -166,9 +166,9 @@ still having access the class's implementation with `super`.
There are a few gotchas with it: There are a few gotchas with it:
- you should always [`extend ::Gitlab::Utils::Override`](utilities.md#override) and use `override` to - you should always [`extend ::Gitlab::Utils::Override`](utilities.md#override) and use `override` to
guard the "overrider" method to ensure that if the method gets renamed in guard the `overrider` method to ensure that if the method gets renamed in
CE, the EE override isn't silently forgotten. CE, the EE override isn't silently forgotten.
- when the "overrider" would add a line in the middle of the CE - when the `overrider` would add a line in the middle of the CE
implementation, you should refactor the CE method and split it in implementation, you should refactor the CE method and split it in
smaller methods. Or create a "hook" method that is empty in CE, smaller methods. Or create a "hook" method that is empty in CE,
and with the EE-specific implementation in EE. and with the EE-specific implementation in EE.
...@@ -971,7 +971,7 @@ information on managing page-specific JavaScript within EE. ...@@ -971,7 +971,7 @@ information on managing page-specific JavaScript within EE.
#### Child Component only used in EE #### Child Component only used in EE
To separate Vue template differences we should [async import the components](https://vuejs.org/v2/guide/components-dynamic-async.html#Async-Components). To separate Vue template differences we should [import the components asynchronously](https://vuejs.org/v2/guide/components-dynamic-async.html#Async-Components).
Doing this allows for us to load the correct component in EE while in CE Doing this allows for us to load the correct component in EE while in CE
we can load a empty component that renders nothing. This code **should** we can load a empty component that renders nothing. This code **should**
...@@ -1068,7 +1068,7 @@ export default { ...@@ -1068,7 +1068,7 @@ export default {
**For EE components that need different results for the same computed values, we can pass in props to the CE wrapper as seen in the example.** **For EE components that need different results for the same computed values, we can pass in props to the CE wrapper as seen in the example.**
- **EE Child components** - **EE Child components**
- Since we are using the async loading to check which component to load, we'd still use the component's name, check [this example](#child-component-only-used-in-ee). - Since we are using the asynchronous loading to check which component to load, we'd still use the component's name, check [this example](#child-component-only-used-in-ee).
- **EE extra HTML** - **EE extra HTML**
- For the templates that have extra HTML in EE we should move it into a new component and use the `ee_else_ce` dynamic import - For the templates that have extra HTML in EE we should move it into a new component and use the `ee_else_ce` dynamic import
......
...@@ -210,7 +210,7 @@ class MigrationName < Elastic::Migration ...@@ -210,7 +210,7 @@ class MigrationName < Elastic::Migration
end end
``` ```
Applied migrations are stored in `gitlab-#{RAILS_ENV}-migrations` index. All unexecuted migrations Applied migrations are stored in `gitlab-#{RAILS_ENV}-migrations` index. All migrations not executed
are applied by the [`Elastic::MigrationWorker`](https://gitlab.com/gitlab-org/gitlab/blob/master/ee/app/workers/elastic/migration_worker.rb) are applied by the [`Elastic::MigrationWorker`](https://gitlab.com/gitlab-org/gitlab/blob/master/ee/app/workers/elastic/migration_worker.rb)
cron worker sequentially. cron worker sequentially.
......
...@@ -44,7 +44,7 @@ addressed. ...@@ -44,7 +44,7 @@ addressed.
> - It is not yet intended for use in GitLab self-managed instances. > - It is not yet intended for use in GitLab self-managed instances.
[GitLab Experiment](https://gitlab.com/gitlab-org/gitlab-experiment/) is a gem included [GitLab Experiment](https://gitlab.com/gitlab-org/gitlab-experiment/) is a gem included
in GitLab that can be used for running experiments. in GitLab that can be used for running experiments.
## How to create an A/B test using `experimentation.rb` ## How to create an A/B test using `experimentation.rb`
...@@ -368,7 +368,7 @@ Use a comma to list more than one experiment to be forced: ...@@ -368,7 +368,7 @@ Use a comma to list more than one experiment to be forced:
document.cookie = "force_experiment=<EXPERIMENT_KEY>,<ANOTHER_EXPERIMENT_KEY>; path=/"; document.cookie = "force_experiment=<EXPERIMENT_KEY>,<ANOTHER_EXPERIMENT_KEY>; path=/";
``` ```
Clear the experiments by unsetting the `force_experiment` cookie: To clear the experiments, unset the `force_experiment` cookie:
```javascript ```javascript
document.cookie = "force_experiment=; path=/"; document.cookie = "force_experiment=; path=/";
......
...@@ -18,6 +18,8 @@ info: "See the Technical Writers assigned to Development Guidelines: https://abo ...@@ -18,6 +18,8 @@ info: "See the Technical Writers assigned to Development Guidelines: https://abo
**GraphQL at GitLab**: **GraphQL at GitLab**:
<!-- vale gitlab.Spelling = NO -->
- <i class="fa fa-youtube-play youtube" aria-hidden="true"></i> [GitLab Unfiltered GraphQL playlist](https://www.youtube.com/watch?v=wHPKZBDMfxE&list=PL05JrBw4t0KpcjeHjaRMB7IGB2oDWyJzv) - <i class="fa fa-youtube-play youtube" aria-hidden="true"></i> [GitLab Unfiltered GraphQL playlist](https://www.youtube.com/watch?v=wHPKZBDMfxE&list=PL05JrBw4t0KpcjeHjaRMB7IGB2oDWyJzv)
- <i class="fa fa-youtube-play youtube" aria-hidden="true"></i> [GraphQL at GitLab: Deep Dive](../api_graphql_styleguide.md#deep-dive) (video) by Nick Thomas - <i class="fa fa-youtube-play youtube" aria-hidden="true"></i> [GraphQL at GitLab: Deep Dive](../api_graphql_styleguide.md#deep-dive) (video) by Nick Thomas
- An overview of the history of GraphQL at GitLab (not frontend-specific) - An overview of the history of GraphQL at GitLab (not frontend-specific)
...@@ -29,6 +31,8 @@ info: "See the Technical Writers assigned to Development Guidelines: https://abo ...@@ -29,6 +31,8 @@ info: "See the Technical Writers assigned to Development Guidelines: https://abo
- [🛠 Vuex -> Apollo Migration: a proof-of-concept project](https://gitlab.com/ntepluhina/vuex-to-apollo/blob/master/README.md) - [🛠 Vuex -> Apollo Migration: a proof-of-concept project](https://gitlab.com/ntepluhina/vuex-to-apollo/blob/master/README.md)
- A collection of examples that show the possible approaches for state management with Vue+GraphQL+(Vuex or Apollo) apps - A collection of examples that show the possible approaches for state management with Vue+GraphQL+(Vuex or Apollo) apps
<!-- vale gitlab.Spelling = YES -->
### Libraries ### Libraries
We use [Apollo](https://www.apollographql.com/) (specifically [Apollo Client](https://www.apollographql.com/docs/react/)) and [Vue Apollo](https://github.com/vuejs/vue-apollo) We use [Apollo](https://www.apollographql.com/) (specifically [Apollo Client](https://www.apollographql.com/docs/react/)) and [Vue Apollo](https://github.com/vuejs/vue-apollo)
...@@ -39,13 +43,21 @@ can help you learn how to integrate Vue Apollo. ...@@ -39,13 +43,21 @@ can help you learn how to integrate Vue Apollo.
For other use cases, check out the [Usage outside of Vue](#usage-outside-of-vue) section. For other use cases, check out the [Usage outside of Vue](#usage-outside-of-vue) section.
<!-- vale gitlab.Spelling = NO -->
We use [Immer](https://immerjs.github.io/immer/docs/introduction) for immutable cache updates; We use [Immer](https://immerjs.github.io/immer/docs/introduction) for immutable cache updates;
see [Immutability and cache updates](#immutability-and-cache-updates) for more information. see [Immutability and cache updates](#immutability-and-cache-updates) for more information.
<!-- vale gitlab.Spelling = YES -->
### Tooling ### Tooling
<!-- vale gitlab.Spelling = NO -->
- [Apollo Client Devtools](https://github.com/apollographql/apollo-client-devtools) - [Apollo Client Devtools](https://github.com/apollographql/apollo-client-devtools)
<!-- vale gitlab.Spelling = YES -->
#### [Apollo GraphQL VS Code extension](https://marketplace.visualstudio.com/items?itemName=apollographql.vscode-apollo) #### [Apollo GraphQL VS Code extension](https://marketplace.visualstudio.com/items?itemName=apollographql.vscode-apollo)
If you use VS Code, the Apollo GraphQL extension supports autocompletion in `.graphql` files. To set up If you use VS Code, the Apollo GraphQL extension supports autocompletion in `.graphql` files. To set up
...@@ -160,9 +172,14 @@ const primaryKeyId = getIdFromGraphQLId(data.id); ...@@ -160,9 +172,14 @@ const primaryKeyId = getIdFromGraphQLId(data.id);
From Apollo version 3.0.0 all the cache updates need to be immutable. It needs to be replaced entirely From Apollo version 3.0.0 all the cache updates need to be immutable. It needs to be replaced entirely
with a **new and updated** object. with a **new and updated** object.
To facilitate the process of updating the cache and returning the new object we use the library [Immer](https://immerjs.github.io/immer/docs/introduction). <!-- vale gitlab.Spelling = NO -->
To facilitate the process of updating the cache and returning the new object we
use the library [Immer](https://immerjs.github.io/immer/docs/introduction).
When possible, follow these conventions: When possible, follow these conventions:
<!-- vale gitlab.Spelling = YES -->
- The updated cache is named `data`. - The updated cache is named `data`.
- The original cache data is named `sourceData`. - The original cache data is named `sourceData`.
...@@ -753,9 +770,13 @@ export default { ...@@ -753,9 +770,13 @@ export default {
#### Mocking response as component data #### Mocking response as component data
With [Vue test utils](https://vue-test-utils.vuejs.org/) one can quickly test components that <!-- vale gitlab.Spelling = NO -->
With [Vue Test Utils](https://vue-test-utils.vuejs.org/) one can quickly test components that
fetch GraphQL queries. The simplest way is to use `shallowMount` and then set fetch GraphQL queries. The simplest way is to use `shallowMount` and then set
the data on the component the data on the component:
<!-- vale gitlab.Spelling = YES -->
```javascript ```javascript
it('tests apollo component', () => { it('tests apollo component', () => {
......
...@@ -26,12 +26,16 @@ To use a sprite Icon in HAML or Rails we use a specific helper function: ...@@ -26,12 +26,16 @@ To use a sprite Icon in HAML or Rails we use a specific helper function:
sprite_icon(icon_name, size: nil, css_class: '') sprite_icon(icon_name, size: nil, css_class: '')
``` ```
<!-- vale gitlab.Spelling = NO -->
- **icon_name**: Use the icon_name for the SVG sprite in the list of - **icon_name**: Use the icon_name for the SVG sprite in the list of
([GitLab SVGs](https://gitlab-org.gitlab.io/gitlab-svgs)). ([GitLab SVGs](https://gitlab-org.gitlab.io/gitlab-svgs)).
- **size (optional)**: Use one of the following sizes : 16, 24, 32, 48, 72 (this - **size (optional)**: Use one of the following sizes : 16, 24, 32, 48, 72 (this
is translated into a `s16` class) is translated into a `s16` class)
- **css_class (optional)**: If you want to add additional CSS classes. - **css_class (optional)**: If you want to add additional CSS classes.
<!-- vale gitlab.Spelling = YES -->
**Example** **Example**
```haml ```haml
......
...@@ -202,15 +202,15 @@ help identify marks and measures coming from the different apps on the same page ...@@ -202,15 +202,15 @@ help identify marks and measures coming from the different apps on the same page
## Best Practices ## Best Practices
### Realtime Components ### Real-time Components
When writing code for realtime features we have to keep a couple of things in mind: When writing code for real-time features we have to keep a couple of things in mind:
1. Do not overload the server with requests. 1. Do not overload the server with requests.
1. It should feel realtime. 1. It should feel real-time.
Thus, we must strike a balance between sending requests and the feeling of realtime. Thus, we must strike a balance between sending requests and the feeling of real-time.
Use the following rules when creating realtime solutions. Use the following rules when creating real-time solutions.
1. The server tells you how much to poll by sending `Poll-Interval` in the header. 1. The server tells you how much to poll by sending `Poll-Interval` in the header.
Use that as your polling interval. This enables system administrators to change the Use that as your polling interval. This enables system administrators to change the
...@@ -221,7 +221,7 @@ Use the following rules when creating realtime solutions. ...@@ -221,7 +221,7 @@ Use the following rules when creating realtime solutions.
1. Poll on active tabs only. Please use [Visibility](https://github.com/ai/visibilityjs). 1. Poll on active tabs only. Please use [Visibility](https://github.com/ai/visibilityjs).
1. Use regular polling intervals, do not use backoff polling, or jitter, as the interval is 1. Use regular polling intervals, do not use backoff polling, or jitter, as the interval is
controlled by the server. controlled by the server.
1. The backend code is likely to be using etags. You do not and should not check for status 1. The backend code is likely to be using ETags. You do not and should not check for status
`304 Not Modified`. The browser transforms it for you. `304 Not Modified`. The browser transforms it for you.
### Lazy Loading Images ### Lazy Loading Images
...@@ -333,7 +333,7 @@ browser's developer console from any page in GitLab. ...@@ -333,7 +333,7 @@ browser's developer console from any page in GitLab.
action(); action();
``` ```
For example, see how we use this in [app/assets/javascripts/pages/projects/graphs/charts/index.js](https://gitlab.com/gitlab-org/gitlab/-/commit/5e90885d6afd4497002df55bf015b338efcfc3c5#02e81de37f5b1716a3ef3222fa7f7edf22c40969_9_8): For example, see how we use this in [`app/assets/javascripts/pages/projects/graphs/charts/index.js`](https://gitlab.com/gitlab-org/gitlab/-/commit/5e90885d6afd4497002df55bf015b338efcfc3c5#02e81de37f5b1716a3ef3222fa7f7edf22c40969_9_8):
```javascript ```javascript
waitForCSSLoaded(() => { waitForCSSLoaded(() => {
......
...@@ -12,7 +12,7 @@ Running into a problem? Maybe this will help ¯\_(ツ)_/¯. ...@@ -12,7 +12,7 @@ Running into a problem? Maybe this will help ¯\_(ツ)_/¯.
### This guide doesn't contain the issue I ran into ### This guide doesn't contain the issue I ran into
If you run into a Frontend development issue that is not in this guide, please consider updating this guide with your issue and possible remedies. This way future adventurers can face these dragons with more success, being armed with your experience and knowedge. If you run into a Frontend development issue that is not in this guide, please consider updating this guide with your issue and possible remedies. This way future adventurers can face these dragons with more success, being armed with your experience and knowledge.
## Testing issues ## Testing issues
......
...@@ -60,6 +60,6 @@ route matching easier. ...@@ -60,6 +60,6 @@ route matching easier.
For more information see: For more information see:
- [`Poll-Interval` header](fe_guide/performance.md#realtime-components) - [`Poll-Interval` header](fe_guide/performance.md#real-time-components)
- [RFC 7232](https://tools.ietf.org/html/rfc7232) - [RFC 7232](https://tools.ietf.org/html/rfc7232)
- [ETag proposal](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/26926) - [ETag proposal](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/26926)
...@@ -103,7 +103,7 @@ not wait until the background worker completes. ...@@ -103,7 +103,7 @@ not wait until the background worker completes.
- An API that calls a model or service method that uses `ReactiveCaching` should return - An API that calls a model or service method that uses `ReactiveCaching` should return
`202 accepted` when the cache is being calculated (when `#with_reactive_cache` returns `nil`). `202 accepted` when the cache is being calculated (when `#with_reactive_cache` returns `nil`).
- It should also - It should also
[set the polling interval header](fe_guide/performance.md#realtime-components) with [set the polling interval header](fe_guide/performance.md#real-time-components) with
`Gitlab::PollingInterval.set_header`. `Gitlab::PollingInterval.set_header`.
- The consumer of the API is expected to poll the API. - The consumer of the API is expected to poll the API.
- You can also consider implementing [ETag caching](polling.md) to reduce the server - You can also consider implementing [ETag caching](polling.md) to reduce the server
......
...@@ -357,7 +357,7 @@ using `v232`. ...@@ -357,7 +357,7 @@ using `v232`.
For the record, the debugging steps to find out this issue were: For the record, the debugging steps to find out this issue were:
1. Switch kubectl context to review-apps-ce (we recommend using [kubectx](https://github.com/ahmetb/kubectx/)) 1. Switch kubectl context to `review-apps-ce` (we recommend using [`kubectx`](https://github.com/ahmetb/kubectx/))
1. `kubectl get pods | grep dns` 1. `kubectl get pods | grep dns`
1. `kubectl describe pod <pod name>` & confirm exact error message 1. `kubectl describe pod <pod name>` & confirm exact error message
1. Web search for exact error message, following rabbit hole to [a relevant Kubernetes bug report](https://github.com/kubernetes/kubernetes/issues/57345) 1. Web search for exact error message, following rabbit hole to [a relevant Kubernetes bug report](https://github.com/kubernetes/kubernetes/issues/57345)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment