main 3f02fc904ea3 cached
189 files
46.2 MB
525.9k tokens
374 symbols
1 requests
Download .txt
Showing preview only (1,913K chars total). Download the full file or copy to clipboard to get everything.
Repository: HoussemDellai/ProductsStoreOnKubernetes
Branch: main
Commit: 3f02fc904ea3
Files: 189
Total size: 46.2 MB

Directory structure:
gitextract_vd94vg5x/

├── .dockerignore
├── .github/
│   └── workflows/
│       ├── 1-actions-ci-cd-aks.yml
│       ├── 2-actions-ci-cd-aks-tf.yml
│       ├── 3-actions-ci-cd-aks-tf-backend.yml
│       └── 4-actions-ci-cd-aks-tf-backend-jobs.yml
├── .gitignore
├── .vscode/
│   ├── launch.json
│   ├── settings.json
│   └── tasks.json
├── MvcApp/
│   ├── Controllers/
│   │   ├── HomeController.cs
│   │   └── ProductsController.cs
│   ├── Data/
│   │   └── ProductsContext.cs
│   ├── Dockerfile
│   ├── Microscanner.Dockerfile
│   ├── Models/
│   │   ├── ErrorViewModel.cs
│   │   └── product.cs
│   ├── MvcApp.csproj
│   ├── Program.cs
│   ├── Properties/
│   │   └── launchSettings.json
│   ├── Startup.cs
│   ├── Views/
│   │   ├── Home/
│   │   │   ├── About.cshtml
│   │   │   ├── Contact.cshtml
│   │   │   ├── Index.cshtml
│   │   │   └── Privacy.cshtml
│   │   ├── Products/
│   │   │   ├── Create.cshtml
│   │   │   ├── Delete.cshtml
│   │   │   ├── Details.cshtml
│   │   │   ├── Edit.cshtml
│   │   │   └── Index.cshtml
│   │   ├── Shared/
│   │   │   ├── Error.cshtml
│   │   │   ├── _CookieConsentPartial.cshtml
│   │   │   ├── _Layout.cshtml
│   │   │   └── _ValidationScriptsPartial.cshtml
│   │   ├── _ViewImports.cshtml
│   │   └── _ViewStart.cshtml
│   ├── appsettings.Development.json
│   ├── appsettings.json
│   └── wwwroot/
│       ├── css/
│       │   └── site.css
│       ├── js/
│       │   └── site.js
│       └── lib/
│           ├── bootstrap/
│           │   ├── .bower.json
│           │   ├── LICENSE
│           │   └── dist/
│           │       ├── css/
│           │       │   ├── bootstrap-theme.css
│           │       │   └── bootstrap.css
│           │       └── js/
│           │           ├── bootstrap.js
│           │           └── npm.js
│           ├── jquery/
│           │   ├── .bower.json
│           │   ├── LICENSE.txt
│           │   └── dist/
│           │       └── jquery.js
│           ├── jquery-validation/
│           │   ├── .bower.json
│           │   ├── LICENSE.md
│           │   └── dist/
│           │       ├── additional-methods.js
│           │       └── jquery.validate.js
│           └── jquery-validation-unobtrusive/
│               ├── .bower.json
│               ├── LICENSE.txt
│               └── jquery.validate.unobtrusive.js
├── ProductsStoreOnKubernetes.sln
├── README.demo.md
├── README.md
├── WebApp/
│   ├── Controllers/
│   │   ├── HomeController.cs
│   │   └── ProductsController.cs
│   ├── Data/
│   │   └── ProductsContext.cs
│   ├── Dockerfile
│   ├── Models/
│   │   ├── ErrorViewModel.cs
│   │   └── Product.cs
│   ├── Program.cs
│   ├── Properties/
│   │   ├── launchSettings.json
│   │   ├── serviceDependencies.json
│   │   └── serviceDependencies.local.json
│   ├── Startup.cs
│   ├── Views/
│   │   ├── Home/
│   │   │   ├── Index.cshtml
│   │   │   └── Privacy.cshtml
│   │   ├── Products/
│   │   │   ├── Create.cshtml
│   │   │   ├── Delete.cshtml
│   │   │   ├── Details.cshtml
│   │   │   ├── Edit.cshtml
│   │   │   └── Index.cshtml
│   │   ├── Shared/
│   │   │   ├── Error.cshtml
│   │   │   ├── _Layout.cshtml
│   │   │   └── _ValidationScriptsPartial.cshtml
│   │   ├── _ViewImports.cshtml
│   │   └── _ViewStart.cshtml
│   ├── WebApp.csproj
│   ├── appsettings.Development.json
│   ├── appsettings.json
│   └── wwwroot/
│       ├── css/
│       │   └── site.css
│       ├── js/
│       │   └── site.js
│       └── lib/
│           ├── bootstrap/
│           │   ├── LICENSE
│           │   └── dist/
│           │       ├── css/
│           │       │   ├── bootstrap-grid.css
│           │       │   ├── bootstrap-reboot.css
│           │       │   └── bootstrap.css
│           │       └── js/
│           │           ├── bootstrap.bundle.js
│           │           └── bootstrap.js
│           ├── jquery/
│           │   ├── LICENSE.txt
│           │   └── dist/
│           │       └── jquery.js
│           ├── jquery-validation/
│           │   ├── LICENSE.md
│           │   └── dist/
│           │       ├── additional-methods.js
│           │       └── jquery.validate.js
│           └── jquery-validation-unobtrusive/
│               ├── LICENSE.txt
│               └── jquery.validate.unobtrusive.js
├── ansible/
│   └── aks-ansible.yml
├── arm-template/
│   ├── parameters.json
│   └── template.json
├── azure-pipelines.yml
├── charts/
│   ├── commands.ps1
│   ├── firstchart/
│   │   ├── .helmignore
│   │   ├── Chart.yaml
│   │   ├── templates/
│   │   │   ├── NOTES.txt
│   │   │   ├── _helpers.tpl
│   │   │   ├── deployment.yaml
│   │   │   ├── hpa.yaml
│   │   │   ├── ingress.yaml
│   │   │   ├── service.yaml
│   │   │   ├── serviceaccount.yaml
│   │   │   └── tests/
│   │   │       └── test-connection.yaml
│   │   └── values.yaml
│   └── productsstore/
│       ├── .helmignore
│       ├── Chart.yaml
│       ├── templates/
│       │   ├── _helpers.tpl
│       │   ├── helm-namespace.yaml
│       │   ├── mssql-config-map.yaml
│       │   ├── mssql-deployment.yaml
│       │   ├── mssql-pv.azure.yaml
│       │   └── mvc-deployment.azure.yaml
│       └── values.yaml
├── create-aks-cluster.sh
├── docker-compose.yaml
├── docs/
│   └── presentation.pptx
├── hpa/
│   ├── commands.ps1
│   ├── hpa.yaml
│   └── tester-pod.yaml
├── infra/
│   ├── backend.tf
│   ├── create-azure-storage-tfstate.sh
│   ├── main.tf
│   ├── output.tf
│   ├── provider.tf
│   ├── terraform.local.tfvars
│   ├── terraform.tfvars
│   ├── tf.commands.sh
│   └── variables.tf
├── ingress-controller/
│   ├── ingress.yaml
│   └── workshop.sh
├── istio/
│   ├── 1-app-gateway.yaml
│   ├── 2-app-virtualservice.yaml
│   ├── 3-app-virtualservice-destinationrule.yaml
│   ├── 4-mssql-svc-deploy.yaml
│   ├── 5-mssql-virtualservice-destinationrule.yaml
│   ├── 6-mssql-deploy-2-0.yaml
│   ├── grafana.secret.yaml
│   ├── istio.aks.yaml
│   ├── kiali.secret.yaml
│   ├── mvc-app-v1.0.yaml
│   ├── mvc-deployment.v1.1.yaml
│   ├── mvc-deployment.v2.0.yaml
│   └── steps.sh
├── kubernetes/
│   ├── mssql-configmap.yaml
│   ├── mssql-deployment.yaml
│   ├── mssql-pv.azure.yaml
│   ├── mssql-secret.yaml
│   └── mvc-deployment.azure.yaml
├── logging-efk/
│   ├── commands.sh
│   ├── fluentd-daemonset-elasticsearch.yaml
│   └── kibana-values.yaml
├── network-policy/
│   ├── 1-backend-policy-deny.yaml
│   ├── 1-namespace-development.yaml
│   ├── 2-backend-policy-allow-pod.yaml
│   ├── 2-pod-nginx-backend.yaml
│   ├── 3-backend-policy-allow-pod-namespace.yaml
│   ├── 3-pod-alpine-test.yaml
│   └── commands.sh
├── opa-gatekeeper/
│   ├── all_ns_must_have_gatekeeper.yaml
│   ├── bad-namespace.yaml
│   ├── commands.ps1
│   ├── good-namespace.yaml
│   └── k8srequiredlabels_template.yaml
├── prometheus/
│   ├── prometheus.values.yaml
│   └── steps.sh
├── rbac/
│   ├── cert/
│   │   ├── houssem.crt
│   │   ├── houssem.csr
│   │   └── houssem.key
│   ├── rbac-aad/
│   │   ├── rbac-aad-group.yaml
│   │   └── rbac-aad-user.yaml
│   ├── role-binding.yaml
│   ├── role-deployment-manager.yaml
│   ├── role.yaml
│   ├── rolebinding-deployment-manager.yaml
│   └── steps.bash
├── start/
│   └── mvc-deployment.simple.yaml
└── terraform/
    ├── aks-cluster.tf
    └── create-service-principal.sh

================================================
FILE CONTENTS
================================================

================================================
FILE: .dockerignore
================================================
.dockerignore
.env
.git
.gitignore
.vs
.vscode
*/bin
*/obj
**/.toolstarget

================================================
FILE: .github/workflows/1-actions-ci-cd-aks.yml
================================================
name: 1-actions-ci-cd-aks

on:
  push:
    branches: [ main ]
    paths: .github/workflows/1-actions-ci-cd-aks.yml
  pull_request:
    branches:  none # [ main ]
  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

jobs:

  build-deploy-aks:
    runs-on: ubuntu-latest
    env:
      DOCKER_REPOSITORY: houssemdocker # name of Docker Hub ID
      IMAGE_NAME: webapp
      IMAGE_TAG: ${{ github.run_number }} # $GITHUB_RUN_NUMBER
      
      CLUSTER_NAME: aks-cluster
      RESOURSE_GROUP: rg-aks-cluster
    
    steps:

    - name: Git Checkout
      uses: actions/checkout@v2
  
    - name: Build Docker Image
      run:
        docker build ./MvcApp/ --file ./MvcApp/Dockerfile --tag $DOCKER_REPOSITORY/$IMAGE_NAME:$GITHUB_RUN_NUMBER --build-arg=token=ZGEzNTQ5Y2QyNjAx --no-cache

    - name: Run Trivy vulnerability scanner
      uses: aquasecurity/trivy-action@master
      continue-on-error: true
      with:
        image-ref: 'docker.io/${{ env.DOCKER_REPOSITORY }}/${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }}'
        format: 'table'
        exit-code: '1'
        ignore-unfixed: true
        vuln-type: 'os,library'
        severity: 'MEDIUM,HIGH,CRITICAL'

    - name: Login to Docker Hub
      run: |
        echo "${{ secrets.DOCKER_REPOSITORY_PASSWORD }}" | docker login -u $DOCKER_REPOSITORY --password-stdin
  
    - name: Push Image to Docker Hub
      run:
        docker push $DOCKER_REPOSITORY/$IMAGE_NAME:$GITHUB_RUN_NUMBER
   
    - uses: cschleiden/replace-tokens@v1
      with:
        files: '["kubernetes/*.yaml"]'
        tokenPrefix: __ # optional, default is #{
        tokenSuffix: __ # optional, default is }#
      env:
        DOCKER_REPOSITORY: ${{ env.DOCKER_REPOSITORY }}
        IMAGE_NAME: ${{ env.IMAGE_NAME }}
        IMAGE_TAG: ${{ env.IMAGE_TAG }}
        
    # Set the target AKS cluster.
    - uses: Azure/aks-set-context@v1
      with:
        creds: ${{ secrets.AZURE_CREDENTIALS }}
        cluster-name: ${{ env.CLUSTER_NAME }}
        resource-group: ${{ env.RESOURSE_GROUP }}

    - uses: Azure/k8s-deploy@v1
      with:
        manifests: |
          kubernetes/mssql-pv.azure.yaml
          kubernetes/mssql-configmap.yaml
          kubernetes/mssql-secret.yaml
          kubernetes/mssql-deployment.yaml
          kubernetes/mvc-deployment.azure.yaml
    
    - name: Run Kube-Bench to check cluster config
      continue-on-error: true
      run: |
        kubectl apply -f https://raw.githubusercontent.com/aquasecurity/kube-bench/main/job-aks.yaml
        sleep 30s
        kubectl logs job.batch/kube-bench
        kubectl delete job.batch/kube-bench


================================================
FILE: .github/workflows/2-actions-ci-cd-aks-tf.yml
================================================
name: 2-actions-ci-cd-aks-tf

on:
  push:
    branches: [ main ]
    paths: .github/workflows/2-actions-ci-cd-aks-tf.yml
  pull_request:
    branches:  none # [ main ]
  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

jobs:

  build-deploy-aks:
    runs-on: ubuntu-latest
    env:
      DOCKER_REPOSITORY: houssemdocker
      IMAGE_NAME: web-app
      IMAGE_TAG: ${{ github.run_number }} # ${{ github.sha }}
      AKS_RESOURCE_GROUP: rg-aks-cluster-tf-023
      AKS_NAME: aks-cluster
      ACR_NAME: acrforakstf023
      TERRAFORM_VERSION: 1.1.9
      WORKING_DIRECTORY: infra
    
    # Use the Bash shell regardless whether the GitHub Actions runner is ubuntu-latest, macos-latest, or windows-latest
    defaults:
      run:
        shell: bash
        working-directory: ${{ env.WORKING_DIRECTORY }}
        
    steps:

    - uses: actions/checkout@v2
  
    - name: Build Docker Image
      working-directory: .
      run:
        docker build ./MvcApp/ --file ./MvcApp/Dockerfile --tag $DOCKER_REPOSITORY/$IMAGE_NAME:$GITHUB_RUN_NUMBER --build-arg=token=ZGEzNTQ5Y2QyNjAx --no-cache
  
    - name: Run Trivy vulnerability scanner
      uses: aquasecurity/trivy-action@master
      continue-on-error: true
      with:
        image-ref: 'docker.io/${{ env.DOCKER_REPOSITORY }}/${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }}'
        format: 'table'
        exit-code: '1'
        ignore-unfixed: true
        vuln-type: 'os,library'
        severity: 'MEDIUM,HIGH,CRITICAL'
  
    - name: Login to Docker Hub
      run: |
        echo "${{ secrets.DOCKER_REPOSITORY_PASSWORD }}" | docker login -u $DOCKER_REPOSITORY --password-stdin
        
    - name: Push Image to Docker Hub
      run:
        docker push $DOCKER_REPOSITORY/$IMAGE_NAME:$GITHUB_RUN_NUMBER

    - name: Replace tokens in terraform.tfvars
      uses: cschleiden/replace-tokens@v1.0
      with:
        tokenPrefix: __
        tokenSuffix: __
        files: infra/terraform.tfvars
      env:
        AKS_RESOURCE_GROUP: ${{ env.AKS_RESOURCE_GROUP }}
        AKS_NAME: ${{ env.AKS_NAME }}
        ACR_NAME: ${{ env.ACR_NAME }}
        SQL_INSTANCE_NAME: sqlforaks-tf-011
        DB_ADMIN_LOGIN: houssem
        DB_ADMIN_PASSWORD: "@Aa123456"
        STORAGE_NAME: storageforsql011
    
    - name: Replace azurerm with local in backend.tf
      uses: jacobtomlinson/gha-find-replace@v2
      with:
        find: "azurerm"
        replace: "local"
        include: "infra/backend.tf"
        regex: true

    # Install the latest version of Terraform CLI
    - name: Install Terraform
      uses: hashicorp/setup-terraform@v1
      with:
        terraform_version: ${{ env.TERRAFORM_VERSION }}
        
    - name: Terraform Init
      id: init
      env:
        ARM_CLIENT_ID: ${{ secrets.ARM_CLIENT_ID }}
        ARM_CLIENT_SECRET: ${{ secrets.ARM_CLIENT_SECRET }}
        ARM_TENANT_ID: ${{ secrets.ARM_TENANT_ID }}
        ARM_SUBSCRIPTION_ID: ${{ secrets.ARM_SUBSCRIPTION_ID }}
      run:
        terraform init
  
    # Checks that all Terraform configuration files adhere to a canonical format
    - name: Terraform Format
      id: format
      run: terraform fmt -check
      continue-on-error: true

    - name: Terraform Plan
      id: plan
      env:
        ARM_CLIENT_ID: ${{ secrets.ARM_CLIENT_ID }}
        ARM_CLIENT_SECRET: ${{ secrets.ARM_CLIENT_SECRET }}
        ARM_TENANT_ID: ${{ secrets.ARM_TENANT_ID }}
        ARM_SUBSCRIPTION_ID: ${{ secrets.ARM_SUBSCRIPTION_ID }}
      run: |
        terraform plan -no-color 

    - name: Terraform Apply
      env:
        ARM_CLIENT_ID: ${{ secrets.ARM_CLIENT_ID }}
        ARM_CLIENT_SECRET: ${{ secrets.ARM_CLIENT_SECRET }}
        ARM_TENANT_ID: ${{ secrets.ARM_TENANT_ID }}
        ARM_SUBSCRIPTION_ID: ${{ secrets.ARM_SUBSCRIPTION_ID }}
      run: terraform apply -auto-approve

    - name: Replace Image Name in Deployment
      uses: cschleiden/replace-tokens@v1
      with:
        files: '["kubernetes/*.yaml"]'
        tokenPrefix: __ # optional, default is #{
        tokenSuffix: __ # optional, default is }#
      env:
        DOCKER_REPOSITORY: ${{ env.DOCKER_REPOSITORY }}
        IMAGE_NAME: ${{ env.IMAGE_NAME }}
        IMAGE_TAG: ${{ env.IMAGE_TAG }}

    # Set the target AKS cluster.
    - uses: Azure/aks-set-context@v1
      with:
        creds: '${{ secrets.AZURE_CREDENTIALS }}'
        cluster-name: ${{ env.AKS_NAME }}
        resource-group: ${{ env.AKS_RESOURCE_GROUP }}
        
    - uses: Azure/k8s-deploy@v1
      with:
        manifests: |
          kubernetes/mssql-pv.azure.yaml
          kubernetes/mssql-configmap.yaml
          kubernetes/mssql-secret.yaml
          kubernetes/mssql-deployment.yaml
          kubernetes/mvc-deployment.azure.yaml
    
    - name: Run Kube-Bench to check cluster config
      continue-on-error: true
      run: |
        kubectl apply -f https://raw.githubusercontent.com/aquasecurity/kube-bench/main/job-aks.yaml
        sleep 30s
        kubectl logs job.batch/kube-bench
        kubectl delete job.batch/kube-bench


================================================
FILE: .github/workflows/3-actions-ci-cd-aks-tf-backend.yml
================================================
name: 3-actions-ci-cd-aks-tf-backend

on:
  push:
    branches: none # [ main ]
  pull_request:
    branches:  none # [ release ]
  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

env:
  LOCATION: westeurope
  INFRA_RESOURCE_GROUP: tfstate-resourcegroup
  TF_STATE_STORAGE_ACCOUNT_NAME: tfstatestorage102
  TF_STATE_CONTAINER_NAME: tfstate
  TF_STATE_FILE_NAME: tfstate
  TF_STATE_ACCESS_KEY: "" # will be set later
    
  DOCKER_REPOSITORY: acrforaks102.azurecr.io
  # DOCKER_REPOSITORY: houssemdocker
  IMAGE_NAME: webapp
  IMAGE_TAG: ${{ github.run_number }}
  
  ARM_CLIENT_ID: ${{ secrets.AZURE_SP_CLIENT_ID }}
  ARM_CLIENT_SECRET: ${{ secrets.AZURE_SP_CLIENT_SECRET }}
  ARM_SUBSCRIPTION_ID:  ${{ secrets.AZURE_SUBSCRIPTION_ID }}
  ARM_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}

  AKS_RESOURCE_GROUP: aks-102-rg
  AKS_NAME: aks-102
  ACR_NAME: acrforaks102
  SQL_INSTANCE_NAME: sqlforaks102
  DB_ADMIN_LOGIN: houssem
  DB_ADMIN_PASSWORD: "@Aa123456"
  STORAGE_NAME: storageforaks102
    
jobs:

  build-and-deploy:
    name: Build and deploy into AKS
    runs-on: ubuntu-latest

    steps:

    - uses: actions/checkout@v2

    - name: Login to Azure
      uses: azure/login@v1
      with:
        creds: ${{ secrets.AZURE_CREDENTIALS }}
      
    - name: Create storage for tfstate
      uses: azure/CLI@v1
      with:
        azcliversion: 2.27.2
        inlineScript: |
          # Create the resource group
          az group create -n $INFRA_RESOURCE_GROUP -l $LOCATION          
          # Create the storage account
          az storage account create -g $INFRA_RESOURCE_GROUP -l $LOCATION \
            --name $TF_STATE_STORAGE_ACCOUNT_NAME \
            --sku Standard_LRS \
            --encryption-services blob
          # Retrieve the storage account key
          ACCOUNT_KEY=$(az storage account keys list --resource-group $INFRA_RESOURCE_GROUP --account-name $TF_STATE_STORAGE_ACCOUNT_NAME --query [0].value -o tsv)
          # Create a storage container (for the Terraform State)
          az storage container create --name $TF_STATE_CONTAINER_NAME --account-name $TF_STATE_STORAGE_ACCOUNT_NAME --account-key $ACCOUNT_KEY

          echo "TF_STATE_ACCESS_KEY=$ACCOUNT_KEY" >> $GITHUB_ENV

#  infra:
#    name: Create Infra with Terraform
#    runs-on: ubuntu-latest
#    needs: [pre-build]
#
#    steps:
#
#    - uses: actions/checkout@v2
      
    - name: Login to Azure with SPN
      uses: azure/CLI@v1
      with:
        azcliversion: 2.27.2
        inlineScript: |
          az login --service-principal -u ${{ secrets.AZURE_SP_CLIENT_ID }} -p ${{ secrets.AZURE_SP_CLIENT_SECRET }} --tenant ${{ secrets.AZURE_TENANT_ID }}
    
    - name: Replace Variables in terraform.tfvars
      uses: datamonsters/replace-action@v2
      with:
        files: infra/terraform.tfvars
        replacements: '__AKS_RESOURCE_GROUP__=${{ env.AKS_RESOURCE_GROUP }},__AKS_NAME__=${{ env.AKS_NAME }},__ACR_NAME__=${{ env.ACR_NAME }},__SQL_INSTANCE_NAME__=${{ env.SQL_INSTANCE_NAME }},__DB_ADMIN_LOGIN__=${{ env.DB_ADMIN_LOGIN }},__DB_ADMIN_PASSWORD__=${{ env.DB_ADMIN_PASSWORD }},__STORAGE_NAME__=${{ env.STORAGE_NAME }}'
 
    - uses: hashicorp/setup-terraform@v1
      name: Setup Terraform
      with:
        terraform_version: 0.13.2 # 1.0.6 # 
    
    - name: Terraform fmt
      id: fmt
      run: terraform fmt
      working-directory: infra
      continue-on-error: true
    
    - name: Terraform Init (Azure Backend)
      id: init
      run: terraform init
             -backend-config="storage_account_name=$TF_STATE_STORAGE_ACCOUNT_NAME"
             -backend-config="container_name=$TF_STATE_CONTAINER_NAME"
             -backend-config="access_key=$TF_STATE_ACCESS_KEY"
             -backend-config="key=$TF_STATE_FILE_NAME"
      working-directory: infra/
    
    - name: Terraform Validate
      id: validate
      run: terraform validate -no-color
      working-directory: infra
    
    - name: Terraform Plan
      id: plan
      run: terraform plan -out out.plan -var-file="terraform.tfvars"
      working-directory: infra
      continue-on-error: true
      
    - name: Terraform Apply
      # if: github.ref == 'refs/heads/master' && github.event_name == 'push'
      run: terraform apply -auto-approve out.plan
      working-directory: infra

#  build:
#    name: Build & Push Docker container
#    runs-on: ubuntu-latest
#    needs: [infra]
#        
#    steps:
#
#    - uses: actions/checkout@v2
 
    - name: Build Docker Image
      run:
        docker build ./MvcApp/ --file ./MvcApp/Dockerfile --tag $DOCKER_REPOSITORY/$IMAGE_NAME:$IMAGE_TAG
        # docker build ./MvcApp/ --file ./MvcApp/Dockerfile --tag $DOCKER_REPOSITORY/$IMAGE_NAME:$GITHUB_RUN_NUMBER --build-arg=token=ZGEzNTQ5Y2QyNjAx --no-cache
    
    - uses: Azure/container-scan@v0
      name: Scan Docker Image using Trivy and Dockle
      continue-on-error: true
      with:
        image-name: ${{ env.DOCKER_REPOSITORY }}/${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }}
              
    - name: Scan Docker Image using Trivy
      continue-on-error: true
      run:
        docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v $HOME/Library/Caches:/root/.cache/ aquasec/trivy --exit-code 0 --severity MEDIUM,HIGH,CRITICAL --ignore-unfixed $DOCKER_REPOSITORY/$IMAGE_NAME:$IMAGE_TAG

    - name: Login to ACR
      run: |
        ACR_PASSWORD=$(az acr credential show -n $ACR_NAME -o tsv --query passwords[0].value)
        docker login $DOCKER_REPOSITORY --username $ACR_NAME --password $ACR_PASSWORD
        
    - name: Push Image to ACR
      run: |
        docker push $DOCKER_REPOSITORY/$IMAGE_NAME:$IMAGE_TAG
        
#    - name: 'Build and push image'
#      uses: azure/docker-login@v1
#      with:
#        login-server: ${{ secrets.REGISTRY_LOGIN_SERVER }}
#          username: ${{ secrets.REGISTRY_USERNAME }}
#          password: ${{ secrets.REGISTRY_PASSWORD }}
#          
#    - run: |
#        docker build . -t ${{ secrets.REGISTRY_LOGIN_SERVER }}/sampleapp:${{ github.sha }}
#        docker push ${{ secrets.REGISTRY_LOGIN_SERVER }}/sampleapp:${{ github.sha }}
            
#    - name: Login to Docker Hub
#      run: |
#        echo ${{ secrets.DOCKER_REPOSITORY_PASSWORD }} | docker login -u $DOCKER_REPOSITORY --password-stdin
#        
#    - name: Push Image to Docker Hub
#      run: |
#        # az login --service-principal -u ${{ secrets.AZURE_SP_CLIENT_ID }} -p ${{ secrets.AZURE_SP_CLIENT_SECRET }} --tenant ${{ secrets.AZURE_TENANT_ID }}
#        # az acr login -n $DOCKER_REPOSITORY --expose-token
#        # docker login $DOCKER_REPOSITORY -u $ACR_NAME -p '1FYGAsIENf2+24J9rHNjYMrBJ3EB0OB6'
#        docker push $DOCKER_REPOSITORY/$IMAGE_NAME:$IMAGE_TAG

#  deploy:
#    name: Deploy app into Kubernetes
#    runs-on: ubuntu-latest
#    needs: [build, infra]
#
#    steps:
#
#    - uses: actions/checkout@v2

    - name: Replace Image Repository, Name and Tag in YAML deployment
      uses: datamonsters/replace-action@v2
      with:
        files: kubernetes/mvc-deployment.azure.yaml
        replacements: 'ACR_NAME=${{ env.DOCKER_REPOSITORY }},DOCKER_IMAGE=${{ env.IMAGE_NAME }},TAG=${{ env.IMAGE_TAG }}'

    - uses: Azure/aks-set-context@v1
      name: Connect to AKS
      with:
        creds: '${{ secrets.AZURE_CREDENTIALS }}'
        cluster-name: ${{ env.AKS_NAME }}
        resource-group: ${{ env.AKS_RESOURCE_GROUP }}

    - uses: Azure/k8s-deploy@v1
      name: Deploy YAML manifest into AKS
      with:
        manifests: |
          kubernetes/mssql-pv.azure.yaml
          kubernetes/mssql-secret.yaml
          kubernetes/mssql-deployment.yaml
          kubernetes/mvc-deployment.azure.yaml
          kubernetes/mssql-configmap.yaml
     
    - name: Run Kube Advisor to check for Resource Limits
      continue-on-error: true
      run:
        kubectl run --rm -i -t kubeadvisor --image=mcr.microsoft.com/aks/kubeadvisor --restart=Never
        
    - name: Deploy Kured into AKS using Helm
      run: |
        helm repo add kured https://weaveworks.github.io/kured
        # kubectl create namespace kured
        helm upgrade kured kured/kured --namespace kured --install --create-namespace \
          --set nodeSelector."beta\.kubernetes\.io/os"=linux \
          --set configuration.startTime=9am \
          --set configuration.endTime=5pm \
          --set configuration.timeZone="America/Los_Angeles"
          # --set configuration.rebootDays="[mo,tu,we,th,fr]"
          
    - name: Deploy Prometheus & Grafana into AKS using Helm
      run: |
        helm repo add "stable" https://charts.helm.sh/stable
        helm upgrade --install prometheus stable/prometheus --set server.service.type=LoadBalancer
        helm upgrade --install grafana stable/grafana --set service.type=LoadBalancer
        
    - name: Deploy EFK into AKS using Helm
      run: |
        helm upgrade --install elasticsearch stable/elasticsearch 
        kubectl apply -f logging-efk/fluentd-daemonset-elasticsearch.yaml
        helm upgrade kibana stable/kibana --install -f logging-efk/kibana-values.yaml


================================================
FILE: .github/workflows/4-actions-ci-cd-aks-tf-backend-jobs.yml
================================================
name: 4-actions-ci-cd-aks-tf-backend-jobs

on:
  push:
    branches: [ main ]
    paths: .github/workflows/4-actions-ci-cd-aks-tf-backend-jobs.yml
  pull_request:
    branches:  none # [ main ]
  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

env:
  LOCATION: westeurope
  INFRA_RESOURCE_GROUP: tfstate-resourcegroup
  TF_STATE_STORAGE_ACCOUNT_NAME: tfstatestorage102
  TF_STATE_CONTAINER_NAME: tfstate
  TF_STATE_FILE_NAME: tfstate
  TF_STATE_ACCESS_KEY: "" # will be set later
    
  DOCKER_REPOSITORY: acrforaks102.azurecr.io
  IMAGE_NAME: webapp
  IMAGE_TAG: ${{ github.run_number }}
  
  ARM_CLIENT_ID: ${{ secrets.AZURE_SP_CLIENT_ID }}
  ARM_CLIENT_SECRET: ${{ secrets.AZURE_SP_CLIENT_SECRET }}
  ARM_SUBSCRIPTION_ID:  ${{ secrets.AZURE_SUBSCRIPTION_ID }}
  ARM_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}

  AKS_RESOURCE_GROUP: aks-102-rg
  AKS_NAME: aks-102
  ACR_NAME: acrforaks102
  SQL_INSTANCE_NAME: sqlforaks102
  DB_ADMIN_LOGIN: houssem
  DB_ADMIN_PASSWORD: "@Aa123456"
  STORAGE_NAME: storageforaks102
    
jobs:

  create-terraform-backend:
    name: Create Terraform Backend
    runs-on: ubuntu-latest

    steps:

    - name: Login to Azure
      uses: azure/login@v1
      with:
        creds: ${{ secrets.AZURE_CREDENTIALS }}
      
    - name: Create storage for tfstate
      uses: azure/CLI@v1
      with:
        azcliversion: 2.35.0
        inlineScript: |
          # Create the resource group
          az group create -n $INFRA_RESOURCE_GROUP -l $LOCATION          
          # Create the storage account
          az storage account create -g $INFRA_RESOURCE_GROUP -l $LOCATION \
            --name $TF_STATE_STORAGE_ACCOUNT_NAME \
            --sku Standard_LRS \
            --encryption-services blob

  create-terraform-infra:
    name: Create Infra with Terraform
    runs-on: ubuntu-latest
    needs: [create-terraform-backend]

    steps:

    - uses: actions/checkout@v2

    - name: Login to Azure
      uses: azure/login@v1
      with:
        creds: ${{ secrets.AZURE_CREDENTIALS }}
        
    - name: Get TF backend storage account key
      uses: azure/CLI@v1
      with:
        azcliversion: 2.27.2
        inlineScript: |
          # Retrieve the storage account key
          ACCOUNT_KEY=$(az storage account keys list --resource-group $INFRA_RESOURCE_GROUP --account-name $TF_STATE_STORAGE_ACCOUNT_NAME --query [0].value -o tsv)
          # Create a storage container (for the Terraform State)
          az storage container create --name $TF_STATE_CONTAINER_NAME --account-name $TF_STATE_STORAGE_ACCOUNT_NAME --account-key $ACCOUNT_KEY

          echo "TF_STATE_ACCESS_KEY=$ACCOUNT_KEY" >> $GITHUB_ENV
    
    - name: Replace Variables in terraform.tfvars
      uses: datamonsters/replace-action@v2
      with:
        files: infra/terraform.tfvars
        replacements: '__AKS_RESOURCE_GROUP__=${{ env.AKS_RESOURCE_GROUP }},__AKS_NAME__=${{ env.AKS_NAME }},__ACR_NAME__=${{ env.ACR_NAME }},__SQL_INSTANCE_NAME__=${{ env.SQL_INSTANCE_NAME }},__DB_ADMIN_LOGIN__=${{ env.DB_ADMIN_LOGIN }},__DB_ADMIN_PASSWORD__=${{ env.DB_ADMIN_PASSWORD }},__STORAGE_NAME__=${{ env.STORAGE_NAME }}'
 
    - name: Setup Terraform
      uses: hashicorp/setup-terraform@v1
      with:
        terraform_version: 1.0.6 
    
    - name: Terraform fmt
      id: fmt
      run: terraform fmt
      working-directory: infra
      continue-on-error: true
    
    - name: Terraform Init (Azure Backend)
      run: terraform init
             -backend-config="storage_account_name=$TF_STATE_STORAGE_ACCOUNT_NAME"
             -backend-config="container_name=$TF_STATE_CONTAINER_NAME"
             -backend-config="access_key=$TF_STATE_ACCESS_KEY"
             -backend-config="key=$TF_STATE_FILE_NAME"
      working-directory: infra/
    
    - name: Terraform Validate
      run: terraform validate -no-color
      working-directory: infra
    
    - name: Terraform Plan
      run: terraform plan -out out.plan -var-file="terraform.tfvars"
      working-directory: infra
      continue-on-error: true
      
    - name: Terraform Apply
      # if: github.ref == 'refs/heads/master' && github.event_name == 'push'
      run: terraform apply -auto-approve out.plan
      working-directory: infra

  build-push-container:
    name: Build & Push Docker container
    runs-on: ubuntu-latest
    needs: [create-terraform-infra]
        
    steps:

    - uses: actions/checkout@v2
 
    - name: Build Docker Image
      run:
        docker build ./MvcApp/ --file ./MvcApp/Dockerfile --tag $DOCKER_REPOSITORY/$IMAGE_NAME:$IMAGE_TAG

    - name: Scan Docker Image using Trivy and Dockle
      uses: Azure/container-scan@v0
      continue-on-error: true
      with:
        image-name: ${{ env.DOCKER_REPOSITORY }}/${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }}
              
    - name: Scan Docker Image using Trivy
      continue-on-error: true
      run:
        docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v $HOME/Library/Caches:/root/.cache/ aquasec/trivy --exit-code 0 --severity MEDIUM,HIGH,CRITICAL --ignore-unfixed $DOCKER_REPOSITORY/$IMAGE_NAME:$IMAGE_TAG

    - name: Login to Azure
      uses: azure/login@v1
      with:
        creds: ${{ secrets.AZURE_CREDENTIALS }}

    - name: Login to ACR
      run: |
        ACR_PASSWORD=$(az acr credential show -n $ACR_NAME -o tsv --query passwords[0].value)
        docker login $DOCKER_REPOSITORY --username $ACR_NAME --password $ACR_PASSWORD
        
    - name: Push Image to ACR
      run: |
        docker push $DOCKER_REPOSITORY/$IMAGE_NAME:$IMAGE_TAG
     
  deploy-app-aks:
    name: Deploy app into Kubernetes
    runs-on: ubuntu-latest
    needs: [build-push-container, create-terraform-infra]

    steps:

    - uses: actions/checkout@v2

    - name: Replace Image Repository, Name and Tag in YAML deployment
      uses: datamonsters/replace-action@v2
      with:
        files: kubernetes/mvc-deployment.azure.yaml
        replacements: 'ACR_NAME=${{ env.DOCKER_REPOSITORY }},DOCKER_IMAGE=${{ env.IMAGE_NAME }},TAG=${{ env.IMAGE_TAG }}'
        
    - name: Login to Azure
      uses: azure/login@v1
      with:
        creds: ${{ secrets.AZURE_CREDENTIALS }}

    - name: Connect to AKS
      uses: Azure/aks-set-context@v1
      with:
        creds: '${{ secrets.AZURE_CREDENTIALS }}'
        cluster-name: ${{ env.AKS_NAME }}
        resource-group: ${{ env.AKS_RESOURCE_GROUP }}

    - name: Deploy YAML manifest into AKS
      uses: Azure/k8s-deploy@v1
      with:
        manifests: |
          kubernetes/mssql-pv.azure.yaml
          kubernetes/mssql-secret.yaml
          kubernetes/mssql-deployment.yaml
          kubernetes/mvc-deployment.azure.yaml
          kubernetes/mssql-configmap.yaml
     
    - name: Run Kube Advisor to check for Resource Limits
      continue-on-error: true
      run:
        kubectl run --rm -i -t kubeadvisor --image=mcr.microsoft.com/aks/kubeadvisor --restart=Never
        
    - name: Deploy Kured into AKS using Helm
      run: |
        helm repo add kured https://weaveworks.github.io/kured
        helm upgrade kured kured/kured --namespace kured --install --create-namespace \
          --set nodeSelector."beta\.kubernetes\.io/os"=linux \
          --set configuration.startTime=9am \
          --set configuration.endTime=5pm \
          --set configuration.timeZone="America/Los_Angeles"
          # --set configuration.rebootDays="[mo,tu,we,th,fr]"
          
    - name: Deploy Prometheus & Grafana into AKS using Helm
      run: |
        helm repo add "stable" https://charts.helm.sh/stable
        helm upgrade --install prometheus stable/prometheus --set server.service.type=LoadBalancer
        helm upgrade --install grafana stable/grafana --set service.type=LoadBalancer
        
    - name: Deploy EFK into AKS using Helm
      run: |
        helm upgrade --install elasticsearch stable/elasticsearch 
        kubectl apply -f logging-efk/fluentd-daemonset-elasticsearch.yaml
        helm upgrade kibana stable/kibana --install -f logging-efk/kibana-values.yaml


================================================
FILE: .gitignore
================================================
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.

# Locally generated Helm charts
*.tgz

# terraform
*.terraform/
*.tfstate
*.tfstate.backup

# User-specific files
*.suo
*.user
*.userosscache
*.sln.docstates

# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs

# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/

# Visual Studio 2015 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/

# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*

# NUNIT
*.VisualState.xml
TestResult.xml

# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c

# DNX
project.lock.json
project.fragment.lock.json
artifacts/

*_i.c
*_p.c
*_i.h
*.ilk
*.meta
*.obj
*.pch
*.pdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc

# Chutzpah Test files
_Chutzpah*

# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb

# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap

# TFS 2012 Local Workspace
$tf/

# Guidance Automation Toolkit
*.gpState

# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user

# JustCode is a .NET coding add-in
.JustCode

# TeamCity is a build add-in
_TeamCity*

# DotCover is a Code Coverage Tool
*.dotCover

# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*

# MightyMoose
*.mm.*
AutoTest.Net/

# Web workbench (sass)
.sass-cache/

# Installshield output folder
[Ee]xpress/

# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html

# Click-Once directory
publish/

# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# TODO: Comment the next line if you want to checkin your web deploy settings
# but database connection strings (with potential passwords) will be unencrypted
#*.pubxml
*.publishproj

# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/

# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
**/packages/*
# except build/, which is used as an MSBuild target.
!**/packages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/packages/repositories.config
# NuGet v3's project.json files produces more ignoreable files
*.nuget.props
*.nuget.targets

# Microsoft Azure Build Output
csx/
*.build.csdef

# Microsoft Azure Emulator
ecf/
rcf/

# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt

# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!*.[Cc]ache/

# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
node_modules/
orleans.codegen.cs

# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/

# RIA/Silverlight projects
Generated_Code/

# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm

# SQL Server files
*.mdf
*.ldf

# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings

# Microsoft Fakes
FakesAssemblies/

# GhostDoc plugin setting file
*.GhostDoc.xml

# Node.js Tools for Visual Studio
.ntvs_analysis.dat

# Visual Studio 6 build log
*.plg

# Visual Studio 6 workspace options file
*.opt

# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions

# Paket dependency manager
.paket/paket.exe
paket-files/

# FAKE - F# Make
.fake/

# JetBrains Rider
.idea/
*.sln.iml

# CodeRush
.cr/

# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc

================================================
FILE: .vscode/launch.json
================================================
{
   // Use IntelliSense to find out which attributes exist for C# debugging
   // Use hover for the description of the existing attributes
   // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md
   "version": "0.2.0",
   "configurations": [
    {
        "name": ".NET Core Launch (web)",
        "type": "coreclr",
        "request": "launch",
        "preLaunchTask": "build",
        "program": "${workspaceFolder}/MvcApp/bin/Debug/netcoreapp2.1/MvcApp.dll",
        "args": [],
        "cwd": "${workspaceFolder}/MvcApp",
        "stopAtEntry": false,
        "internalConsoleOptions": "openOnSessionStart",
        "launchBrowser": {
            "enabled": true,
            "args": "${auto-detect-url}",
            "windows": {
                "command": "cmd.exe",
                "args": "/C start ${auto-detect-url}"
            },
            "osx": {
                "command": "open"
            },
            "linux": {
                "command": "xdg-open"
            }
        },
        "env": {
            "ASPNETCORE_ENVIRONMENT": "Development"
        },
        "sourceFileMap": {
            "/Views": "${workspaceFolder}/Views"
        }
    },
    {
        "name": ".NET Core Attach",
        "type": "coreclr",
        "request": "attach",
        "processId": "${command:pickProcess}"
    },
    {
        "name": "Local Process with Kubernetes (Preview)",
        "type": "dev-spaces-connect-configuration",
        "request": "launch"
    }
]
}

================================================
FILE: .vscode/settings.json
================================================
{
    "docker.defaultRegistryPath": "houssemdocker"
}

================================================
FILE: .vscode/tasks.json
================================================
{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build",
            "command": "dotnet",
            "type": "process",
            "args": [
                "build",
                "${workspaceFolder}/MvcApp/MvcApp.csproj"
            ],
            "problemMatcher": "$msCompile"
        }
    ]
}

================================================
FILE: MvcApp/Controllers/HomeController.cs
================================================
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using MvcApp.Models;
using Prometheus;

namespace MvcApp.Controllers
{
    public class HomeController : Controller
    {
        private static readonly Counter counter = Metrics
            .CreateCounter("my_counter", "Metrics counter");

        public IActionResult Index()
        {
            return View();
        }

        public IActionResult About()
        {
            ViewData["Message"] = "Your application description page.";

            return View();
        }

        public IActionResult Contact()
        {
            ViewData["Message"] = "Your contact page.";

            counter.Inc();
            
            return View();
        }

        public IActionResult Privacy()
        {
            return View();
        }

        [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
        public IActionResult Error()
        {
            return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
        }
    }
}


================================================
FILE: MvcApp/Controllers/ProductsController.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.EntityFrameworkCore;
using MvcApp.Models;

namespace MvcApp.Controllers
{
    public class ProductsController : Controller
    {
        private readonly ProductsContext _context;

        public ProductsController(ProductsContext context)
        {
            System.Console.WriteLine("hello");
            _context = context;
        }

        // GET: Products
        public async Task<IActionResult> Index()
        {
            return View(await _context.Product.ToListAsync());
        }

        // GET: Products/Details/5
        public async Task<IActionResult> Details(int? id)
        {
            if (id == null)
            {
                return NotFound();
            }

            var product = await _context.Product
                .FirstOrDefaultAsync(m => m.Id == id);
            if (product == null)
            {
                return NotFound();
            }

            return View(product);
        }

        // GET: Products/Create
        public IActionResult Create()
        {
            return View();
        }

        // POST: Products/Create
        // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
        // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Create([Bind("Id,Name")] Product product)
        {
            if (ModelState.IsValid)
            {
                _context.Add(product);
                await _context.SaveChangesAsync();
                return RedirectToAction(nameof(Index));
            }
            return View(product);
        }

        // GET: Products/Edit/5
        public async Task<IActionResult> Edit(int? id)
        {
            if (id == null)
            {
                return NotFound();
            }

            var product = await _context.Product.FindAsync(id);
            if (product == null)
            {
                return NotFound();
            }
            return View(product);
        }

        // POST: Products/Edit/5
        // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
        // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Edit(int id, [Bind("Id,Name")] Product product)
        {
            if (id != product.Id)
            {
                return NotFound();
            }

            if (ModelState.IsValid)
            {
                try
                {
                    _context.Update(product);
                    await _context.SaveChangesAsync();
                }
                catch (DbUpdateConcurrencyException)
                {
                    if (!ProductExists(product.Id))
                    {
                        return NotFound();
                    }
                    else
                    {
                        throw;
                    }
                }
                return RedirectToAction(nameof(Index));
            }
            return View(product);
        }

        // GET: Products/Delete/5
        public async Task<IActionResult> Delete(int? id)
        {
            if (id == null)
            {
                return NotFound();
            }

            var product = await _context.Product
                .FirstOrDefaultAsync(m => m.Id == id);
            if (product == null)
            {
                return NotFound();
            }

            return View(product);
        }

        // POST: Products/Delete/5
        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> DeleteConfirmed(int id)
        {
            var product = await _context.Product.FindAsync(id);
            _context.Product.Remove(product);
            await _context.SaveChangesAsync();
            return RedirectToAction(nameof(Index));
        }

        private bool ProductExists(int id)
        {
            return _context.Product.Any(e => e.Id == id);
        }
    }
}


================================================
FILE: MvcApp/Data/ProductsContext.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;

namespace MvcApp.Models
{
    public class ProductsContext : DbContext
    {
        public ProductsContext (DbContextOptions<ProductsContext> options)
            : base(options)
        {
            Database.EnsureCreated();
        }

        public DbSet<MvcApp.Models.Product> Product { get; set; }
    }
}


================================================
FILE: MvcApp/Dockerfile
================================================
FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:5.0-buster-slim AS build
WORKDIR /src
COPY "MvcApp.csproj" .
RUN dotnet restore "MvcApp.csproj"
COPY . .
RUN dotnet build . -c Release -o /app/build

# RUN apt-get install curl

FROM build AS publish
RUN dotnet publish "MvcApp.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "MvcApp.dll"]

================================================
FILE: MvcApp/Microscanner.Dockerfile
================================================
ARG APP_IMAGE=mvc-app:1.0
ARG MICROSCANNER_TOKEN=ZGEzNTQ5Y2QyNjAx

FROM $APP_IMAGE

# Run Aqua Security Microscanner, https://github.com/aquasecurity/microscanner
RUN apt-get update && \ 
    apt-get -y install ca-certificates && \
    apt-get -y install wget && \
    wget -O /microscanner https://get.aquasec.com/microscanner && \
    chmod +x /microscanner && \
    /microscanner $MICROSCANNER_TOKEN --full-output && \
    rm -rf /microscanner

================================================
FILE: MvcApp/Models/ErrorViewModel.cs
================================================
using System;

namespace MvcApp.Models
{
    public class ErrorViewModel
    {
        public string RequestId { get; set; }

        public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
    }
}

================================================
FILE: MvcApp/Models/product.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace MvcApp.Models
{
    public class Product
    {
        public int Id { get; set; }

        public string Name { get; set; }
    }
}


================================================
FILE: MvcApp/MvcApp.csproj
================================================
<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>net5.0</TargetFramework>
    <DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
    <UserSecretsId>5687dc37-8f5d-4658-9d8c-d7db734efc4b</UserSecretsId>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="5.0.1" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="5.0.1">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
    </PackageReference>
    <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="5.0.0" />
    <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.10.8" />
    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="5.0.1" />
    
    <PackageReference Include="prometheus-net" Version="4.0.0" />
    <PackageReference Include="prometheus-net.AspNetCore" Version="4.0.0" />
  </ItemGroup>

<!-- Old -->
  <!-- <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.App" />
    <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.0.1916590" />
    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.1.1" />
    <PackageReference Include="prometheus-net" Version="3.1.4" />
    <PackageReference Include="prometheus-net.AspNetCore" Version="3.1.4" />
  </ItemGroup> -->

</Project>


================================================
FILE: MvcApp/Program.cs
================================================
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Hosting;

namespace MvcApp
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateWebHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
    }
}


================================================
FILE: MvcApp/Properties/launchSettings.json
================================================
{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:3317",
      "sslPort": 44361
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "MvcApp": {
      "commandName": "Project",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      },
      "applicationUrl": "https://localhost:5001;http://localhost:5000"
    },
    "Docker": {
      "commandName": "Docker",
      "launchBrowser": true,
      "launchUrl": "{Scheme}://localhost:{ServicePort}"
    }
  }
}

================================================
FILE: MvcApp/Startup.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Hosting;
using MvcApp.Models;
using Prometheus;

namespace MvcApp
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllersWithViews();
           
            services.AddDbContext<ProductsContext>(options =>
                    options.UseSqlServer(Configuration.GetConnectionString("ProductsContext")));
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            // Export metrics to Prometheus
            // https://localhost:5001/metrics
            app.UseMetricServer(url: "/metrics");

            app.UseHttpMetrics(options =>
            {
                //options.RequestCount.Enabled = false;

                //options.RequestDuration.Histogram = Metrics.CreateHistogram("myapp_http_request_duration_seconds", "Some help text",
                //    new HistogramConfiguration
                //    {
                //        Buckets = Histogram.LinearBuckets(start: 1, width: 1, count: 64),
            
                //        LabelNames = new[] { "code", "method" }
                //    });
            });

            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
                app.UseHsts();
            }

            app.UseHttpsRedirection();
            app.UseStaticFiles();
            app.UseRouting();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
            });
        }
    }
}


================================================
FILE: MvcApp/Views/Home/About.cshtml
================================================
@{
    ViewData["Title"] = "About";
}
<h2>@ViewData["Title"]</h2>
<h3>@ViewData["Message"]</h3>

<p>Use this area to provide additional information.</p>


================================================
FILE: MvcApp/Views/Home/Contact.cshtml
================================================
@{
    ViewData["Title"] = "Contact";
}
<h2>@ViewData["Title"]</h2>
<h3>@ViewData["Message"]</h3>

<address>
    One Microsoft Way<br />
    Redmond, WA 98052-6399<br />
    <abbr title="Phone">P:</abbr>
    425.555.0100
</address>

<address>
    <strong>Support:</strong> <a href="mailto:Support@example.com">Support@example.com</a><br />
    <strong>Marketing:</strong> <a href="mailto:Marketing@example.com">Marketing@example.com</a>
</address>


================================================
FILE: MvcApp/Views/Home/Index.cshtml
================================================
@{
    ViewData["Title"] = "Home Page";
}

<div id="myCarousel" class="carousel slide" data-ride="carousel" data-interval="6000">
    <ol class="carousel-indicators">
        <li data-target="#myCarousel" data-slide-to="0" class="active"></li>
        <li data-target="#myCarousel" data-slide-to="1"></li>
        <li data-target="#myCarousel" data-slide-to="2"></li>
    </ol>
    <div class="carousel-inner" role="listbox">
        <div class="item active">
            <img src="~/images/banner1.svg" alt="ASP.NET" class="img-responsive" />
            <div class="carousel-caption" role="option">
                <p>
                    ASP.NET Core running in Docker Container 
                    <a class="btn btn-default" href="https://go.microsoft.com/fwlink/?LinkID=525028&clcid=0x409">
                        Learn More
                    </a>
                </p>
            </div>
        </div>
        <div class="item">
            <img src="~/images/banner2.svg" alt="Visual Studio" class="img-responsive" />
            <div class="carousel-caption" role="option">
                <p>
                    Ignite The Tour in Stockholm :)
                    <a class="btn btn-default" href="https://go.microsoft.com/fwlink/?LinkID=525030&clcid=0x409">
                        Learn More
                    </a>
                </p>
            </div>
        </div>
        <div class="item">
            <img src="~/images/banner3.svg" alt="Microsoft Azure" class="img-responsive" />
            <div class="carousel-caption" role="option">
                <p>
                    Learn how Microsoft's Azure cloud platform allows you to build, deploy, and scale web apps.
                    <a class="btn btn-default" href="https://go.microsoft.com/fwlink/?LinkID=525027&clcid=0x409">
                        Learn More
                    </a>
                </p>
            </div>
        </div>
    </div>
    <a class="left carousel-control" href="#myCarousel" role="button" data-slide="prev">
        <span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>
        <span class="sr-only">Previous</span>
    </a>
    <a class="right carousel-control" href="#myCarousel" role="button" data-slide="next">
        <span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>
        <span class="sr-only">Next</span>
    </a>
</div>

<div class="row">
    <div class="col-md-3">
        <h2>Application uses</h2>
        <ul>
            <li>Sample pages using ASP.NET Core MVC</li>
            <li>Theming using <a href="https://go.microsoft.com/fwlink/?LinkID=398939">Bootstrap</a></li>
        </ul>
    </div>
    <div class="col-md-3">
        <h2>How to</h2>
        <ul>
            <li><a href="https://go.microsoft.com/fwlink/?LinkID=398600">Add a Controller and View</a></li>
            <li><a href="https://go.microsoft.com/fwlink/?LinkId=699315">Manage User Secrets using Secret Manager.</a></li>
            <li><a href="https://go.microsoft.com/fwlink/?LinkId=699316">Use logging to log a message.</a></li>
            <li><a href="https://go.microsoft.com/fwlink/?LinkId=699317">Add packages using NuGet.</a></li>
            <li><a href="https://go.microsoft.com/fwlink/?LinkId=699319">Target development, staging or production environment.</a></li>
        </ul>
    </div>
    <div class="col-md-3">
        <h2>Overview</h2>
        <ul>
            <li><a href="https://go.microsoft.com/fwlink/?LinkId=518008">Conceptual overview of what is ASP.NET Core</a></li>
            <li><a href="https://go.microsoft.com/fwlink/?LinkId=699320">Fundamentals of ASP.NET Core such as Startup and middleware.</a></li>
            <li><a href="https://go.microsoft.com/fwlink/?LinkId=398602">Working with Data</a></li>
            <li><a href="https://go.microsoft.com/fwlink/?LinkId=398603">Security</a></li>
            <li><a href="https://go.microsoft.com/fwlink/?LinkID=699321">Client side development</a></li>
            <li><a href="https://go.microsoft.com/fwlink/?LinkID=699322">Develop on different platforms</a></li>
            <li><a href="https://go.microsoft.com/fwlink/?LinkID=699323">Read more on the documentation site</a></li>
        </ul>
    </div>
    <div class="col-md-3">
        <h2>Run &amp; Deploy</h2>
        <ul>
            <li><a href="https://go.microsoft.com/fwlink/?LinkID=517851">Run your app</a></li>
            <li><a href="https://go.microsoft.com/fwlink/?LinkID=517853">Run tools such as EF migrations and more</a></li>
            <li><a href="https://go.microsoft.com/fwlink/?LinkID=398609">Publish to Microsoft Azure Web Apps</a></li>
        </ul>
    </div>
</div>


================================================
FILE: MvcApp/Views/Home/Privacy.cshtml
================================================
@{
    ViewData["Title"] = "Privacy Policy";
}
<h2>@ViewData["Title"]</h2>

<p>Use this page to detail your site's privacy policy.</p>


================================================
FILE: MvcApp/Views/Products/Create.cshtml
================================================
@model MvcApp.Models.Product

@{
    ViewData["Title"] = "Create";
}

<h2>Create</h2>

<h4>Product</h4>
<hr />
<div class="row">
    <div class="col-md-4">
        <form asp-action="Create">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="Name" class="control-label"></label>
                <input asp-for="Name" class="form-control" />
                <span asp-validation-for="Name" class="text-danger"></span>
            </div>
            <div class="form-group">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </form>
    </div>
</div>

<div>
    <a asp-action="Index">Back to List</a>
</div>

@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}


================================================
FILE: MvcApp/Views/Products/Delete.cshtml
================================================
@model MvcApp.Models.Product

@{
    ViewData["Title"] = "Delete";
}

<h2>Delete</h2>

<h3>Are you sure you want to delete this?</h3>
<div>
    <h4>Product</h4>
    <hr />
    <dl class="dl-horizontal">
        <dt>
            @Html.DisplayNameFor(model => model.Name)
        </dt>
        <dd>
            @Html.DisplayFor(model => model.Name)
        </dd>
    </dl>
    
    <form asp-action="Delete">
        <input type="hidden" asp-for="Id" />
        <input type="submit" value="Delete" class="btn btn-default" /> |
        <a asp-action="Index">Back to List</a>
    </form>
</div>


================================================
FILE: MvcApp/Views/Products/Details.cshtml
================================================
@model MvcApp.Models.Product

@{
    ViewData["Title"] = "Details";
}

<h2>Details</h2>

<div>
    <h4>Product</h4>
    <hr />
    <dl class="dl-horizontal">
        <dt>
            @Html.DisplayNameFor(model => model.Name)
        </dt>
        <dd>
            @Html.DisplayFor(model => model.Name)
        </dd>
    </dl>
</div>
<div>
    <a asp-action="Edit" asp-route-id="@Model.Id">Edit</a> |
    <a asp-action="Index">Back to List</a>
</div>


================================================
FILE: MvcApp/Views/Products/Edit.cshtml
================================================
@model MvcApp.Models.Product

@{
    ViewData["Title"] = "Edit";
}

<h2>Edit</h2>

<h4>Product</h4>
<hr />
<div class="row">
    <div class="col-md-4">
        <form asp-action="Edit">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <input type="hidden" asp-for="Id" />
            <div class="form-group">
                <label asp-for="Name" class="control-label"></label>
                <input asp-for="Name" class="form-control" />
                <span asp-validation-for="Name" class="text-danger"></span>
            </div>
            <div class="form-group">
                <input type="submit" value="Save" class="btn btn-default" />
            </div>
        </form>
    </div>
</div>

<div>
    <a asp-action="Index">Back to List</a>
</div>

@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}


================================================
FILE: MvcApp/Views/Products/Index.cshtml
================================================
@model IEnumerable<MvcApp.Models.Product>

@{
    ViewData["Title"] = "Index";
}

<h2>Index</h2>

<p>
    <a asp-action="Create">Create New</a>
</p>
<table class="table">
    <thead>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.Name)
            </th>
            <th></th>
        </tr>
    </thead>
    <tbody>
@foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Name)
            </td>
            <td>
                <a asp-action="Edit" asp-route-id="@item.Id">Edit</a> |
                <a asp-action="Details" asp-route-id="@item.Id">Details</a> |
                <a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
            </td>
        </tr>
}
    </tbody>
</table>


================================================
FILE: MvcApp/Views/Shared/Error.cshtml
================================================
@model ErrorViewModel
@{
    ViewData["Title"] = "Error";
}

<h1 class="text-danger">Error.</h1>
<h2 class="text-danger">An error occurred while processing your request.</h2>

@if (Model.ShowRequestId)
{
    <p>
        <strong>Request ID:</strong> <code>@Model.RequestId</code>
    </p>
}

<h3>Development Mode</h3>
<p>
    Swapping to <strong>Development</strong> environment will display more detailed information about the error that occurred.
</p>
<p>
    <strong>Development environment should not be enabled in deployed applications</strong>, as it can result in sensitive information from exceptions being displayed to end users. For local debugging, development environment can be enabled by setting the <strong>ASPNETCORE_ENVIRONMENT</strong> environment variable to <strong>Development</strong>, and restarting the application.
</p>


================================================
FILE: MvcApp/Views/Shared/_CookieConsentPartial.cshtml
================================================
@using Microsoft.AspNetCore.Http.Features

@{
    var consentFeature = Context.Features.Get<ITrackingConsentFeature>();
    var showBanner = !consentFeature?.CanTrack ?? false;
    var cookieString = consentFeature?.CreateConsentCookie();
}

@if (showBanner)
{
    <nav id="cookieConsent" class="navbar navbar-default navbar-fixed-top" role="alert">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#cookieConsent .navbar-collapse">
                    <span class="sr-only">Toggle cookie consent banner</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <span class="navbar-brand"><span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span></span>
            </div>
            <div class="collapse navbar-collapse">
                <p class="navbar-text">
                    Use this space to summarize your privacy and cookie use policy.
                </p>
                <div class="navbar-right">
                    <a asp-controller="Home" asp-action="Privacy" class="btn btn-info navbar-btn">Learn More</a>
                    <button type="button" class="btn btn-default navbar-btn" data-cookie-string="@cookieString">Accept</button>
                </div>
            </div>
        </div>
    </nav>
    <script>
        (function () {
            document.querySelector("#cookieConsent button[data-cookie-string]").addEventListener("click", function (el) {
                document.cookie = el.target.dataset.cookieString;
                document.querySelector("#cookieConsent").classList.add("hidden");
            }, false);
        })();
    </script>
}

================================================
FILE: MvcApp/Views/Shared/_Layout.cshtml
================================================
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - MvcApp</title>

    <environment include="Development">
        <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
        <link rel="stylesheet" href="~/css/site.css" />
    </environment>
    <environment exclude="Development">
        <link rel="stylesheet" href="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/css/bootstrap.min.css"
              asp-fallback-href="~/lib/bootstrap/dist/css/bootstrap.min.css"
              asp-fallback-test-class="sr-only" asp-fallback-test-property="position" asp-fallback-test-value="absolute" />
        <link rel="stylesheet" href="~/css/site.min.css" asp-append-version="true" />
    </environment>
</head>
<body>
    <nav class="navbar navbar-inverse navbar-fixed-top">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                    <span class="sr-only">Toggle navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <a asp-area="" asp-controller="Home" asp-action="Index" class="navbar-brand">MvcApp</a>
            </div>
            <div class="navbar-collapse collapse">
                <ul class="nav navbar-nav">
                    <li><a asp-area="" asp-controller="Home" asp-action="Index">Home</a></li>
                    <li><a asp-area="" asp-controller="Home" asp-action="About">About</a></li>
                    <li><a asp-area="" asp-controller="Home" asp-action="Contact">Contact</a></li>

                    <li><a asp-area="" asp-controller="Products" asp-action="Index">Products</a></li>
                    <li><a href="/metrics">Metrics</a></li>
                </ul>
            </div>
        </div>
    </nav>

    <partial name="_CookieConsentPartial" />

    <div class="container body-content">
        @RenderBody()
        <hr />
        <footer>
            <p>&copy; 2020 - MvcApp</p>
        </footer>
    </div>

    <environment include="Development">
        <script src="~/lib/jquery/dist/jquery.js"></script>
        <script src="~/lib/bootstrap/dist/js/bootstrap.js"></script>
        <script src="~/js/site.js" asp-append-version="true"></script>
    </environment>
    <environment exclude="Development">
        <script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-3.3.1.min.js"
                asp-fallback-src="~/lib/jquery/dist/jquery.min.js"
                asp-fallback-test="window.jQuery"
                crossorigin="anonymous"
                integrity="sha384-tsQFqpEReu7ZLhBV2VZlAu7zcOV+rXbYlF2cqB8txI/8aZajjp4Bqd+V6D5IgvKT">
        </script>
        <script src="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/bootstrap.min.js"
                asp-fallback-src="~/lib/bootstrap/dist/js/bootstrap.min.js"
                asp-fallback-test="window.jQuery && window.jQuery.fn && window.jQuery.fn.modal"
                crossorigin="anonymous"
                integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa">
        </script>
        <script src="~/js/site.min.js" asp-append-version="true"></script>
    </environment>

    @RenderSection("Scripts", required: false)
</body>
</html>


================================================
FILE: MvcApp/Views/Shared/_ValidationScriptsPartial.cshtml
================================================
<environment include="Development">
    <script src="~/lib/jquery-validation/dist/jquery.validate.js"></script>
    <script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js"></script>
</environment>
<environment exclude="Development">
    <script src="https://ajax.aspnetcdn.com/ajax/jquery.validate/1.17.0/jquery.validate.min.js"
            asp-fallback-src="~/lib/jquery-validation/dist/jquery.validate.min.js"
            asp-fallback-test="window.jQuery && window.jQuery.validator"
            crossorigin="anonymous"
            integrity="sha384-rZfj/ogBloos6wzLGpPkkOr/gpkBNLZ6b6yLy4o+ok+t/SAKlL5mvXLr0OXNi1Hp">
    </script>
    <script src="https://ajax.aspnetcdn.com/ajax/jquery.validation.unobtrusive/3.2.9/jquery.validate.unobtrusive.min.js"
            asp-fallback-src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"
            asp-fallback-test="window.jQuery && window.jQuery.validator && window.jQuery.validator.unobtrusive"
            crossorigin="anonymous"
            integrity="sha384-ifv0TYDWxBHzvAk2Z0n8R434FL1Rlv/Av18DXE43N/1rvHyOG4izKst0f2iSLdds">
    </script>
</environment>


================================================
FILE: MvcApp/Views/_ViewImports.cshtml
================================================
@using MvcApp
@using MvcApp.Models
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers


================================================
FILE: MvcApp/Views/_ViewStart.cshtml
================================================
@{
    Layout = "_Layout";
}


================================================
FILE: MvcApp/appsettings.Development.json
================================================
{
  "Logging": {
    "LogLevel": {
      "Default": "Debug",
      "System": "Information",
      "Microsoft": "Information"
    }
  }
}


================================================
FILE: MvcApp/appsettings.json
================================================
{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "ProductsContext": "Server=(localdb)\\mssqllocaldb;Database=ProductsDB"
  }
}

================================================
FILE: MvcApp/wwwroot/css/site.css
================================================
/* Please see documentation at https://docs.microsoft.com/aspnet/core/client-side/bundling-and-minification\ 
for details on configuring this project to bundle and minify static web assets. */
body {
    padding-top: 50px;
    padding-bottom: 20px;
}

/* Wrapping element */
/* Set some basic padding to keep content from hitting the edges */
.body-content {
    padding-left: 15px;
    padding-right: 15px;
}

/* Carousel */
.carousel-caption p {
    font-size: 20px;
    line-height: 1.4;
}

/* Make .svg files in the carousel display properly in older browsers */
.carousel-inner .item img[src$=".svg"] {
    width: 100%;
}

/* QR code generator */
#qrCode {
    margin: 15px;
}

/* Hide/rearrange for smaller screens */
@media screen and (max-width: 767px) {
    /* Hide captions */
    .carousel-caption {
        display: none;
    }
}


================================================
FILE: MvcApp/wwwroot/js/site.js
================================================
// Please see documentation at https://docs.microsoft.com/aspnet/core/client-side/bundling-and-minification
// for details on configuring this project to bundle and minify static web assets.

// Write your JavaScript code.


================================================
FILE: MvcApp/wwwroot/lib/bootstrap/.bower.json
================================================
{
  "name": "bootstrap",
  "description": "The most popular front-end framework for developing responsive, mobile first projects on the web.",
  "keywords": [
    "css",
    "js",
    "less",
    "mobile-first",
    "responsive",
    "front-end",
    "framework",
    "web"
  ],
  "homepage": "http://getbootstrap.com",
  "license": "MIT",
  "moduleType": "globals",
  "main": [
    "less/bootstrap.less",
    "dist/js/bootstrap.js"
  ],
  "ignore": [
    "/.*",
    "_config.yml",
    "CNAME",
    "composer.json",
    "CONTRIBUTING.md",
    "docs",
    "js/tests",
    "test-infra"
  ],
  "dependencies": {
    "jquery": "1.9.1 - 3"
  },
  "version": "3.3.7",
  "_release": "3.3.7",
  "_resolution": {
    "type": "version",
    "tag": "v3.3.7",
    "commit": "0b9c4a4007c44201dce9a6cc1a38407005c26c86"
  },
  "_source": "https://github.com/twbs/bootstrap.git",
  "_target": "v3.3.7",
  "_originalSource": "bootstrap",
  "_direct": true
}

================================================
FILE: MvcApp/wwwroot/lib/bootstrap/LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2011-2016 Twitter, Inc.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.


================================================
FILE: MvcApp/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css
================================================
/*!
 * Bootstrap v3.3.7 (http://getbootstrap.com)
 * Copyright 2011-2016 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 */
.btn-default,
.btn-primary,
.btn-success,
.btn-info,
.btn-warning,
.btn-danger {
  text-shadow: 0 -1px 0 rgba(0, 0, 0, .2);
  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
}
.btn-default:active,
.btn-primary:active,
.btn-success:active,
.btn-info:active,
.btn-warning:active,
.btn-danger:active,
.btn-default.active,
.btn-primary.active,
.btn-success.active,
.btn-info.active,
.btn-warning.active,
.btn-danger.active {
  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
}
.btn-default.disabled,
.btn-primary.disabled,
.btn-success.disabled,
.btn-info.disabled,
.btn-warning.disabled,
.btn-danger.disabled,
.btn-default[disabled],
.btn-primary[disabled],
.btn-success[disabled],
.btn-info[disabled],
.btn-warning[disabled],
.btn-danger[disabled],
fieldset[disabled] .btn-default,
fieldset[disabled] .btn-primary,
fieldset[disabled] .btn-success,
fieldset[disabled] .btn-info,
fieldset[disabled] .btn-warning,
fieldset[disabled] .btn-danger {
  -webkit-box-shadow: none;
          box-shadow: none;
}
.btn-default .badge,
.btn-primary .badge,
.btn-success .badge,
.btn-info .badge,
.btn-warning .badge,
.btn-danger .badge {
  text-shadow: none;
}
.btn:active,
.btn.active {
  background-image: none;
}
.btn-default {
  text-shadow: 0 1px 0 #fff;
  background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);
  background-image:      -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);
  background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0));
  background-image:         linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);
  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);
  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
  background-repeat: repeat-x;
  border-color: #dbdbdb;
  border-color: #ccc;
}
.btn-default:hover,
.btn-default:focus {
  background-color: #e0e0e0;
  background-position: 0 -15px;
}
.btn-default:active,
.btn-default.active {
  background-color: #e0e0e0;
  border-color: #dbdbdb;
}
.btn-default.disabled,
.btn-default[disabled],
fieldset[disabled] .btn-default,
.btn-default.disabled:hover,
.btn-default[disabled]:hover,
fieldset[disabled] .btn-default:hover,
.btn-default.disabled:focus,
.btn-default[disabled]:focus,
fieldset[disabled] .btn-default:focus,
.btn-default.disabled.focus,
.btn-default[disabled].focus,
fieldset[disabled] .btn-default.focus,
.btn-default.disabled:active,
.btn-default[disabled]:active,
fieldset[disabled] .btn-default:active,
.btn-default.disabled.active,
.btn-default[disabled].active,
fieldset[disabled] .btn-default.active {
  background-color: #e0e0e0;
  background-image: none;
}
.btn-primary {
  background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);
  background-image:      -o-linear-gradient(top, #337ab7 0%, #265a88 100%);
  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88));
  background-image:         linear-gradient(to bottom, #337ab7 0%, #265a88 100%);
  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);
  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
  background-repeat: repeat-x;
  border-color: #245580;
}
.btn-primary:hover,
.btn-primary:focus {
  background-color: #265a88;
  background-position: 0 -15px;
}
.btn-primary:active,
.btn-primary.active {
  background-color: #265a88;
  border-color: #245580;
}
.btn-primary.disabled,
.btn-primary[disabled],
fieldset[disabled] .btn-primary,
.btn-primary.disabled:hover,
.btn-primary[disabled]:hover,
fieldset[disabled] .btn-primary:hover,
.btn-primary.disabled:focus,
.btn-primary[disabled]:focus,
fieldset[disabled] .btn-primary:focus,
.btn-primary.disabled.focus,
.btn-primary[disabled].focus,
fieldset[disabled] .btn-primary.focus,
.btn-primary.disabled:active,
.btn-primary[disabled]:active,
fieldset[disabled] .btn-primary:active,
.btn-primary.disabled.active,
.btn-primary[disabled].active,
fieldset[disabled] .btn-primary.active {
  background-color: #265a88;
  background-image: none;
}
.btn-success {
  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);
  background-image:      -o-linear-gradient(top, #5cb85c 0%, #419641 100%);
  background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641));
  background-image:         linear-gradient(to bottom, #5cb85c 0%, #419641 100%);
  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);
  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
  background-repeat: repeat-x;
  border-color: #3e8f3e;
}
.btn-success:hover,
.btn-success:focus {
  background-color: #419641;
  background-position: 0 -15px;
}
.btn-success:active,
.btn-success.active {
  background-color: #419641;
  border-color: #3e8f3e;
}
.btn-success.disabled,
.btn-success[disabled],
fieldset[disabled] .btn-success,
.btn-success.disabled:hover,
.btn-success[disabled]:hover,
fieldset[disabled] .btn-success:hover,
.btn-success.disabled:focus,
.btn-success[disabled]:focus,
fieldset[disabled] .btn-success:focus,
.btn-success.disabled.focus,
.btn-success[disabled].focus,
fieldset[disabled] .btn-success.focus,
.btn-success.disabled:active,
.btn-success[disabled]:active,
fieldset[disabled] .btn-success:active,
.btn-success.disabled.active,
.btn-success[disabled].active,
fieldset[disabled] .btn-success.active {
  background-color: #419641;
  background-image: none;
}
.btn-info {
  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
  background-image:      -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
  background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2));
  background-image:         linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);
  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);
  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
  background-repeat: repeat-x;
  border-color: #28a4c9;
}
.btn-info:hover,
.btn-info:focus {
  background-color: #2aabd2;
  background-position: 0 -15px;
}
.btn-info:active,
.btn-info.active {
  background-color: #2aabd2;
  border-color: #28a4c9;
}
.btn-info.disabled,
.btn-info[disabled],
fieldset[disabled] .btn-info,
.btn-info.disabled:hover,
.btn-info[disabled]:hover,
fieldset[disabled] .btn-info:hover,
.btn-info.disabled:focus,
.btn-info[disabled]:focus,
fieldset[disabled] .btn-info:focus,
.btn-info.disabled.focus,
.btn-info[disabled].focus,
fieldset[disabled] .btn-info.focus,
.btn-info.disabled:active,
.btn-info[disabled]:active,
fieldset[disabled] .btn-info:active,
.btn-info.disabled.active,
.btn-info[disabled].active,
fieldset[disabled] .btn-info.active {
  background-color: #2aabd2;
  background-image: none;
}
.btn-warning {
  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
  background-image:      -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
  background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316));
  background-image:         linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);
  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);
  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
  background-repeat: repeat-x;
  border-color: #e38d13;
}
.btn-warning:hover,
.btn-warning:focus {
  background-color: #eb9316;
  background-position: 0 -15px;
}
.btn-warning:active,
.btn-warning.active {
  background-color: #eb9316;
  border-color: #e38d13;
}
.btn-warning.disabled,
.btn-warning[disabled],
fieldset[disabled] .btn-warning,
.btn-warning.disabled:hover,
.btn-warning[disabled]:hover,
fieldset[disabled] .btn-warning:hover,
.btn-warning.disabled:focus,
.btn-warning[disabled]:focus,
fieldset[disabled] .btn-warning:focus,
.btn-warning.disabled.focus,
.btn-warning[disabled].focus,
fieldset[disabled] .btn-warning.focus,
.btn-warning.disabled:active,
.btn-warning[disabled]:active,
fieldset[disabled] .btn-warning:active,
.btn-warning.disabled.active,
.btn-warning[disabled].active,
fieldset[disabled] .btn-warning.active {
  background-color: #eb9316;
  background-image: none;
}
.btn-danger {
  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
  background-image:      -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a));
  background-image:         linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);
  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);
  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
  background-repeat: repeat-x;
  border-color: #b92c28;
}
.btn-danger:hover,
.btn-danger:focus {
  background-color: #c12e2a;
  background-position: 0 -15px;
}
.btn-danger:active,
.btn-danger.active {
  background-color: #c12e2a;
  border-color: #b92c28;
}
.btn-danger.disabled,
.btn-danger[disabled],
fieldset[disabled] .btn-danger,
.btn-danger.disabled:hover,
.btn-danger[disabled]:hover,
fieldset[disabled] .btn-danger:hover,
.btn-danger.disabled:focus,
.btn-danger[disabled]:focus,
fieldset[disabled] .btn-danger:focus,
.btn-danger.disabled.focus,
.btn-danger[disabled].focus,
fieldset[disabled] .btn-danger.focus,
.btn-danger.disabled:active,
.btn-danger[disabled]:active,
fieldset[disabled] .btn-danger:active,
.btn-danger.disabled.active,
.btn-danger[disabled].active,
fieldset[disabled] .btn-danger.active {
  background-color: #c12e2a;
  background-image: none;
}
.thumbnail,
.img-thumbnail {
  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
          box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
}
.dropdown-menu > li > a:hover,
.dropdown-menu > li > a:focus {
  background-color: #e8e8e8;
  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
  background-image:      -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
  background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
  background-image:         linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
  background-repeat: repeat-x;
}
.dropdown-menu > .active > a,
.dropdown-menu > .active > a:hover,
.dropdown-menu > .active > a:focus {
  background-color: #2e6da4;
  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
  background-image:      -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
  background-image:         linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
  background-repeat: repeat-x;
}
.navbar-default {
  background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%);
  background-image:      -o-linear-gradient(top, #fff 0%, #f8f8f8 100%);
  background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8));
  background-image:         linear-gradient(to bottom, #fff 0%, #f8f8f8 100%);
  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);
  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
  background-repeat: repeat-x;
  border-radius: 4px;
  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
}
.navbar-default .navbar-nav > .open > a,
.navbar-default .navbar-nav > .active > a {
  background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
  background-image:      -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
  background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2));
  background-image:         linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);
  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);
  background-repeat: repeat-x;
  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
          box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
}
.navbar-brand,
.navbar-nav > li > a {
  text-shadow: 0 1px 0 rgba(255, 255, 255, .25);
}
.navbar-inverse {
  background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);
  background-image:      -o-linear-gradient(top, #3c3c3c 0%, #222 100%);
  background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222));
  background-image:         linear-gradient(to bottom, #3c3c3c 0%, #222 100%);
  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);
  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
  background-repeat: repeat-x;
  border-radius: 4px;
}
.navbar-inverse .navbar-nav > .open > a,
.navbar-inverse .navbar-nav > .active > a {
  background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);
  background-image:      -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);
  background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f));
  background-image:         linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);
  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);
  background-repeat: repeat-x;
  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
          box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
}
.navbar-inverse .navbar-brand,
.navbar-inverse .navbar-nav > li > a {
  text-shadow: 0 -1px 0 rgba(0, 0, 0, .25);
}
.navbar-static-top,
.navbar-fixed-top,
.navbar-fixed-bottom {
  border-radius: 0;
}
@media (max-width: 767px) {
  .navbar .navbar-nav .open .dropdown-menu > .active > a,
  .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,
  .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {
    color: #fff;
    background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
    background-image:      -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
    background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
    background-image:         linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
    background-repeat: repeat-x;
  }
}
.alert {
  text-shadow: 0 1px 0 rgba(255, 255, 255, .2);
  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
}
.alert-success {
  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
  background-image:      -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
  background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc));
  background-image:         linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);
  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);
  background-repeat: repeat-x;
  border-color: #b2dba1;
}
.alert-info {
  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
  background-image:      -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0));
  background-image:         linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);
  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);
  background-repeat: repeat-x;
  border-color: #9acfea;
}
.alert-warning {
  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
  background-image:      -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
  background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0));
  background-image:         linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);
  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);
  background-repeat: repeat-x;
  border-color: #f5e79e;
}
.alert-danger {
  background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
  background-image:      -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
  background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3));
  background-image:         linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);
  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);
  background-repeat: repeat-x;
  border-color: #dca7a7;
}
.progress {
  background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
  background-image:      -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
  background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5));
  background-image:         linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);
  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);
  background-repeat: repeat-x;
}
.progress-bar {
  background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);
  background-image:      -o-linear-gradient(top, #337ab7 0%, #286090 100%);
  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090));
  background-image:         linear-gradient(to bottom, #337ab7 0%, #286090 100%);
  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);
  background-repeat: repeat-x;
}
.progress-bar-success {
  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);
  background-image:      -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);
  background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44));
  background-image:         linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);
  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);
  background-repeat: repeat-x;
}
.progress-bar-info {
  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
  background-image:      -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
  background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5));
  background-image:         linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);
  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);
  background-repeat: repeat-x;
}
.progress-bar-warning {
  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
  background-image:      -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
  background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f));
  background-image:         linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);
  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);
  background-repeat: repeat-x;
}
.progress-bar-danger {
  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);
  background-image:      -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);
  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c));
  background-image:         linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);
  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);
  background-repeat: repeat-x;
}
.progress-bar-striped {
  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
}
.list-group {
  border-radius: 4px;
  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
          box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
}
.list-group-item.active,
.list-group-item.active:hover,
.list-group-item.active:focus {
  text-shadow: 0 -1px 0 #286090;
  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);
  background-image:      -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);
  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a));
  background-image:         linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);
  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);
  background-repeat: repeat-x;
  border-color: #2b669a;
}
.list-group-item.active .badge,
.list-group-item.active:hover .badge,
.list-group-item.active:focus .badge {
  text-shadow: none;
}
.panel {
  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
          box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
}
.panel-default > .panel-heading {
  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
  background-image:      -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
  background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
  background-image:         linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
  background-repeat: repeat-x;
}
.panel-primary > .panel-heading {
  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
  background-image:      -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
  background-image:         linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
  background-repeat: repeat-x;
}
.panel-success > .panel-heading {
  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
  background-image:      -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
  background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6));
  background-image:         linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);
  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);
  background-repeat: repeat-x;
}
.panel-info > .panel-heading {
  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
  background-image:      -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3));
  background-image:         linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);
  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);
  background-repeat: repeat-x;
}
.panel-warning > .panel-heading {
  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
  background-image:      -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
  background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc));
  background-image:         linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);
  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);
  background-repeat: repeat-x;
}
.panel-danger > .panel-heading {
  background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
  background-image:      -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
  background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc));
  background-image:         linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);
  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);
  background-repeat: repeat-x;
}
.well {
  background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
  background-image:      -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
  background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5));
  background-image:         linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);
  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);
  background-repeat: repeat-x;
  border-color: #dcdcdc;
  -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
          box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
}
/*# sourceMappingURL=bootstrap-theme.css.map */


================================================
FILE: MvcApp/wwwroot/lib/bootstrap/dist/css/bootstrap.css
================================================
/*!
 * Bootstrap v3.3.7 (http://getbootstrap.com)
 * Copyright 2011-2016 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 */
/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */
html {
  font-family: sans-serif;
  -webkit-text-size-adjust: 100%;
      -ms-text-size-adjust: 100%;
}
body {
  margin: 0;
}
article,
aside,
details,
figcaption,
figure,
footer,
header,
hgroup,
main,
menu,
nav,
section,
summary {
  display: block;
}
audio,
canvas,
progress,
video {
  display: inline-block;
  vertical-align: baseline;
}
audio:not([controls]) {
  display: none;
  height: 0;
}
[hidden],
template {
  display: none;
}
a {
  background-color: transparent;
}
a:active,
a:hover {
  outline: 0;
}
abbr[title] {
  border-bottom: 1px dotted;
}
b,
strong {
  font-weight: bold;
}
dfn {
  font-style: italic;
}
h1 {
  margin: .67em 0;
  font-size: 2em;
}
mark {
  color: #000;
  background: #ff0;
}
small {
  font-size: 80%;
}
sub,
sup {
  position: relative;
  font-size: 75%;
  line-height: 0;
  vertical-align: baseline;
}
sup {
  top: -.5em;
}
sub {
  bottom: -.25em;
}
img {
  border: 0;
}
svg:not(:root) {
  overflow: hidden;
}
figure {
  margin: 1em 40px;
}
hr {
  height: 0;
  -webkit-box-sizing: content-box;
     -moz-box-sizing: content-box;
          box-sizing: content-box;
}
pre {
  overflow: auto;
}
code,
kbd,
pre,
samp {
  font-family: monospace, monospace;
  font-size: 1em;
}
button,
input,
optgroup,
select,
textarea {
  margin: 0;
  font: inherit;
  color: inherit;
}
button {
  overflow: visible;
}
button,
select {
  text-transform: none;
}
button,
html input[type="button"],
input[type="reset"],
input[type="submit"] {
  -webkit-appearance: button;
  cursor: pointer;
}
button[disabled],
html input[disabled] {
  cursor: default;
}
button::-moz-focus-inner,
input::-moz-focus-inner {
  padding: 0;
  border: 0;
}
input {
  line-height: normal;
}
input[type="checkbox"],
input[type="radio"] {
  -webkit-box-sizing: border-box;
     -moz-box-sizing: border-box;
          box-sizing: border-box;
  padding: 0;
}
input[type="number"]::-webkit-inner-spin-button,
input[type="number"]::-webkit-outer-spin-button {
  height: auto;
}
input[type="search"] {
  -webkit-box-sizing: content-box;
     -moz-box-sizing: content-box;
          box-sizing: content-box;
  -webkit-appearance: textfield;
}
input[type="search"]::-webkit-search-cancel-button,
input[type="search"]::-webkit-search-decoration {
  -webkit-appearance: none;
}
fieldset {
  padding: .35em .625em .75em;
  margin: 0 2px;
  border: 1px solid #c0c0c0;
}
legend {
  padding: 0;
  border: 0;
}
textarea {
  overflow: auto;
}
optgroup {
  font-weight: bold;
}
table {
  border-spacing: 0;
  border-collapse: collapse;
}
td,
th {
  padding: 0;
}
/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */
@media print {
  *,
  *:before,
  *:after {
    color: #000 !important;
    text-shadow: none !important;
    background: transparent !important;
    -webkit-box-shadow: none !important;
            box-shadow: none !important;
  }
  a,
  a:visited {
    text-decoration: underline;
  }
  a[href]:after {
    content: " (" attr(href) ")";
  }
  abbr[title]:after {
    content: " (" attr(title) ")";
  }
  a[href^="#"]:after,
  a[href^="javascript:"]:after {
    content: "";
  }
  pre,
  blockquote {
    border: 1px solid #999;

    page-break-inside: avoid;
  }
  thead {
    display: table-header-group;
  }
  tr,
  img {
    page-break-inside: avoid;
  }
  img {
    max-width: 100% !important;
  }
  p,
  h2,
  h3 {
    orphans: 3;
    widows: 3;
  }
  h2,
  h3 {
    page-break-after: avoid;
  }
  .navbar {
    display: none;
  }
  .btn > .caret,
  .dropup > .btn > .caret {
    border-top-color: #000 !important;
  }
  .label {
    border: 1px solid #000;
  }
  .table {
    border-collapse: collapse !important;
  }
  .table td,
  .table th {
    background-color: #fff !important;
  }
  .table-bordered th,
  .table-bordered td {
    border: 1px solid #ddd !important;
  }
}
@font-face {
  font-family: 'Glyphicons Halflings';

  src: url('../fonts/glyphicons-halflings-regular.eot');
  src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');
}
.glyphicon {
  position: relative;
  top: 1px;
  display: inline-block;
  font-family: 'Glyphicons Halflings';
  font-style: normal;
  font-weight: normal;
  line-height: 1;

  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}
.glyphicon-asterisk:before {
  content: "\002a";
}
.glyphicon-plus:before {
  content: "\002b";
}
.glyphicon-euro:before,
.glyphicon-eur:before {
  content: "\20ac";
}
.glyphicon-minus:before {
  content: "\2212";
}
.glyphicon-cloud:before {
  content: "\2601";
}
.glyphicon-envelope:before {
  content: "\2709";
}
.glyphicon-pencil:before {
  content: "\270f";
}
.glyphicon-glass:before {
  content: "\e001";
}
.glyphicon-music:before {
  content: "\e002";
}
.glyphicon-search:before {
  content: "\e003";
}
.glyphicon-heart:before {
  content: "\e005";
}
.glyphicon-star:before {
  content: "\e006";
}
.glyphicon-star-empty:before {
  content: "\e007";
}
.glyphicon-user:before {
  content: "\e008";
}
.glyphicon-film:before {
  content: "\e009";
}
.glyphicon-th-large:before {
  content: "\e010";
}
.glyphicon-th:before {
  content: "\e011";
}
.glyphicon-th-list:before {
  content: "\e012";
}
.glyphicon-ok:before {
  content: "\e013";
}
.glyphicon-remove:before {
  content: "\e014";
}
.glyphicon-zoom-in:before {
  content: "\e015";
}
.glyphicon-zoom-out:before {
  content: "\e016";
}
.glyphicon-off:before {
  content: "\e017";
}
.glyphicon-signal:before {
  content: "\e018";
}
.glyphicon-cog:before {
  content: "\e019";
}
.glyphicon-trash:before {
  content: "\e020";
}
.glyphicon-home:before {
  content: "\e021";
}
.glyphicon-file:before {
  content: "\e022";
}
.glyphicon-time:before {
  content: "\e023";
}
.glyphicon-road:before {
  content: "\e024";
}
.glyphicon-download-alt:before {
  content: "\e025";
}
.glyphicon-download:before {
  content: "\e026";
}
.glyphicon-upload:before {
  content: "\e027";
}
.glyphicon-inbox:before {
  content: "\e028";
}
.glyphicon-play-circle:before {
  content: "\e029";
}
.glyphicon-repeat:before {
  content: "\e030";
}
.glyphicon-refresh:before {
  content: "\e031";
}
.glyphicon-list-alt:before {
  content: "\e032";
}
.glyphicon-lock:before {
  content: "\e033";
}
.glyphicon-flag:before {
  content: "\e034";
}
.glyphicon-headphones:before {
  content: "\e035";
}
.glyphicon-volume-off:before {
  content: "\e036";
}
.glyphicon-volume-down:before {
  content: "\e037";
}
.glyphicon-volume-up:before {
  content: "\e038";
}
.glyphicon-qrcode:before {
  content: "\e039";
}
.glyphicon-barcode:before {
  content: "\e040";
}
.glyphicon-tag:before {
  content: "\e041";
}
.glyphicon-tags:before {
  content: "\e042";
}
.glyphicon-book:before {
  content: "\e043";
}
.glyphicon-bookmark:before {
  content: "\e044";
}
.glyphicon-print:before {
  content: "\e045";
}
.glyphicon-camera:before {
  content: "\e046";
}
.glyphicon-font:before {
  content: "\e047";
}
.glyphicon-bold:before {
  content: "\e048";
}
.glyphicon-italic:before {
  content: "\e049";
}
.glyphicon-text-height:before {
  content: "\e050";
}
.glyphicon-text-width:before {
  content: "\e051";
}
.glyphicon-align-left:before {
  content: "\e052";
}
.glyphicon-align-center:before {
  content: "\e053";
}
.glyphicon-align-right:before {
  content: "\e054";
}
.glyphicon-align-justify:before {
  content: "\e055";
}
.glyphicon-list:before {
  content: "\e056";
}
.glyphicon-indent-left:before {
  content: "\e057";
}
.glyphicon-indent-right:before {
  content: "\e058";
}
.glyphicon-facetime-video:before {
  content: "\e059";
}
.glyphicon-picture:before {
  content: "\e060";
}
.glyphicon-map-marker:before {
  content: "\e062";
}
.glyphicon-adjust:before {
  content: "\e063";
}
.glyphicon-tint:before {
  content: "\e064";
}
.glyphicon-edit:before {
  content: "\e065";
}
.glyphicon-share:before {
  content: "\e066";
}
.glyphicon-check:before {
  content: "\e067";
}
.glyphicon-move:before {
  content: "\e068";
}
.glyphicon-step-backward:before {
  content: "\e069";
}
.glyphicon-fast-backward:before {
  content: "\e070";
}
.glyphicon-backward:before {
  content: "\e071";
}
.glyphicon-play:before {
  content: "\e072";
}
.glyphicon-pause:before {
  content: "\e073";
}
.glyphicon-stop:before {
  content: "\e074";
}
.glyphicon-forward:before {
  content: "\e075";
}
.glyphicon-fast-forward:before {
  content: "\e076";
}
.glyphicon-step-forward:before {
  content: "\e077";
}
.glyphicon-eject:before {
  content: "\e078";
}
.glyphicon-chevron-left:before {
  content: "\e079";
}
.glyphicon-chevron-right:before {
  content: "\e080";
}
.glyphicon-plus-sign:before {
  content: "\e081";
}
.glyphicon-minus-sign:before {
  content: "\e082";
}
.glyphicon-remove-sign:before {
  content: "\e083";
}
.glyphicon-ok-sign:before {
  content: "\e084";
}
.glyphicon-question-sign:before {
  content: "\e085";
}
.glyphicon-info-sign:before {
  content: "\e086";
}
.glyphicon-screenshot:before {
  content: "\e087";
}
.glyphicon-remove-circle:before {
  content: "\e088";
}
.glyphicon-ok-circle:before {
  content: "\e089";
}
.glyphicon-ban-circle:before {
  content: "\e090";
}
.glyphicon-arrow-left:before {
  content: "\e091";
}
.glyphicon-arrow-right:before {
  content: "\e092";
}
.glyphicon-arrow-up:before {
  content: "\e093";
}
.glyphicon-arrow-down:before {
  content: "\e094";
}
.glyphicon-share-alt:before {
  content: "\e095";
}
.glyphicon-resize-full:before {
  content: "\e096";
}
.glyphicon-resize-small:before {
  content: "\e097";
}
.glyphicon-exclamation-sign:before {
  content: "\e101";
}
.glyphicon-gift:before {
  content: "\e102";
}
.glyphicon-leaf:before {
  content: "\e103";
}
.glyphicon-fire:before {
  content: "\e104";
}
.glyphicon-eye-open:before {
  content: "\e105";
}
.glyphicon-eye-close:before {
  content: "\e106";
}
.glyphicon-warning-sign:before {
  content: "\e107";
}
.glyphicon-plane:before {
  content: "\e108";
}
.glyphicon-calendar:before {
  content: "\e109";
}
.glyphicon-random:before {
  content: "\e110";
}
.glyphicon-comment:before {
  content: "\e111";
}
.glyphicon-magnet:before {
  content: "\e112";
}
.glyphicon-chevron-up:before {
  content: "\e113";
}
.glyphicon-chevron-down:before {
  content: "\e114";
}
.glyphicon-retweet:before {
  content: "\e115";
}
.glyphicon-shopping-cart:before {
  content: "\e116";
}
.glyphicon-folder-close:before {
  content: "\e117";
}
.glyphicon-folder-open:before {
  content: "\e118";
}
.glyphicon-resize-vertical:before {
  content: "\e119";
}
.glyphicon-resize-horizontal:before {
  content: "\e120";
}
.glyphicon-hdd:before {
  content: "\e121";
}
.glyphicon-bullhorn:before {
  content: "\e122";
}
.glyphicon-bell:before {
  content: "\e123";
}
.glyphicon-certificate:before {
  content: "\e124";
}
.glyphicon-thumbs-up:before {
  content: "\e125";
}
.glyphicon-thumbs-down:before {
  content: "\e126";
}
.glyphicon-hand-right:before {
  content: "\e127";
}
.glyphicon-hand-left:before {
  content: "\e128";
}
.glyphicon-hand-up:before {
  content: "\e129";
}
.glyphicon-hand-down:before {
  content: "\e130";
}
.glyphicon-circle-arrow-right:before {
  content: "\e131";
}
.glyphicon-circle-arrow-left:before {
  content: "\e132";
}
.glyphicon-circle-arrow-up:before {
  content: "\e133";
}
.glyphicon-circle-arrow-down:before {
  content: "\e134";
}
.glyphicon-globe:before {
  content: "\e135";
}
.glyphicon-wrench:before {
  content: "\e136";
}
.glyphicon-tasks:before {
  content: "\e137";
}
.glyphicon-filter:before {
  content: "\e138";
}
.glyphicon-briefcase:before {
  content: "\e139";
}
.glyphicon-fullscreen:before {
  content: "\e140";
}
.glyphicon-dashboard:before {
  content: "\e141";
}
.glyphicon-paperclip:before {
  content: "\e142";
}
.glyphicon-heart-empty:before {
  content: "\e143";
}
.glyphicon-link:before {
  content: "\e144";
}
.glyphicon-phone:before {
  content: "\e145";
}
.glyphicon-pushpin:before {
  content: "\e146";
}
.glyphicon-usd:before {
  content: "\e148";
}
.glyphicon-gbp:before {
  content: "\e149";
}
.glyphicon-sort:before {
  content: "\e150";
}
.glyphicon-sort-by-alphabet:before {
  content: "\e151";
}
.glyphicon-sort-by-alphabet-alt:before {
  content: "\e152";
}
.glyphicon-sort-by-order:before {
  content: "\e153";
}
.glyphicon-sort-by-order-alt:before {
  content: "\e154";
}
.glyphicon-sort-by-attributes:before {
  content: "\e155";
}
.glyphicon-sort-by-attributes-alt:before {
  content: "\e156";
}
.glyphicon-unchecked:before {
  content: "\e157";
}
.glyphicon-expand:before {
  content: "\e158";
}
.glyphicon-collapse-down:before {
  content: "\e159";
}
.glyphicon-collapse-up:before {
  content: "\e160";
}
.glyphicon-log-in:before {
  content: "\e161";
}
.glyphicon-flash:before {
  content: "\e162";
}
.glyphicon-log-out:before {
  content: "\e163";
}
.glyphicon-new-window:before {
  content: "\e164";
}
.glyphicon-record:before {
  content: "\e165";
}
.glyphicon-save:before {
  content: "\e166";
}
.glyphicon-open:before {
  content: "\e167";
}
.glyphicon-saved:before {
  content: "\e168";
}
.glyphicon-import:before {
  content: "\e169";
}
.glyphicon-export:before {
  content: "\e170";
}
.glyphicon-send:before {
  content: "\e171";
}
.glyphicon-floppy-disk:before {
  content: "\e172";
}
.glyphicon-floppy-saved:before {
  content: "\e173";
}
.glyphicon-floppy-remove:before {
  content: "\e174";
}
.glyphicon-floppy-save:before {
  content: "\e175";
}
.glyphicon-floppy-open:before {
  content: "\e176";
}
.glyphicon-credit-card:before {
  content: "\e177";
}
.glyphicon-transfer:before {
  content: "\e178";
}
.glyphicon-cutlery:before {
  content: "\e179";
}
.glyphicon-header:before {
  content: "\e180";
}
.glyphicon-compressed:before {
  content: "\e181";
}
.glyphicon-earphone:before {
  content: "\e182";
}
.glyphicon-phone-alt:before {
  content: "\e183";
}
.glyphicon-tower:before {
  content: "\e184";
}
.glyphicon-stats:before {
  content: "\e185";
}
.glyphicon-sd-video:before {
  content: "\e186";
}
.glyphicon-hd-video:before {
  content: "\e187";
}
.glyphicon-subtitles:before {
  content: "\e188";
}
.glyphicon-sound-stereo:before {
  content: "\e189";
}
.glyphicon-sound-dolby:before {
  content: "\e190";
}
.glyphicon-sound-5-1:before {
  content: "\e191";
}
.glyphicon-sound-6-1:before {
  content: "\e192";
}
.glyphicon-sound-7-1:before {
  content: "\e193";
}
.glyphicon-copyright-mark:before {
  content: "\e194";
}
.glyphicon-registration-mark:before {
  content: "\e195";
}
.glyphicon-cloud-download:before {
  content: "\e197";
}
.glyphicon-cloud-upload:before {
  content: "\e198";
}
.glyphicon-tree-conifer:before {
  content: "\e199";
}
.glyphicon-tree-deciduous:before {
  content: "\e200";
}
.glyphicon-cd:before {
  content: "\e201";
}
.glyphicon-save-file:before {
  content: "\e202";
}
.glyphicon-open-file:before {
  content: "\e203";
}
.glyphicon-level-up:before {
  content: "\e204";
}
.glyphicon-copy:before {
  content: "\e205";
}
.glyphicon-paste:before {
  content: "\e206";
}
.glyphicon-alert:before {
  content: "\e209";
}
.glyphicon-equalizer:before {
  content: "\e210";
}
.glyphicon-king:before {
  content: "\e211";
}
.glyphicon-queen:before {
  content: "\e212";
}
.glyphicon-pawn:before {
  content: "\e213";
}
.glyphicon-bishop:before {
  content: "\e214";
}
.glyphicon-knight:before {
  content: "\e215";
}
.glyphicon-baby-formula:before {
  content: "\e216";
}
.glyphicon-tent:before {
  content: "\26fa";
}
.glyphicon-blackboard:before {
  content: "\e218";
}
.glyphicon-bed:before {
  content: "\e219";
}
.glyphicon-apple:before {
  content: "\f8ff";
}
.glyphicon-erase:before {
  content: "\e221";
}
.glyphicon-hourglass:before {
  content: "\231b";
}
.glyphicon-lamp:before {
  content: "\e223";
}
.glyphicon-duplicate:before {
  content: "\e224";
}
.glyphicon-piggy-bank:before {
  content: "\e225";
}
.glyphicon-scissors:before {
  content: "\e226";
}
.glyphicon-bitcoin:before {
  content: "\e227";
}
.glyphicon-btc:before {
  content: "\e227";
}
.glyphicon-xbt:before {
  content: "\e227";
}
.glyphicon-yen:before {
  content: "\00a5";
}
.glyphicon-jpy:before {
  content: "\00a5";
}
.glyphicon-ruble:before {
  content: "\20bd";
}
.glyphicon-rub:before {
  content: "\20bd";
}
.glyphicon-scale:before {
  content: "\e230";
}
.glyphicon-ice-lolly:before {
  content: "\e231";
}
.glyphicon-ice-lolly-tasted:before {
  content: "\e232";
}
.glyphicon-education:before {
  content: "\e233";
}
.glyphicon-option-horizontal:before {
  content: "\e234";
}
.glyphicon-option-vertical:before {
  content: "\e235";
}
.glyphicon-menu-hamburger:before {
  content: "\e236";
}
.glyphicon-modal-window:before {
  content: "\e237";
}
.glyphicon-oil:before {
  content: "\e238";
}
.glyphicon-grain:before {
  content: "\e239";
}
.glyphicon-sunglasses:before {
  content: "\e240";
}
.glyphicon-text-size:before {
  content: "\e241";
}
.glyphicon-text-color:before {
  content: "\e242";
}
.glyphicon-text-background:before {
  content: "\e243";
}
.glyphicon-object-align-top:before {
  content: "\e244";
}
.glyphicon-object-align-bottom:before {
  content: "\e245";
}
.glyphicon-object-align-horizontal:before {
  content: "\e246";
}
.glyphicon-object-align-left:before {
  content: "\e247";
}
.glyphicon-object-align-vertical:before {
  content: "\e248";
}
.glyphicon-object-align-right:before {
  content: "\e249";
}
.glyphicon-triangle-right:before {
  content: "\e250";
}
.glyphicon-triangle-left:before {
  content: "\e251";
}
.glyphicon-triangle-bottom:before {
  content: "\e252";
}
.glyphicon-triangle-top:before {
  content: "\e253";
}
.glyphicon-console:before {
  content: "\e254";
}
.glyphicon-superscript:before {
  content: "\e255";
}
.glyphicon-subscript:before {
  content: "\e256";
}
.glyphicon-menu-left:before {
  content: "\e257";
}
.glyphicon-menu-right:before {
  content: "\e258";
}
.glyphicon-menu-down:before {
  content: "\e259";
}
.glyphicon-menu-up:before {
  content: "\e260";
}
* {
  -webkit-box-sizing: border-box;
     -moz-box-sizing: border-box;
          box-sizing: border-box;
}
*:before,
*:after {
  -webkit-box-sizing: border-box;
     -moz-box-sizing: border-box;
          box-sizing: border-box;
}
html {
  font-size: 10px;

  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
body {
  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
  font-size: 14px;
  line-height: 1.42857143;
  color: #333;
  background-color: #fff;
}
input,
button,
select,
textarea {
  font-family: inherit;
  font-size: inherit;
  line-height: inherit;
}
a {
  color: #337ab7;
  text-decoration: none;
}
a:hover,
a:focus {
  color: #23527c;
  text-decoration: underline;
}
a:focus {
  outline: 5px auto -webkit-focus-ring-color;
  outline-offset: -2px;
}
figure {
  margin: 0;
}
img {
  vertical-align: middle;
}
.img-responsive,
.thumbnail > img,
.thumbnail a > img,
.carousel-inner > .item > img,
.carousel-inner > .item > a > img {
  display: block;
  max-width: 100%;
  height: auto;
}
.img-rounded {
  border-radius: 6px;
}
.img-thumbnail {
  display: inline-block;
  max-width: 100%;
  height: auto;
  padding: 4px;
  line-height: 1.42857143;
  background-color: #fff;
  border: 1px solid #ddd;
  border-radius: 4px;
  -webkit-transition: all .2s ease-in-out;
       -o-transition: all .2s ease-in-out;
          transition: all .2s ease-in-out;
}
.img-circle {
  border-radius: 50%;
}
hr {
  margin-top: 20px;
  margin-bottom: 20px;
  border: 0;
  border-top: 1px solid #eee;
}
.sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  border: 0;
}
.sr-only-focusable:active,
.sr-only-focusable:focus {
  position: static;
  width: auto;
  height: auto;
  margin: 0;
  overflow: visible;
  clip: auto;
}
[role="button"] {
  cursor: pointer;
}
h1,
h2,
h3,
h4,
h5,
h6,
.h1,
.h2,
.h3,
.h4,
.h5,
.h6 {
  font-family: inherit;
  font-weight: 500;
  line-height: 1.1;
  color: inherit;
}
h1 small,
h2 small,
h3 small,
h4 small,
h5 small,
h6 small,
.h1 small,
.h2 small,
.h3 small,
.h4 small,
.h5 small,
.h6 small,
h1 .small,
h2 .small,
h3 .small,
h4 .small,
h5 .small,
h6 .small,
.h1 .small,
.h2 .small,
.h3 .small,
.h4 .small,
.h5 .small,
.h6 .small {
  font-weight: normal;
  line-height: 1;
  color: #777;
}
h1,
.h1,
h2,
.h2,
h3,
.h3 {
  margin-top: 20px;
  margin-bottom: 10px;
}
h1 small,
.h1 small,
h2 small,
.h2 small,
h3 small,
.h3 small,
h1 .small,
.h1 .small,
h2 .small,
.h2 .small,
h3 .small,
.h3 .small {
  font-size: 65%;
}
h4,
.h4,
h5,
.h5,
h6,
.h6 {
  margin-top: 10px;
  margin-bottom: 10px;
}
h4 small,
.h4 small,
h5 small,
.h5 small,
h6 small,
.h6 small,
h4 .small,
.h4 .small,
h5 .small,
.h5 .small,
h6 .small,
.h6 .small {
  font-size: 75%;
}
h1,
.h1 {
  font-size: 36px;
}
h2,
.h2 {
  font-size: 30px;
}
h3,
.h3 {
  font-size: 24px;
}
h4,
.h4 {
  font-size: 18px;
}
h5,
.h5 {
  font-size: 14px;
}
h6,
.h6 {
  font-size: 12px;
}
p {
  margin: 0 0 10px;
}
.lead {
  margin-bottom: 20px;
  font-size: 16px;
  font-weight: 300;
  line-height: 1.4;
}
@media (min-width: 768px) {
  .lead {
    font-size: 21px;
  }
}
small,
.small {
  font-size: 85%;
}
mark,
.mark {
  padding: .2em;
  background-color: #fcf8e3;
}
.text-left {
  text-align: left;
}
.text-right {
  text-align: right;
}
.text-center {
  text-align: center;
}
.text-justify {
  text-align: justify;
}
.text-nowrap {
  white-space: nowrap;
}
.text-lowercase {
  text-transform: lowercase;
}
.text-uppercase {
  text-transform: uppercase;
}
.text-capitalize {
  text-transform: capitalize;
}
.text-muted {
  color: #777;
}
.text-primary {
  color: #337ab7;
}
a.text-primary:hover,
a.text-primary:focus {
  color: #286090;
}
.text-success {
  color: #3c763d;
}
a.text-success:hover,
a.text-success:focus {
  color: #2b542c;
}
.text-info {
  color: #31708f;
}
a.text-info:hover,
a.text-info:focus {
  color: #245269;
}
.text-warning {
  color: #8a6d3b;
}
a.text-warning:hover,
a.text-warning:focus {
  color: #66512c;
}
.text-danger {
  color: #a94442;
}
a.text-danger:hover,
a.text-danger:focus {
  color: #843534;
}
.bg-primary {
  color: #fff;
  background-color: #337ab7;
}
a.bg-primary:hover,
a.bg-primary:focus {
  background-color: #286090;
}
.bg-success {
  background-color: #dff0d8;
}
a.bg-success:hover,
a.bg-success:focus {
  background-color: #c1e2b3;
}
.bg-info {
  background-color: #d9edf7;
}
a.bg-info:hover,
a.bg-info:focus {
  background-color: #afd9ee;
}
.bg-warning {
  background-color: #fcf8e3;
}
a.bg-warning:hover,
a.bg-warning:focus {
  background-color: #f7ecb5;
}
.bg-danger {
  background-color: #f2dede;
}
a.bg-danger:hover,
a.bg-danger:focus {
  background-color: #e4b9b9;
}
.page-header {
  padding-bottom: 9px;
  margin: 40px 0 20px;
  border-bottom: 1px solid #eee;
}
ul,
ol {
  margin-top: 0;
  margin-bottom: 10px;
}
ul ul,
ol ul,
ul ol,
ol ol {
  margin-bottom: 0;
}
.list-unstyled {
  padding-left: 0;
  list-style: none;
}
.list-inline {
  padding-left: 0;
  margin-left: -5px;
  list-style: none;
}
.list-inline > li {
  display: inline-block;
  padding-right: 5px;
  padding-left: 5px;
}
dl {
  margin-top: 0;
  margin-bottom: 20px;
}
dt,
dd {
  line-height: 1.42857143;
}
dt {
  font-weight: bold;
}
dd {
  margin-left: 0;
}
@media (min-width: 768px) {
  .dl-horizontal dt {
    float: left;
    width: 160px;
    overflow: hidden;
    clear: left;
    text-align: right;
    text-overflow: ellipsis;
    white-space: nowrap;
  }
  .dl-horizontal dd {
    margin-left: 180px;
  }
}
abbr[title],
abbr[data-original-title] {
  cursor: help;
  border-bottom: 1px dotted #777;
}
.initialism {
  font-size: 90%;
  text-transform: uppercase;
}
blockquote {
  padding: 10px 20px;
  margin: 0 0 20px;
  font-size: 17.5px;
  border-left: 5px solid #eee;
}
blockquote p:last-child,
blockquote ul:last-child,
blockquote ol:last-child {
  margin-bottom: 0;
}
blockquote footer,
blockquote small,
blockquote .small {
  display: block;
  font-size: 80%;
  line-height: 1.42857143;
  color: #777;
}
blockquote footer:before,
blockquote small:before,
blockquote .small:before {
  content: '\2014 \00A0';
}
.blockquote-reverse,
blockquote.pull-right {
  padding-right: 15px;
  padding-left: 0;
  text-align: right;
  border-right: 5px solid #eee;
  border-left: 0;
}
.blockquote-reverse footer:before,
blockquote.pull-right footer:before,
.blockquote-reverse small:before,
blockquote.pull-right small:before,
.blockquote-reverse .small:before,
blockquote.pull-right .small:before {
  content: '';
}
.blockquote-reverse footer:after,
blockquote.pull-right footer:after,
.blockquote-reverse small:after,
blockquote.pull-right small:after,
.blockquote-reverse .small:after,
blockquote.pull-right .small:after {
  content: '\00A0 \2014';
}
address {
  margin-bottom: 20px;
  font-style: normal;
  line-height: 1.42857143;
}
code,
kbd,
pre,
samp {
  font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
}
code {
  padding: 2px 4px;
  font-size: 90%;
  color: #c7254e;
  background-color: #f9f2f4;
  border-radius: 4px;
}
kbd {
  padding: 2px 4px;
  font-size: 90%;
  color: #fff;
  background-color: #333;
  border-radius: 3px;
  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);
          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);
}
kbd kbd {
  padding: 0;
  font-size: 100%;
  font-weight: bold;
  -webkit-box-shadow: none;
          box-shadow: none;
}
pre {
  display: block;
  padding: 9.5px;
  margin: 0 0 10px;
  font-size: 13px;
  line-height: 1.42857143;
  color: #333;
  word-break: break-all;
  word-wrap: break-word;
  background-color: #f5f5f5;
  border: 1px solid #ccc;
  border-radius: 4px;
}
pre code {
  padding: 0;
  font-size: inherit;
  color: inherit;
  white-space: pre-wrap;
  background-color: transparent;
  border-radius: 0;
}
.pre-scrollable {
  max-height: 340px;
  overflow-y: scroll;
}
.container {
  padding-right: 15px;
  padding-left: 15px;
  margin-right: auto;
  margin-left: auto;
}
@media (min-width: 768px) {
  .container {
    width: 750px;
  }
}
@media (min-width: 992px) {
  .container {
    width: 970px;
  }
}
@media (min-width: 1200px) {
  .container {
    width: 1170px;
  }
}
.container-fluid {
  padding-right: 15px;
  padding-left: 15px;
  margin-right: auto;
  margin-left: auto;
}
.row {
  margin-right: -15px;
  margin-left: -15px;
}
.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {
  position: relative;
  min-height: 1px;
  padding-right: 15px;
  padding-left: 15px;
}
.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {
  float: left;
}
.col-xs-12 {
  width: 100%;
}
.col-xs-11 {
  width: 91.66666667%;
}
.col-xs-10 {
  width: 83.33333333%;
}
.col-xs-9 {
  width: 75%;
}
.col-xs-8 {
  width: 66.66666667%;
}
.col-xs-7 {
  width: 58.33333333%;
}
.col-xs-6 {
  width: 50%;
}
.col-xs-5 {
  width: 41.66666667%;
}
.col-xs-4 {
  width: 33.33333333%;
}
.col-xs-3 {
  width: 25%;
}
.col-xs-2 {
  width: 16.66666667%;
}
.col-xs-1 {
  width: 8.33333333%;
}
.col-xs-pull-12 {
  right: 100%;
}
.col-xs-pull-11 {
  right: 91.66666667%;
}
.col-xs-pull-10 {
  right: 83.33333333%;
}
.col-xs-pull-9 {
  right: 75%;
}
.col-xs-pull-8 {
  right: 66.66666667%;
}
.col-xs-pull-7 {
  right: 58.33333333%;
}
.col-xs-pull-6 {
  right: 50%;
}
.col-xs-pull-5 {
  right: 41.66666667%;
}
.col-xs-pull-4 {
  right: 33.33333333%;
}
.col-xs-pull-3 {
  right: 25%;
}
.col-xs-pull-2 {
  right: 16.66666667%;
}
.col-xs-pull-1 {
  right: 8.33333333%;
}
.col-xs-pull-0 {
  right: auto;
}
.col-xs-push-12 {
  left: 100%;
}
.col-xs-push-11 {
  left: 91.66666667%;
}
.col-xs-push-10 {
  left: 83.33333333%;
}
.col-xs-push-9 {
  left: 75%;
}
.col-xs-push-8 {
  left: 66.66666667%;
}
.col-xs-push-7 {
  left: 58.33333333%;
}
.col-xs-push-6 {
  left: 50%;
}
.col-xs-push-5 {
  left: 41.66666667%;
}
.col-xs-push-4 {
  left: 33.33333333%;
}
.col-xs-push-3 {
  left: 25%;
}
.col-xs-push-2 {
  left: 16.66666667%;
}
.col-xs-push-1 {
  left: 8.33333333%;
}
.col-xs-push-0 {
  left: auto;
}
.col-xs-offset-12 {
  margin-left: 100%;
}
.col-xs-offset-11 {
  margin-left: 91.66666667%;
}
.col-xs-offset-10 {
  margin-left: 83.33333333%;
}
.col-xs-offset-9 {
  margin-left: 75%;
}
.col-xs-offset-8 {
  margin-left: 66.66666667%;
}
.col-xs-offset-7 {
  margin-left: 58.33333333%;
}
.col-xs-offset-6 {
  margin-left: 50%;
}
.col-xs-offset-5 {
  margin-left: 41.66666667%;
}
.col-xs-offset-4 {
  margin-left: 33.33333333%;
}
.col-xs-offset-3 {
  margin-left: 25%;
}
.col-xs-offset-2 {
  margin-left: 16.66666667%;
}
.col-xs-offset-1 {
  margin-left: 8.33333333%;
}
.col-xs-offset-0 {
  margin-left: 0;
}
@media (min-width: 768px) {
  .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {
    float: left;
  }
  .col-sm-12 {
    width: 100%;
  }
  .col-sm-11 {
    width: 91.66666667%;
  }
  .col-sm-10 {
    width: 83.33333333%;
  }
  .col-sm-9 {
    width: 75%;
  }
  .col-sm-8 {
    width: 66.66666667%;
  }
  .col-sm-7 {
    width: 58.33333333%;
  }
  .col-sm-6 {
    width: 50%;
  }
  .col-sm-5 {
    width: 41.66666667%;
  }
  .col-sm-4 {
    width: 33.33333333%;
  }
  .col-sm-3 {
    width: 25%;
  }
  .col-sm-2 {
    width: 16.66666667%;
  }
  .col-sm-1 {
    width: 8.33333333%;
  }
  .col-sm-pull-12 {
    right: 100%;
  }
  .col-sm-pull-11 {
    right: 91.66666667%;
  }
  .col-sm-pull-10 {
    right: 83.33333333%;
  }
  .col-sm-pull-9 {
    right: 75%;
  }
  .col-sm-pull-8 {
    right: 66.66666667%;
  }
  .col-sm-pull-7 {
    right: 58.33333333%;
  }
  .col-sm-pull-6 {
    right: 50%;
  }
  .col-sm-pull-5 {
    right: 41.66666667%;
  }
  .col-sm-pull-4 {
    right: 33.33333333%;
  }
  .col-sm-pull-3 {
    right: 25%;
  }
  .col-sm-pull-2 {
    right: 16.66666667%;
  }
  .col-sm-pull-1 {
    right: 8.33333333%;
  }
  .col-sm-pull-0 {
    right: auto;
  }
  .col-sm-push-12 {
    left: 100%;
  }
  .col-sm-push-11 {
    left: 91.66666667%;
  }
  .col-sm-push-10 {
    left: 83.33333333%;
  }
  .col-sm-push-9 {
    left: 75%;
  }
  .col-sm-push-8 {
    left: 66.66666667%;
  }
  .col-sm-push-7 {
    left: 58.33333333%;
  }
  .col-sm-push-6 {
    left: 50%;
  }
  .col-sm-push-5 {
    left: 41.66666667%;
  }
  .col-sm-push-4 {
    left: 33.33333333%;
  }
  .col-sm-push-3 {
    left: 25%;
  }
  .col-sm-push-2 {
    left: 16.66666667%;
  }
  .col-sm-push-1 {
    left: 8.33333333%;
  }
  .col-sm-push-0 {
    left: auto;
  }
  .col-sm-offset-12 {
    margin-left: 100%;
  }
  .col-sm-offset-11 {
    margin-left: 91.66666667%;
  }
  .col-sm-offset-10 {
    margin-left: 83.33333333%;
  }
  .col-sm-offset-9 {
    margin-left: 75%;
  }
  .col-sm-offset-8 {
    margin-left: 66.66666667%;
  }
  .col-sm-offset-7 {
    margin-left: 58.33333333%;
  }
  .col-sm-offset-6 {
    margin-left: 50%;
  }
  .col-sm-offset-5 {
    margin-left: 41.66666667%;
  }
  .col-sm-offset-4 {
    margin-left: 33.33333333%;
  }
  .col-sm-offset-3 {
    margin-left: 25%;
  }
  .col-sm-offset-2 {
    margin-left: 16.66666667%;
  }
  .col-sm-offset-1 {
    margin-left: 8.33333333%;
  }
  .col-sm-offset-0 {
    margin-left: 0;
  }
}
@media (min-width: 992px) {
  .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {
    float: left;
  }
  .col-md-12 {
    width: 100%;
  }
  .col-md-11 {
    width: 91.66666667%;
  }
  .col-md-10 {
    width: 83.33333333%;
  }
  .col-md-9 {
    width: 75%;
  }
  .col-md-8 {
    width: 66.66666667%;
  }
  .col-md-7 {
    width: 58.33333333%;
  }
  .col-md-6 {
    width: 50%;
  }
  .col-md-5 {
    width: 41.66666667%;
  }
  .col-md-4 {
    width: 33.33333333%;
  }
  .col-md-3 {
    width: 25%;
  }
  .col-md-2 {
    width: 16.66666667%;
  }
  .col-md-1 {
    width: 8.33333333%;
  }
  .col-md-pull-12 {
    right: 100%;
  }
  .col-md-pull-11 {
    right: 91.66666667%;
  }
  .col-md-pull-10 {
    right: 83.33333333%;
  }
  .col-md-pull-9 {
    right: 75%;
  }
  .col-md-pull-8 {
    right: 66.66666667%;
  }
  .col-md-pull-7 {
    right: 58.33333333%;
  }
  .col-md-pull-6 {
    right: 50%;
  }
  .col-md-pull-5 {
    right: 41.66666667%;
  }
  .col-md-pull-4 {
    right: 33.33333333%;
  }
  .col-md-pull-3 {
    right: 25%;
  }
  .col-md-pull-2 {
    right: 16.66666667%;
  }
  .col-md-pull-1 {
    right: 8.33333333%;
  }
  .col-md-pull-0 {
    right: auto;
  }
  .col-md-push-12 {
    left: 100%;
  }
  .col-md-push-11 {
    left: 91.66666667%;
  }
  .col-md-push-10 {
    left: 83.33333333%;
  }
  .col-md-push-9 {
    left: 75%;
  }
  .col-md-push-8 {
    left: 66.66666667%;
  }
  .col-md-push-7 {
    left: 58.33333333%;
  }
  .col-md-push-6 {
    left: 50%;
  }
  .col-md-push-5 {
    left: 41.66666667%;
  }
  .col-md-push-4 {
    left: 33.33333333%;
  }
  .col-md-push-3 {
    left: 25%;
  }
  .col-md-push-2 {
    left: 16.66666667%;
  }
  .col-md-push-1 {
    left: 8.33333333%;
  }
  .col-md-push-0 {
    left: auto;
  }
  .col-md-offset-12 {
    margin-left: 100%;
  }
  .col-md-offset-11 {
    margin-left: 91.66666667%;
  }
  .col-md-offset-10 {
    margin-left: 83.33333333%;
  }
  .col-md-offset-9 {
    margin-left: 75%;
  }
  .col-md-offset-8 {
    margin-left: 66.66666667%;
  }
  .col-md-offset-7 {
    margin-left: 58.33333333%;
  }
  .col-md-offset-6 {
    margin-left: 50%;
  }
  .col-md-offset-5 {
    margin-left: 41.66666667%;
  }
  .col-md-offset-4 {
    margin-left: 33.33333333%;
  }
  .col-md-offset-3 {
    margin-left: 25%;
  }
  .col-md-offset-2 {
    margin-left: 16.66666667%;
  }
  .col-md-offset-1 {
    margin-left: 8.33333333%;
  }
  .col-md-offset-0 {
    margin-left: 0;
  }
}
@media (min-width: 1200px) {
  .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {
    float: left;
  }
  .col-lg-12 {
    width: 100%;
  }
  .col-lg-11 {
    width: 91.66666667%;
  }
  .col-lg-10 {
    width: 83.33333333%;
  }
  .col-lg-9 {
    width: 75%;
  }
  .col-lg-8 {
    width: 66.66666667%;
  }
  .col-lg-7 {
    width: 58.33333333%;
  }
  .col-lg-6 {
    width: 50%;
  }
  .col-lg-5 {
    width: 41.66666667%;
  }
  .col-lg-4 {
    width: 33.33333333%;
  }
  .col-lg-3 {
    width: 25%;
  }
  .col-lg-2 {
    width: 16.66666667%;
  }
  .col-lg-1 {
    width: 8.33333333%;
  }
  .col-lg-pull-12 {
    right: 100%;
  }
  .col-lg-pull-11 {
    right: 91.66666667%;
  }
  .col-lg-pull-10 {
    right: 83.33333333%;
  }
  .col-lg-pull-9 {
    right: 75%;
  }
  .col-lg-pull-8 {
    right: 66.66666667%;
  }
  .col-lg-pull-7 {
    right: 58.33333333%;
  }
  .col-lg-pull-6 {
    right: 50%;
  }
  .col-lg-pull-5 {
    right: 41.66666667%;
  }
  .col-lg-pull-4 {
    right: 33.33333333%;
  }
  .col-lg-pull-3 {
    right: 25%;
  }
  .col-lg-pull-2 {
    right: 16.66666667%;
  }
  .col-lg-pull-1 {
    right: 8.33333333%;
  }
  .col-lg-pull-0 {
    right: auto;
  }
  .col-lg-push-12 {
    left: 100%;
  }
  .col-lg-push-11 {
    left: 91.66666667%;
  }
  .col-lg-push-10 {
    left: 83.33333333%;
  }
  .col-lg-push-9 {
    left: 75%;
  }
  .col-lg-push-8 {
    left: 66.66666667%;
  }
  .col-lg-push-7 {
    left: 58.33333333%;
  }
  .col-lg-push-6 {
    left: 50%;
  }
  .col-lg-push-5 {
    left: 41.66666667%;
  }
  .col-lg-push-4 {
    left: 33.33333333%;
  }
  .col-lg-push-3 {
    left: 25%;
  }
  .col-lg-push-2 {
    left: 16.66666667%;
  }
  .col-lg-push-1 {
    left: 8.33333333%;
  }
  .col-lg-push-0 {
    left: auto;
  }
  .col-lg-offset-12 {
    margin-left: 100%;
  }
  .col-lg-offset-11 {
    margin-left: 91.66666667%;
  }
  .col-lg-offset-10 {
    margin-left: 83.33333333%;
  }
  .col-lg-offset-9 {
    margin-left: 75%;
  }
  .col-lg-offset-8 {
    margin-left: 66.66666667%;
  }
  .col-lg-offset-7 {
    margin-left: 58.33333333%;
  }
  .col-lg-offset-6 {
    margin-left: 50%;
  }
  .col-lg-offset-5 {
    margin-left: 41.66666667%;
  }
  .col-lg-offset-4 {
    margin-left: 33.33333333%;
  }
  .col-lg-offset-3 {
    margin-left: 25%;
  }
  .col-lg-offset-2 {
    margin-left: 16.66666667%;
  }
  .col-lg-offset-1 {
    margin-left: 8.33333333%;
  }
  .col-lg-offset-0 {
    margin-left: 0;
  }
}
table {
  background-color: transparent;
}
caption {
  padding-top: 8px;
  padding-bottom: 8px;
  color: #777;
  text-align: left;
}
th {
  text-align: left;
}
.table {
  width: 100%;
  max-width: 100%;
  margin-bottom: 20px;
}
.table > thead > tr > th,
.table > tbody > tr > th,
.table > tfoot > tr > th,
.table > thead > tr > td,
.table > tbody > tr > td,
.table > tfoot > tr > td {
  padding: 8px;
  line-height: 1.42857143;
  vertical-align: top;
  border-top: 1px solid #ddd;
}
.table > thead > tr > th {
  vertical-align: bottom;
  border-bottom: 2px solid #ddd;
}
.table > caption + thead > tr:first-child > th,
.table > colgroup + thead > tr:first-child > th,
.table > thead:first-child > tr:first-child > th,
.table > caption + thead > tr:first-child > td,
.table > colgroup + thead > tr:first-child > td,
.table > thead:first-child > tr:first-child > td {
  border-top: 0;
}
.table > tbody + tbody {
  border-top: 2px solid #ddd;
}
.table .table {
  background-color: #fff;
}
.table-condensed > thead > tr > th,
.table-condensed > tbody > tr > th,
.table-condensed > tfoot > tr > th,
.table-condensed > thead > tr > td,
.table-condensed > tbody > tr > td,
.table-condensed > tfoot > tr > td {
  padding: 5px;
}
.table-bordered {
  border: 1px solid #ddd;
}
.table-bordered > thead > tr > th,
.table-bordered > tbody > tr > th,
.table-bordered > tfoot > tr > th,
.table-bordered > thead > tr > td,
.table-bordered > tbody > tr > td,
.table-bordered > tfoot > tr > td {
  border: 1px solid #ddd;
}
.table-bordered > thead > tr > th,
.table-bordered > thead > tr > td {
  border-bottom-width: 2px;
}
.table-striped > tbody > tr:nth-of-type(odd) {
  background-color: #f9f9f9;
}
.table-hover > tbody > tr:hover {
  background-color: #f5f5f5;
}
table col[class*="col-"] {
  position: static;
  display: table-column;
  float: none;
}
table td[class*="col-"],
table th[class*="col-"] {
  position: static;
  display: table-cell;
  float: none;
}
.table > thead > tr > td.active,
.table > tbody > tr > td.active,
.table > tfoot > tr > td.active,
.table > thead > tr > th.active,
.table > tbody > tr > th.active,
.table > tfoot > tr > th.active,
.table > thead > tr.active > td,
.table > tbody > tr.active > td,
.table > tfoot > tr.active > td,
.table > thead > tr.active > th,
.table > tbody > tr.active > th,
.table > tfoot > tr.active > th {
  background-color: #f5f5f5;
}
.table-hover > tbody > tr > td.active:hover,
.table-hover > tbody > tr > th.active:hover,
.table-hover > tbody > tr.active:hover > td,
.table-hover > tbody > tr:hover > .active,
.table-hover > tbody > tr.active:hover > th {
  background-color: #e8e8e8;
}
.table > thead > tr > td.success,
.table > tbody > tr > td.success,
.table > tfoot > tr > td.success,
.table > thead > tr > th.success,
.table > tbody > tr > th.success,
.table > tfoot > tr > th.success,
.table > thead > tr.success > td,
.table > tbody > tr.success > td,
.table > tfoot > tr.success > td,
.table > thead > tr.success > th,
.table > tbody > tr.success > th,
.table > tfoot > tr.success > th {
  background-color: #dff0d8;
}
.table-hover > tbody > tr > td.success:hover,
.table-hover > tbody > tr > th.success:hover,
.table-hover > tbody > tr.success:hover > td,
.table-hover > tbody > tr:hover > .success,
.table-hover > tbody > tr.success:hover > th {
  background-color: #d0e9c6;
}
.table > thead > tr > td.info,
.table > tbody > tr > td.info,
.table > tfoot > tr > td.info,
.table > thead > tr > th.info,
.table > tbody > tr > th.info,
.table > tfoot > tr > th.info,
.table > thead > tr.info > td,
.table > tbody > tr.info > td,
.table > tfoot > tr.info > td,
.table > thead > tr.info > th,
.table > tbody > tr.info > th,
.table > tfoot > tr.info > th {
  background-color: #d9edf7;
}
.table-hover > tbody > tr > td.info:hover,
.table-hover > tbody > tr > th.info:hover,
.table-hover > tbody > tr.info:hover > td,
.table-hover > tbody > tr:hover > .info,
.table-hover > tbody > tr.info:hover > th {
  background-color: #c4e3f3;
}
.table > thead > tr > td.warning,
.table > tbody > tr > td.warning,
.table > tfoot > tr > td.warning,
.table > thead > tr > th.warning,
.table > tbody > tr > th.warning,
.table > tfoot > tr > th.warning,
.table > thead > tr.warning > td,
.table > tbody > tr.warning > td,
.table > tfoot > tr.warning > td,
.table > thead > tr.warning > th,
.table > tbody > tr.warning > th,
.table > tfoot > tr.warning > th {
  background-color: #fcf8e3;
}
.table-hover > tbody > tr > td.warning:hover,
.table-hover > tbody > tr > th.warning:hover,
.table-hover > tbody > tr.warning:hover > td,
.table-hover > tbody > tr:hover > .warning,
.table-hover > tbody > tr.warning:hover > th {
  background-color: #faf2cc;
}
.table > thead > tr > td.danger,
.table > tbody > tr > td.danger,
.table > tfoot > tr > td.danger,
.table > thead > tr > th.danger,
.table > tbody > tr > th.danger,
.table > tfoot > tr > th.danger,
.table > thead > tr.danger > td,
.table > tbody > tr.danger > td,
.table > tfoot > tr.danger > td,
.table > thead > tr.danger > th,
.table > tbody > tr.danger > th,
.table > tfoot > tr.danger > th {
  background-color: #f2dede;
}
.table-hover > tbody > tr > td.danger:hover,
.table-hover > tbody > tr > th.danger:hover,
.table-hover > tbody > tr.danger:hover > td,
.table-hover > tbody > tr:hover > .danger,
.table-hover > tbody > tr.danger:hover > th {
  background-color: #ebcccc;
}
.table-responsive {
  min-height: .01%;
  overflow-x: auto;
}
@media screen and (max-width: 767px) {
  .table-responsive {
    width: 100%;
    margin-bottom: 15px;
    overflow-y: hidden;
    -ms-overflow-style: -ms-autohiding-scrollbar;
    border: 1px solid #ddd;
  }
  .table-responsive > .table {
    margin-bottom: 0;
  }
  .table-responsive > .table > thead > tr > th,
  .table-responsive > .table > tbody > tr > th,
  .table-responsive > .table > tfoot > tr > th,
  .table-responsive > .table > thead > tr > td,
  .table-responsive > .table > tbody > tr > td,
  .table-responsive > .table > tfoot > tr > td {
    white-space: nowrap;
  }
  .table-responsive > .table-bordered {
    border: 0;
  }
  .table-responsive > .table-bordered > thead > tr > th:first-child,
  .table-responsive > .table-bordered > tbody > tr > th:first-child,
  .table-responsive > .table-bordered > tfoot > tr > th:first-child,
  .table-responsive > .table-bordered > thead > tr > td:first-child,
  .table-responsive > .table-bordered > tbody > tr > td:first-child,
  .table-responsive > .table-bordered > tfoot > tr > td:first-child {
    border-left: 0;
  }
  .table-responsive > .table-bordered > thead > tr > th:last-child,
  .table-responsive > .table-bordered > tbody > tr > th:last-child,
  .table-responsive > .table-bordered > tfoot > tr > th:last-child,
  .table-responsive > .table-bordered > thead > tr > td:last-child,
  .table-responsive > .table-bordered > tbody > tr > td:last-child,
  .table-responsive > .table-bordered > tfoot > tr > td:last-child {
    border-right: 0;
  }
  .table-responsive > .table-bordered > tbody > tr:last-child > th,
  .table-responsive > .table-bordered > tfoot > tr:last-child > th,
  .table-responsive > .table-bordered > tbody > tr:last-child > td,
  .table-responsive > .table-bordered > tfoot > tr:last-child > td {
    border-bottom: 0;
  }
}
fieldset {
  min-width: 0;
  padding: 0;
  margin: 0;
  border: 0;
}
legend {
  display: block;
  width: 100%;
  padding: 0;
  margin-bottom: 20px;
  font-size: 21px;
  line-height: inherit;
  color: #333;
  border: 0;
  border-bottom: 1px solid #e5e5e5;
}
label {
  display: inline-block;
  max-width: 100%;
  margin-bottom: 5px;
  font-weight: bold;
}
input[type="search"] {
  -webkit-box-sizing: border-box;
     -moz-box-sizing: border-box;
          box-sizing: border-box;
}
input[type="radio"],
input[type="checkbox"] {
  margin: 4px 0 0;
  margin-top: 1px \9;
  line-height: normal;
}
input[type="file"] {
  display: block;
}
input[type="range"] {
  display: block;
  width: 100%;
}
select[multiple],
select[size] {
  height: auto;
}
input[type="file"]:focus,
input[type="radio"]:focus,
input[type="checkbox"]:focus {
  outline: 5px auto -webkit-focus-ring-color;
  outline-offset: -2px;
}
output {
  display: block;
  padding-top: 7px;
  font-size: 14px;
  line-height: 1.42857143;
  color: #555;
}
.form-control {
  display: block;
  width: 100%;
  height: 34px;
  padding: 6px 12px;
  font-size: 14px;
  line-height: 1.42857143;
  color: #555;
  background-color: #fff;
  background-image: none;
  border: 1px solid #ccc;
  border-radius: 4px;
  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
  -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;
       -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
          transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
}
.form-control:focus {
  border-color: #66afe9;
  outline: 0;
  -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);
          box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);
}
.form-control::-moz-placeholder {
  color: #999;
  opacity: 1;
}
.form-control:-ms-input-placeholder {
  color: #999;
}
.form-control::-webkit-input-placeholder {
  color: #999;
}
.form-control::-ms-expand {
  background-color: transparent;
  border: 0;
}
.form-control[disabled],
.form-control[readonly],
fieldset[disabled] .form-control {
  background-color: #eee;
  opacity: 1;
}
.form-control[disabled],
fieldset[disabled] .form-control {
  cursor: not-allowed;
}
textarea.form-control {
  height: auto;
}
input[type="search"] {
  -webkit-appearance: none;
}
@media screen and (-webkit-min-device-pixel-ratio: 0) {
  input[type="date"].form-control,
  input[type="time"].form-control,
  input[type="datetime-local"].form-control,
  input[type="month"].form-control {
    line-height: 34px;
  }
  input[type="date"].input-sm,
  input[type="time"].input-sm,
  input[type="datetime-local"].input-sm,
  input[type="month"].input-sm,
  .input-group-sm input[type="date"],
  .input-group-sm input[type="time"],
  .input-group-sm input[type="datetime-local"],
  .input-group-sm input[type="month"] {
    line-height: 30px;
  }
  input[type="date"].input-lg,
  input[type="time"].input-lg,
  input[type="datetime-local"].input-lg,
  input[type="month"].input-lg,
  .input-group-lg input[type="date"],
  .input-group-lg input[type="time"],
  .input-group-lg input[type="datetime-local"],
  .input-group-lg input[type="month"] {
    line-height: 46px;
  }
}
.form-group {
  margin-bottom: 15px;
}
.radio,
.checkbox {
  position: relative;
  display: block;
  margin-top: 10px;
  margin-bottom: 10px;
}
.radio label,
.checkbox label {
  min-height: 20px;
  padding-left: 20px;
  margin-bottom: 0;
  font-weight: normal;
  cursor: pointer;
}
.radio input[type="radio"],
.radio-inline input[type="radio"],
.checkbox input[type="checkbox"],
.checkbox-inline input[type="checkbox"] {
  position: absolute;
  margin-top: 4px \9;
  margin-left: -20px;
}
.radio + .radio,
.checkbox + .checkbox {
  margin-top: -5px;
}
.radio-inline,
.checkbox-inline {
  position: relative;
  display: inline-block;
  padding-left: 20px;
  margin-bottom: 0;
  font-weight: normal;
  vertical-align: middle;
  cursor: pointer;
}
.radio-inline + .radio-inline,
.checkbox-inline + .checkbox-inline {
  margin-top: 0;
  margin-left: 10px;
}
input[type="radio"][disabled],
input[type="checkbox"][disabled],
input[type="radio"].disabled,
input[type="checkbox"].disabled,
fieldset[disabled] input[type="radio"],
fieldset[disabled] input[type="checkbox"] {
  cursor: not-allowed;
}
.radio-inline.disabled,
.checkbox-inline.disabled,
fieldset[disabled] .radio-inline,
fieldset[disabled] .checkbox-inline {
  cursor: not-allowed;
}
.radio.disabled label,
.checkbox.disabled label,
fieldset[disabled] .radio label,
fieldset[disabled] .checkbox label {
  cursor: not-allowed;
}
.form-control-static {
  min-height: 34px;
  padding-top: 7px;
  padding-bottom: 7px;
  margin-bottom: 0;
}
.form-control-static.input-lg,
.form-control-static.input-sm {
  padding-right: 0;
  padding-left: 0;
}
.input-sm {
  height: 30px;
  padding: 5px 10px;
  font-size: 12px;
  line-height: 1.5;
  border-radius: 3px;
}
select.input-sm {
  height: 30px;
  line-height: 30px;
}
textarea.input-sm,
select[multiple].input-sm {
  height: auto;
}
.form-group-sm .form-control {
  height: 30px;
  padding: 5px 10px;
  font-size: 12px;
  line-height: 1.5;
  border-radius: 3px;
}
.form-group-sm select.form-control {
  height: 30px;
  line-height: 30px;
}
.form-group-sm textarea.form-control,
.form-group-sm select[multiple].form-control {
  height: auto;
}
.form-group-sm .form-control-static {
  height: 30px;
  min-height: 32px;
  padding: 6px 10px;
  font-size: 12px;
  line-height: 1.5;
}
.input-lg {
  height: 46px;
  padding: 10px 16px;
  font-size: 18px;
  line-height: 1.3333333;
  border-radius: 6px;
}
select.input-lg {
  height: 46px;
  line-height: 46px;
}
textarea.input-lg,
select[multiple].input-lg {
  height: auto;
}
.form-group-lg .form-control {
  height: 46px;
  padding: 10px 16px;
  font-size: 18px;
  line-height: 1.3333333;
  border-radius: 6px;
}
.form-group-lg select.form-control {
  height: 46px;
  line-height: 46px;
}
.form-group-lg textarea.form-control,
.form-group-lg select[multiple].form-control {
  height: auto;
}
.form-group-lg .form-control-static {
  height: 46px;
  min-height: 38px;
  padding: 11px 16px;
  font-size: 18px;
  line-height: 1.3333333;
}
.has-feedback {
  position: relative;
}
.has-feedback .form-control {
  padding-right: 42.5px;
}
.form-control-feedback {
  position: absolute;
  top: 0;
  right: 0;
  z-index: 2;
  display: block;
  width: 34px;
  height: 34px;
  line-height: 34px;
  text-align: center;
  pointer-events: none;
}
.input-lg + .form-control-feedback,
.input-group-lg + .form-control-feedback,
.form-group-lg .form-control + .form-control-feedback {
  width: 46px;
  height: 46px;
  line-height: 46px;
}
.input-sm + .form-control-feedback,
.input-group-sm + .form-control-feedback,
.form-group-sm .form-control + .form-control-feedback {
  width: 30px;
  height: 30px;
  line-height: 30px;
}
.has-success .help-block,
.has-success .control-label,
.has-success .radio,
.has-success .checkbox,
.has-success .radio-inline,
.has-success .checkbox-inline,
.has-success.radio label,
.has-success.checkbox label,
.has-success.radio-inline label,
.has-success.checkbox-inline label {
  color: #3c763d;
}
.has-success .form-control {
  border-color: #3c763d;
  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
}
.has-success .form-control:focus {
  border-color: #2b542c;
  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;
          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;
}
.has-success .input-group-addon {
  color: #3c763d;
  background-color: #dff0d8;
  border-color: #3c763d;
}
.has-success .form-control-feedback {
  color: #3c763d;
}
.has-warning .help-block,
.has-warning .control-label,
.has-warning .radio,
.has-warning .checkbox,
.has-warning .radio-inline,
.has-warning .checkbox-inline,
.has-warning.radio label,
.has-warning.checkbox label,
.has-warning.radio-inline label,
.has-warning.checkbox-inline label {
  color: #8a6d3b;
}
.has-warning .form-control {
  border-color: #8a6d3b;
  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
}
.has-warning .form-control:focus {
  border-color: #66512c;
  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;
          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;
}
.has-warning .input-group-addon {
  color: #8a6d3b;
  background-color: #fcf8e3;
  border-color: #8a6d3b;
}
.has-warning .form-control-feedback {
  color: #8a6d3b;
}
.has-error .help-block,
.has-error .control-label,
.has-error .radio,
.has-error .checkbox,
.has-error .radio-inline,
.has-error .checkbox-inline,
.has-error.radio label,
.has-error.checkbox label,
.has-error.radio-inline label,
.has-error.checkbox-inline label {
  color: #a94442;
}
.has-error .form-control {
  border-color: #a94442;
  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
}
.has-error .form-control:focus {
  border-color: #843534;
  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;
          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;
}
.has-error .input-group-addon {
  color: #a94442;
  background-color: #f2dede;
  border-color: #a94442;
}
.has-error .form-control-feedback {
  color: #a94442;
}
.has-feedback label ~ .form-control-feedback {
  top: 25px;
}
.has-feedback label.sr-only ~ .form-control-feedback {
  top: 0;
}
.help-block {
  display: block;
  margin-top: 5px;
  margin-bottom: 10px;
  color: #737373;
}
@media (min-width: 768px) {
  .form-inline .form-group {
    display: inline-block;
    margin-bottom: 0;
    vertical-align: middle;
  }
  .form-inline .form-control {
    display: inline-block;
    width: auto;
    vertical-align: middle;
  }
  .form-inline .form-control-static {
    display: inline-block;
  }
  .form-inline .input-group {
    display: inline-table;
    vertical-align: middle;
  }
  .form-inline .input-group .input-group-addon,
  .form-inline .input-group .input-group-btn,
  .form-inline .input-group .form-control {
    width: auto;
  }
  .form-inline .input-group > .form-control {
    width: 100%;
  }
  .form-inline .control-label {
    margin-bottom: 0;
    vertical-align: middle;
  }
  .form-inline .radio,
  .form-inline .checkbox {
    display: inline-block;
    margin-top: 0;
    margin-bottom: 0;
    vertical-align: middle;
  }
  .form-inline .radio label,
  .form-inline .checkbox label {
    padding-left: 0;
  }
  .form-inline .radio input[type="radio"],
  .form-inline .checkbox input[type="checkbox"] {
    position: relative;
    margin-left: 0;
  }
  .form-inline .has-feedback .form-control-feedback {
    top: 0;
  }
}
.form-horizontal .radio,
.form-horizontal .checkbox,
.form-horizontal .radio-inline,
.form-horizontal .checkbox-inline {
  padding-top: 7px;
  margin-top: 0;
  margin-bottom: 0;
}
.form-horizontal .radio,
.form-horizontal .checkbox {
  min-height: 27px;
}
.form-horizontal .form-group {
  margin-right: -15px;
  margin-left: -15px;
}
@media (min-width: 768px) {
  .form-horizontal .control-label {
    padding-top: 7px;
    margin-bottom: 0;
    text-align: right;
  }
}
.form-horizontal .has-feedback .form-control-feedback {
  right: 15px;
}
@media (min-width: 768px) {
  .form-horizontal .form-group-lg .control-label {
    padding-top: 11px;
    font-size: 18px;
  }
}
@media (min-width: 768px) {
  .form-horizontal .form-group-sm .control-label {
    padding-top: 6px;
    font-size: 12px;
  }
}
.btn {
  display: inline-block;
  padding: 6px 12px;
  margin-bottom: 0;
  font-size: 14px;
  font-weight: normal;
  line-height: 1.42857143;
  text-align: center;
  white-space: nowrap;
  vertical-align: middle;
  -ms-touch-action: manipulation;
      touch-action: manipulation;
  cursor: pointer;
  -webkit-user-select: none;
     -moz-user-select: none;
      -ms-user-select: none;
          user-select: none;
  background-image: none;
  border: 1px solid transparent;
  border-radius: 4px;
}
.btn:focus,
.btn:active:focus,
.btn.active:focus,
.btn.focus,
.btn:active.focus,
.btn.active.focus {
  outline: 5px auto -webkit-focus-ring-color;
  outline-offset: -2px;
}
.btn:hover,
.btn:focus,
.btn.focus {
  color: #333;
  text-decoration: none;
}
.btn:active,
.btn.active {
  background-image: none;
  outline: 0;
  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
}
.btn.disabled,
.btn[disabled],
fieldset[disabled] .btn {
  cursor: not-allowed;
  filter: alpha(opacity=65);
  -webkit-box-shadow: none;
          box-shadow: none;
  opacity: .65;
}
a.btn.disabled,
fieldset[disabled] a.btn {
  pointer-events: none;
}
.btn-default {
  color: #333;
  background-color: #fff;
  border-color: #ccc;
}
.btn-default:focus,
.btn-default.focus {
  color: #333;
  background-color: #e6e6e6;
  border-color: #8c8c8c;
}
.btn-default:hover {
  color: #333;
  background-color: #e6e6e6;
  border-color: #adadad;
}
.btn-default:active,
.btn-default.active,
.open > .dropdown-toggle.btn-default {
  color: #333;
  background-color: #e6e6e6;
  border-color: #adadad;
}
.btn-default:active:hover,
.btn-default.active:hover,
.open > .dropdown-toggle.btn-default:hover,
.btn-default:active:focus,
.btn-default.active:focus,
.open > .dropdown-toggle.btn-default:focus,
.btn-default:active.focus,
.btn-default.active.focus,
.open > .dropdown-toggle.btn-default.focus {
  color: #333;
  background-color: #d4d4d4;
  border-color: #8c8c8c;
}
.btn-default:active,
.btn-default.active,
.open > .dropdown-toggle.btn-default {
  background-image: none;
}
.btn-default.disabled:hover,
.btn-default[disabled]:hover,
fieldset[disabled] .btn-default:hover,
.btn-default.disabled:focus,
.btn-default[disabled]:focus,
fieldset[disabled] .btn-default:focus,
.btn-default.disabled.focus,
.btn-default[disabled].focus,
fieldset[disabled] .btn-default.focus {
  background-color: #fff;
  border-color: #ccc;
}
.btn-default .badge {
  color: #fff;
  background-color: #333;
}
.btn-primary {
  color: #fff;
  background-color: #337ab7;
  border-color: #2e6da4;
}
.btn-primary:focus,
.btn-primary.focus {
  color: #fff;
  background-color: #286090;
  border-color: #122b40;
}
.btn-primary:hover {
  color: #fff;
  background-color: #286090;
  border-color: #204d74;
}
.btn-primary:active,
.btn-primary.active,
.open > .dropdown-toggle.btn-primary {
  color: #fff;
  background-color: #286090;
  border-color: #204d74;
}
.btn-primary:active:hover,
.btn-primary.active:hover,
.open > .dropdown-toggle.btn-primary:hover,
.btn-primary:active:focus,
.btn-primary.active:focus,
.open > .dropdown-toggle.btn-primary:focus,
.btn-primary:active.focus,
.btn-primary.active.focus,
.open > .dropdown-toggle.btn-primary.focus {
  color: #fff;
  background-color: #204d74;
  border-color: #122b40;
}
.btn-primary:active,
.btn-primary.active,
.open > .dropdown-toggle.btn-primary {
  background-image: none;
}
.btn-primary.disabled:hover,
.btn-primary[disabled]:hover,
fieldset[disabled] .btn-primary:hover,
.btn-primary.disabled:focus,
.btn-primary[disabled]:focus,
fieldset[disabled] .btn-primary:focus,
.btn-primary.disabled.focus,
.btn-primary[disabled].focus,
fieldset[disabled] .btn-primary.focus {
  background-color: #337ab7;
  border-color: #2e6da4;
}
.btn-primary .badge {
  color: #337ab7;
  background-color: #fff;
}
.btn-success {
  color: #fff;
  background-color: #5cb85c;
  border-color: #4cae4c;
}
.btn-success:focus,
.btn-success.focus {
  color: #fff;
  background-color: #449d44;
  border-color: #255625;
}
.btn-success:hover {
  color: #fff;
  background-color: #449d44;
  border-color: #398439;
}
.btn-success:active,
.btn-success.active,
.open > .dropdown-toggle.btn-success {
  color: #fff;
  background-color: #449d44;
  border-color: #398439;
}
.btn-success:active:hover,
.btn-success.active:hover,
.open > .dropdown-toggle.btn-success:hover,
.btn-success:active:focus,
.btn-success.active:focus,
.open > .dropdown-toggle.btn-success:focus,
.btn-success:active.focus,
.btn-success.active.focus,
.open > .dropdown-toggle.btn-success.focus {
  color: #fff;
  background-color: #398439;
  border-color: #255625;
}
.btn-success:active,
.btn-success.active,
.open > .dropdown-toggle.btn-success {
  background-image: none;
}
.btn-success.disabled:hover,
.btn-success[disabled]:hover,
fieldset[disabled] .btn-success:hover,
.btn-success.disabled:focus,
.btn-success[disabled]:focus,
fieldset[disabled] .btn-success:focus,
.btn-success.disabled.focus,
.btn-success[disabled].focus,
fieldset[disabled] .btn-success.focus {
  background-color: #5cb85c;
  border-color: #4cae4c;
}
.btn-success .badge {
  color: #5cb85c;
  background-color: #fff;
}
.btn-info {
  color: #fff;
  background-color: #5bc0de;
  border-color: #46b8da;
}
.btn-info:focus,
.btn-info.focus {
  color: #fff;
  background-color: #31b0d5;
  border-color: #1b6d85;
}
.btn-info:hover {
  color: #fff;
  background-color: #31b0d5;
  border-color: #269abc;
}
.btn-info:active,
.btn-info.active,
.open > .dropdown-toggle.btn-info {
  color: #fff;
  background-color: #31b0d5;
  border-color: #269abc;
}
.btn-info:active:hover,
.btn-info.active:hover,
.open > .dropdown-toggle.btn-info:hover,
.btn-info:active:focus,
.btn-info.active:focus,
.open > .dropdown-toggle.btn-info:focus,
.btn-info:active.focus,
.btn-info.active.focus,
.open > .dropdown-toggle.btn-info.focus {
  color: #fff;
  background-color: #269abc;
  border-color: #1b6d85;
}
.btn-info:active,
.btn-info.active,
.open > .dropdown-toggle.btn-info {
  background-image: none;
}
.btn-info.disabled:hover,
.btn-info[disabled]:hover,
fieldset[disabled] .btn-info:hover,
.btn-info.disabled:focus,
.btn-info[disabled]:focus,
fieldset[disabled] .btn-info:focus,
.btn-info.disabled.focus,
.btn-info[disabled].focus,
fieldset[disabled] .btn-info.focus {
  background-color: #5bc0de;
  border-color: #46b8da;
}
.btn-info .badge {
  color: #5bc0de;
  background-color: #fff;
}
.btn-warning {
  color: #fff;
  background-color: #f0ad4e;
  border-color: #eea236;
}
.btn-warning:focus,
.btn-warning.focus {
  color: #fff;
  background-color: #ec971f;
  border-color: #985f0d;
}
.btn-warning:hover {
  color: #fff;
  background-color: #ec971f;
  border-color: #d58512;
}
.btn-warning:active,
.btn-warning.active,
.open > .dropdown-toggle.btn-warning {
  color: #fff;
  background-color: #ec971f;
  border-color: #d58512;
}
.btn-warning:active:hover,
.btn-warning.active:hover,
.open > .dropdown-toggle.btn-warning:hover,
.btn-warning:active:focus,
.btn-warning.active:focus,
.open > .dropdown-toggle.btn-warning:focus,
.btn-warning:active.focus,
.btn-warning.active.focus,
.open > .dropdown-toggle.btn-warning.focus {
  color: #fff;
  background-color: #d58512;
  border-color: #985f0d;
}
.btn-warning:active,
.btn-warning.active,
.open > .dropdown-toggle.btn-warning {
  background-image: none;
}
.btn-warning.disabled:hover,
.btn-warning[disabled]:hover,
fieldset[disabled] .btn-warning:hover,
.btn-warning.disabled:focus,
.btn-warning[disabled]:focus,
fieldset[disabled] .btn-warning:focus,
.btn-warning.disabled.focus,
.btn-warning[disabled].focus,
fieldset[disabled] .btn-warning.focus {
  background-color: #f0ad4e;
  border-color: #eea236;
}
.btn-warning .badge {
  color: #f0ad4e;
  background-color: #fff;
}
.btn-danger {
  color: #fff;
  background-color: #d9534f;
  border-color: #d43f3a;
}
.btn-danger:focus,
.btn-danger.focus {
  color: #fff;
  background-color: #c9302c;
  border-color: #761c19;
}
.btn-danger:hover {
  color: #fff;
  background-color: #c9302c;
  border-color: #ac2925;
}
.btn-danger:active,
.btn-danger.active,
.open > .dropdown-toggle.btn-danger {
  color: #fff;
  background-color: #c9302c;
  border-color: #ac2925;
}
.btn-danger:active:hover,
.btn-danger.active:hover,
.open > .dropdown-toggle.btn-danger:hover,
.btn-danger:active:focus,
.btn-danger.active:focus,
.open > .dropdown-toggle.btn-danger:focus,
.btn-danger:active.focus,
.btn-danger.active.focus,
.open > .dropdown-toggle.btn-danger.focus {
  color: #fff;
  background-color: #ac2925;
  border-color: #761c19;
}
.btn-danger:active,
.btn-danger.active,
.open > .dropdown-toggle.btn-danger {
  background-image: none;
}
.btn-danger.disabled:hover,
.btn-danger[disabled]:hover,
fieldset[disabled] .btn-danger:hover,
.btn-danger.disabled:focus,
.btn-danger[disabled]:focus,
fieldset[disabled] .btn-danger:focus,
.btn-danger.disabled.focus,
.btn-danger[disabled].focus,
fieldset[disabled] .btn-danger.focus {
  background-color: #d9534f;
  border-color: #d43f3a;
}
.btn-danger .badge {
  color: #d9534f;
  background-color: #fff;
}
.btn-link {
  font-weight: normal;
  color: #337ab7;
  border-radius: 0;
}
.btn-link,
.btn-link:active,
.btn-link.active,
.btn-link[disabled],
fieldset[disabled] .btn-link {
  background-color: transparent;
  -webkit-box-shadow: none;
          box-shadow: none;
}
.btn-link,
.btn-link:hover,
.btn-link:focus,
.btn-link:active {
  border-color: transparent;
}
.btn-link:hover,
.btn-link:focus {
  color: #23527c;
  text-decoration: underline;
  background-color: transparent;
}
.btn-link[disabled]:hover,
fieldset[disabled] .btn-link:hover,
.btn-link[disabled]:focus,
fieldset[disabled] .btn-link:focus {
  color: #777;
  text-decoration: none;
}
.btn-lg,
.btn-group-lg > .btn {
  padding: 10px 16px;
  font-size: 18px;
  line-height: 1.3333333;
  border-radius: 6px;
}
.btn-sm,
.btn-group-sm > .btn {
  padding: 5px 10px;
  font-size: 12px;
  line-height: 1.5;
  border-radius: 3px;
}
.btn-xs,
.btn-group-xs > .btn {
  padding: 1px 5px;
  font-size: 12px;
  line-height: 1.5;
  border-radius: 3px;
}
.btn-block {
  display: block;
  width: 100%;
}
.btn-block + .btn-block {
  margin-top: 5px;
}
input[type="submit"].btn-block,
input[type="reset"].btn-block,
input[type="button"].btn-block {
  width: 100%;
}
.fade {
  opacity: 0;
  -webkit-transition: opacity .15s linear;
       -o-transition: opacity .15s linear;
          transition: opacity .15s linear;
}
.fade.in {
  opacity: 1;
}
.collapse {
  display: none;
}
.collapse.in {
  display: block;
}
tr.collapse.in {
  display: table-row;
}
tbody.collapse.in {
  display: table-row-group;
}
.collapsing {
  position: relative;
  height: 0;
  overflow: hidden;
  -webkit-transition-timing-function: ease;
       -o-transition-timing-function: ease;
          transition-timing-function: ease;
  -webkit-transition-duration: .35s;
       -o-transition-duration: .35s;
          transition-duration: .35s;
  -webkit-transition-property: height, visibility;
       -o-transition-property: height, visibility;
          transition-property: height, visibility;
}
.caret {
  display: inline-block;
  width: 0;
  height: 0;
  margin-left: 2px;
  vertical-align: middle;
  border-top: 4px dashed;
  border-top: 4px solid \9;
  border-right: 4px solid transparent;
  border-left: 4px solid transparent;
}
.dropup,
.dropdown {
  position: relative;
}
.dropdown-toggle:focus {
  outline: 0;
}
.dropdown-menu {
  position: absolute;
  top: 100%;
  left: 0;
  z-index: 1000;
  display: none;
  float: left;
  min-width: 160px;
  padding: 5px 0;
  margin: 2px 0 0;
  font-size: 14px;
  text-align: left;
  list-style: none;
  background-color: #fff;
  -webkit-background-clip: padding-box;
          background-clip: padding-box;
  border: 1px solid #ccc;
  border: 1px solid rgba(0, 0, 0, .15);
  border-radius: 4px;
  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
          box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
}
.dropdown-menu.pull-right {
  right: 0;
  left: auto;
}
.dropdown-menu .divider {
  height: 1px;
  margin: 9px 0;
  overflow: hidden;
  background-color: #e5e5e5;
}
.dropdown-menu > li > a {
  display: block;
  padding: 3px 20px;
  clear: both;
  font-weight: normal;
  line-height: 1.42857143;
  color: #333;
  white-space: nowrap;
}
.dropdown-menu > li > a:hover,
.dropdown-menu > li > a:focus {
  color: #262626;
  text-decoration: none;
  background-color: #f5f5f5;
}
.dropdown-menu > .active > a,
.dropdown-menu > .active > a:hover,
.dropdown-menu > .active > a:focus {
  color: #fff;
  text-decoration: none;
  background-color: #337ab7;
  outline: 0;
}
.dropdown-menu > .disabled > a,
.dropdown-menu > .disabled > a:hover,
.dropdown-menu > .disabled > a:focus {
  color: #777;
}
.dropdown-menu > .disabled > a:hover,
.dropdown-menu > .disabled > a:focus {
  text-decoration: none;
  cursor: not-allowed;
  background-color: transparent;
  background-image: none;
  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
}
.open > .dropdown-menu {
  display: block;
}
.open > a {
  outline: 0;
}
.dropdown-menu-right {
  right: 0;
  left: auto;
}
.dropdown-menu-left {
  right: auto;
  left: 0;
}
.dropdown-header {
  display: block;
  padding: 3px 20px;
  font-size: 12px;
  line-height: 1.42857143;
  color: #777;
  white-space: nowrap;
}
.dropdown-backdrop {
  position: fixed;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  z-index: 990;
}
.pull-right > .dropdown-menu {
  right: 0;
  left: auto;
}
.dropup .caret,
.navbar-fixed-bottom .dropdown .caret {
  content: "";
  border-top: 0;
  border-bottom: 4px dashed;
  border-bottom: 4px solid \9;
}
.dropup .dropdown-menu,
.navbar-fixed-bottom .dropdown .dropdown-menu {
  top: auto;
  bottom: 100%;
  margin-bottom: 2px;
}
@media (min-width: 768px) {
  .navbar-right .dropdown-menu {
    right: 0;
    left: auto;
  }
  .navbar-right .dropdown-menu-left {
    right: auto;
    left: 0;
  }
}
.btn-group,
.btn-group-vertical {
  position: relative;
  display: inline-block;
  vertical-align: middle;
}
.btn-group > .btn,
.btn-group-vertical > .btn {
  position: relative;
  float: left;
}
.btn-group > .btn:hover,
.btn-group-vertical > .btn:hover,
.btn-group > .btn:focus,
.btn-group-vertical > .btn:focus,
.btn-group > .btn:active,
.btn-group-vertical > .btn:active,
.btn-group > .btn.active,
.btn-group-vertical > .btn.active {
  z-index: 2;
}
.btn-group .btn + .btn,
.btn-group .btn + .btn-group,
.btn-group .btn-group + .btn,
.btn-group .btn-group + .btn-group {
  margin-left: -1px;
}
.btn-toolbar {
  margin-left: -5px;
}
.btn-toolbar .btn,
.btn-toolbar .btn-group,
.btn-toolbar .input-group {
  float: left;
}
.btn-toolbar > .btn,
.btn-toolbar > .btn-group,
.btn-toolbar > .input-group {
  margin-left: 5px;
}
.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
  border-radius: 0;
}
.btn-group > .btn:first-child {
  margin-left: 0;
}
.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {
  border-top-right-radius: 0;
  border-bottom-right-radius: 0;
}
.btn-group > .btn:last-child:not(:first-child),
.btn-group > .dropdown-toggle:not(:first-child) {
  border-top-left-radius: 0;
  border-bottom-left-radius: 0;
}
.btn-group > .btn-group {
  float: left;
}
.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
  border-radius: 0;
}
.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,
.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
  border-top-right-radius: 0;
  border-bottom-right-radius: 0;
}
.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {
  border-top-left-radius: 0;
  border-bottom-left-radius: 0;
}
.btn-group .dropdown-toggle:active,
.btn-group.open .dropdown-toggle {
  outline: 0;
}
.btn-group > .btn + .dropdown-toggle {
  padding-right: 8px;
  padding-left: 8px;
}
.btn-group > .btn-lg + .dropdown-toggle {
  padding-right: 12px;
  padding-left: 12px;
}
.btn-group.open .dropdown-toggle {
  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
}
.btn-group.open .dropdown-toggle.btn-link {
  -webkit-box-shadow: none;
          box-shadow: none;
}
.btn .caret {
  margin-left: 0;
}
.btn-lg .caret {
  border-width: 5px 5px 0;
  border-bottom-width: 0;
}
.dropup .btn-lg .caret {
  border-width: 0 5px 5px;
}
.btn-group-vertical > .btn,
.btn-group-vertical > .btn-group,
.btn-group-vertical > .btn-group > .btn {
  display: block;
  float: none;
  width: 100%;
  max-width: 100%;
}
.btn-group-vertical > .btn-group > .btn {
  float: none;
}
.btn-group-vertical > .btn + .btn,
.btn-group-vertical > .btn + .btn-group,
.btn-group-vertical > .btn-group + .btn,
.btn-group-vertical > .btn-group + .btn-group {
  margin-top: -1px;
  margin-left: 0;
}
.btn-group-vertical > .btn:not(:first-child):not(:last-child) {
  border-radius: 0;
}
.btn-group-vertical > .btn:first-child:not(:last-child) {
  border-top-left-radius: 4px;
  border-top-right-radius: 4px;
  border-bottom-right-radius: 0;
  border-bottom-left-radius: 0;
}
.btn-group-vertical > .btn:last-child:not(:first-child) {
  border-top-left-radius: 0;
  border-top-right-radius: 0;
  border-bottom-right-radius: 4px;
  border-bottom-left-radius: 4px;
}
.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
  border-radius: 0;
}
.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,
.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
  border-bottom-right-radius: 0;
  border-bottom-left-radius: 0;
}
.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {
  border-top-left-radius: 0;
  border-top-right-radius: 0;
}
.btn-group-justified {
  display: table;
  width: 100%;
  table-layout: fixed;
  border-collapse: separate;
}
.btn-group-justified > .btn,
.btn-group-justified > .btn-group {
  display: table-cell;
  float: none;
  width: 1%;
}
.btn-group-justified > .btn-group .btn {
  width: 100%;
}
.btn-group-justified > .btn-group .dropdown-menu {
  left: auto;
}
[data-toggle="buttons"] > .btn input[type="radio"],
[data-toggle="buttons"] > .btn-group > .btn input[type="radio"],
[data-toggle="buttons"] > .btn input[type="checkbox"],
[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] {
  position: absolute;
  clip: rect(0, 0, 0, 0);
  pointer-events: none;
}
.input-group {
  position: relative;
  display: table;
  border-collapse: separate;
}
.input-group[class*="col-"] {
  float: none;
  padding-right: 0;
  padding-left: 0;
}
.input-group .form-control {
  position: relative;
  z-index: 2;
  float: left;
  width: 100%;
  margin-bottom: 0;
}
.input-group .form-control:focus {
  z-index: 3;
}
.input-group-lg > .form-control,
.input-group-lg > .input-group-addon,
.input-group-lg > .input-group-btn > .btn {
  height: 46px;
  padding: 10px 16px;
  font-size: 18px;
  line-height: 1.3333333;
  border-radius: 6px;
}
select.input-group-lg > .form-control,
select.input-group-lg > .input-group-addon,
select.input-group-lg > .input-group-btn > .btn {
  height: 46px;
  line-height: 46px;
}
textarea.input-group-lg > .form-control,
textarea.input-group-lg > .input-group-addon,
textarea.input-group-lg > .input-group-btn > .btn,
select[multiple].input-group-lg > .form-control,
select[multiple].input-group-lg > .input-group-addon,
select[multiple].input-group-lg > .input-group-btn > .btn {
  height: auto;
}
.input-group-sm > .form-control,
.input-group-sm > .input-group-addon,
.input-group-sm > .input-group-btn > .btn {
  height: 30px;
  padding: 5px 10px;
  font-size: 12px;
  line-height: 1.5;
  border-radius: 3px;
}
select.input-group-sm > .form-control,
select.input-group-sm > .input-group-addon,
select.input-group-sm > .input-group-btn > .btn {
  height: 30px;
  line-height: 30px;
}
textarea.input-group-sm > .form-control,
textarea.input-group-sm > .input-group-addon,
textarea.input-group-sm > .input-group-btn > .btn,
select[multiple].input-group-sm > .form-control,
select[multiple].input-group-sm > .input-group-addon,
select[multiple].input-group-sm > .input-group-btn > .btn {
  height: auto;
}
.input-group-addon,
.input-group-btn,
.input-group .form-control {
  display: table-cell;
}
.input-group-addon:not(:first-child):not(:last-child),
.input-group-btn:not(:first-child):not(:last-child),
.input-group .form-control:not(:first-child):not(:last-child) {
  border-radius: 0;
}
.input-group-addon,
.input-group-btn {
  width: 1%;
  white-space: nowrap;
  vertical-align: middle;
}
.input-group-addon {
  padding: 6px 12px;
  font-size: 14px;
  font-weight: normal;
  line-height: 1;
  color: #555;
  text-align: center;
  background-color: #eee;
  border: 1px solid #ccc;
  border-radius: 4px;
}
.input-group-addon.input-sm {
  padding: 5px 10px;
  font-size: 12px;
  border-radius: 3px;
}
.input-group-addon.input-lg {
  padding: 10px 16px;
  font-size: 18px;
  border-radius: 6px;
}
.input-group-addon input[type="radio"],
.input-group-addon input[type="checkbox"] {
  margin-top: 0;
}
.input-group .form-control:first-child,
.input-group-addon:first-child,
.input-group-btn:first-child > .btn,
.input-group-btn:first-child > .btn-group > .btn,
.input-group-btn:first-child > .dropdown-toggle,
.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),
.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {
  border-top-right-radius: 0;
  border-bottom-right-radius: 0;
}
.input-group-addon:first-child {
  border-right: 0;
}
.input-group .form-control:last-child,
.input-group-addon:last-child,
.input-group-btn:last-child > .btn,
.input-group-btn:last-child > .btn-group > .btn,
.input-group-btn:last-child > .dropdown-toggle,
.input-group-btn:first-child > .btn:not(:first-child),
.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {
  border-top-left-radius: 0;
  border-bottom-left-radius: 0;
}
.input-group-addon:last-child {
  border-left: 0;
}
.input-group-btn {
  position: relative;
  font-size: 0;
  white-space: nowrap;
}
.input-group-btn > .btn {
  position: relative;
}
.input-group-btn > .btn + .btn {
  margin-left: -1px;
}
.input-group-btn > .btn:hover,
.input-group-btn > .btn:focus,
.input-group-btn > .btn:active {
  z-index: 2;
}
.input-group-btn:first-child > .btn,
.input-group-btn:first-child > .btn-group {
  margin-right: -1px;
}
.input-group-btn:last-child > .btn,
.input-group-btn:last-child > .btn-group {
  z-index: 2;
  margin-left: -1px;
}
.nav {
  padding-left: 0;
  margin-bottom: 0;
  list-style: none;
}
.nav > li {
  position: relative;
  display: block;
}
.nav > li > a {
  position: relative;
  display: block;
  padding: 10px 15px;
}
.nav > li > a:hover,
.nav > li > a:focus {
  text-decoration: none;
  background-color: #eee;
}
.nav > li.disabled > a {
  color: #777;
}
.nav > li.disabled > a:hover,
.nav > li.disabled > a:focus {
  color: #777;
  text-decoration: none;
  cursor: not-allowed;
  background-color: transparent;
}
.nav .open > a,
.nav .open > a:hover,
.nav .open > a:focus {
  background-color: #eee;
  border-color: #337ab7;
}
.nav .nav-divider {
  height: 1px;
  margin: 9px 0;
  overflow: hidden;
  background-color: #e5e5e5;
}
.nav > li > a > img {
  max-width: none;
}
.nav-tabs {
  border-bottom: 1px solid #ddd;
}
.nav-tabs > li {
  float: left;
  margin-bottom: -1px;
}
.nav-tabs > li > a {
  margin-right: 2px;
  line-height: 1.42857143;
  border: 1px solid transparent;
  border-radius: 4px 4px 0 0;
}
.nav-tabs > li > a:hover {
  border-color: #eee #eee #ddd;
}
.nav-tabs > li.active > a,
.nav-tabs > li.active > a:hover,
.nav-tabs > li.active > a:focus {
  color: #555;
  cursor: default;
  background-color: #fff;
  border: 1px solid #ddd;
  border-bottom-color: transparent;
}
.nav-tabs.nav-justified {
  width: 100%;
  border-bottom: 0;
}
.nav-tabs.nav-justified > li {
  float: none;
}
.nav-tabs.nav-justified > li > a {
  margin-bottom: 5px;
  text-align: center;
}
.nav-tabs.nav-justified > .dropdown .dropdown-menu {
  top: auto;
  left: auto;
}
@media (min-width: 768px) {
  .nav-tabs.nav-justified > li {
    display: table-cell;
    width: 1%;
  }
  .nav-tabs.nav-justified > li > a {
    margin-bottom: 0;
  }
}
.nav-tabs.nav-justified > li > a {
  margin-right: 0;
  border-radius: 4px;
}
.nav-tabs.nav-justified > .active > a,
.nav-tabs.nav-justified > .active > a:hover,
.nav-tabs.nav-justified > .active > a:focus {
  border: 1px solid #ddd;
}
@media (min-width: 768px) {
  .nav-tabs.nav-justified > li > a {
    border-bottom: 1px solid #ddd;
    border-radius: 4px 4px 0 0;
  }
  .nav-tabs.nav-justified > .active > a,
  .nav-tabs.nav-justified > .active > a:hover,
  .nav-tabs.nav-justified > .active > a:focus {
    border-bottom-color: #fff;
  }
}
.nav-pills > li {
  float: left;
}
.nav-pills > li > a {
  border-radius: 4px;
}
.nav-pills > li + li {
  margin-left: 2px;
}
.nav-pills > li.active > a,
.nav-pills > li.active > a:hover,
.nav-pills > li.active > a:focus {
  color: #fff;
  background-color: #337ab7;
}
.nav-stacked > li {
  float: none;
}
.nav-stacked > li + li {
  margin-top: 2px;
  margin-left: 0;
}
.nav-justified {
  width: 100%;
}
.nav-justified > li {
  float: none;
}
.nav-justified > li > a {
  margin-bottom: 5px;
  text-align: center;
}
.nav-justified > .dropdown .dropdown-menu {
  top: auto;
  left: auto;
}
@media (min-width: 768px) {
  .nav-justified > li {
    display: table-cell;
    width: 1%;
  }
  .nav-justified > li > a {
    margin-bottom: 0;
  }
}
.nav-tabs-justified {
  border-bottom: 0;
}
.nav-tabs-justified > li > a {
  margin-right: 0;
  border-radius: 4px;
}
.nav-tabs-justified > .active > a,
.nav-tabs-justified > .active > a:hover,
.nav-tabs-justified > .active > a:focus {
  border: 1px solid #ddd;
}
@media (min-width: 768px) {
  .nav-tabs-justified > li > a {
    border-bottom: 1px solid #ddd;
    border-radius: 4px 4px 0 0;
  }
  .nav-tabs-justified > .active > a,
  .nav-tabs-justified > .active > a:hover,
  .nav-tabs-justified > .active > a:focus {
    border-bottom-color: #fff;
  }
}
.tab-content > .tab-pane {
  display: none;
}
.tab-content > .active {
  display: block;
}
.nav-tabs .dropdown-menu {
  margin-top: -1px;
  border-top-left-radius: 0;
  border-top-right-radius: 0;
}
.navbar {
  position: relative;
  min-height: 50px;
  margin-bottom: 20px;
  border: 1px solid transparent;
}
@media (min-width: 768px) {
  .navbar {
    border-radius: 4px;
  }
}
@media (min-width: 768px) {
  .navbar-header {
    float: left;
  }
}
.navbar-collapse {
  padding-right: 15px;
  padding-left: 15px;
  overflow-x: visible;
  -webkit-overflow-scrolling: touch;
  border-top: 1px solid transparent;
  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);
          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);
}
.navbar-collapse.in {
  overflow-y: auto;
}
@media (min-width: 768px) {
  .navbar-collapse {
    width: auto;
    border-top: 0;
    -webkit-box-shadow: none;
            box-shadow: none;
  }
  .navbar-collapse.collapse {
    display: block !important;
    height: auto !important;
    padding-bottom: 0;
    overflow: visible !important;
  }
  .navbar-collapse.in {
    overflow-y: visible;
  }
  .navbar-fixed-top .navbar-collapse,
  .navbar-static-top .navbar-collapse,
  .navbar-fixed-bottom .navbar-collapse {
    padding-right: 0;
    padding-left: 0;
  }
}
.navbar-fixed-top .navbar-collapse,
.navbar-fixed-bottom .navbar-collapse {
  max-height: 340px;
}
@media (max-device-width: 480px) and (orientation: landscape) {
  .navbar-fixed-top .navbar-collapse,
  .navbar-fixed-bottom .navbar-collapse {
    max-height: 200px;
  }
}
.container > .navbar-header,
.container-fluid > .navbar-header,
.container > .navbar-collapse,
.container-fluid > .navbar-collapse {
  margin-right: -15px;
  margin-left: -15px;
}
@media (min-width: 768px) {
  .container > .navbar-header,
  .container-fluid > .navbar-header,
  .container > .navbar-collapse,
  .container-fluid > .navbar-collapse {
    margin-right: 0;
    margin-left: 0;
  }
}
.navbar-static-top {
  z-index: 1000;
  border-width: 0 0 1px;
}
@media (min-width: 768px) {
  .navbar-static-top {
    border-radius: 0;
  }
}
.navbar-fixed-top,
.navbar-fixed-bottom {
  position: fixed;
  right: 0;
  left: 0;
  z-index: 1030;
}
@media (min-width: 768px) {
  .navbar-fixed-top,
  .navbar-fixed-bottom {
    border-radius: 0;
  }
}
.navbar-fixed-top {
  top: 0;
  border-width: 0 0 1px;
}
.navbar-fixed-bottom {
  bottom: 0;
  margin-bottom: 0;
  border-width: 1px 0 0;
}
.navbar-brand {
  float: left;
  height: 50px;
  padding: 15px 15px;
  font-size: 18px;
  line-height: 20px;
}
.navbar-brand:hover,
.navbar-brand:focus {
  text-decoration: none;
}
.navbar-brand > img {
  display: block;
}
@media (min-width: 768px) {
  .navbar > .container .navbar-brand,
  .navbar > .container-fluid .navbar-brand {
    margin-left: -15px;
  }
}
.navbar-toggle {
  position: relative;
  float: right;
  padding: 9px 10px;
  margin-top: 8px;
  margin-right: 15px;
  margin-bottom: 8px;
  background-color: transparent;
  background-image: none;
  border: 1px solid transparent;
  border-radius: 4px;
}
.navbar-toggle:focus {
  outline: 0;
}
.navbar-toggle .icon-bar {
  display: block;
  width: 22px;
  height: 2px;
  border-radius: 1px;
}
.navbar-toggle .icon-bar + .icon-bar {
  margin-top: 4px;
}
@media (min-width: 768px) {
  .navbar-toggle {
    display: none;
  }
}
.navbar-nav {
  margin: 7.5px -15px;
}
.navbar-nav > li > a {
  padding-top: 10px;
  padding-bottom: 10px;
  line-height: 20px;
}
@media (max-width: 767px) {
  .navbar-nav .open .dropdown-menu {
    position: static;
    float: none;
    width: auto;
    margin-top: 0;
    background-color: transparent;
    border: 0;
    -webkit-box-shadow: none;
            box-shadow: none;
  }
  .navbar-nav .open .dropdown-menu > li > a,
  .navbar-nav .open .dropdown-menu .dropdown-header {
    padding: 5px 15px 5px 25px;
  }
  .navbar-nav .open .dropdown-menu > li > a {
    line-height: 20px;
  }
  .navbar-nav .open .dropdown-menu > li > a:hover,
  .navbar-nav .open .dropdown-menu > li > a:focus {
    background-image: none;
  }
}
@media (min-width: 768px) {
  .navbar-nav {
    float: left;
    margin: 0;
  }
  .navbar-nav > li {
    float: left;
  }
  .navbar-nav > li > a {
    padding-top: 15px;
    padding-bottom: 15px;
  }
}
.navbar-form {
  padding: 10px 15px;
  margin-top: 8px;
  margin-right: -15px;
  margin-bottom: 8px;
  margin-left: -15px;
  border-top: 1px solid transparent;
  border-bottom: 1px solid transparent;
  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);
          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);
}
@media (min-width: 768px) {
  .navbar-form .form-group {
    display: inline-block;
    margin-bottom: 0;
    vertical-align: middle;
  }
  .navbar-form .form-control {
    display: inline-block;
    width: auto;
    vertical-align: middle;
  }
  .navbar-form .form-control-static {
    display: inline-block;
  }
  .navbar-form .input-group {
    display: inline-table;
    vertical-align: middle;
  }
  .navbar-form .input-group .input-group-addon,
  .navbar-form .input-group .input-group-btn,
  .navbar-form .input-group .form-control {
    width: auto;
  }
  .navbar-form .input-group > .form-control {
    width: 100%;
  }
  .navbar-form .control-label {
    margin-bottom: 0;
    vertical-align: middle;
  }
  .navbar-form .radio,
  .navbar-form .checkbox {
    display: inline-block;
    margin-top: 0;
    margin-bottom: 0;
    vertical-align: middle;
  }
  .navbar-form .radio label,
  .navbar-form .checkbox label {
    padding-left: 0;
  }
  .navbar-form .radio input[type="radio"],
  .navbar-form .checkbox input[type="checkbox"] {
    position: relative;
    margin-left: 0;
  }
  .navbar-form .has-feedback .form-control-feedback {
    top: 0;
  }
}
@media (max-width: 767px) {
  .navbar-form .form-group {
    margin-bottom: 5px;
  }
  .navbar-form .form-group:last-child {
    margin-bottom: 0;
  }
}
@media (min-width: 768px) {
  .navbar-form {
    width: auto;
    padding-top: 0;
    padding-bottom: 0;
    margin-right: 0;
    margin-left: 0;
    border: 0;
    -webkit-box-shadow: none;
            box-shadow: none;
  }
}
.navbar-nav > li > .dropdown-menu {
  margin-top: 0;
  border-top-left-radius: 0;
  border-top-right-radius: 0;
}
.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {
  margin-bottom: 0;
  border-top-left-radius: 4px;
  border-top-right-radius: 4px;
  border-bottom-right-radius: 0;
  border-bottom-left-radius: 0;
}
.navbar-btn {
  margin-top: 8px;
  margin-bottom: 8px;
}
.navbar-btn.btn-sm {
  margin-top: 10px;
  margin-bottom: 10px;
}
.navbar-btn.btn-xs {
  margin-top: 14px;
  margin-bottom: 14px;
}
.navbar-text {
  margin-top: 15px;
  margin-bottom: 15px;
}
@media (min-width: 768px) {
  .navbar-text {
    float: left;
    margin-right: 15px;
    margin-left: 15px;
  }
}
@media (min-width: 768px) {
  .navbar-left {
    float: left !important;
  }
  .navbar-right {
    float: right !important;
    margin-right: -15px;
  }
  .navbar-right ~ .navbar-right {
    margin-right: 0;
  }
}
.navbar-default {
  background-color: #f8f8f8;
  border-color: #e7e7e7;
}
.navbar-default .navbar-brand {
  color: #777;
}
.navbar-default .navbar-brand:hover,
.navbar-default .navbar-brand:focus {
  color: #5e5e5e;
  background-color: transparent;
}
.navbar-default .navbar-text {
  color: #777;
}
.navbar-default .navbar-nav > li > a {
  color: #777;
}
.navbar-default .navbar-nav > li > a:hover,
.navbar-default .navbar-nav > li > a:focus {
  color: #333;
  background-color: transparent;
}
.navbar-default .navbar-nav > .active > a,
.navbar-default .navbar-nav > .active > a:hover,
.navbar-default .navbar-nav > .active > a:focus {
  color: #555;
  background-color: #e7e7e7;
}
.navbar-default .navbar-nav > .disabled > a,
.navbar-default .navbar-nav > .disabled > a:hover,
.navbar-default .navbar-nav > .disabled > a:focus {
  color: #ccc;
  background-color: transparent;
}
.navbar-default .navbar-toggle {
  border-color: #ddd;
}
.navbar-default .navbar-toggle:hover,
.navbar-default .navbar-toggle:focus {
  background-color: #ddd;
}
.navbar-default .navbar-toggle .icon-bar {
  background-color: #888;
}
.navbar-default .navbar-collapse,
.navbar-default .navbar-form {
  border-color: #e7e7e7;
}
.navbar-default .navbar-nav > .open > a,
.navbar-default .navbar-nav > .open > a:hover,
.navbar-default .navbar-nav > .open > a:focus {
  color: #555;
  background-color: #e7e7e7;
}
@media (max-width: 767px) {
  .navbar-default .navbar-nav .open .dropdown-menu > li > a {
    color: #777;
  }
  .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,
  .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {
    color: #333;
    background-color: transparent;
  }
  .navbar-default .navbar-nav .open .dropdown-menu > .active > a,
  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,
  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {
    color: #555;
    background-color: #e7e7e7;
  }
  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,
  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,
  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {
    color: #ccc;
    background-color: transparent;
  }
}
.navbar-default .navbar-link {
  color: #777;
}
.navbar-default .navbar-link:hover {
  color: #333;
}
.navbar-default .btn-link {
  color: #777;
}
.navbar-default .btn-link:hover,
.navbar-default .btn-link:focus {
  color: #333;
}
.navbar-default .btn-link[disabled]:hover,
fieldset[disabled] .navbar-default .btn-link:hover,
.navbar-default .btn-link[disabled]:focus,
fieldset[disabled] .navbar-default .btn-link:focus {
  color: #ccc;
}
.navbar-inverse {
  background-color: #222;
  border-color: #080808;
}
.navbar-inverse .navbar-brand {
  color: #9d9d9d;
}
.navbar-inverse .navbar-brand:hover,
.navbar-inverse .navbar-brand:focus {
  color: #fff;
  background-color: transparent;
}
.navbar-inverse .navbar-text {
  color: #9d9d9d;
}
.navbar-inverse .navbar-nav > li > a {
  color: #9d9d9d;
}
.navbar-inverse .navbar-nav > li > a:hover,
.navbar-inverse .navbar-nav > li > a:focus {
  color: #fff;
  background-color: transparent;
}
.navbar-inverse .navbar-nav > .active > a,
.navbar-inverse .navbar-nav > .active > a:hover,
.navbar-inverse .navbar-nav > .active > a:focus {
  color: #fff;
  background-color: #080808;
}
.navbar-inverse .navbar-nav > .disabled > a,
.navbar-inverse .navbar-nav > .disabled > a:hover,
.navbar-inverse .navbar-nav > .disabled > a:focus {
  color: #444;
  background-color: transparent;
}
.navbar-inverse .navbar-toggle {
  border-color: #333;
}
.navbar-inverse .navbar-toggle:hover,
.navbar-inverse .navbar-toggle:focus {
  background-color: #333;
}
.navbar-inverse .navbar-toggle .icon-bar {
  background-color: #fff;
}
.navbar-inverse .navbar-collapse,
.navbar-inverse .navbar-form {
  border-color: #101010;
}
.navbar-inverse .navbar-nav > .open > a,
.navbar-inverse .navbar-nav > .open > a:hover,
.navbar-inverse .navbar-nav > .open > a:focus {
  color: #fff;
  background-color: #080808;
}
@media (max-width: 767px) {
  .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {
    border-color: #080808;
  }
  .navbar-inverse .navbar-nav .open .dropdown-menu .divider {
    background-color: #080808;
  }
  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {
    color: #9d9d9d;
  }
  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,
  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {
    color: #fff;
    background-color: transparent;
  }
  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,
  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,
  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {
    color: #fff;
    background-color: #080808;
  }
  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,
  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,
  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {
    color: #444;
    background-color: transparent;
  }
}
.navbar-inverse .navbar-link {
  color: #9d9d9d;
}
.navbar-inverse .navbar-link:hover {
  color: #fff;
}
.navbar-inverse .btn-link {
  color: #9d9d9d;
}
.navbar-inverse .btn-link:hover,
.navbar-inverse .btn-link:focus {
  color: #fff;
}
.navbar-inverse .btn-link[disabled]:hover,
fieldset[disabled] .navbar-inverse .btn-link:hover,
.navbar-inverse .btn-link[disabled]:focus,
fieldset[disabled] .navbar-inverse .btn-link:focus {
  color: #444;
}
.breadcrumb {
  padding: 8px 15px;
  margin-bottom: 20px;
  list-style: none;
  background-color: #f5f5f5;
  border-radius: 4px;
}
.breadcrumb > li {
  display: inline-block;
}
.breadcrumb > li + li:before {
  padding: 0 5px;
  color: #ccc;
  content: "/\00a0";
}
.breadcrumb > .active {
  color: #777;
}
.pagination {
  display: inline-block;
  padding-left: 0;
  margin: 20px 0;
  border-radius: 4px;
}
.pagination > li {
  display: inline;
}
.pagination > li > a,
.pagination > li > span {
  position: relative;
  float: left;
  padding: 6px 12px;
  margin-left: -1px;
  line-height: 1.42857143;
  color: #337ab7;
  text-decoration: none;
  background-color: #fff;
  border: 1px solid #ddd;
}
.pagination > li:first-child > a,
.pagination > li:first-child > span {
  margin-left: 0;
  border-top-left-radius: 4px;
  border-bottom-left-radius: 4px;
}
.pagination > li:last-child > a,
.pagination > li:last-child > span {
  border-top-right-radius: 4px;
  border-bottom-right-radius: 4px;
}
.pagination > li > a:hover,
.pagination > li > span:hover,
.pagination > li > a:focus,
.pagination > li > span:focus {
  z-index: 2;
  color: #23527c;
  background-color: #eee;
  border-color: #ddd;
}
.pagination > .active > a,
.pagination > .active > span,
.pagination > .active > a:hover,
.pagination > .active > span:hover,
.pagination > .active > a:focus,
.pagination > .active > span:focus {
  z-index: 3;
  color: #fff;
  cursor: default;
  background-color: #337ab7;
  border-color: #337ab7;
}
.pagination > .disabled > span,
.pagination > .disabled > span:hover,
.pagination > .disabled > span:focus,
.pagination > .disabled > a,
.pagination > .disabled > a:hover,
.pagination > .disabled > a:focus {
  color: #777;
  cursor: not-allowed;
  background-color: #fff;
  border-color: #ddd;
}
.pagination-lg > li > a,
.pagination-lg > li > span {
  padding: 10px 16px;
  font-size: 18px;
  line-height: 1.3333333;
}
.pagination-lg > li:first-child > a,
.pagination-lg > li:first-child > span {
  border-top-left-radius: 6px;
  border-bottom-left-radius: 6px;
}
.pagination-lg > li:last-child > a,
.pagination-lg > li:last-child > span {
  border-top-right-radius: 6px;
  border-bottom-right-radius: 6px;
}
.pagination-sm > li > a,
.pagination-sm > li > span {
  padding: 5px 10px;
  font-size: 12px;
  line-height: 1.5;
}
.pagination-sm > li:first-child > a,
.pagination-sm > li:first-child > span {
  border-top-left-radius: 3px;
  border-bottom-left-radius: 3px;
}
.pagination-sm > li:last-child > a,
.pagination-sm > li:last-child > span {
  border-top-right-radius: 3px;
  border-bottom-right-radius: 3px;
}
.pager {
  padding-left: 0;
  margin: 20px 0;
  text-align: center;
  list-sty
Download .txt
gitextract_vd94vg5x/

├── .dockerignore
├── .github/
│   └── workflows/
│       ├── 1-actions-ci-cd-aks.yml
│       ├── 2-actions-ci-cd-aks-tf.yml
│       ├── 3-actions-ci-cd-aks-tf-backend.yml
│       └── 4-actions-ci-cd-aks-tf-backend-jobs.yml
├── .gitignore
├── .vscode/
│   ├── launch.json
│   ├── settings.json
│   └── tasks.json
├── MvcApp/
│   ├── Controllers/
│   │   ├── HomeController.cs
│   │   └── ProductsController.cs
│   ├── Data/
│   │   └── ProductsContext.cs
│   ├── Dockerfile
│   ├── Microscanner.Dockerfile
│   ├── Models/
│   │   ├── ErrorViewModel.cs
│   │   └── product.cs
│   ├── MvcApp.csproj
│   ├── Program.cs
│   ├── Properties/
│   │   └── launchSettings.json
│   ├── Startup.cs
│   ├── Views/
│   │   ├── Home/
│   │   │   ├── About.cshtml
│   │   │   ├── Contact.cshtml
│   │   │   ├── Index.cshtml
│   │   │   └── Privacy.cshtml
│   │   ├── Products/
│   │   │   ├── Create.cshtml
│   │   │   ├── Delete.cshtml
│   │   │   ├── Details.cshtml
│   │   │   ├── Edit.cshtml
│   │   │   └── Index.cshtml
│   │   ├── Shared/
│   │   │   ├── Error.cshtml
│   │   │   ├── _CookieConsentPartial.cshtml
│   │   │   ├── _Layout.cshtml
│   │   │   └── _ValidationScriptsPartial.cshtml
│   │   ├── _ViewImports.cshtml
│   │   └── _ViewStart.cshtml
│   ├── appsettings.Development.json
│   ├── appsettings.json
│   └── wwwroot/
│       ├── css/
│       │   └── site.css
│       ├── js/
│       │   └── site.js
│       └── lib/
│           ├── bootstrap/
│           │   ├── .bower.json
│           │   ├── LICENSE
│           │   └── dist/
│           │       ├── css/
│           │       │   ├── bootstrap-theme.css
│           │       │   └── bootstrap.css
│           │       └── js/
│           │           ├── bootstrap.js
│           │           └── npm.js
│           ├── jquery/
│           │   ├── .bower.json
│           │   ├── LICENSE.txt
│           │   └── dist/
│           │       └── jquery.js
│           ├── jquery-validation/
│           │   ├── .bower.json
│           │   ├── LICENSE.md
│           │   └── dist/
│           │       ├── additional-methods.js
│           │       └── jquery.validate.js
│           └── jquery-validation-unobtrusive/
│               ├── .bower.json
│               ├── LICENSE.txt
│               └── jquery.validate.unobtrusive.js
├── ProductsStoreOnKubernetes.sln
├── README.demo.md
├── README.md
├── WebApp/
│   ├── Controllers/
│   │   ├── HomeController.cs
│   │   └── ProductsController.cs
│   ├── Data/
│   │   └── ProductsContext.cs
│   ├── Dockerfile
│   ├── Models/
│   │   ├── ErrorViewModel.cs
│   │   └── Product.cs
│   ├── Program.cs
│   ├── Properties/
│   │   ├── launchSettings.json
│   │   ├── serviceDependencies.json
│   │   └── serviceDependencies.local.json
│   ├── Startup.cs
│   ├── Views/
│   │   ├── Home/
│   │   │   ├── Index.cshtml
│   │   │   └── Privacy.cshtml
│   │   ├── Products/
│   │   │   ├── Create.cshtml
│   │   │   ├── Delete.cshtml
│   │   │   ├── Details.cshtml
│   │   │   ├── Edit.cshtml
│   │   │   └── Index.cshtml
│   │   ├── Shared/
│   │   │   ├── Error.cshtml
│   │   │   ├── _Layout.cshtml
│   │   │   └── _ValidationScriptsPartial.cshtml
│   │   ├── _ViewImports.cshtml
│   │   └── _ViewStart.cshtml
│   ├── WebApp.csproj
│   ├── appsettings.Development.json
│   ├── appsettings.json
│   └── wwwroot/
│       ├── css/
│       │   └── site.css
│       ├── js/
│       │   └── site.js
│       └── lib/
│           ├── bootstrap/
│           │   ├── LICENSE
│           │   └── dist/
│           │       ├── css/
│           │       │   ├── bootstrap-grid.css
│           │       │   ├── bootstrap-reboot.css
│           │       │   └── bootstrap.css
│           │       └── js/
│           │           ├── bootstrap.bundle.js
│           │           └── bootstrap.js
│           ├── jquery/
│           │   ├── LICENSE.txt
│           │   └── dist/
│           │       └── jquery.js
│           ├── jquery-validation/
│           │   ├── LICENSE.md
│           │   └── dist/
│           │       ├── additional-methods.js
│           │       └── jquery.validate.js
│           └── jquery-validation-unobtrusive/
│               ├── LICENSE.txt
│               └── jquery.validate.unobtrusive.js
├── ansible/
│   └── aks-ansible.yml
├── arm-template/
│   ├── parameters.json
│   └── template.json
├── azure-pipelines.yml
├── charts/
│   ├── commands.ps1
│   ├── firstchart/
│   │   ├── .helmignore
│   │   ├── Chart.yaml
│   │   ├── templates/
│   │   │   ├── NOTES.txt
│   │   │   ├── _helpers.tpl
│   │   │   ├── deployment.yaml
│   │   │   ├── hpa.yaml
│   │   │   ├── ingress.yaml
│   │   │   ├── service.yaml
│   │   │   ├── serviceaccount.yaml
│   │   │   └── tests/
│   │   │       └── test-connection.yaml
│   │   └── values.yaml
│   └── productsstore/
│       ├── .helmignore
│       ├── Chart.yaml
│       ├── templates/
│       │   ├── _helpers.tpl
│       │   ├── helm-namespace.yaml
│       │   ├── mssql-config-map.yaml
│       │   ├── mssql-deployment.yaml
│       │   ├── mssql-pv.azure.yaml
│       │   └── mvc-deployment.azure.yaml
│       └── values.yaml
├── create-aks-cluster.sh
├── docker-compose.yaml
├── docs/
│   └── presentation.pptx
├── hpa/
│   ├── commands.ps1
│   ├── hpa.yaml
│   └── tester-pod.yaml
├── infra/
│   ├── backend.tf
│   ├── create-azure-storage-tfstate.sh
│   ├── main.tf
│   ├── output.tf
│   ├── provider.tf
│   ├── terraform.local.tfvars
│   ├── terraform.tfvars
│   ├── tf.commands.sh
│   └── variables.tf
├── ingress-controller/
│   ├── ingress.yaml
│   └── workshop.sh
├── istio/
│   ├── 1-app-gateway.yaml
│   ├── 2-app-virtualservice.yaml
│   ├── 3-app-virtualservice-destinationrule.yaml
│   ├── 4-mssql-svc-deploy.yaml
│   ├── 5-mssql-virtualservice-destinationrule.yaml
│   ├── 6-mssql-deploy-2-0.yaml
│   ├── grafana.secret.yaml
│   ├── istio.aks.yaml
│   ├── kiali.secret.yaml
│   ├── mvc-app-v1.0.yaml
│   ├── mvc-deployment.v1.1.yaml
│   ├── mvc-deployment.v2.0.yaml
│   └── steps.sh
├── kubernetes/
│   ├── mssql-configmap.yaml
│   ├── mssql-deployment.yaml
│   ├── mssql-pv.azure.yaml
│   ├── mssql-secret.yaml
│   └── mvc-deployment.azure.yaml
├── logging-efk/
│   ├── commands.sh
│   ├── fluentd-daemonset-elasticsearch.yaml
│   └── kibana-values.yaml
├── network-policy/
│   ├── 1-backend-policy-deny.yaml
│   ├── 1-namespace-development.yaml
│   ├── 2-backend-policy-allow-pod.yaml
│   ├── 2-pod-nginx-backend.yaml
│   ├── 3-backend-policy-allow-pod-namespace.yaml
│   ├── 3-pod-alpine-test.yaml
│   └── commands.sh
├── opa-gatekeeper/
│   ├── all_ns_must_have_gatekeeper.yaml
│   ├── bad-namespace.yaml
│   ├── commands.ps1
│   ├── good-namespace.yaml
│   └── k8srequiredlabels_template.yaml
├── prometheus/
│   ├── prometheus.values.yaml
│   └── steps.sh
├── rbac/
│   ├── cert/
│   │   ├── houssem.crt
│   │   ├── houssem.csr
│   │   └── houssem.key
│   ├── rbac-aad/
│   │   ├── rbac-aad-group.yaml
│   │   └── rbac-aad-user.yaml
│   ├── role-binding.yaml
│   ├── role-deployment-manager.yaml
│   ├── role.yaml
│   ├── rolebinding-deployment-manager.yaml
│   └── steps.bash
├── start/
│   └── mvc-deployment.simple.yaml
└── terraform/
    ├── aks-cluster.tf
    └── create-service-principal.sh
Download .txt
SYMBOL INDEX (374 symbols across 25 files)

FILE: MvcApp/Controllers/HomeController.cs
  class HomeController (line 12) | public class HomeController : Controller
    method Index (line 17) | public IActionResult Index()
    method About (line 22) | public IActionResult About()
    method Contact (line 29) | public IActionResult Contact()
    method Privacy (line 38) | public IActionResult Privacy()
    method Error (line 43) | [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, No...

FILE: MvcApp/Controllers/ProductsController.cs
  class ProductsController (line 12) | public class ProductsController : Controller
    method ProductsController (line 16) | public ProductsController(ProductsContext context)
    method Index (line 23) | public async Task<IActionResult> Index()
    method Details (line 29) | public async Task<IActionResult> Details(int? id)
    method Create (line 47) | public IActionResult Create()
    method Create (line 55) | [HttpPost]
    method Edit (line 69) | public async Task<IActionResult> Edit(int? id)
    method Edit (line 87) | [HttpPost]
    method Delete (line 120) | public async Task<IActionResult> Delete(int? id)
    method DeleteConfirmed (line 138) | [HttpPost, ActionName("Delete")]
    method ProductExists (line 148) | private bool ProductExists(int id)

FILE: MvcApp/Data/ProductsContext.cs
  class ProductsContext (line 9) | public class ProductsContext : DbContext
    method ProductsContext (line 11) | public ProductsContext (DbContextOptions<ProductsContext> options)

FILE: MvcApp/Models/ErrorViewModel.cs
  class ErrorViewModel (line 5) | public class ErrorViewModel

FILE: MvcApp/Models/product.cs
  class Product (line 8) | public class Product

FILE: MvcApp/Program.cs
  class Program (line 14) | public class Program
    method Main (line 16) | public static void Main(string[] args)
    method CreateWebHostBuilder (line 21) | public static IHostBuilder CreateWebHostBuilder(string[] args) =>

FILE: MvcApp/Startup.cs
  class Startup (line 19) | public class Startup
    method Startup (line 21) | public Startup(IConfiguration configuration)
    method ConfigureServices (line 29) | public void ConfigureServices(IServiceCollection services)
    method Configure (line 38) | public void Configure(IApplicationBuilder app, IWebHostEnvironment env)

FILE: MvcApp/wwwroot/lib/bootstrap/dist/js/bootstrap.js
  function transitionEnd (line 34) | function transitionEnd() {
  function removeElement (line 126) | function removeElement() {
  function Plugin (line 142) | function Plugin(option) {
  function Plugin (line 251) | function Plugin(option) {
  function Plugin (line 475) | function Plugin(option) {
  function getTargetFromTrigger (line 695) | function getTargetFromTrigger($trigger) {
  function Plugin (line 707) | function Plugin(option) {
  function getParent (line 774) | function getParent($this) {
  function clearMenus (line 787) | function clearMenus(e) {
  function Plugin (line 880) | function Plugin(option) {
  function Plugin (line 1208) | function Plugin(option, _relatedTarget) {
  function complete (line 1574) | function complete() {
  function Plugin (line 1750) | function Plugin(option) {
  function Plugin (line 1859) | function Plugin(option) {
  function ScrollSpy (line 1902) | function ScrollSpy(element, options) {
  function Plugin (line 2022) | function Plugin(option) {
  function next (line 2131) | function next() {
  function Plugin (line 2177) | function Plugin(option) {
  function Plugin (line 2334) | function Plugin(option) {

FILE: MvcApp/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
  function setValidationValues (line 24) | function setValidationValues(options, ruleName, value) {
  function splitAndTrim (line 31) | function splitAndTrim(value) {
  function escapeAttributeValue (line 35) | function escapeAttributeValue(value) {
  function getModelPrefix (line 40) | function getModelPrefix(fieldName) {
  function appendModelPrefix (line 44) | function appendModelPrefix(value, prefix) {
  function onError (line 51) | function onError(error, inputElement) {  // 'this' is the form element
  function onErrors (line 68) | function onErrors(event, validator) {  // 'this' is the form element
  function onSuccess (line 82) | function onSuccess(error) {  // 'this' is the form element
  function onReset (line 98) | function onReset(event) {  // 'this' is the form element
  function validationInfo (line 123) | function validationInfo(form) {

FILE: MvcApp/wwwroot/lib/jquery-validation/dist/additional-methods.js
  function stripHtml (line 21) | function stripHtml( value ) {
  function isOdd (line 212) | function isOdd( n ) {

FILE: MvcApp/wwwroot/lib/jquery-validation/dist/jquery.validate.js
  function handle (line 70) | function handle() {
  function delegate (line 411) | function delegate( event ) {

FILE: MvcApp/wwwroot/lib/jquery/dist/jquery.js
  function DOMEval (line 97) | function DOMEval( code, doc, node ) {
  function toType (line 115) | function toType( obj ) {
  function isArrayLike (line 483) | function isArrayLike( obj ) {
  function Sizzle (line 715) | function Sizzle( selector, context, results, seed ) {
  function createCache (line 854) | function createCache() {
  function markFunction (line 872) | function markFunction( fn ) {
  function assert (line 881) | function assert( fn ) {
  function addHandle (line 903) | function addHandle( attrs, handler ) {
  function siblingCheck (line 918) | function siblingCheck( a, b ) {
  function createInputPseudo (line 944) | function createInputPseudo( type ) {
  function createButtonPseudo (line 955) | function createButtonPseudo( type ) {
  function createDisabledPseudo (line 966) | function createDisabledPseudo( disabled ) {
  function createPositionalPseudo (line 1022) | function createPositionalPseudo( fn ) {
  function testContext (line 1045) | function testContext( context ) {
  function setFilters (line 2127) | function setFilters() {}
  function toSelector (line 2198) | function toSelector( tokens ) {
  function addCombinator (line 2208) | function addCombinator( matcher, combinator, base ) {
  function elementMatcher (line 2272) | function elementMatcher( matchers ) {
  function multipleContexts (line 2286) | function multipleContexts( selector, contexts, results ) {
  function condense (line 2295) | function condense( unmatched, map, filter, context, xml ) {
  function setMatcher (line 2316) | function setMatcher( preFilter, selector, matcher, postFilter, postFinde...
  function matcherFromTokens (line 2409) | function matcherFromTokens( tokens ) {
  function matcherFromGroupMatchers (line 2467) | function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
  function nodeName (line 2803) | function nodeName( elem, name ) {
  function winnow (line 2813) | function winnow( elements, qualifier, not ) {
  function sibling (line 3108) | function sibling( cur, dir ) {
  function createOptions (line 3195) | function createOptions( options ) {
  function Identity (line 3420) | function Identity( v ) {
  function Thrower (line 3423) | function Thrower( ex ) {
  function adoptValue (line 3427) | function adoptValue( value, resolve, reject, noValue ) {
  function resolve (line 3520) | function resolve( depth, deferred, handler, special ) {
  function completed (line 3885) | function completed() {
  function fcamelCase (line 3980) | function fcamelCase( all, letter ) {
  function camelCase (line 3987) | function camelCase( string ) {
  function Data (line 4004) | function Data() {
  function getData (line 4173) | function getData( data ) {
  function dataAttr (line 4198) | function dataAttr( elem, key, data ) {
  function adjustCSS (line 4511) | function adjustCSS( elem, prop, valueParts, tween ) {
  function getDefaultDisplay (line 4578) | function getDefaultDisplay( elem ) {
  function showHide (line 4601) | function showHide( elements, show ) {
  function getAll (line 4702) | function getAll( context, tag ) {
  function setGlobalEval (line 4727) | function setGlobalEval( elems, refElements ) {
  function buildFragment (line 4743) | function buildFragment( elems, context, scripts, selection, ignored ) {
  function returnTrue (line 4866) | function returnTrue() {
  function returnFalse (line 4870) | function returnFalse() {
  function safeActiveElement (line 4876) | function safeActiveElement() {
  function on (line 4882) | function on( elem, types, selector, data, fn, one ) {
  function manipulationTarget (line 5610) | function manipulationTarget( elem, content ) {
  function disableScript (line 5621) | function disableScript( elem ) {
  function restoreScript (line 5625) | function restoreScript( elem ) {
  function cloneCopyEvent (line 5635) | function cloneCopyEvent( src, dest ) {
  function fixInput (line 5670) | function fixInput( src, dest ) {
  function domManip (line 5683) | function domManip( collection, args, callback, ignored ) {
  function remove (line 5773) | function remove( elem, selector, keepData ) {
  function computeStyleTests (line 6066) | function computeStyleTests() {
  function roundPixelMeasures (line 6108) | function roundPixelMeasures( measure ) {
  function curCSS (line 6153) | function curCSS( elem, name, computed ) {
  function addGetHookIf (line 6206) | function addGetHookIf( conditionFn, hookFn ) {
  function vendorPropName (line 6243) | function vendorPropName( name ) {
  function finalPropName (line 6264) | function finalPropName( name ) {
  function setPositiveNumber (line 6272) | function setPositiveNumber( elem, value, subtract ) {
  function boxModelAdjustment (line 6284) | function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, ...
  function getWidthOrHeight (line 6349) | function getWidthOrHeight( elem, dimension, extra ) {
  function Tween (line 6682) | function Tween( elem, options, prop, end, easing ) {
  function schedule (line 6805) | function schedule() {
  function createFxNow (line 6818) | function createFxNow() {
  function genFx (line 6826) | function genFx( type, includeWidth ) {
  function createTween (line 6846) | function createTween( value, prop, animation ) {
  function defaultPrefilter (line 6860) | function defaultPrefilter( elem, props, opts ) {
  function propFilter (line 7032) | function propFilter( props, specialEasing ) {
  function Animation (line 7069) | function Animation( elem, properties, options ) {
  function stripAndCollapse (line 7784) | function stripAndCollapse( value ) {
  function getClass (line 7790) | function getClass( elem ) {
  function classesToArray (line 7794) | function classesToArray( value ) {
  function buildParams (line 8416) | function buildParams( prefix, obj, traditional, add ) {
  function addToPrefiltersOrTransports (line 8566) | function addToPrefiltersOrTransports( structure ) {
  function inspectPrefiltersOrTransports (line 8600) | function inspectPrefiltersOrTransports( structure, options, originalOpti...
  function ajaxExtend (line 8629) | function ajaxExtend( target, src ) {
  function ajaxHandleResponses (line 8649) | function ajaxHandleResponses( s, jqXHR, responses ) {
  function ajaxConvert (line 8707) | function ajaxConvert( s, response, jqXHR, isSuccess ) {
  function done (line 9220) | function done( status, nativeStatusText, responses, headers ) {

FILE: WebApp/Controllers/HomeController.cs
  class HomeController (line 12) | public class HomeController : Controller
    method HomeController (line 16) | public HomeController(ILogger<HomeController> logger)
    method Index (line 21) | public IActionResult Index()
    method Privacy (line 26) | public IActionResult Privacy()
    method Error (line 31) | [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, No...

FILE: WebApp/Controllers/ProductsController.cs
  class ProductsController (line 13) | public class ProductsController : Controller
    method ProductsController (line 17) | public ProductsController(ProductsContext context)
    method Index (line 23) | public async Task<IActionResult> Index()
    method Details (line 29) | public async Task<IActionResult> Details(int? id)
    method Create (line 47) | public IActionResult Create()
    method Create (line 55) | [HttpPost]
    method Edit (line 69) | public async Task<IActionResult> Edit(int? id)
    method Edit (line 87) | [HttpPost]
    method Delete (line 120) | public async Task<IActionResult> Delete(int? id)
    method DeleteConfirmed (line 138) | [HttpPost, ActionName("Delete")]
    method ProductExists (line 148) | private bool ProductExists(int id)

FILE: WebApp/Data/ProductsContext.cs
  class ProductsContext (line 10) | public class ProductsContext : DbContext
    method ProductsContext (line 12) | public ProductsContext (DbContextOptions<ProductsContext> options)

FILE: WebApp/Models/ErrorViewModel.cs
  class ErrorViewModel (line 5) | public class ErrorViewModel

FILE: WebApp/Models/Product.cs
  class Product (line 3) | public class Product

FILE: WebApp/Program.cs
  class Program (line 12) | public class Program
    method Main (line 14) | public static void Main(string[] args)
    method CreateHostBuilder (line 19) | public static IHostBuilder CreateHostBuilder(string[] args) =>

FILE: WebApp/Startup.cs
  class Startup (line 16) | public class Startup
    method Startup (line 18) | public Startup(IConfiguration configuration)
    method ConfigureServices (line 26) | public void ConfigureServices(IServiceCollection services)
    method Configure (line 35) | public void Configure(IApplicationBuilder app, IWebHostEnvironment env)

FILE: WebApp/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.js
  function _defineProperties (line 14) | function _defineProperties(target, props) {
  function _createClass (line 24) | function _createClass(Constructor, protoProps, staticProps) {
  function _defineProperty (line 30) | function _defineProperty(obj, key, value) {
  function _objectSpread (line 45) | function _objectSpread(target) {
  function _inheritsLoose (line 64) | function _inheritsLoose(subClass, superClass) {
  function toType (line 86) | function toType(obj) {
  function getSpecialTransitionEndEvent (line 90) | function getSpecialTransitionEndEvent() {
  function transitionEndEmulator (line 104) | function transitionEndEmulator(duration) {
  function setTransitionEndSupport (line 119) | function setTransitionEndSupport() {
  function Alert (line 260) | function Alert(element) {
  function Button (line 428) | function Button(element) {
  function Carousel (line 635) | function Carousel(element, config) {
  function Collapse (line 1195) | function Collapse(element, config) {
  function microtaskDebounce (line 1539) | function microtaskDebounce(fn) {
  function taskDebounce (line 1553) | function taskDebounce(fn) {
  function isFunction (line 1586) | function isFunction(functionToCheck) {
  function getStyleComputedProperty (line 1598) | function getStyleComputedProperty(element, property) {
  function getParentNode (line 1615) | function getParentNode(element) {
  function getScrollParent (line 1629) | function getScrollParent(element) {
  function isIE (line 1667) | function isIE(version) {
  function getOffsetParent (line 1684) | function getOffsetParent(element) {
  function isOffsetContainer (line 1713) | function isOffsetContainer(element) {
  function getRoot (line 1729) | function getRoot(node) {
  function findCommonOffsetParent (line 1745) | function findCommonOffsetParent(element1, element2) {
  function getScroll (line 1789) | function getScroll(element) {
  function includeScroll (line 1813) | function includeScroll(rect, element) {
  function getBordersSize (line 1836) | function getBordersSize(styles, axis) {
  function getSize (line 1843) | function getSize(axis, body, html, computedStyle) {
  function getWindowSizes (line 1847) | function getWindowSizes(document) {
  function defineProperties (line 1865) | function defineProperties(target, props) {
  function getClientRect (line 1922) | function getClientRect(offsets) {
  function getBoundingClientRect (line 1936) | function getBoundingClientRect(element) {
  function getOffsetRectRelativeToArbitraryNode (line 1985) | function getOffsetRectRelativeToArbitraryNode(children, parent) {
  function getViewportOffsetRectRelativeToArtbitraryNode (line 2037) | function getViewportOffsetRectRelativeToArtbitraryNode(element) {
  function isFixed (line 2066) | function isFixed(element) {
  function getFixedPositionOffsetParent (line 2089) | function getFixedPositionOffsetParent(element) {
  function getBoundaries (line 2112) | function getBoundaries(popper, reference, padding, boundariesElement) {
  function getArea (line 2166) | function getArea(_ref) {
  function computeAutoPlacement (line 2182) | function computeAutoPlacement(placement, refRect, popper, reference, bou...
  function getReferenceOffsets (line 2243) | function getReferenceOffsets(state, popper, reference) {
  function getOuterSizes (line 2257) | function getOuterSizes(element) {
  function getOppositePlacement (line 2276) | function getOppositePlacement(placement) {
  function getPopperOffsets (line 2293) | function getPopperOffsets(popper, referenceOffsets, placement) {
  function find (line 2331) | function find(arr, check) {
  function findIndex (line 2350) | function findIndex(arr, prop, value) {
  function runModifiers (line 2375) | function runModifiers(modifiers, data, ends) {
  function update (line 2405) | function update() {
  function isModifierEnabled (line 2457) | function isModifierEnabled(modifiers, modifierName) {
  function getSupportedPropertyName (line 2472) | function getSupportedPropertyName(property) {
  function destroy (line 2491) | function destroy() {
  function getWindow (line 2521) | function getWindow(element) {
  function attachToScrollParents (line 2526) | function attachToScrollParents(scrollParent, event, callback, scrollPare...
  function setupEventListeners (line 2543) | function setupEventListeners(reference, options, state, updateBound) {
  function enableEventListeners (line 2563) | function enableEventListeners() {
  function removeEventListeners (line 2575) | function removeEventListeners(reference, state) {
  function disableEventListeners (line 2599) | function disableEventListeners() {
  function isNumeric (line 2613) | function isNumeric(n) {
  function setStyles (line 2625) | function setStyles(element, styles) {
  function setAttributes (line 2644) | function setAttributes(element, attributes) {
  function applyStyle (line 2664) | function applyStyle(data) {
  function applyStyleOnLoad (line 2693) | function applyStyleOnLoad(reference, popper, options, modifierOptions, s...
  function getRoundedOffsets (line 2730) | function getRoundedOffsets(data, shouldRound) {
  function computeStyle (line 2769) | function computeStyle(data, options) {
  function isModifierRequired (line 2870) | function isModifierRequired(modifiers, requestingName, requestedName) {
  function arrow (line 2895) | function arrow(data, options) {
  function getOppositeVariation (line 2977) | function getOppositeVariation(variation) {
  function clockwise (line 3032) | function clockwise(placement) {
  function flip (line 3053) | function flip(data, options) {
  function keepTogether (line 3143) | function keepTogether(data) {
  function toValue (line 3177) | function toValue(str, measurement, popperOffsets, referenceOffsets) {
  function parseOffset (line 3229) | function parseOffset(offset, popperOffsets, referenceOffsets, basePlacem...
  function offset (line 3305) | function offset(data, _ref) {
  function preventOverflow (line 3346) | function preventOverflow(data, options) {
  function shift (line 3417) | function shift(data) {
  function hide (line 3450) | function hide(data) {
  function inner (line 3488) | function inner(data) {
  function Popper (line 3939) | function Popper(reference, popper) {
  function Dropdown (line 4169) | function Dropdown(element, config) {
  function Modal (line 4674) | function Modal(element, config) {
  function allowedAttribute (line 5247) | function allowedAttribute(attr, allowedAttributeList) {
  function sanitizeHtml (line 5271) | function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {
  function Tooltip (line 5408) | function Tooltip(element, config) {
  function Popover (line 6086) | function Popover() {
  function ScrollSpy (line 6273) | function ScrollSpy(element, config) {
  function Tab (line 6568) | function Tab(element) {
  function Toast (line 6805) | function Toast(element, config) {

FILE: WebApp/wwwroot/lib/bootstrap/dist/js/bootstrap.js
  function _defineProperties (line 15) | function _defineProperties(target, props) {
  function _createClass (line 25) | function _createClass(Constructor, protoProps, staticProps) {
  function _defineProperty (line 31) | function _defineProperty(obj, key, value) {
  function _objectSpread (line 46) | function _objectSpread(target) {
  function _inheritsLoose (line 65) | function _inheritsLoose(subClass, superClass) {
  function toType (line 87) | function toType(obj) {
  function getSpecialTransitionEndEvent (line 91) | function getSpecialTransitionEndEvent() {
  function transitionEndEmulator (line 105) | function transitionEndEmulator(duration) {
  function setTransitionEndSupport (line 120) | function setTransitionEndSupport() {
  function Alert (line 261) | function Alert(element) {
  function Button (line 429) | function Button(element) {
  function Carousel (line 636) | function Carousel(element, config) {
  function Collapse (line 1196) | function Collapse(element, config) {
  function Dropdown (line 1591) | function Dropdown(element, config) {
  function Modal (line 2096) | function Modal(element, config) {
  function allowedAttribute (line 2669) | function allowedAttribute(attr, allowedAttributeList) {
  function sanitizeHtml (line 2693) | function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {
  function Tooltip (line 2830) | function Tooltip(element, config) {
  function Popover (line 3508) | function Popover() {
  function ScrollSpy (line 3695) | function ScrollSpy(element, config) {
  function Tab (line 3990) | function Tab(element) {
  function Toast (line 4227) | function Toast(element, config) {

FILE: WebApp/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
  function setValidationValues (line 25) | function setValidationValues(options, ruleName, value) {
  function splitAndTrim (line 32) | function splitAndTrim(value) {
  function escapeAttributeValue (line 36) | function escapeAttributeValue(value) {
  function getModelPrefix (line 41) | function getModelPrefix(fieldName) {
  function appendModelPrefix (line 45) | function appendModelPrefix(value, prefix) {
  function onError (line 52) | function onError(error, inputElement) {  // 'this' is the form element
  function onErrors (line 69) | function onErrors(event, validator) {  // 'this' is the form element
  function onSuccess (line 83) | function onSuccess(error) {  // 'this' is the form element
  function onReset (line 99) | function onReset(event) {  // 'this' is the form element
  function validationInfo (line 124) | function validationInfo(form) {

FILE: WebApp/wwwroot/lib/jquery-validation/dist/additional-methods.js
  function stripHtml (line 21) | function stripHtml( value ) {
  function isOdd (line 212) | function isOdd( n ) {

FILE: WebApp/wwwroot/lib/jquery-validation/dist/jquery.validate.js
  function handle (line 70) | function handle() {
  function delegate (line 411) | function delegate( event ) {

FILE: WebApp/wwwroot/lib/jquery/dist/jquery.js
  function DOMEval (line 103) | function DOMEval( code, node, doc ) {
  function toType (line 133) | function toType( obj ) {
  function isArrayLike (line 503) | function isArrayLike( obj ) {
  function Sizzle (line 755) | function Sizzle( selector, context, results, seed ) {
  function createCache (line 903) | function createCache() {
  function markFunction (line 923) | function markFunction( fn ) {
  function assert (line 932) | function assert( fn ) {
  function addHandle (line 956) | function addHandle( attrs, handler ) {
  function siblingCheck (line 971) | function siblingCheck( a, b ) {
  function createInputPseudo (line 997) | function createInputPseudo( type ) {
  function createButtonPseudo (line 1008) | function createButtonPseudo( type ) {
  function createDisabledPseudo (line 1019) | function createDisabledPseudo( disabled ) {
  function createPositionalPseudo (line 1075) | function createPositionalPseudo( fn ) {
  function testContext (line 1098) | function testContext( context ) {
  function setFilters (line 2309) | function setFilters() {}
  function toSelector (line 2383) | function toSelector( tokens ) {
  function addCombinator (line 2393) | function addCombinator( matcher, combinator, base ) {
  function elementMatcher (line 2460) | function elementMatcher( matchers ) {
  function multipleContexts (line 2474) | function multipleContexts( selector, contexts, results ) {
  function condense (line 2483) | function condense( unmatched, map, filter, context, xml ) {
  function setMatcher (line 2504) | function setMatcher( preFilter, selector, matcher, postFilter, postFinde...
  function matcherFromTokens (line 2604) | function matcherFromTokens( tokens ) {
  function matcherFromGroupMatchers (line 2667) | function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
  function nodeName (line 3025) | function nodeName( elem, name ) {
  function winnow (line 3035) | function winnow( elements, qualifier, not ) {
  function sibling (line 3330) | function sibling( cur, dir ) {
  function createOptions (line 3423) | function createOptions( options ) {
  function Identity (line 3648) | function Identity( v ) {
  function Thrower (line 3651) | function Thrower( ex ) {
  function adoptValue (line 3655) | function adoptValue( value, resolve, reject, noValue ) {
  function resolve (line 3748) | function resolve( depth, deferred, handler, special ) {
  function completed (line 4113) | function completed() {
  function fcamelCase (line 4208) | function fcamelCase( _all, letter ) {
  function camelCase (line 4215) | function camelCase( string ) {
  function Data (line 4232) | function Data() {
  function getData (line 4401) | function getData( data ) {
  function dataAttr (line 4426) | function dataAttr( elem, key, data ) {
  function adjustCSS (line 4738) | function adjustCSS( elem, prop, valueParts, tween ) {
  function getDefaultDisplay (line 4806) | function getDefaultDisplay( elem ) {
  function showHide (line 4829) | function showHide( elements, show ) {
  function getAll (line 4961) | function getAll( context, tag ) {
  function setGlobalEval (line 4986) | function setGlobalEval( elems, refElements ) {
  function buildFragment (line 5002) | function buildFragment( elems, context, scripts, selection, ignored ) {
  function returnTrue (line 5097) | function returnTrue() {
  function returnFalse (line 5101) | function returnFalse() {
  function expectSync (line 5111) | function expectSync( elem, type ) {
  function safeActiveElement (line 5118) | function safeActiveElement() {
  function on (line 5124) | function on( elem, types, selector, data, fn, one ) {
  function leverageNative (line 5612) | function leverageNative( el, type, expectSync ) {
  function manipulationTarget (line 5976) | function manipulationTarget( elem, content ) {
  function disableScript (line 5987) | function disableScript( elem ) {
  function restoreScript (line 5991) | function restoreScript( elem ) {
  function cloneCopyEvent (line 6001) | function cloneCopyEvent( src, dest ) {
  function fixInput (line 6034) | function fixInput( src, dest ) {
  function domManip (line 6047) | function domManip( collection, args, callback, ignored ) {
  function remove (line 6139) | function remove( elem, selector, keepData ) {
  function computeStyleTests (line 6453) | function computeStyleTests() {
  function roundPixelMeasures (line 6497) | function roundPixelMeasures( measure ) {
  function curCSS (line 6571) | function curCSS( elem, name, computed ) {
  function addGetHookIf (line 6624) | function addGetHookIf( conditionFn, hookFn ) {
  function vendorPropName (line 6649) | function vendorPropName( name ) {
  function finalPropName (line 6664) | function finalPropName( name ) {
  function setPositiveNumber (line 6690) | function setPositiveNumber( _elem, value, subtract ) {
  function boxModelAdjustment (line 6702) | function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, ...
  function getWidthOrHeight (line 6770) | function getWidthOrHeight( elem, dimension, extra ) {
  function Tween (line 7146) | function Tween( elem, options, prop, end, easing ) {
  function schedule (line 7269) | function schedule() {
  function createFxNow (line 7282) | function createFxNow() {
  function genFx (line 7290) | function genFx( type, includeWidth ) {
  function createTween (line 7310) | function createTween( value, prop, animation ) {
  function defaultPrefilter (line 7324) | function defaultPrefilter( elem, props, opts ) {
  function propFilter (line 7496) | function propFilter( props, specialEasing ) {
  function Animation (line 7533) | function Animation( elem, properties, options ) {
  function stripAndCollapse (line 8248) | function stripAndCollapse( value ) {
  function getClass (line 8254) | function getClass( elem ) {
  function classesToArray (line 8258) | function classesToArray( value ) {
  function buildParams (line 8885) | function buildParams( prefix, obj, traditional, add ) {
  function addToPrefiltersOrTransports (line 9039) | function addToPrefiltersOrTransports( structure ) {
  function inspectPrefiltersOrTransports (line 9073) | function inspectPrefiltersOrTransports( structure, options, originalOpti...
  function ajaxExtend (line 9102) | function ajaxExtend( target, src ) {
  function ajaxHandleResponses (line 9122) | function ajaxHandleResponses( s, jqXHR, responses ) {
  function ajaxConvert (line 9180) | function ajaxConvert( s, response, jqXHR, isSuccess ) {
  function done (line 9696) | function done( status, nativeStatusText, responses, headers ) {
Condensed preview — 189 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,055K chars).
[
  {
    "path": ".dockerignore",
    "chars": 82,
    "preview": ".dockerignore\r\n.env\r\n.git\r\n.gitignore\r\n.vs\r\n.vscode\r\n*/bin\r\n*/obj\r\n**/.toolstarget"
  },
  {
    "path": ".github/workflows/1-actions-ci-cd-aks.yml",
    "chars": 2644,
    "preview": "name: 1-actions-ci-cd-aks\n\non:\n  push:\n    branches: [ main ]\n    paths: .github/workflows/1-actions-ci-cd-aks.yml\n  pul"
  },
  {
    "path": ".github/workflows/2-actions-ci-cd-aks-tf.yml",
    "chars": 5059,
    "preview": "name: 2-actions-ci-cd-aks-tf\n\non:\n  push:\n    branches: [ main ]\n    paths: .github/workflows/2-actions-ci-cd-aks-tf.yml"
  },
  {
    "path": ".github/workflows/3-actions-ci-cd-aks-tf-backend.yml",
    "chars": 9107,
    "preview": "name: 3-actions-ci-cd-aks-tf-backend\n\non:\n  push:\n    branches: none # [ main ]\n  pull_request:\n    branches:  none # [ "
  },
  {
    "path": ".github/workflows/4-actions-ci-cd-aks-tf-backend-jobs.yml",
    "chars": 8062,
    "preview": "name: 4-actions-ci-cd-aks-tf-backend-jobs\n\non:\n  push:\n    branches: [ main ]\n    paths: .github/workflows/4-actions-ci-"
  },
  {
    "path": ".gitignore",
    "chars": 4397,
    "preview": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n\n# Loca"
  },
  {
    "path": ".vscode/launch.json",
    "chars": 1538,
    "preview": "{\n   // Use IntelliSense to find out which attributes exist for C# debugging\n   // Use hover for the description of the "
  },
  {
    "path": ".vscode/settings.json",
    "chars": 53,
    "preview": "{\n    \"docker.defaultRegistryPath\": \"houssemdocker\"\n}"
  },
  {
    "path": ".vscode/tasks.json",
    "chars": 325,
    "preview": "{\n    \"version\": \"2.0.0\",\n    \"tasks\": [\n        {\n            \"label\": \"build\",\n            \"command\": \"dotnet\",\n      "
  },
  {
    "path": "MvcApp/Controllers/HomeController.cs",
    "chars": 1232,
    "preview": "using System;\r\nusing System.Collections.Generic;\r\nusing System.Diagnostics;\r\nusing System.Linq;\r\nusing System.Threading"
  },
  {
    "path": "MvcApp/Controllers/ProductsController.cs",
    "chars": 4509,
    "preview": "using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Threading.Tasks;\r\nusing Microsoft.As"
  },
  {
    "path": "MvcApp/Data/ProductsContext.cs",
    "chars": 468,
    "preview": "using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Threading.Tasks;\r\nusing Microsoft.En"
  },
  {
    "path": "MvcApp/Dockerfile",
    "chars": 515,
    "preview": "FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim AS base\r\nWORKDIR /app\r\nEXPOSE 80\r\nEXPOSE 443\r\n\r\nFROM mcr.microsoft."
  },
  {
    "path": "MvcApp/Microscanner.Dockerfile",
    "chars": 446,
    "preview": "ARG APP_IMAGE=mvc-app:1.0\nARG MICROSCANNER_TOKEN=ZGEzNTQ5Y2QyNjAx\n\nFROM $APP_IMAGE\n\n# Run Aqua Security Microscanner, ht"
  },
  {
    "path": "MvcApp/Models/ErrorViewModel.cs",
    "chars": 214,
    "preview": "using System;\r\n\r\nnamespace MvcApp.Models\r\n{\r\n    public class ErrorViewModel\r\n    {\r\n        public string RequestId { g"
  },
  {
    "path": "MvcApp/Models/product.cs",
    "chars": 256,
    "preview": "using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace MvcApp"
  },
  {
    "path": "MvcApp/MvcApp.csproj",
    "chars": 1575,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\r\n\r\n  <PropertyGroup>\r\n    <TargetFramework>net5.0</TargetFramework>\r\n    <DockerD"
  },
  {
    "path": "MvcApp/Program.cs",
    "chars": 768,
    "preview": "using System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Threading.Tasks;\r\n"
  },
  {
    "path": "MvcApp/Properties/launchSettings.json",
    "chars": 811,
    "preview": "{\r\n  \"iisSettings\": {\r\n    \"windowsAuthentication\": false,\r\n    \"anonymousAuthentication\": true,\r\n    \"iisExpress\": {\r\n "
  },
  {
    "path": "MvcApp/Startup.cs",
    "chars": 2655,
    "preview": "using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Threading.Tasks;\r\nusing Microsoft.As"
  },
  {
    "path": "MvcApp/Views/Home/About.cshtml",
    "chars": 161,
    "preview": "@{\r\n    ViewData[\"Title\"] = \"About\";\r\n}\r\n<h2>@ViewData[\"Title\"]</h2>\r\n<h3>@ViewData[\"Message\"]</h3>\r\n\r\n<p>Use this area"
  },
  {
    "path": "MvcApp/Views/Home/Contact.cshtml",
    "chars": 466,
    "preview": "@{\r\n    ViewData[\"Title\"] = \"Contact\";\r\n}\r\n<h2>@ViewData[\"Title\"]</h2>\r\n<h3>@ViewData[\"Message\"]</h3>\r\n\r\n<address>\r\n   "
  },
  {
    "path": "MvcApp/Views/Home/Index.cshtml",
    "chars": 4776,
    "preview": "@{\r\n    ViewData[\"Title\"] = \"Home Page\";\r\n}\r\n\r\n<div id=\"myCarousel\" class=\"carousel slide\" data-ride=\"carousel\" data-in"
  },
  {
    "path": "MvcApp/Views/Home/Privacy.cshtml",
    "chars": 142,
    "preview": "@{\r\n    ViewData[\"Title\"] = \"Privacy Policy\";\r\n}\r\n<h2>@ViewData[\"Title\"]</h2>\r\n\r\n<p>Use this page to detail your site's"
  },
  {
    "path": "MvcApp/Views/Products/Create.cshtml",
    "chars": 882,
    "preview": "@model MvcApp.Models.Product\r\n\r\n@{\r\n    ViewData[\"Title\"] = \"Create\";\r\n}\r\n\r\n<h2>Create</h2>\r\n\r\n<h4>Product</h4>\r\n<hr />"
  },
  {
    "path": "MvcApp/Views/Products/Delete.cshtml",
    "chars": 619,
    "preview": "@model MvcApp.Models.Product\r\n\r\n@{\r\n    ViewData[\"Title\"] = \"Delete\";\r\n}\r\n\r\n<h2>Delete</h2>\r\n\r\n<h3>Are you sure you wan"
  },
  {
    "path": "MvcApp/Views/Products/Details.cshtml",
    "chars": 475,
    "preview": "@model MvcApp.Models.Product\r\n\r\n@{\r\n    ViewData[\"Title\"] = \"Details\";\r\n}\r\n\r\n<h2>Details</h2>\r\n\r\n<div>\r\n    <h4>Product"
  },
  {
    "path": "MvcApp/Views/Products/Edit.cshtml",
    "chars": 924,
    "preview": "@model MvcApp.Models.Product\r\n\r\n@{\r\n    ViewData[\"Title\"] = \"Edit\";\r\n}\r\n\r\n<h2>Edit</h2>\r\n\r\n<h4>Product</h4>\r\n<hr />\r\n<d"
  },
  {
    "path": "MvcApp/Views/Products/Index.cshtml",
    "chars": 819,
    "preview": "@model IEnumerable<MvcApp.Models.Product>\r\n\r\n@{\r\n    ViewData[\"Title\"] = \"Index\";\r\n}\r\n\r\n<h2>Index</h2>\r\n\r\n<p>\r\n    <a a"
  },
  {
    "path": "MvcApp/Views/Shared/Error.cshtml",
    "chars": 867,
    "preview": "@model ErrorViewModel\r\n@{\r\n    ViewData[\"Title\"] = \"Error\";\r\n}\r\n\r\n<h1 class=\"text-danger\">Error.</h1>\r\n<h2 class=\"text-"
  },
  {
    "path": "MvcApp/Views/Shared/_CookieConsentPartial.cshtml",
    "chars": 1896,
    "preview": "@using Microsoft.AspNetCore.Http.Features\r\n\r\n@{\r\n    var consentFeature = Context.Features.Get<ITrackingConsentFeature>"
  },
  {
    "path": "MvcApp/Views/Shared/_Layout.cshtml",
    "chars": 3596,
    "preview": "<!DOCTYPE html>\r\n<html>\r\n<head>\r\n    <meta charset=\"utf-8\" />\r\n    <meta name=\"viewport\" content=\"width=device-width, i"
  },
  {
    "path": "MvcApp/Views/Shared/_ValidationScriptsPartial.cshtml",
    "chars": 1172,
    "preview": "<environment include=\"Development\">\r\n    <script src=\"~/lib/jquery-validation/dist/jquery.validate.js\"></script>\r\n    <s"
  },
  {
    "path": "MvcApp/Views/_ViewImports.cshtml",
    "chars": 92,
    "preview": "@using MvcApp\r\n@using MvcApp.Models\r\n@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers\r\n"
  },
  {
    "path": "MvcApp/Views/_ViewStart.cshtml",
    "chars": 33,
    "preview": "@{\r\n    Layout = \"_Layout\";\r\n}\r\n"
  },
  {
    "path": "MvcApp/appsettings.Development.json",
    "chars": 146,
    "preview": "{\r\n  \"Logging\": {\r\n    \"LogLevel\": {\r\n      \"Default\": \"Debug\",\r\n      \"System\": \"Information\",\r\n      \"Microsoft\": \"Inf"
  },
  {
    "path": "MvcApp/appsettings.json",
    "chars": 212,
    "preview": "{\r\n  \"Logging\": {\r\n    \"LogLevel\": {\r\n      \"Default\": \"Warning\"\r\n    }\r\n  },\r\n  \"AllowedHosts\": \"*\",\r\n  \"ConnectionStri"
  },
  {
    "path": "MvcApp/wwwroot/css/site.css",
    "chars": 880,
    "preview": "/* Please see documentation at https://docs.microsoft.com/aspnet/core/client-side/bundling-and-minification\\ \r\nfor deta"
  },
  {
    "path": "MvcApp/wwwroot/js/site.js",
    "chars": 228,
    "preview": "// Please see documentation at https://docs.microsoft.com/aspnet/core/client-side/bundling-and-minification\r\n// for det"
  },
  {
    "path": "MvcApp/wwwroot/lib/bootstrap/.bower.json",
    "chars": 984,
    "preview": "{\r\n  \"name\": \"bootstrap\",\r\n  \"description\": \"The most popular front-end framework for developing responsive, mobile firs"
  },
  {
    "path": "MvcApp/wwwroot/lib/bootstrap/LICENSE",
    "chars": 1106,
    "preview": "The MIT License (MIT)\r\n\r\nCopyright (c) 2011-2016 Twitter, Inc.\r\n\r\nPermission is hereby granted, free of charge, to any p"
  },
  {
    "path": "MvcApp/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css",
    "chars": 26719,
    "preview": "/*!\r\n * Bootstrap v3.3.7 (http://getbootstrap.com)\r\n * Copyright 2011-2016 Twitter, Inc.\r\n * Licensed under MIT (https:/"
  },
  {
    "path": "MvcApp/wwwroot/lib/bootstrap/dist/css/bootstrap.css",
    "chars": 152767,
    "preview": "/*!\r\n * Bootstrap v3.3.7 (http://getbootstrap.com)\r\n * Copyright 2011-2016 Twitter, Inc.\r\n * Licensed under MIT (https:/"
  },
  {
    "path": "MvcApp/wwwroot/lib/bootstrap/dist/js/bootstrap.js",
    "chars": 72084,
    "preview": "/*!\r\n * Bootstrap v3.3.7 (http://getbootstrap.com)\r\n * Copyright 2011-2016 Twitter, Inc.\r\n * Licensed under the MIT lice"
  },
  {
    "path": "MvcApp/wwwroot/lib/bootstrap/dist/js/npm.js",
    "chars": 496,
    "preview": "// This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment.\r\nreq"
  },
  {
    "path": "MvcApp/wwwroot/lib/jquery/.bower.json",
    "chars": 570,
    "preview": "{\r\n  \"name\": \"jquery\",\r\n  \"main\": \"dist/jquery.js\",\r\n  \"license\": \"MIT\",\r\n  \"ignore\": [\r\n    \"package.json\"\r\n  ],\r\n  \"ke"
  },
  {
    "path": "MvcApp/wwwroot/lib/jquery/LICENSE.txt",
    "chars": 1641,
    "preview": "Copyright JS Foundation and other contributors, https://js.foundation/\r\n\r\nThis software consists of voluntary contributi"
  },
  {
    "path": "MvcApp/wwwroot/lib/jquery/dist/jquery.js",
    "chars": 282115,
    "preview": "/*!\r\n * jQuery JavaScript Library v3.3.1\r\n * https://jquery.com/\r\n *\r\n * Includes Sizzle.js\r\n * https://sizzlejs.com/\r\n "
  },
  {
    "path": "MvcApp/wwwroot/lib/jquery-validation/.bower.json",
    "chars": 956,
    "preview": "{\r\n  \"name\": \"jquery-validation\",\r\n  \"homepage\": \"https://jqueryvalidation.org/\",\r\n  \"repository\": {\r\n    \"type\": \"git\","
  },
  {
    "path": "MvcApp/wwwroot/lib/jquery-validation/LICENSE.md",
    "chars": 1116,
    "preview": "The MIT License (MIT)\r\n=====================\r\n\r\nCopyright Jörn Zaefferer\r\n\r\nPermission is hereby granted, free of charge"
  },
  {
    "path": "MvcApp/wwwroot/lib/jquery-validation/dist/additional-methods.js",
    "chars": 43163,
    "preview": "/*!\r\n * jQuery Validation Plugin v1.17.0\r\n *\r\n * https://jqueryvalidation.org/\r\n *\r\n * Copyright (c) 2017 Jörn Zaefferer"
  },
  {
    "path": "MvcApp/wwwroot/lib/jquery-validation/dist/jquery.validate.js",
    "chars": 50275,
    "preview": "/*!\r\n * jQuery Validation Plugin v1.17.0\r\n *\r\n * https://jqueryvalidation.org/\r\n *\r\n * Copyright (c) 2017 Jörn Zaefferer"
  },
  {
    "path": "MvcApp/wwwroot/lib/jquery-validation-unobtrusive/.bower.json",
    "chars": 474,
    "preview": "{\r\n  \"name\": \"jquery-validation-unobtrusive\",\r\n  \"homepage\": \"https://github.com/aspnet/jquery-validation-unobtrusive\",\r"
  },
  {
    "path": "MvcApp/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt",
    "chars": 587,
    "preview": "Copyright (c) .NET Foundation. All rights reserved.\r\n\r\nLicensed under the Apache License, Version 2.0 (the \"License\"); y"
  },
  {
    "path": "MvcApp/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js",
    "chars": 19748,
    "preview": "// Unobtrusive validation support library for jQuery and jQuery Validate\r\n// Copyright (C) Microsoft Corporation. All ri"
  },
  {
    "path": "ProductsStoreOnKubernetes.sln",
    "chars": 1594,
    "preview": "\r\nMicrosoft Visual Studio Solution File, Format Version 12.00\r\n# Visual Studio Version 16\r\nVisualStudioVersion = 16.0.3"
  },
  {
    "path": "README.demo.md",
    "chars": 174,
    "preview": "\ndocker build --rm -f \"Dockerfile\" -t acrsec.azurecr.io/webapp:1.0 .\n\ndocker run --rm -d -p 5555:80/tcp acrsec.azurecr.i"
  },
  {
    "path": "README.md",
    "chars": 8173,
    "preview": "![Docker Image CI](https://github.com/HoussemDellai/ProductsStoreOnKubernetes/workflows/Docker%20Image%20CI/badge.svg)\n\n"
  },
  {
    "path": "WebApp/Controllers/HomeController.cs",
    "chars": 911,
    "preview": "using Microsoft.AspNetCore.Mvc;\nusing Microsoft.Extensions.Logging;\nusing System;\nusing System.Collections.Generic;\nusi"
  },
  {
    "path": "WebApp/Controllers/ProductsController.cs",
    "chars": 4326,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing Microsoft.AspNet"
  },
  {
    "path": "WebApp/Data/ProductsContext.cs",
    "chars": 468,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing Microsoft.Entity"
  },
  {
    "path": "WebApp/Dockerfile",
    "chars": 494,
    "preview": "# Dockerfile\nFROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim AS base\nWORKDIR /app\nEXPOSE 80\nEXPOSE 443\n\nFROM mcr.mi"
  },
  {
    "path": "WebApp/Models/ErrorViewModel.cs",
    "chars": 205,
    "preview": "using System;\n\nnamespace WebApp.Models\n{\n    public class ErrorViewModel\n    {\n        public string RequestId { get; se"
  },
  {
    "path": "WebApp/Models/Product.cs",
    "chars": 187,
    "preview": "namespace WebApp.Models\n{\n    public class Product\n    {\n        public int Id { get; set; }\n\n        public string Nam"
  },
  {
    "path": "WebApp/Program.cs",
    "chars": 688,
    "preview": "using Microsoft.AspNetCore.Hosting;\nusing Microsoft.Extensions.Configuration;\nusing Microsoft.Extensions.Hosting;\nusing "
  },
  {
    "path": "WebApp/Properties/launchSettings.json",
    "chars": 872,
    "preview": "{\n  \"iisSettings\": {\n    \"windowsAuthentication\": false,\n    \"anonymousAuthentication\": true,\n    \"iisExpress\": {\n      "
  },
  {
    "path": "WebApp/Properties/serviceDependencies.json",
    "chars": 110,
    "preview": "{\n  \"dependencies\": {\n    \"mssql1\": {\n      \"type\": \"mssql\",\n      \"connectionId\": \"WebAppContext\"\n    }\n  }\n}"
  },
  {
    "path": "WebApp/Properties/serviceDependencies.local.json",
    "chars": 116,
    "preview": "{\n  \"dependencies\": {\n    \"mssql1\": {\n      \"type\": \"mssql.local\",\n      \"connectionId\": \"WebAppContext\"\n    }\n  }\n}"
  },
  {
    "path": "WebApp/Startup.cs",
    "chars": 1985,
    "preview": "using Microsoft.AspNetCore.Builder;\nusing Microsoft.AspNetCore.Hosting;\nusing Microsoft.AspNetCore.HttpsPolicy;\nusing M"
  },
  {
    "path": "WebApp/Views/Home/Index.cshtml",
    "chars": 229,
    "preview": "@{\n    ViewData[\"Title\"] = \"Home Page\";\n}\n\n<div class=\"text-center\">\n    <h1 class=\"display-4\">Welcome</h1>\n    <p>Lear"
  },
  {
    "path": "WebApp/Views/Home/Privacy.cshtml",
    "chars": 136,
    "preview": "@{\n    ViewData[\"Title\"] = \"Privacy Policy\";\n}\n<h1>@ViewData[\"Title\"]</h1>\n\n<p>Use this page to detail your site's priv"
  },
  {
    "path": "WebApp/Views/Products/Create.cshtml",
    "chars": 1115,
    "preview": "@model WebApp.Models.Product\n\n@{\n    ViewData[\"Title\"] = \"Create\";\n}\n\n<h1>Create</h1>\n\n<h4>Product</h4>\n<hr />\n<div cla"
  },
  {
    "path": "WebApp/Views/Products/Delete.cshtml",
    "chars": 819,
    "preview": "@model WebApp.Models.Product\n\n@{\n    ViewData[\"Title\"] = \"Delete\";\n}\n\n<h1>Delete</h1>\n\n<h3>Are you sure you want to del"
  },
  {
    "path": "WebApp/Views/Products/Details.cshtml",
    "chars": 679,
    "preview": "@model WebApp.Models.Product\n\n@{\n    ViewData[\"Title\"] = \"Details\";\n}\n\n<h1>Details</h1>\n\n<div>\n    <h4>Product</h4>\n   "
  },
  {
    "path": "WebApp/Views/Products/Edit.cshtml",
    "chars": 1156,
    "preview": "@model WebApp.Models.Product\n\n@{\n    ViewData[\"Title\"] = \"Edit\";\n}\n\n<h1>Edit</h1>\n\n<h4>Product</h4>\n<hr />\n<div class=\""
  },
  {
    "path": "WebApp/Views/Products/Index.cshtml",
    "chars": 971,
    "preview": "@model IEnumerable<WebApp.Models.Product>\n\n@{\n    ViewData[\"Title\"] = \"Index\";\n}\n\n<h1>Index</h1>\n\n<p>\n    <a asp-action"
  },
  {
    "path": "WebApp/Views/Shared/Error.cshtml",
    "chars": 857,
    "preview": "@model ErrorViewModel\n@{\n    ViewData[\"Title\"] = \"Error\";\n}\n\n<h1 class=\"text-danger\">Error.</h1>\n<h2 class=\"text-danger"
  },
  {
    "path": "WebApp/Views/Shared/_Layout.cshtml",
    "chars": 2406,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-wi"
  },
  {
    "path": "WebApp/Views/Shared/_ValidationScriptsPartial.cshtml",
    "chars": 172,
    "preview": "<script src=\"~/lib/jquery-validation/dist/jquery.validate.min.js\"></script>\n<script src=\"~/lib/jquery-validation-unobtr"
  },
  {
    "path": "WebApp/Views/_ViewImports.cshtml",
    "chars": 89,
    "preview": "@using WebApp\n@using WebApp.Models\n@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers\n"
  },
  {
    "path": "WebApp/Views/_ViewStart.cshtml",
    "chars": 30,
    "preview": "@{\n    Layout = \"_Layout\";\n}\n"
  },
  {
    "path": "WebApp/WebApp.csproj",
    "chars": 930,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n  <PropertyGroup>\n    <TargetFramework>net5.0</TargetFramework>\n    <UserSecretsI"
  },
  {
    "path": "WebApp/appsettings.Development.json",
    "chars": 159,
    "preview": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Information\",\n      \"Microsoft\": \"Warning\",\n      \"Microsoft.Hostin"
  },
  {
    "path": "WebApp/appsettings.json",
    "chars": 341,
    "preview": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Information\",\n      \"Microsoft\": \"Warning\",\n      \"Microsoft.Hostin"
  },
  {
    "path": "WebApp/wwwroot/css/site.css",
    "chars": 1344,
    "preview": "/* Please see documentation at https://docs.microsoft.com/aspnet/core/client-side/bundling-and-minification\nfor details"
  },
  {
    "path": "WebApp/wwwroot/js/site.js",
    "chars": 224,
    "preview": "// Please see documentation at https://docs.microsoft.com/aspnet/core/client-side/bundling-and-minification\n// for deta"
  },
  {
    "path": "WebApp/wwwroot/lib/bootstrap/LICENSE",
    "chars": 1131,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2011-2018 Twitter, Inc.\nCopyright (c) 2011-2018 The Bootstrap Authors\n\nPermission i"
  },
  {
    "path": "WebApp/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.css",
    "chars": 64548,
    "preview": "/*!\n * Bootstrap Grid v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-"
  },
  {
    "path": "WebApp/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.css",
    "chars": 4897,
    "preview": "/*!\n * Bootstrap Reboot v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 201"
  },
  {
    "path": "WebApp/wwwroot/lib/bootstrap/dist/css/bootstrap.css",
    "chars": 192348,
    "preview": "/*!\n * Bootstrap v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 "
  },
  {
    "path": "WebApp/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.js",
    "chars": 222909,
    "preview": "/*!\n  * Bootstrap v4.3.1 (https://getbootstrap.com/)\n  * Copyright 2011-2019 The Bootstrap Authors (https://github.com/t"
  },
  {
    "path": "WebApp/wwwroot/lib/bootstrap/dist/js/bootstrap.js",
    "chars": 131637,
    "preview": "/*!\n  * Bootstrap v4.3.1 (https://getbootstrap.com/)\n  * Copyright 2011-2019 The Bootstrap Authors (https://github.com/t"
  },
  {
    "path": "WebApp/wwwroot/lib/jquery/LICENSE.txt",
    "chars": 1605,
    "preview": "Copyright JS Foundation and other contributors, https://js.foundation/\n\nThis software consists of voluntary contribution"
  },
  {
    "path": "WebApp/wwwroot/lib/jquery/dist/jquery.js",
    "chars": 287630,
    "preview": "/*!\n * jQuery JavaScript Library v3.5.1\n * https://jquery.com/\n *\n * Includes Sizzle.js\n * https://sizzlejs.com/\n *\n * C"
  },
  {
    "path": "WebApp/wwwroot/lib/jquery-validation/LICENSE.md",
    "chars": 1094,
    "preview": "The MIT License (MIT)\n=====================\n\nCopyright Jörn Zaefferer\n\nPermission is hereby granted, free of charge, to "
  },
  {
    "path": "WebApp/wwwroot/lib/jquery-validation/dist/additional-methods.js",
    "chars": 42006,
    "preview": "/*!\n * jQuery Validation Plugin v1.17.0\n *\n * https://jqueryvalidation.org/\n *\n * Copyright (c) 2017 Jörn Zaefferer\n * R"
  },
  {
    "path": "WebApp/wwwroot/lib/jquery-validation/dist/jquery.validate.js",
    "chars": 48675,
    "preview": "/*!\n * jQuery Validation Plugin v1.17.0\n *\n * https://jqueryvalidation.org/\n *\n * Copyright (c) 2017 Jörn Zaefferer\n * R"
  },
  {
    "path": "WebApp/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt",
    "chars": 575,
    "preview": "Copyright (c) .NET Foundation. All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you"
  },
  {
    "path": "WebApp/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js",
    "chars": 19366,
    "preview": "// Unobtrusive validation support library for jQuery and jQuery Validate\n// Copyright (c) .NET Foundation. All rights re"
  },
  {
    "path": "ansible/aks-ansible.yml",
    "chars": 3054,
    "preview": "- hosts: localhost\n  connection: local\n  vars:\n    resource_group: myResourceGroup\n    location: eastus2\n    keyvault_na"
  },
  {
    "path": "arm-template/parameters.json",
    "chars": 487,
    "preview": "{\n    \"$schema\": \"https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#\",\n    \"contentVersio"
  },
  {
    "path": "arm-template/template.json",
    "chars": 4252,
    "preview": "{\n    \"$schema\": \"https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#\",\n    \"contentVersion\""
  },
  {
    "path": "azure-pipelines.yml",
    "chars": 1519,
    "preview": "# trigger:\n# - master\n  \npr:\n  branches:\n    include:\n      - dev\n\nresources:\n- repo: self\n\nvariables:\n  tag: '$(Build.B"
  },
  {
    "path": "charts/commands.ps1",
    "chars": 884,
    "preview": "# Install Helm, guide: https://helm.sh/docs/intro/install/\n# Check Helm version\nhelm version\n\n# Create a sample chart\nhe"
  },
  {
    "path": "charts/firstchart/.helmignore",
    "chars": 349,
    "preview": "# Patterns to ignore when building packages.\n# This supports shell glob matching, relative path matching, and\n# negation"
  },
  {
    "path": "charts/firstchart/Chart.yaml",
    "chars": 1101,
    "preview": "apiVersion: v2\nname: firstchart\ndescription: A Helm chart for Kubernetes\n\n# A chart can be either an 'application' or a "
  },
  {
    "path": "charts/firstchart/templates/NOTES.txt",
    "chars": 1593,
    "preview": "1. Get the application URL by running these commands:\n{{- if .Values.ingress.enabled }}\n{{- range $host := .Values.ingre"
  },
  {
    "path": "charts/firstchart/templates/_helpers.tpl",
    "chars": 1850,
    "preview": "{{/* vim: set filetype=mustache: */}}\n{{/*\nExpand the name of the chart.\n*/}}\n{{- define \"firstchart.name\" -}}\n{{- defau"
  },
  {
    "path": "charts/firstchart/templates/deployment.yaml",
    "chars": 1843,
    "preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: {{ include \"firstchart.fullname\" . }}\n  labels:\n    {{- include \""
  },
  {
    "path": "charts/firstchart/templates/hpa.yaml",
    "chars": 917,
    "preview": "{{- if .Values.autoscaling.enabled }}\napiVersion: autoscaling/v2beta1\nkind: HorizontalPodAutoscaler\nmetadata:\n  name: {{"
  },
  {
    "path": "charts/firstchart/templates/ingress.yaml",
    "chars": 1058,
    "preview": "{{- if .Values.ingress.enabled -}}\n{{- $fullName := include \"firstchart.fullname\" . -}}\n{{- $svcPort := .Values.service."
  },
  {
    "path": "charts/firstchart/templates/service.yaml",
    "chars": 370,
    "preview": "apiVersion: v1\nkind: Service\nmetadata:\n  name: {{ include \"firstchart.fullname\" . }}\n  labels:\n    {{- include \"firstcha"
  },
  {
    "path": "charts/firstchart/templates/serviceaccount.yaml",
    "chars": 326,
    "preview": "{{- if .Values.serviceAccount.create -}}\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: {{ include \"firstchart.se"
  },
  {
    "path": "charts/firstchart/templates/tests/test-connection.yaml",
    "chars": 396,
    "preview": "apiVersion: v1\nkind: Pod\nmetadata:\n  name: \"{{ include \"firstchart.fullname\" . }}-test-connection\"\n  labels:\n    {{- inc"
  },
  {
    "path": "charts/firstchart/values.yaml",
    "chars": 1803,
    "preview": "# Default values for firstchart.\n# This is a YAML-formatted file.\n# Declare variables to be passed into your templates.\n"
  },
  {
    "path": "charts/productsstore/.helmignore",
    "chars": 333,
    "preview": "# Patterns to ignore when building packages.\n# This supports shell glob matching, relative path matching, and\n# negation"
  },
  {
    "path": "charts/productsstore/Chart.yaml",
    "chars": 108,
    "preview": "apiVersion: v2\nappVersion: \"1.0\"\ndescription: A Helm chart for Kubernetes\nname: productsstore\nversion: 0.2.0"
  },
  {
    "path": "charts/productsstore/templates/_helpers.tpl",
    "chars": 1063,
    "preview": "{{/* vim: set filetype=mustache: */}}\n{{/*\nExpand the name of the chart.\n*/}}\n{{- define \"productsstore.name\" -}}\n{{- de"
  },
  {
    "path": "charts/productsstore/templates/helm-namespace.yaml",
    "chars": 116,
    "preview": "kind: Namespace\napiVersion: v1\nmetadata:\n  name: {{ .Values.namespace }}\n  labels:\n    name: {{ .Values.namespace }}"
  },
  {
    "path": "charts/productsstore/templates/mssql-config-map.yaml",
    "chars": 240,
    "preview": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: mssql-connection-configmap\n  namespace: {{ .Values.namespace }}\n  label"
  },
  {
    "path": "charts/productsstore/templates/mssql-deployment.yaml",
    "chars": 1305,
    "preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: mssql-deployment-helm\n  namespace: {{ .Values.namespace }}\nspec:\n"
  },
  {
    "path": "charts/productsstore/templates/mssql-pv.azure.yaml",
    "chars": 1068,
    "preview": "# We need the the StorageClass object only when we provision \n# the hardware resources (creation of Azure Disk in this c"
  },
  {
    "path": "charts/productsstore/templates/mvc-deployment.azure.yaml",
    "chars": 1195,
    "preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: mvc-deployment-helm\n  namespace: {{ .Values.namespace }}\nspec:\n  "
  },
  {
    "path": "charts/productsstore/values.yaml",
    "chars": 975,
    "preview": "# Default values for productsstore.\n# This is a YAML-formatted file.\n# Declare variables to be passed into your template"
  },
  {
    "path": "create-aks-cluster.sh",
    "chars": 832,
    "preview": "# connect to Azure via Azure CLI\naz login\n\n# Create resource group\naz group create \\\n   --location westeurope \\ \n   --su"
  },
  {
    "path": "docker-compose.yaml",
    "chars": 563,
    "preview": "version: \"3\"\nservices:\n  web:\n    container_name: web-app\n    build: \n      dockerfile: Dockerfile\n      context: MvcApp"
  },
  {
    "path": "hpa/commands.ps1",
    "chars": 217,
    "preview": "# Setup the web url to test\n$WEBAPP_URL='http://20.50.165.16'\n# Start Load Test with Artillery\nartillery quick --count 1"
  },
  {
    "path": "hpa/hpa.yaml",
    "chars": 339,
    "preview": "apiVersion: autoscaling/v1\nkind: HorizontalPodAutoscaler\nmetadata:\n  name: mvc-deployment-hpa\nspec:\n  maxReplicas: 10 # "
  },
  {
    "path": "hpa/tester-pod.yaml",
    "chars": 503,
    "preview": "apiVersion: v1\nkind: Pod\nmetadata:\n  name: counter4\nspec:\n  containers:\n  - name: count\n    image: busybox\n    args: [/b"
  },
  {
    "path": "infra/backend.tf",
    "chars": 39,
    "preview": "terraform {\n  backend \"azurerm\" {\n  }\n}"
  },
  {
    "path": "infra/create-azure-storage-tfstate.sh",
    "chars": 2169,
    "preview": "set -e\n\nexport LOCATION=\"__LOCATION__\"\nexport INFRA_RESOURCE_GROUP=\"__INFRA_RESOURCE_GROUP__\"\nexport TF_STATE_STORAGE_AC"
  },
  {
    "path": "infra/main.tf",
    "chars": 3035,
    "preview": "resource \"azurerm_resource_group\" \"rg\" {\n  name     = var.resource_group_name\n  location = var.location\n}\n\nresource \"azu"
  },
  {
    "path": "infra/output.tf",
    "chars": 284,
    "preview": "output \"kube_config\" {\n  value     = azurerm_kubernetes_cluster.k8s.kube_config_raw\n  sensitive = true\n}\n\noutput \"host\" "
  },
  {
    "path": "infra/provider.tf",
    "chars": 161,
    "preview": "provider \"azurerm\" {\n  features {}\n}\n\nterraform {\n  required_providers {\n    azurerm = {\n      source  = \"hashicorp/azur"
  },
  {
    "path": "infra/terraform.local.tfvars",
    "chars": 274,
    "preview": "resource_group_name = \"aks-01-rg\"\ncluster_name        = \"aks-01\"\nacr_name            = \"acrforaks01\"\nsql_name           "
  },
  {
    "path": "infra/terraform.tfvars",
    "chars": 328,
    "preview": "resource_group_name = \"__AKS_RESOURCE_GROUP__\"\ncluster_name        = \"__AKS_NAME__\"\nacr_name            = \"__ACR_NAME__\""
  },
  {
    "path": "infra/tf.commands.sh",
    "chars": 230,
    "preview": "\naz ad sp create-for-rbac --name \"azure-sp-github-actions-ci-cd\" --role owner --sdk-auth\n\nterraform fmt\n\nterraform init\n"
  },
  {
    "path": "infra/variables.tf",
    "chars": 649,
    "preview": "variable \"node_count\" {\n  default = 3\n}\n\nvariable \"dns_prefix\" {\n  default = \"aks-k8s-2022\"\n}\n\nvariable \"cluster_name\" {"
  },
  {
    "path": "ingress-controller/ingress.yaml",
    "chars": 346,
    "preview": "apiVersion: extensions/v1beta1\nkind: Ingress\nmetadata:\n  name: frontend\n  annotations:\n    kubernetes.io/ingress.class: "
  },
  {
    "path": "ingress-controller/workshop.sh",
    "chars": 486,
    "preview": "# src: https://aksworkshop.io/\n\n# Enable the HTTP routing add-on on your cluster\n# This could be enabled in the Azure Po"
  },
  {
    "path": "istio/1-app-gateway.yaml",
    "chars": 229,
    "preview": "apiVersion: networking.istio.io/v1alpha3\nkind: Gateway\nmetadata:\n  name: mvc-app-gateway\nspec:\n  selector:\n    istio: in"
  },
  {
    "path": "istio/2-app-virtualservice.yaml",
    "chars": 334,
    "preview": "# mvc-app-virtualservice.yaml\napiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: mvc-app\nsp"
  },
  {
    "path": "istio/3-app-virtualservice-destinationrule.yaml",
    "chars": 803,
    "preview": "# mvc-app-virtualservice.yaml\napiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: mvc-app\nsp"
  },
  {
    "path": "istio/4-mssql-svc-deploy.yaml",
    "chars": 934,
    "preview": "apiVersion: apps/v1beta1\nkind: Deployment\nmetadata:\n  name: mssql-deployment-1-0\nspec:\n  replicas: 1\n  selector:\n    mat"
  },
  {
    "path": "istio/5-mssql-virtualservice-destinationrule.yaml",
    "chars": 820,
    "preview": "# mvc-app-virtualservice.yaml\napiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: mssql-virt"
  },
  {
    "path": "istio/6-mssql-deploy-2-0.yaml",
    "chars": 674,
    "preview": "apiVersion: apps/v1beta1\nkind: Deployment\nmetadata:\n  name: mssql-deployment-2-0\nspec:\n  replicas: 1\n  selector:\n    mat"
  },
  {
    "path": "istio/grafana.secret.yaml",
    "chars": 177,
    "preview": "apiVersion: v1\nkind: Secret\nmetadata:\n  name: grafana\n  namespace: istio-system\n  labels:\n    app: grafana\ntype: Opaque\n"
  },
  {
    "path": "istio/istio.aks.yaml",
    "chars": 943,
    "preview": "apiVersion: install.istio.io/v1alpha2\nkind: IstioControlPlane\nspec:\n  # Use the default profile as the base\n  # More det"
  },
  {
    "path": "istio/kiali.secret.yaml",
    "chars": 165,
    "preview": "apiVersion: v1\nkind: Secret\nmetadata:\n  name: kiali\n  namespace: istio-system\n  labels:\n    app: kiali\ntype: Opaque\ndata"
  },
  {
    "path": "istio/mvc-app-v1.0.yaml",
    "chars": 721,
    "preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: mvc-app-1-0\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n    "
  },
  {
    "path": "istio/mvc-deployment.v1.1.yaml",
    "chars": 431,
    "preview": "apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2\nkind: Deployment\nmetadata:\n  name: mvc-app-1-1\nspec:\n  "
  },
  {
    "path": "istio/mvc-deployment.v2.0.yaml",
    "chars": 431,
    "preview": "apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2\nkind: Deployment\nmetadata:\n  name: mvc-app-2-0\nspec:\n  "
  },
  {
    "path": "istio/steps.sh",
    "chars": 1330,
    "preview": "# pre\n$ az aks browse --resource-group aks-k8s-extia-rg --name aks-k8s-extia --subscription \"Microsoft Azure Sponsorship"
  },
  {
    "path": "kubernetes/mssql-configmap.yaml",
    "chars": 461,
    "preview": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: mssql-connection-configmap\n  labels:\n    app: mvc\ndata:\n  # db-connecti"
  },
  {
    "path": "kubernetes/mssql-deployment.yaml",
    "chars": 1245,
    "preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: mssql-deployment\nspec:\n  selector:\n    matchLabels:\n      app: ms"
  },
  {
    "path": "kubernetes/mssql-pv.azure.yaml",
    "chars": 440,
    "preview": "kind: StorageClass\napiVersion: storage.k8s.io/v1\nmetadata:\n  name: azure-disk\nprovisioner: kubernetes.io/azure-disk\npara"
  },
  {
    "path": "kubernetes/mssql-secret.yaml",
    "chars": 203,
    "preview": "apiVersion: v1\nkind: Secret\nmetadata:\n  name:  mssql-secret\ndata:\n   db-connection-string-secret: U2VydmVyPW1zc3FsLXNlcn"
  },
  {
    "path": "kubernetes/mvc-deployment.azure.yaml",
    "chars": 1169,
    "preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: mvc-deployment\nspec:\n  selector:\n    matchLabels:\n      app: mvc\n"
  },
  {
    "path": "logging-efk/commands.sh",
    "chars": 336,
    "preview": "# Get Helm Stable Repo\nhelm repo add stable https://kubernetes-charts.storage.googleapis.com\n\n# Install Elasticsearch\nhe"
  },
  {
    "path": "logging-efk/fluentd-daemonset-elasticsearch.yaml",
    "chars": 2296,
    "preview": "# src: https://github.com/fluent/fluentd-kubernetes-daemonset/blob/master/fluentd-daemonset-elasticsearch.yaml\napiVersio"
  },
  {
    "path": "logging-efk/kibana-values.yaml",
    "chars": 276,
    "preview": "files:\n  kibana.yml:\n    ## Default Kibana configuration from kibana-docker.\n    server.name: kibana\n    server.host: \"0"
  },
  {
    "path": "network-policy/1-backend-policy-deny.yaml",
    "chars": 200,
    "preview": "kind: NetworkPolicy\napiVersion: networking.k8s.io/v1\nmetadata:\n  name: backend-policy\n  namespace: development\nspec:\n  p"
  },
  {
    "path": "network-policy/1-namespace-development.yaml",
    "chars": 95,
    "preview": "apiVersion: v1\nkind: Namespace\nmetadata:\n  name: development\n  labels:\n    purpose: development"
  },
  {
    "path": "network-policy/2-backend-policy-allow-pod.yaml",
    "chars": 322,
    "preview": "kind: NetworkPolicy\napiVersion: networking.k8s.io/v1\nmetadata:\n  name: backend-policy\n  namespace: development\nspec:\n  p"
  },
  {
    "path": "network-policy/2-pod-nginx-backend.yaml",
    "chars": 238,
    "preview": "apiVersion: v1\nkind: Pod\nmetadata:\n  name: backend\n  namespace: development\n  labels:\n    app: webapp\n    role: backend\n"
  },
  {
    "path": "network-policy/3-backend-policy-allow-pod-namespace.yaml",
    "chars": 371,
    "preview": "kind: NetworkPolicy\napiVersion: networking.k8s.io/v1\nmetadata:\n  name: backend-policy\n  namespace: development\nspec:\n  p"
  },
  {
    "path": "network-policy/3-pod-alpine-test.yaml",
    "chars": 112,
    "preview": "apiVersion: v1\nkind: Pod\nmetadata:\n  name: alpine\n  namespace: development\nspec:\n  containers:\n  - image: alpine"
  },
  {
    "path": "network-policy/commands.sh",
    "chars": 226,
    "preview": "kubectl create namespace development\nkubectl label namespace/development purpose=development\n\nkubectl run backend --imag"
  },
  {
    "path": "opa-gatekeeper/all_ns_must_have_gatekeeper.yaml",
    "chars": 346,
    "preview": "# src: https://github.com/open-policy-agent/gatekeeper/blob/master/demo/basic/constraints/all_ns_must_have_gatekeeper.ya"
  },
  {
    "path": "opa-gatekeeper/bad-namespace.yaml",
    "chars": 59,
    "preview": "apiVersion: v1\nkind: Namespace\nmetadata:\n name: mynamespace"
  },
  {
    "path": "opa-gatekeeper/commands.ps1",
    "chars": 682,
    "preview": "# Deploy OPA Gatekeeper\nkubectl apply -f https://raw.githubusercontent.com/open-policy-agent/gatekeeper/master/deploy/ga"
  },
  {
    "path": "opa-gatekeeper/good-namespace.yaml",
    "chars": 86,
    "preview": "apiVersion: v1\nkind: Namespace\nmetadata:\n name: mynamespace\n labels:\n  gatekeeper: OPA"
  },
  {
    "path": "opa-gatekeeper/k8srequiredlabels_template.yaml",
    "chars": 940,
    "preview": "# src: https://github.com/open-policy-agent/gatekeeper/blob/master/demo/basic/templates/k8srequiredlabels_template.yaml\n"
  },
  {
    "path": "prometheus/prometheus.values.yaml",
    "chars": 40739,
    "preview": "rbac:\n  create: true\n\npodSecurityPolicy:\n  enabled: false\n\nimagePullSecrets:\n# - name: \"image-pull-secret\"\n\n## Define se"
  },
  {
    "path": "prometheus/steps.sh",
    "chars": 1789,
    "preview": "# Documentation for working with Prometheus and Grafana\n# Adedicated tutorial was created on this repo: https://github.c"
  },
  {
    "path": "rbac/cert/houssem.crt",
    "chars": 1001,
    "preview": "-----BEGIN CERTIFICATE-----\nMIICtTCCAZ0CCQD+XepAqP54ozANBgkqhkiG9w0BAQUFADAVMRMwEQYDVQQDEwpt\naW5pa3ViZUNBMB4XDTE5MDIyMzA"
  },
  {
    "path": "rbac/cert/houssem.csr",
    "chars": 911,
    "preview": "-----BEGIN CERTIFICATE REQUEST-----\nMIICaTCCAVECAQAwJDEQMA4GA1UEAwwHaG91c3NlbTEQMA4GA1UECgwHZXJhbGFi\nczCCASIwDQYJKoZIhvc"
  },
  {
    "path": "rbac/cert/houssem.key",
    "chars": 1675,
    "preview": "-----BEGIN RSA PRIVATE KEY-----\nMIIEogIBAAKCAQEA1p7eBPtroMR2syvOvBfLMcuuIdH6PWLAG6wH7QVWeNV47GDB\nl9XKPHxyHT9K0iQi4ax7DdR"
  },
  {
    "path": "rbac/rbac-aad/rbac-aad-group.yaml",
    "chars": 300,
    "preview": "apiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRoleBinding\nmetadata:\n name: contoso-cluster-admins\nroleRef:\n apiG"
  },
  {
    "path": "rbac/rbac-aad/rbac-aad-user.yaml",
    "chars": 340,
    "preview": "apiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRoleBinding\nmetadata:\n  name: rb-cluster-admins\nroleRef:\n  apiGrou"
  },
  {
    "path": "rbac/role-binding.yaml",
    "chars": 471,
    "preview": "# This role binding allows \"jane\" to read pods in the \"default\" namespace.\nkind: RoleBinding\napiVersion: rbac.authorizat"
  },
  {
    "path": "rbac/role-deployment-manager.yaml",
    "chars": 311,
    "preview": "kind: Role\napiVersion: rbac.authorization.k8s.io/v1beta1\nmetadata:\n  namespace: office\n  name: deployment-manager\nrules:"
  },
  {
    "path": "rbac/role.yaml",
    "chars": 216,
    "preview": "kind: Role\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n  namespace: default\n  name: pod-reader\nrules:\n- apiGroups"
  },
  {
    "path": "rbac/rolebinding-deployment-manager.yaml",
    "chars": 246,
    "preview": "kind: RoleBinding\napiVersion: rbac.authorization.k8s.io/v1beta1\nmetadata:\n  name: deployment-manager-binding\n  namespace"
  },
  {
    "path": "rbac/steps.bash",
    "chars": 768,
    "preview": "mkdir cert\n\ncd  cert/\n\n# generate .key\nopenssl genrsa -out houssem.key 2048\n\n# generate .csr\nopenssl req -new \\\n    -key"
  },
  {
    "path": "start/mvc-deployment.simple.yaml",
    "chars": 622,
    "preview": "apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2\nkind: Deployment\nmetadata:\n  name: mvc-deployment\nspec:"
  },
  {
    "path": "terraform/aks-cluster.tf",
    "chars": 1128,
    "preview": "resource \"azurerm_resource_group\" \"test\" {\n  name     = \"aks-tf-RG\"\n  location = \"West Europe\"\n}\n\nresource \"azurerm_kube"
  },
  {
    "path": "terraform/create-service-principal.sh",
    "chars": 488,
    "preview": "# Use az ad sp to generate a Service Principal in Azure\naz ad sp create-for-rbac --role=\"Contributor\" --scopes=\"/subscri"
  }
]

// ... and 1 more files (download for full content)

About this extraction

This page contains the full source code of the HoussemDellai/ProductsStoreOnKubernetes GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 189 files (46.2 MB), approximately 525.9k tokens, and a symbol index with 374 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!