diff --git a/.venv/Scripts/Activate.ps1 b/.venv/Scripts/Activate.ps1 new file mode 100644 index 0000000..e3765a9 --- /dev/null +++ b/.venv/Scripts/Activate.ps1 @@ -0,0 +1,502 @@ +<# +.Synopsis +Activate a Python virtual environment for the current PowerShell session. + +.Description +Pushes the python executable for a virtual environment to the front of the +$Env:PATH environment variable and sets the prompt to signify that you are +in a Python virtual environment. Makes use of the command line switches as +well as the `pyvenv.cfg` file values present in the virtual environment. + +.Parameter VenvDir +Path to the directory that contains the virtual environment to activate. The +default value for this is the parent of the directory that the Activate.ps1 +script is located within. + +.Parameter Prompt +The prompt prefix to display when this virtual environment is activated. By +default, this prompt is the name of the virtual environment folder (VenvDir) +surrounded by parentheses and followed by a single space (ie. '(.venv) '). + +.Example +Activate.ps1 +Activates the Python virtual environment that contains the Activate.ps1 script. + +.Example +Activate.ps1 -Verbose +Activates the Python virtual environment that contains the Activate.ps1 script, +and shows extra information about the activation as it executes. + +.Example +Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv +Activates the Python virtual environment located in the specified location. + +.Example +Activate.ps1 -Prompt "MyPython" +Activates the Python virtual environment that contains the Activate.ps1 script, +and prefixes the current prompt with the specified string (surrounded in +parentheses) while the virtual environment is active. + +.Notes +On Windows, it may be required to enable this Activate.ps1 script by setting the +execution policy for the user. You can do this by issuing the following PowerShell +command: + +PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser + +For more information on Execution Policies: +https://go.microsoft.com/fwlink/?LinkID=135170 + +#> +Param( + [Parameter(Mandatory = $false)] + [String] + $VenvDir, + [Parameter(Mandatory = $false)] + [String] + $Prompt +) + +<# Function declarations --------------------------------------------------- #> + +<# +.Synopsis +Remove all shell session elements added by the Activate script, including the +addition of the virtual environment's Python executable from the beginning of +the PATH variable. + +.Parameter NonDestructive +If present, do not remove this function from the global namespace for the +session. + +#> +function global:deactivate ([switch]$NonDestructive) { + # Revert to original values + + # The prior prompt: + if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) { + Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt + Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT + } + + # The prior PYTHONHOME: + if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) { + Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME + Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME + } + + # The prior PATH: + if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) { + Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH + Remove-Item -Path Env:_OLD_VIRTUAL_PATH + } + + # Just remove the VIRTUAL_ENV altogether: + if (Test-Path -Path Env:VIRTUAL_ENV) { + Remove-Item -Path env:VIRTUAL_ENV + } + + # Just remove VIRTUAL_ENV_PROMPT altogether. + if (Test-Path -Path Env:VIRTUAL_ENV_PROMPT) { + Remove-Item -Path env:VIRTUAL_ENV_PROMPT + } + + # Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether: + if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) { + Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force + } + + # Leave deactivate function in the global namespace if requested: + if (-not $NonDestructive) { + Remove-Item -Path function:deactivate + } +} + +<# +.Description +Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the +given folder, and returns them in a map. + +For each line in the pyvenv.cfg file, if that line can be parsed into exactly +two strings separated by `=` (with any amount of whitespace surrounding the =) +then it is considered a `key = value` line. The left hand string is the key, +the right hand is the value. + +If the value starts with a `'` or a `"` then the first and last character is +stripped from the value before being captured. + +.Parameter ConfigDir +Path to the directory that contains the `pyvenv.cfg` file. +#> +function Get-PyVenvConfig( + [String] + $ConfigDir +) { + Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg" + + # Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue). + $pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue + + # An empty map will be returned if no config file is found. + $pyvenvConfig = @{ } + + if ($pyvenvConfigPath) { + + Write-Verbose "File exists, parse `key = value` lines" + $pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath + + $pyvenvConfigContent | ForEach-Object { + $keyval = $PSItem -split "\s*=\s*", 2 + if ($keyval[0] -and $keyval[1]) { + $val = $keyval[1] + + # Remove extraneous quotations around a string value. + if ("'""".Contains($val.Substring(0, 1))) { + $val = $val.Substring(1, $val.Length - 2) + } + + $pyvenvConfig[$keyval[0]] = $val + Write-Verbose "Adding Key: '$($keyval[0])'='$val'" + } + } + } + return $pyvenvConfig +} + + +<# Begin Activate script --------------------------------------------------- #> + +# Determine the containing directory of this script +$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition +$VenvExecDir = Get-Item -Path $VenvExecPath + +Write-Verbose "Activation script is located in path: '$VenvExecPath'" +Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)" +Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)" + +# Set values required in priority: CmdLine, ConfigFile, Default +# First, get the location of the virtual environment, it might not be +# VenvExecDir if specified on the command line. +if ($VenvDir) { + Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values" +} +else { + Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir." + $VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/") + Write-Verbose "VenvDir=$VenvDir" +} + +# Next, read the `pyvenv.cfg` file to determine any required value such +# as `prompt`. +$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir + +# Next, set the prompt from the command line, or the config file, or +# just use the name of the virtual environment folder. +if ($Prompt) { + Write-Verbose "Prompt specified as argument, using '$Prompt'" +} +else { + Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value" + if ($pyvenvCfg -and $pyvenvCfg['prompt']) { + Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'" + $Prompt = $pyvenvCfg['prompt']; + } + else { + Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virtual environment)" + Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'" + $Prompt = Split-Path -Path $venvDir -Leaf + } +} + +Write-Verbose "Prompt = '$Prompt'" +Write-Verbose "VenvDir='$VenvDir'" + +# Deactivate any currently active virtual environment, but leave the +# deactivate function in place. +deactivate -nondestructive + +# Now set the environment variable VIRTUAL_ENV, used by many tools to determine +# that there is an activated venv. +$env:VIRTUAL_ENV = $VenvDir + +if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) { + + Write-Verbose "Setting prompt to '$Prompt'" + + # Set the prompt to include the env name + # Make sure _OLD_VIRTUAL_PROMPT is global + function global:_OLD_VIRTUAL_PROMPT { "" } + Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT + New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt + + function global:prompt { + Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) " + _OLD_VIRTUAL_PROMPT + } + $env:VIRTUAL_ENV_PROMPT = $Prompt +} + +# Clear PYTHONHOME +if (Test-Path -Path Env:PYTHONHOME) { + Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME + Remove-Item -Path Env:PYTHONHOME +} + +# Add the venv to the PATH +Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH +$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH" + +# SIG # Begin signature block +# MIIvIwYJKoZIhvcNAQcCoIIvFDCCLxACAQExDzANBglghkgBZQMEAgEFADB5Bgor +# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG +# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBnL745ElCYk8vk +# dBtMuQhLeWJ3ZGfzKW4DHCYzAn+QB6CCE8MwggWQMIIDeKADAgECAhAFmxtXno4h +# MuI5B72nd3VcMA0GCSqGSIb3DQEBDAUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQK +# EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNV +# BAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDAeFw0xMzA4MDExMjAwMDBaFw0z +# ODAxMTUxMjAwMDBaMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJ +# bmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0 +# IFRydXN0ZWQgUm9vdCBHNDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB +# AL/mkHNo3rvkXUo8MCIwaTPswqclLskhPfKK2FnC4SmnPVirdprNrnsbhA3EMB/z +# G6Q4FutWxpdtHauyefLKEdLkX9YFPFIPUh/GnhWlfr6fqVcWWVVyr2iTcMKyunWZ +# anMylNEQRBAu34LzB4TmdDttceItDBvuINXJIB1jKS3O7F5OyJP4IWGbNOsFxl7s +# Wxq868nPzaw0QF+xembud8hIqGZXV59UWI4MK7dPpzDZVu7Ke13jrclPXuU15zHL +# 2pNe3I6PgNq2kZhAkHnDeMe2scS1ahg4AxCN2NQ3pC4FfYj1gj4QkXCrVYJBMtfb +# BHMqbpEBfCFM1LyuGwN1XXhm2ToxRJozQL8I11pJpMLmqaBn3aQnvKFPObURWBf3 +# JFxGj2T3wWmIdph2PVldQnaHiZdpekjw4KISG2aadMreSx7nDmOu5tTvkpI6nj3c +# AORFJYm2mkQZK37AlLTSYW3rM9nF30sEAMx9HJXDj/chsrIRt7t/8tWMcCxBYKqx +# YxhElRp2Yn72gLD76GSmM9GJB+G9t+ZDpBi4pncB4Q+UDCEdslQpJYls5Q5SUUd0 +# viastkF13nqsX40/ybzTQRESW+UQUOsxxcpyFiIJ33xMdT9j7CFfxCBRa2+xq4aL +# T8LWRV+dIPyhHsXAj6KxfgommfXkaS+YHS312amyHeUbAgMBAAGjQjBAMA8GA1Ud +# EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTs1+OC0nFdZEzf +# Lmc/57qYrhwPTzANBgkqhkiG9w0BAQwFAAOCAgEAu2HZfalsvhfEkRvDoaIAjeNk +# aA9Wz3eucPn9mkqZucl4XAwMX+TmFClWCzZJXURj4K2clhhmGyMNPXnpbWvWVPjS +# PMFDQK4dUPVS/JA7u5iZaWvHwaeoaKQn3J35J64whbn2Z006Po9ZOSJTROvIXQPK +# 7VB6fWIhCoDIc2bRoAVgX+iltKevqPdtNZx8WorWojiZ83iL9E3SIAveBO6Mm0eB +# cg3AFDLvMFkuruBx8lbkapdvklBtlo1oepqyNhR6BvIkuQkRUNcIsbiJeoQjYUIp +# 5aPNoiBB19GcZNnqJqGLFNdMGbJQQXE9P01wI4YMStyB0swylIQNCAmXHE/A7msg +# dDDS4Dk0EIUhFQEI6FUy3nFJ2SgXUE3mvk3RdazQyvtBuEOlqtPDBURPLDab4vri +# RbgjU2wGb2dVf0a1TD9uKFp5JtKkqGKX0h7i7UqLvBv9R0oN32dmfrJbQdA75PQ7 +# 9ARj6e/CVABRoIoqyc54zNXqhwQYs86vSYiv85KZtrPmYQ/ShQDnUBrkG5WdGaG5 +# nLGbsQAe79APT0JsyQq87kP6OnGlyE0mpTX9iV28hWIdMtKgK1TtmlfB2/oQzxm3 +# i0objwG2J5VT6LaJbVu8aNQj6ItRolb58KaAoNYes7wPD1N1KarqE3fk3oyBIa0H +# EEcRrYc9B9F1vM/zZn4wggawMIIEmKADAgECAhAIrUCyYNKcTJ9ezam9k67ZMA0G +# CSqGSIb3DQEBDAUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJ +# bmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0 +# IFRydXN0ZWQgUm9vdCBHNDAeFw0yMTA0MjkwMDAwMDBaFw0zNjA0MjgyMzU5NTla +# MGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFBMD8GA1UE +# AxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcgUlNBNDA5NiBTSEEz +# ODQgMjAyMSBDQTEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDVtC9C +# 0CiteLdd1TlZG7GIQvUzjOs9gZdwxbvEhSYwn6SOaNhc9es0JAfhS0/TeEP0F9ce +# 2vnS1WcaUk8OoVf8iJnBkcyBAz5NcCRks43iCH00fUyAVxJrQ5qZ8sU7H/Lvy0da +# E6ZMswEgJfMQ04uy+wjwiuCdCcBlp/qYgEk1hz1RGeiQIXhFLqGfLOEYwhrMxe6T +# SXBCMo/7xuoc82VokaJNTIIRSFJo3hC9FFdd6BgTZcV/sk+FLEikVoQ11vkunKoA +# FdE3/hoGlMJ8yOobMubKwvSnowMOdKWvObarYBLj6Na59zHh3K3kGKDYwSNHR7Oh +# D26jq22YBoMbt2pnLdK9RBqSEIGPsDsJ18ebMlrC/2pgVItJwZPt4bRc4G/rJvmM +# 1bL5OBDm6s6R9b7T+2+TYTRcvJNFKIM2KmYoX7BzzosmJQayg9Rc9hUZTO1i4F4z +# 8ujo7AqnsAMrkbI2eb73rQgedaZlzLvjSFDzd5Ea/ttQokbIYViY9XwCFjyDKK05 +# huzUtw1T0PhH5nUwjewwk3YUpltLXXRhTT8SkXbev1jLchApQfDVxW0mdmgRQRNY +# mtwmKwH0iU1Z23jPgUo+QEdfyYFQc4UQIyFZYIpkVMHMIRroOBl8ZhzNeDhFMJlP +# /2NPTLuqDQhTQXxYPUez+rbsjDIJAsxsPAxWEQIDAQABo4IBWTCCAVUwEgYDVR0T +# AQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUaDfg67Y7+F8Rhvv+YXsIiGX0TkIwHwYD +# VR0jBBgwFoAU7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0PAQH/BAQDAgGGMBMG +# A1UdJQQMMAoGCCsGAQUFBwMDMHcGCCsGAQUFBwEBBGswaTAkBggrBgEFBQcwAYYY +# aHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAChjVodHRwOi8vY2Fj +# ZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNydDBDBgNV +# HR8EPDA6MDigNqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRU +# cnVzdGVkUm9vdEc0LmNybDAcBgNVHSAEFTATMAcGBWeBDAEDMAgGBmeBDAEEATAN +# BgkqhkiG9w0BAQwFAAOCAgEAOiNEPY0Idu6PvDqZ01bgAhql+Eg08yy25nRm95Ry +# sQDKr2wwJxMSnpBEn0v9nqN8JtU3vDpdSG2V1T9J9Ce7FoFFUP2cvbaF4HZ+N3HL +# IvdaqpDP9ZNq4+sg0dVQeYiaiorBtr2hSBh+3NiAGhEZGM1hmYFW9snjdufE5Btf +# Q/g+lP92OT2e1JnPSt0o618moZVYSNUa/tcnP/2Q0XaG3RywYFzzDaju4ImhvTnh +# OE7abrs2nfvlIVNaw8rpavGiPttDuDPITzgUkpn13c5UbdldAhQfQDN8A+KVssIh +# dXNSy0bYxDQcoqVLjc1vdjcshT8azibpGL6QB7BDf5WIIIJw8MzK7/0pNVwfiThV +# 9zeKiwmhywvpMRr/LhlcOXHhvpynCgbWJme3kuZOX956rEnPLqR0kq3bPKSchh/j +# wVYbKyP/j7XqiHtwa+aguv06P0WmxOgWkVKLQcBIhEuWTatEQOON8BUozu3xGFYH +# Ki8QxAwIZDwzj64ojDzLj4gLDb879M4ee47vtevLt/B3E+bnKD+sEq6lLyJsQfmC +# XBVmzGwOysWGw/YmMwwHS6DTBwJqakAwSEs0qFEgu60bhQjiWQ1tygVQK+pKHJ6l +# /aCnHwZ05/LWUpD9r4VIIflXO7ScA+2GRfS0YW6/aOImYIbqyK+p/pQd52MbOoZW +# eE4wggd3MIIFX6ADAgECAhAHHxQbizANJfMU6yMM0NHdMA0GCSqGSIb3DQEBCwUA +# MGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFBMD8GA1UE +# AxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcgUlNBNDA5NiBTSEEz +# ODQgMjAyMSBDQTEwHhcNMjIwMTE3MDAwMDAwWhcNMjUwMTE1MjM1OTU5WjB8MQsw +# CQYDVQQGEwJVUzEPMA0GA1UECBMGT3JlZ29uMRIwEAYDVQQHEwlCZWF2ZXJ0b24x +# IzAhBgNVBAoTGlB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uMSMwIQYDVQQDExpQ +# eXRob24gU29mdHdhcmUgRm91bmRhdGlvbjCCAiIwDQYJKoZIhvcNAQEBBQADggIP +# ADCCAgoCggIBAKgc0BTT+iKbtK6f2mr9pNMUTcAJxKdsuOiSYgDFfwhjQy89koM7 +# uP+QV/gwx8MzEt3c9tLJvDccVWQ8H7mVsk/K+X+IufBLCgUi0GGAZUegEAeRlSXx +# xhYScr818ma8EvGIZdiSOhqjYc4KnfgfIS4RLtZSrDFG2tN16yS8skFa3IHyvWdb +# D9PvZ4iYNAS4pjYDRjT/9uzPZ4Pan+53xZIcDgjiTwOh8VGuppxcia6a7xCyKoOA +# GjvCyQsj5223v1/Ig7Dp9mGI+nh1E3IwmyTIIuVHyK6Lqu352diDY+iCMpk9Zanm +# SjmB+GMVs+H/gOiofjjtf6oz0ki3rb7sQ8fTnonIL9dyGTJ0ZFYKeb6BLA66d2GA +# LwxZhLe5WH4Np9HcyXHACkppsE6ynYjTOd7+jN1PRJahN1oERzTzEiV6nCO1M3U1 +# HbPTGyq52IMFSBM2/07WTJSbOeXjvYR7aUxK9/ZkJiacl2iZI7IWe7JKhHohqKuc +# eQNyOzxTakLcRkzynvIrk33R9YVqtB4L6wtFxhUjvDnQg16xot2KVPdfyPAWd81w +# tZADmrUtsZ9qG79x1hBdyOl4vUtVPECuyhCxaw+faVjumapPUnwo8ygflJJ74J+B +# Yxf6UuD7m8yzsfXWkdv52DjL74TxzuFTLHPyARWCSCAbzn3ZIly+qIqDAgMBAAGj +# ggIGMIICAjAfBgNVHSMEGDAWgBRoN+Drtjv4XxGG+/5hewiIZfROQjAdBgNVHQ4E +# FgQUt/1Teh2XDuUj2WW3siYWJgkZHA8wDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQM +# MAoGCCsGAQUFBwMDMIG1BgNVHR8Ega0wgaowU6BRoE+GTWh0dHA6Ly9jcmwzLmRp +# Z2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVTaWduaW5nUlNBNDA5NlNI +# QTM4NDIwMjFDQTEuY3JsMFOgUaBPhk1odHRwOi8vY3JsNC5kaWdpY2VydC5jb20v +# RGlnaUNlcnRUcnVzdGVkRzRDb2RlU2lnbmluZ1JTQTQwOTZTSEEzODQyMDIxQ0Ex +# LmNybDA+BgNVHSAENzA1MDMGBmeBDAEEATApMCcGCCsGAQUFBwIBFhtodHRwOi8v +# d3d3LmRpZ2ljZXJ0LmNvbS9DUFMwgZQGCCsGAQUFBwEBBIGHMIGEMCQGCCsGAQUF +# BzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wXAYIKwYBBQUHMAKGUGh0dHA6 +# Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVTaWdu +# aW5nUlNBNDA5NlNIQTM4NDIwMjFDQTEuY3J0MAwGA1UdEwEB/wQCMAAwDQYJKoZI +# hvcNAQELBQADggIBABxv4AeV/5ltkELHSC63fXAFYS5tadcWTiNc2rskrNLrfH1N +# s0vgSZFoQxYBFKI159E8oQQ1SKbTEubZ/B9kmHPhprHya08+VVzxC88pOEvz68nA +# 82oEM09584aILqYmj8Pj7h/kmZNzuEL7WiwFa/U1hX+XiWfLIJQsAHBla0i7QRF2 +# de8/VSF0XXFa2kBQ6aiTsiLyKPNbaNtbcucaUdn6vVUS5izWOXM95BSkFSKdE45O +# q3FForNJXjBvSCpwcP36WklaHL+aHu1upIhCTUkzTHMh8b86WmjRUqbrnvdyR2yd +# I5l1OqcMBjkpPpIV6wcc+KY/RH2xvVuuoHjlUjwq2bHiNoX+W1scCpnA8YTs2d50 +# jDHUgwUo+ciwpffH0Riq132NFmrH3r67VaN3TuBxjI8SIZM58WEDkbeoriDk3hxU +# 8ZWV7b8AW6oyVBGfM06UgkfMb58h+tJPrFx8VI/WLq1dTqMfZOm5cuclMnUHs2uq +# rRNtnV8UfidPBL4ZHkTcClQbCoz0UbLhkiDvIS00Dn+BBcxw/TKqVL4Oaz3bkMSs +# M46LciTeucHY9ExRVt3zy7i149sd+F4QozPqn7FrSVHXmem3r7bjyHTxOgqxRCVa +# 18Vtx7P/8bYSBeS+WHCKcliFCecspusCDSlnRUjZwyPdP0VHxaZg2unjHY3rMYIa +# tjCCGrICAQEwfTBpMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIElu +# Yy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgQ29kZSBTaWduaW5nIFJT +# QTQwOTYgU0hBMzg0IDIwMjEgQ0ExAhAHHxQbizANJfMU6yMM0NHdMA0GCWCGSAFl +# AwQCAQUAoIHKMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcC +# AQsxDjAMBgorBgEEAYI3AgEVMC8GCSqGSIb3DQEJBDEiBCBnAZ6P7YvTwq0fbF62 +# o7E75R0LxsW5OtyYiFESQckLhjBeBgorBgEEAYI3AgEMMVAwTqBIgEYAQgB1AGkA +# bAB0ADoAIABSAGUAbABlAGEAcwBlAF8AdgAzAC4AMQAwAC4AMQAwAF8AMgAwADIA +# MwAwADIAMAA3AC4AMAAzoQKAADANBgkqhkiG9w0BAQEFAASCAgA9vWkGafy8eKJ4 +# qwYMuW8ZEx5UK6HwWWKYY0jQSxVV0PP8vy9yf9fwGBE9Zgo/w23D1UC/Z8s9NMf2 +# GudXPNyLnqDnnKT5r7MGw0NI6xmbBhMppDcr4wkUpe6ZCqPvfQIQtHiE8GnFNgGn +# H1WYg0Drtb72AjQEX33D8dm8+8K0B9r5A+TXGgNeIYMh66U0wDD5Sl8Fv3Q8LIX5 +# EA+X3W+Xuhyy2DiwLTXW4NWKJQHUNhQAeLIm3sfiy0jSL+XN2gv8Pib5Mq3Ibz++ +# b+XobitWV0mYotOGZMFdWmXMRNFrYHc/vk0oGCdNahoysyCEaN5wUgM0W6xbsk/i +# yjxkGX81/sEXnggrqbkESSMrg6IvrzrhUyTxUxPIFxkWfv/xnFRUduci5ffkT/m8 +# ESloggQJTR+jb/AfnQ/GVhQlf0+Yt776qa71dYfdR4IaN8GhJjc6zPU6JgcfYb5R +# PmxbQhvhOF7Axlb9GOpZ0w8XIqLO1Gp6EwNe3SPPnd3Ukx6xE+fgpTLT728JDjUD +# D2ryNac+tCtAAdV8KKGCcrc7GdQmWPhL9URCVOnedMA/mh+eWBJi44AogWMGbh0n +# otLmQjiyMR0O1exesd09Ghvxj1zTgBv0a9ibdyAJ9NRupr+FPOi7dxEPiw3pubjY +# G4cP+eOA/PCEVQ2m1WEGfkg4LFsYl6GCFz0wghc5BgorBgEEAYI3AwMBMYIXKTCC +# FyUGCSqGSIb3DQEHAqCCFxYwghcSAgEDMQ8wDQYJYIZIAWUDBAIBBQAwdwYLKoZI +# hvcNAQkQAQSgaARmMGQCAQEGCWCGSAGG/WwHATAxMA0GCWCGSAFlAwQCAQUABCC4 +# UYrwN6/qXQr+Vk0pG/9598aaMzHobLGClMZ/oK1uqgIQOl+9s2ZkDwWiuUy8hMn9 +# bBgPMjAyMzAyMDcxNzI4MzlaoIITBzCCBsAwggSooAMCAQICEAxNaXJLlPo8Kko9 +# KQeAPVowDQYJKoZIhvcNAQELBQAwYzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRp +# Z2lDZXJ0LCBJbmMuMTswOQYDVQQDEzJEaWdpQ2VydCBUcnVzdGVkIEc0IFJTQTQw +# OTYgU0hBMjU2IFRpbWVTdGFtcGluZyBDQTAeFw0yMjA5MjEwMDAwMDBaFw0zMzEx +# MjEyMzU5NTlaMEYxCzAJBgNVBAYTAlVTMREwDwYDVQQKEwhEaWdpQ2VydDEkMCIG +# A1UEAxMbRGlnaUNlcnQgVGltZXN0YW1wIDIwMjIgLSAyMIICIjANBgkqhkiG9w0B +# AQEFAAOCAg8AMIICCgKCAgEAz+ylJjrGqfJru43BDZrboegUhXQzGias0BxVHh42 +# bbySVQxh9J0Jdz0Vlggva2Sk/QaDFteRkjgcMQKW+3KxlzpVrzPsYYrppijbkGNc +# vYlT4DotjIdCriak5Lt4eLl6FuFWxsC6ZFO7KhbnUEi7iGkMiMbxvuAvfTuxylON +# QIMe58tySSgeTIAehVbnhe3yYbyqOgd99qtu5Wbd4lz1L+2N1E2VhGjjgMtqedHS +# EJFGKes+JvK0jM1MuWbIu6pQOA3ljJRdGVq/9XtAbm8WqJqclUeGhXk+DF5mjBoK +# JL6cqtKctvdPbnjEKD+jHA9QBje6CNk1prUe2nhYHTno+EyREJZ+TeHdwq2lfvgt +# Gx/sK0YYoxn2Off1wU9xLokDEaJLu5i/+k/kezbvBkTkVf826uV8MefzwlLE5hZ7 +# Wn6lJXPbwGqZIS1j5Vn1TS+QHye30qsU5Thmh1EIa/tTQznQZPpWz+D0CuYUbWR4 +# u5j9lMNzIfMvwi4g14Gs0/EH1OG92V1LbjGUKYvmQaRllMBY5eUuKZCmt2Fk+tkg +# bBhRYLqmgQ8JJVPxvzvpqwcOagc5YhnJ1oV/E9mNec9ixezhe7nMZxMHmsF47caI +# yLBuMnnHC1mDjcbu9Sx8e47LZInxscS451NeX1XSfRkpWQNO+l3qRXMchH7XzuLU +# OncCAwEAAaOCAYswggGHMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMBYG +# A1UdJQEB/wQMMAoGCCsGAQUFBwMIMCAGA1UdIAQZMBcwCAYGZ4EMAQQCMAsGCWCG +# SAGG/WwHATAfBgNVHSMEGDAWgBS6FtltTYUvcyl2mi91jGogj57IbzAdBgNVHQ4E +# FgQUYore0GH8jzEU7ZcLzT0qlBTfUpwwWgYDVR0fBFMwUTBPoE2gS4ZJaHR0cDov +# L2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0UlNBNDA5NlNIQTI1 +# NlRpbWVTdGFtcGluZ0NBLmNybDCBkAYIKwYBBQUHAQEEgYMwgYAwJAYIKwYBBQUH +# MAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBYBggrBgEFBQcwAoZMaHR0cDov +# L2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0UlNBNDA5NlNI +# QTI1NlRpbWVTdGFtcGluZ0NBLmNydDANBgkqhkiG9w0BAQsFAAOCAgEAVaoqGvNG +# 83hXNzD8deNP1oUj8fz5lTmbJeb3coqYw3fUZPwV+zbCSVEseIhjVQlGOQD8adTK +# myn7oz/AyQCbEx2wmIncePLNfIXNU52vYuJhZqMUKkWHSphCK1D8G7WeCDAJ+uQt +# 1wmJefkJ5ojOfRu4aqKbwVNgCeijuJ3XrR8cuOyYQfD2DoD75P/fnRCn6wC6X0qP +# GjpStOq/CUkVNTZZmg9U0rIbf35eCa12VIp0bcrSBWcrduv/mLImlTgZiEQU5QpZ +# omvnIj5EIdI/HMCb7XxIstiSDJFPPGaUr10CU+ue4p7k0x+GAWScAMLpWnR1DT3h +# eYi/HAGXyRkjgNc2Wl+WFrFjDMZGQDvOXTXUWT5Dmhiuw8nLw/ubE19qtcfg8wXD +# Wd8nYiveQclTuf80EGf2JjKYe/5cQpSBlIKdrAqLxksVStOYkEVgM4DgI974A6T2 +# RUflzrgDQkfoQTZxd639ouiXdE4u2h4djFrIHprVwvDGIqhPm73YHJpRxC+a9l+n +# J5e6li6FV8Bg53hWf2rvwpWaSxECyIKcyRoFfLpxtU56mWz06J7UWpjIn7+Nuxhc +# Q/XQKujiYu54BNu90ftbCqhwfvCXhHjjCANdRyxjqCU4lwHSPzra5eX25pvcfizM +# /xdMTQCi2NYBDriL7ubgclWJLCcZYfZ3AYwwggauMIIElqADAgECAhAHNje3JFR8 +# 2Ees/ShmKl5bMA0GCSqGSIb3DQEBCwUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQK +# EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNV +# BAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDAeFw0yMjAzMjMwMDAwMDBaFw0z +# NzAzMjIyMzU5NTlaMGMxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwg +# SW5jLjE7MDkGA1UEAxMyRGlnaUNlcnQgVHJ1c3RlZCBHNCBSU0E0MDk2IFNIQTI1 +# NiBUaW1lU3RhbXBpbmcgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +# AQDGhjUGSbPBPXJJUVXHJQPE8pE3qZdRodbSg9GeTKJtoLDMg/la9hGhRBVCX6SI +# 82j6ffOciQt/nR+eDzMfUBMLJnOWbfhXqAJ9/UO0hNoR8XOxs+4rgISKIhjf69o9 +# xBd/qxkrPkLcZ47qUT3w1lbU5ygt69OxtXXnHwZljZQp09nsad/ZkIdGAHvbREGJ +# 3HxqV3rwN3mfXazL6IRktFLydkf3YYMZ3V+0VAshaG43IbtArF+y3kp9zvU5Emfv +# DqVjbOSmxR3NNg1c1eYbqMFkdECnwHLFuk4fsbVYTXn+149zk6wsOeKlSNbwsDET +# qVcplicu9Yemj052FVUmcJgmf6AaRyBD40NjgHt1biclkJg6OBGz9vae5jtb7IHe +# IhTZgirHkr+g3uM+onP65x9abJTyUpURK1h0QCirc0PO30qhHGs4xSnzyqqWc0Jo +# n7ZGs506o9UD4L/wojzKQtwYSH8UNM/STKvvmz3+DrhkKvp1KCRB7UK/BZxmSVJQ +# 9FHzNklNiyDSLFc1eSuo80VgvCONWPfcYd6T/jnA+bIwpUzX6ZhKWD7TA4j+s4/T +# Xkt2ElGTyYwMO1uKIqjBJgj5FBASA31fI7tk42PgpuE+9sJ0sj8eCXbsq11GdeJg +# o1gJASgADoRU7s7pXcheMBK9Rp6103a50g5rmQzSM7TNsQIDAQABo4IBXTCCAVkw +# EgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUuhbZbU2FL3MpdpovdYxqII+e +# yG8wHwYDVR0jBBgwFoAU7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0PAQH/BAQD +# AgGGMBMGA1UdJQQMMAoGCCsGAQUFBwMIMHcGCCsGAQUFBwEBBGswaTAkBggrBgEF +# BQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAChjVodHRw +# Oi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNy +# dDBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGln +# aUNlcnRUcnVzdGVkUm9vdEc0LmNybDAgBgNVHSAEGTAXMAgGBmeBDAEEAjALBglg +# hkgBhv1sBwEwDQYJKoZIhvcNAQELBQADggIBAH1ZjsCTtm+YqUQiAX5m1tghQuGw +# GC4QTRPPMFPOvxj7x1Bd4ksp+3CKDaopafxpwc8dB+k+YMjYC+VcW9dth/qEICU0 +# MWfNthKWb8RQTGIdDAiCqBa9qVbPFXONASIlzpVpP0d3+3J0FNf/q0+KLHqrhc1D +# X+1gtqpPkWaeLJ7giqzl/Yy8ZCaHbJK9nXzQcAp876i8dU+6WvepELJd6f8oVInw +# 1YpxdmXazPByoyP6wCeCRK6ZJxurJB4mwbfeKuv2nrF5mYGjVoarCkXJ38SNoOeY +# +/umnXKvxMfBwWpx2cYTgAnEtp/Nh4cku0+jSbl3ZpHxcpzpSwJSpzd+k1OsOx0I +# SQ+UzTl63f8lY5knLD0/a6fxZsNBzU+2QJshIUDQtxMkzdwdeDrknq3lNHGS1yZr +# 5Dhzq6YBT70/O3itTK37xJV77QpfMzmHQXh6OOmc4d0j/R0o08f56PGYX/sr2H7y +# Rp11LB4nLCbbbxV7HhmLNriT1ObyF5lZynDwN7+YAN8gFk8n+2BnFqFmut1VwDop +# hrCYoCvtlUG3OtUVmDG0YgkPCr2B2RP+v6TR81fZvAT6gt4y3wSJ8ADNXcL50CN/ +# AAvkdgIm2fBldkKmKYcJRyvmfxqkhQ/8mJb2VVQrH4D6wPIOK+XW+6kvRBVK5xMO +# Hds3OBqhK/bt1nz8MIIFjTCCBHWgAwIBAgIQDpsYjvnQLefv21DiCEAYWjANBgkq +# hkiG9w0BAQwFADBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5j +# MRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBB +# c3N1cmVkIElEIFJvb3QgQ0EwHhcNMjIwODAxMDAwMDAwWhcNMzExMTA5MjM1OTU5 +# WjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL +# ExB3d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJv +# b3QgRzQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1K +# PDAiMGkz7MKnJS7JIT3yithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2r +# snnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C +# 8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBf +# sXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY +# QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8 +# rhsDdV14Ztk6MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaY +# dj1ZXUJ2h4mXaXpI8OCiEhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+ +# wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw +# ++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+N +# P8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7F +# wI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo4IBOjCCATYwDwYDVR0TAQH/BAUw +# AwEB/zAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wHwYDVR0jBBgwFoAU +# Reuir/SSy4IxLVGLp6chnfNtyA8wDgYDVR0PAQH/BAQDAgGGMHkGCCsGAQUFBwEB +# BG0wazAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEMGCCsG +# AQUFBzAChjdodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1 +# cmVkSURSb290Q0EuY3J0MEUGA1UdHwQ+MDwwOqA4oDaGNGh0dHA6Ly9jcmwzLmRp +# Z2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcmwwEQYDVR0gBAow +# CDAGBgRVHSAAMA0GCSqGSIb3DQEBDAUAA4IBAQBwoL9DXFXnOF+go3QbPbYW1/e/ +# Vwe9mqyhhyzshV6pGrsi+IcaaVQi7aSId229GhT0E0p6Ly23OO/0/4C5+KH38nLe +# JLxSA8hO0Cre+i1Wz/n096wwepqLsl7Uz9FDRJtDIeuWcqFItJnLnU+nBgMTdydE +# 1Od/6Fmo8L8vC6bp8jQ87PcDx4eo0kxAGTVGamlUsLihVo7spNU96LHc/RzY9Hda +# XFSMb++hUD38dglohJ9vytsgjTVgHAIDyyCwrFigDkBjxZgiwbJZ9VVrzyerbHbO +# byMt9H5xaiNrIv8SuFQtJ37YOtnwtoeW/VvRXKwYw02fc7cBqZ9Xql4o4rmUMYID +# djCCA3ICAQEwdzBjMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIElu +# Yy4xOzA5BgNVBAMTMkRpZ2lDZXJ0IFRydXN0ZWQgRzQgUlNBNDA5NiBTSEEyNTYg +# VGltZVN0YW1waW5nIENBAhAMTWlyS5T6PCpKPSkHgD1aMA0GCWCGSAFlAwQCAQUA +# oIHRMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAcBgkqhkiG9w0BCQUxDxcN +# MjMwMjA3MTcyODM5WjArBgsqhkiG9w0BCRACDDEcMBowGDAWBBTzhyJNhjOCkjWp +# lLy9j5bp/hx8czAvBgkqhkiG9w0BCQQxIgQgAx0v8Gb9yM8xCR7Op69rzlH4o/gI +# FV2lCtwfBRz1CxwwNwYLKoZIhvcNAQkQAi8xKDAmMCQwIgQgx/ThvjIoiSCr4iY6 +# vhrE/E/meBwtZNBMgHVXoCO1tvowDQYJKoZIhvcNAQEBBQAEggIApHlws8Gbu+U9 +# vQzkS9mdPU2kATHlgt7f1IKHWghZA2w85SyV9F0ntoMYRs8iU8nlyH5ehCz0fqlK +# 6NaX1BOZ7Kyq7feSaFzZML8An8yLQMv9OUYWqOhdi/N0KxINdAnb5C2TRNFpjrmu +# yXDutaSeiHVzRab6t17AcPM7F0jzb6uUS65mTZZiSW8sY4n4Hv9OKjllODf+/U+g +# tXevF/+4B5FSFAPiPMGyUR/tdkTbLv/OqAENoBipCHWZoi0qZngkHPvm1yFVR2ir +# 4sABfk2vZ0UaogfTnzEgvMl99v3Un0Eh4IZhrccd2INCLR5ZR7eygmUI0T0yqlm8 +# 4tp/kwSguuoofasfTyibdk8BH2CqeDzFqqTBQfV6FvEDz4svPeNpmXIO5HDKjKN9 +# /MWGUrgAstIA2dQwbUcdaIxs/j7Mr3NIhdZn5YazX5XDCAcZ1czi7uXayCWrVjQx +# u4PvCC9l+bMKmYOzsr6FQiPz5uZ70UUSSV8thWJM388/y5I80ir9JQzyZiusdJG4 +# rhTvWVV7DgZi3Rw27FZndj4ovh7VJBK9jmQcAhhG2BdxTMytVkuteJxiC+RdEY9A +# 59zAPaeDalk3E/tiGzHgrrjsDbpqSsqLPSNUnN4C+rpTHDSOv/DLvYqnhi80CjqC +# 4o3mbn4+je/8XAZjOqim6CKIe9BeAeY= +# SIG # End signature block diff --git a/.venv/Scripts/activate b/.venv/Scripts/activate new file mode 100644 index 0000000..b707299 --- /dev/null +++ b/.venv/Scripts/activate @@ -0,0 +1,69 @@ +# This file must be used with "source bin/activate" *from bash* +# you cannot run it directly + +deactivate () { + # reset old environment variables + if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then + PATH="${_OLD_VIRTUAL_PATH:-}" + export PATH + unset _OLD_VIRTUAL_PATH + fi + if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then + PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}" + export PYTHONHOME + unset _OLD_VIRTUAL_PYTHONHOME + fi + + # This should detect bash and zsh, which have a hash command that must + # be called to get it to forget past commands. Without forgetting + # past commands the $PATH changes we made may not be respected + if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then + hash -r 2> /dev/null + fi + + if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then + PS1="${_OLD_VIRTUAL_PS1:-}" + export PS1 + unset _OLD_VIRTUAL_PS1 + fi + + unset VIRTUAL_ENV + unset VIRTUAL_ENV_PROMPT + if [ ! "${1:-}" = "nondestructive" ] ; then + # Self destruct! + unset -f deactivate + fi +} + +# unset irrelevant variables +deactivate nondestructive + +VIRTUAL_ENV="C:\Users\Kripovskii\Desktop\rentprod\dev_rent\.venv" +export VIRTUAL_ENV + +_OLD_VIRTUAL_PATH="$PATH" +PATH="$VIRTUAL_ENV/Scripts:$PATH" +export PATH + +# unset PYTHONHOME if set +# this will fail if PYTHONHOME is set to the empty string (which is bad anyway) +# could use `if (set -u; : $PYTHONHOME) ;` in bash +if [ -n "${PYTHONHOME:-}" ] ; then + _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}" + unset PYTHONHOME +fi + +if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then + _OLD_VIRTUAL_PS1="${PS1:-}" + PS1="(.venv) ${PS1:-}" + export PS1 + VIRTUAL_ENV_PROMPT="(.venv) " + export VIRTUAL_ENV_PROMPT +fi + +# This should detect bash and zsh, which have a hash command that must +# be called to get it to forget past commands. Without forgetting +# past commands the $PATH changes we made may not be respected +if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then + hash -r 2> /dev/null +fi diff --git a/.venv/Scripts/activate.bat b/.venv/Scripts/activate.bat new file mode 100644 index 0000000..56e8b6a --- /dev/null +++ b/.venv/Scripts/activate.bat @@ -0,0 +1,34 @@ +@echo off + +rem This file is UTF-8 encoded, so we need to update the current code page while executing it +for /f "tokens=2 delims=:." %%a in ('"%SystemRoot%\System32\chcp.com"') do ( + set _OLD_CODEPAGE=%%a +) +if defined _OLD_CODEPAGE ( + "%SystemRoot%\System32\chcp.com" 65001 > nul +) + +set VIRTUAL_ENV=C:\Users\Kripovskii\Desktop\rentprod\dev_rent\.venv + +if not defined PROMPT set PROMPT=$P$G + +if defined _OLD_VIRTUAL_PROMPT set PROMPT=%_OLD_VIRTUAL_PROMPT% +if defined _OLD_VIRTUAL_PYTHONHOME set PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME% + +set _OLD_VIRTUAL_PROMPT=%PROMPT% +set PROMPT=(.venv) %PROMPT% + +if defined PYTHONHOME set _OLD_VIRTUAL_PYTHONHOME=%PYTHONHOME% +set PYTHONHOME= + +if defined _OLD_VIRTUAL_PATH set PATH=%_OLD_VIRTUAL_PATH% +if not defined _OLD_VIRTUAL_PATH set _OLD_VIRTUAL_PATH=%PATH% + +set PATH=%VIRTUAL_ENV%\Scripts;%PATH% +set VIRTUAL_ENV_PROMPT=(.venv) + +:END +if defined _OLD_CODEPAGE ( + "%SystemRoot%\System32\chcp.com" %_OLD_CODEPAGE% > nul + set _OLD_CODEPAGE= +) diff --git a/.venv/Scripts/deactivate.bat b/.venv/Scripts/deactivate.bat new file mode 100644 index 0000000..62a39a7 --- /dev/null +++ b/.venv/Scripts/deactivate.bat @@ -0,0 +1,22 @@ +@echo off + +if defined _OLD_VIRTUAL_PROMPT ( + set "PROMPT=%_OLD_VIRTUAL_PROMPT%" +) +set _OLD_VIRTUAL_PROMPT= + +if defined _OLD_VIRTUAL_PYTHONHOME ( + set "PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%" + set _OLD_VIRTUAL_PYTHONHOME= +) + +if defined _OLD_VIRTUAL_PATH ( + set "PATH=%_OLD_VIRTUAL_PATH%" +) + +set _OLD_VIRTUAL_PATH= + +set VIRTUAL_ENV= +set VIRTUAL_ENV_PROMPT= + +:END diff --git a/.venv/Scripts/django-admin.exe b/.venv/Scripts/django-admin.exe new file mode 100644 index 0000000..448a5fe Binary files /dev/null and b/.venv/Scripts/django-admin.exe differ diff --git a/.venv/Scripts/pip.exe b/.venv/Scripts/pip.exe new file mode 100644 index 0000000..021829c Binary files /dev/null and b/.venv/Scripts/pip.exe differ diff --git a/.venv/Scripts/pip3.10.exe b/.venv/Scripts/pip3.10.exe new file mode 100644 index 0000000..021829c Binary files /dev/null and b/.venv/Scripts/pip3.10.exe differ diff --git a/.venv/Scripts/pip3.exe b/.venv/Scripts/pip3.exe new file mode 100644 index 0000000..021829c Binary files /dev/null and b/.venv/Scripts/pip3.exe differ diff --git a/.venv/Scripts/python.exe b/.venv/Scripts/python.exe new file mode 100644 index 0000000..8ac81a6 Binary files /dev/null and b/.venv/Scripts/python.exe differ diff --git a/.venv/Scripts/pythonw.exe b/.venv/Scripts/pythonw.exe new file mode 100644 index 0000000..5be80f7 Binary files /dev/null and b/.venv/Scripts/pythonw.exe differ diff --git a/.venv/Scripts/sqlformat.exe b/.venv/Scripts/sqlformat.exe new file mode 100644 index 0000000..b614ab3 Binary files /dev/null and b/.venv/Scripts/sqlformat.exe differ diff --git a/.venv/pyvenv.cfg b/.venv/pyvenv.cfg new file mode 100644 index 0000000..f6d9266 --- /dev/null +++ b/.venv/pyvenv.cfg @@ -0,0 +1,3 @@ +home = C:\Users\Kripovskii\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0 +include-system-site-packages = false +version = 3.10.10 diff --git a/pairent_frontend/Comparison.html b/pairent_frontend/Comparison.html new file mode 100644 index 0000000..439e980 --- /dev/null +++ b/pairent_frontend/Comparison.html @@ -0,0 +1,803 @@ + + + + + + + + + + + + Сравнения + + +
+
+ + + + +
+ +

Pairent

+ + + + +
+ + + +
+ +
+ +
+ +
+
+ + + +

Сравнения квартир

+
+ + +
+ + +
+
+ + +
+
+ +

Фото

+

Стоимость

+

Адрес

+
+ + +
+ + + +

37 660 ₽ / мес.

+ +

Владивосток, Пушкина улица, 1А

+ +
+
+ + + + +

10 мин

+
+
+ + + + +

15 мин

+
+
+ + +
+ + +
+ + + +

37 660 ₽ / мес.

+ +

Владивосток, Пушкина улица, 1А

+ +
+
+ + + +

10 мин

+
+
+ + + +

15 мин

+
+
+ + +
+ + +
+ + + +

37 660 ₽ / мес.

+ +

Владивосток, Пушкина улица, 1А

+ +
+
+ + + +

10 мин

+
+
+ + + +

15 мин

+
+
+ + +
+ + +
+ + + +

37 660 ₽ / мес.

+ +

Владивосток, Пушкина улица, 1А

+ +
+
+ + + +

10 мин

+
+
+ + + +

15 мин

+
+
+ + +
+
+ + +
+

Характеристики

+
+
+ + +
+ +
+

Количество комнат

+

Студия

+

Этаж

+

Общая площадь

+

Жилая

+

Санузел

+

Вид из окон

+

Балкон

+
+ + +
+ +

1

+ +

Не указано

+ +

1 из 9

+ +

81,4 м²

+ +

Не указано

+ +

Несколько

+ +

Во двор и на улицу

+ +

Не указано

+
+ + +
+ +

1

+ +

Не указано

+ +

1 из 9

+ +

81,4 м²

+ +

Не указано

+ +

Несколько

+ +

Во двор и на улицу

+ +

Не указано

+
+ + +
+ +

1

+ +

Не указано

+ +

1 из 9

+ +

81,4 м²

+ +

Не указано

+ +

Несколько

+ +

Во двор и на улицу

+ +

Не указано

+
+ + +
+ +

1

+ +

Не указано

+ +

1 из 9

+ +

81,4 м²

+ +

Не указано

+ +

Несколько

+ +

Во двор и на улицу

+ +

Не указано

+
+
+ + +
+

Удобства

+
+
+ + +
+ +
+

Телефон

+

Интернет

+

Мебель

+

Телевизор

+

Стиральная машина

+

Холодильник

+

Кондиционер

+

Встроенная техника

+

Посудомойка

+

Можно с детьми

+

Можно с животными

+

Свежий ремонт

+
+ + +
+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+
+ + +
+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+
+ + +
+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+
+ + +
+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+
+
+ + +
+

Сервисы

+
+
+ + +
+ +
+

Кафе

+

Ресторан

+

Аптека

+

Больница

+

Продуктовый

+

Магазин одежды

+

Кинотеатр

+

Парк

+

Комп. клуб

+

Банк

+
+ + +
+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+
+ + +
+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+
+ + +
+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+
+ + +
+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+
+
+ + +
+

О здании

+
+
+ + +
+ +
+

Тип здания

+

Год постройки дома

+

Высота потолков

+

Количество этажей

+

Количество квартир

+

Лифт

+

Мусоропровод

+

Парковка

+

Охрана или консьерж

+

Закрытая территория

+
+ + +
+ +

Монолитное

+ +

2021

+ +

3,1 м

+ +

9

+ +

Не указано

+ +

+ +

+ +

Закрытая

+ +

+ +

+
+ + +
+ +

Монолитное

+ +

2021

+ +

3,1 м

+ +

9

+ +

Не указано

+ +

+ +

+ +

Закрытая

+ +

+ +

+
+ + +
+ +

Монолитное

+ +

2021

+ +

3,1 м

+ +

9

+ +

Не указано

+ +

+ +

+ +

Закрытая

+ +

+ +

+
+ + +
+ +

Монолитное

+ +

2021

+ +

3,1 м

+ +

9

+ +

Не указано

+ +

+ +

+ +

Закрытая

+ +

+ +

+
+
+ + +
+ + + +
+ + +
+
+

Недавно просмотренные 15

+ +
+ + + +
+ + +
+
+
+ + +
+ +
+ +

56 м², 2-х комнатная

+

36 тыс. / мес.

+

Владивосток, ул. Нейбута 15А

+
+ + +
+ +

56 м², 2-х комнатная

+

36 тыс. / мес.

+

Владивосток, ул. Нейбута 15А

+
+ + +
+ +

56 м², 2-х комнатная

+

36 тыс. / мес.

+

Владивосток, ул. Нейбута 15А

+
+ + +
+ +

56 м², 2-х комнатная

+

36 тыс. / мес.

+

Владивосток, ул. Нейбута 15А

+
+
+
+
+ + + + \ No newline at end of file diff --git a/pairent_frontend/Favorites.html b/pairent_frontend/Favorites.html new file mode 100644 index 0000000..3b02e65 --- /dev/null +++ b/pairent_frontend/Favorites.html @@ -0,0 +1,875 @@ + + + + + + + + + + + + Избранное + + +
+
+ + + + +
+ +

Pairent

+ + + + +
+ +
+ +
+ +
+ +

Избранное

+ + +
+
+ + +
+ +

56 м², 2-х комнатная

+ +

ул. Нейбута 15А, 5 этаж из 9

+ +
+
+ + + + +

10 мин

+
+
+ + + + +

15 мин

+
+
+ +
+
+ + + + + + + + + + + + +
+ + +
+ +
+ + + + + + + + + + + + + +
+ + +
+ +
+ + + + + + + + + + + + +
+
+ + +
+ + + + + + + + +
+
+
+ +
+ +
+ + + +

36 660 ₽

+
+ +

в месяц

+ +

gsdfgdfsgsdfgagkasjkdfgjhasdfkghsdfgoiks dfhgksadhfgosdjkfghsdkjfghsdfklghs dfkghsdfkghkdlsfhgksdfghsdf jghsdfgjmshdfgjksdfgnjsdfgsdnfjg...

+ +

25 марта 2023

+
+
+ + +
+ + +
+
+ + +
+ +

56 м², 2-х комнатная

+ +

ул. Нейбута 15А, 5 этаж из 9

+ +
+
+ + + + +

10 мин

+
+
+ + + + +

15 мин

+
+
+ +
+
+ + + + + + + + + + + + +
+ + +
+ +
+ + + + + + + + + + + + + +
+ + +
+ +
+ + + + + + + + + + + + +
+
+ + +
+ + + + + + + + +
+
+
+ +
+ +
+ + + +

36 660 ₽

+
+ +

в месяц

+ +

gsdfgdfsgsdfgagkasjkdfgjhasdfkghsdfgoiks dfhgksadhfgosdjkfghsdkjfghsdfklghs dfkghsdfkghkdlsfhgksdfghsdf jghsdfgjmshdfgjksdfgnjsdfgsdnfjg...

+ +

25 марта 2023

+
+
+ + +
+ + +
+
+ + +
+ +

56 м², 2-х комнатная

+ +

ул. Нейбута 15А, 5 этаж из 9

+ +
+
+ + + + +

10 мин

+
+
+ + + + +

15 мин

+
+
+ +
+
+ + + + + + + + + + + + +
+ + +
+ +
+ + + + + + + + + + + + + +
+ + +
+ +
+ + + + + + + + + + + + +
+
+ + +
+ + + + + + + + +
+
+
+ +
+ +
+ + + +

36 660 ₽

+
+ +

в месяц

+ +

gsdfgdfsgsdfgagkasjkdfgjhasdfkghsdfgoiks dfhgksadhfgosdjkfghsdkjfghsdfklghs dfkghsdfkghkdlsfhgksdfghsdf jghsdfgjmshdfgjksdfgnjsdfgsdnfjg...

+ +

25 марта 2023

+
+
+ + +
+ + +
+
+ + +
+ +

56 м², 2-х комнатная

+ +

ул. Нейбута 15А, 5 этаж из 9

+ +
+
+ + + + +

10 мин

+
+
+ + + + +

15 мин

+
+
+ +
+
+ + + + + + + + + + + + +
+ + +
+ +
+ + + + + + + + + + + + + +
+ + +
+ +
+ + + + + + + + + + + + +
+
+ + +
+ + + + + + + + +
+
+
+ +
+ +
+ + + +

36 660 ₽

+
+ +

в месяц

+ +

gsdfgdfsgsdfgagkasjkdfgjhasdfkghsdfgoiks dfhgksadhfgosdjkfghsdkjfghsdfklghs dfkghsdfkghkdlsfhgksdfghsdf jghsdfgjmshdfgjksdfgnjsdfgsdnfjg...

+ +

25 марта 2023

+
+
+ + +
+ + +
+
+ + +
+ +

56 м², 2-х комнатная

+ +

ул. Нейбута 15А, 5 этаж из 9

+ +
+
+ + + + +

10 мин

+
+
+ + + + +

15 мин

+
+
+ +
+
+ + + + + + + + + + + + +
+ + +
+ +
+ + + + + + + + + + + + + +
+ + +
+ +
+ + + + + + + + + + + + +
+
+ + +
+ + + + + + + + +
+
+
+ +
+ +
+ + + +

36 660 ₽

+
+ +

в месяц

+ +

gsdfgdfsgsdfgagkasjkdfgjhasdfkghsdfgoiks dfhgksadhfgosdjkfghsdkjfghsdfklghs dfkghsdfkghkdlsfhgksdfghsdf jghsdfgjmshdfgjksdfgnjsdfgsdnfjg...

+ +

25 марта 2023

+
+
+ + +
+ + +
+ + + +
+ + + + + + + + + +
+
+ + +
+ + + +
+ + +
+
+

Недавно просмотренные 15

+ +
+ + + +
+ + +
+
+
+ + +
+ +
+ +

56 м², 2-х комнатная

+

36 тыс. / мес.

+

Владивосток, ул. Нейбута 15А

+
+ + +
+ +

56 м², 2-х комнатная

+

36 тыс. / мес.

+

Владивосток, ул. Нейбута 15А

+
+ + +
+ +

56 м², 2-х комнатная

+

36 тыс. / мес.

+

Владивосток, ул. Нейбута 15А

+
+ + +
+ +

56 м², 2-х комнатная

+

36 тыс. / мес.

+

Владивосток, ул. Нейбута 15А

+
+
+
+
+ + + + \ No newline at end of file diff --git a/pairent_frontend/images/apartment.png b/pairent_frontend/images/apartment.png new file mode 100644 index 0000000..707d1bf Binary files /dev/null and b/pairent_frontend/images/apartment.png differ diff --git a/pairent_frontend/images/logo.png b/pairent_frontend/images/logo.png new file mode 100644 index 0000000..63449dc Binary files /dev/null and b/pairent_frontend/images/logo.png differ diff --git a/pairent_frontend/src/styleComparison.css b/pairent_frontend/src/styleComparison.css new file mode 100644 index 0000000..9de67de --- /dev/null +++ b/pairent_frontend/src/styleComparison.css @@ -0,0 +1,443 @@ +*{ + margin: 0; + padding: 0; + box-sizing: border-box; + font-family: 'Inter', sans-serif; + color: #000; +} + +button{ + cursor: pointer; + border: 0; +} + +a{ + text-decoration: none; +} + +header{ + display: flex; + justify-content: space-around; + align-items: center; + margin: 18px 0px 11px 0px; +} + +.logoSection{ + display: flex; + align-items: center; +} + +/*Логотип*/ +.logoSection img{ + width: 100px; + height: 32px; +} + +.verticalLine{ + width: 3px; + height: 37px; + margin: 0px 17px 0px 17px; + background-color: #A9A9A9; +} + +/*Название сервиса*/ +.logoSection h1{ + font-weight: 700; + font-size: 32px; + color: #222; +} + +/*Кнопка локации*/ +.btnLocation{ + width: 150px; + height: 28px; + margin-left: 37px; + border-radius: 40px; + background-color: #CCC; + font-size: 15px; +} + +/*Навигация*/ +nav { + display: flex; + align-items: center; +} + +nav div{ + margin-right: 55px; +} + +nav a, svg{ + transition: 0.3s; + fill: #222; +} + +nav svg:hover{ + fill: #0050A1; +} + +nav a:hover{ + color: #0050A1; +} + +/*Личный кабинет*/ +.userIcon{ + border-radius: 20px; + background-color: #fff; +} + + + +main{ + margin: 0 5% 0 5%; +} + +/*Горизонтальная линия под шапкой*/ +.horizontalLine{ + width: 100%; + height: 1px; + background-color: #CCC; +} + +.titleSection{ + display: flex; + justify-content: space-between; + margin-top: 24px; + padding: 0 3% 0 3%; +} + +.titleSectionLeft{ + display: flex; + align-items: center; +} + +/*Кнопка "вернуться назад"*/ +.btnBack{ + display: flex; + justify-content: space-evenly; + align-items: center; + width: 180px; + height: 36px; + color: #BABABA; + background: #fff; + border: 1px solid #ccc; + border-radius: 12px; + font-size: 15px; +} + +/*Заголовок страницы*/ +.titleSectionLeft h2{ + margin-left: 31px; + font-size: 24px; + color: #222; +} + +.titleSectionRight{ + display: flex; + align-items: center; +} + +/*Кнопки "предыдущая" и "следующая"*/ +.btnPrevious, .btnNext { + display: flex; + align-items: center; + justify-content: center; + width: 32px; + height: 32px; + border-radius: 20px; + background: #fff; + box-shadow: 0px 0px 12px rgba(0, 0, 0, 0.25); +} + +.btnPrevious{ + margin-right: 10px; +} + +/*Добавленные для сравнения квартиры*/ +.apartmentSection{ + display: flex; + justify-content: space-between; + padding-left: 3%; +} + +/*Наименования*/ +.apartmentTittle{ + width: 19%; +} + +.apartmentTittle h3{ + font-weight: 600; + font-size: 16px; +} + +.photo{ + display: flex; + align-items: center; + height: 50%; +} + +.cost{ + display: flex; + align-items: center; + height: 9%; +} + +.address{ + display: flex; + align-items: center; + height: 11%; +} + +/*Блок с квартирой*/ +.apartmentBlock{ + width: 20%; + margin-top: 26px; +} + +/*Фото квартиры*/ +.apartmentBlock img{ + width: 100%; +} + +/*Стоимость квартиры*/ +.apartmentBlock h3{ + margin-top: 16px; + font-weight: 600; + font-size: 20px; + color: #222; +} + +/*Адрес квартиры*/ +.addressApartment{ + margin-top: 16px; + font-size: 16px; + color: #0050A1; +} + +/*Транспорт*/ +.transport{ + display: flex; + margin-top: 9px; +} + +/*Время транспорта*/ +.transport p{ + font-weight: 500; + font-size: 15px; + color: #A9A9A9; +} + +.transportBas, .transportSubway{ + display: flex; + justify-content: space-around; + align-items: center; + width: 96px; + height: 32px; + border: 2px solid #A9A9A9; + border-radius: 20px; +} + +.transportSubway{ + margin-left: 9px; +} + +/*Кнопка "показать контакты"*/ +.btnContact{ + width: 180px; + height: 36px; + margin-top: 26px; + background: #175FA9; + border-radius: 12px; + font-weight: 500; + font-size: 16px; + color: #fff; +} + +/*Разделение секции*/ +.separation{ + margin-top: 50px; +} + +.separation p{ + margin-left: 3%; + font-weight: 500; + font-size: 16px; + color: rgba(0, 0, 0, 0.5); +} + +.separationLine{ + height: 2px; + margin-top: 8px; +} + +/*Характеристики*/ +.aboutSection { + display: flex; + justify-content: space-between; + margin-left: 3%; +} + +/*Наименования характеристик*/ +.aboutTittle h3{ + margin-top: 33px; + font-weight: 600; + font-size: 16px; +} + +/*Характеристики квартиры*/ +.aboutBlock p{ + margin-top: 33px; + font-size: 16px; +} + +/*Не указано*/ +.notIndicated{ + color: rgba(0, 0, 0, 0.5); +} + +/*Кнопки с вопросами*/ +.questionBtnSection{ + display: flex; + justify-content: space-between; + margin-top: 58px; +} + +.questionBtn{ + width: 323px; + height: 128px; + padding: 2% 5% 2% 3%; + border-radius: 12px; + text-align: left; +} + +.questionBtn h3{ + font-size: 18px; + color: #fff; +} + +.questionBtn p{ + margin-top: 16px; + font-size: 16px; + line-height: 19px; + color: #fff; +} + +.orangeBtn{ + background: linear-gradient(180deg, #F76D09 0%, #FFA800 100%); +} + +.orangeBtn:active{ + background: linear-gradient(180deg, #FFA800 0%, #F76D09 100%); +} + +.greenBtn{ + background: linear-gradient(180deg, #107A34 0%, #51A633 100%); +} + +.greenBtn:active{ + background: linear-gradient(180deg, #51A633 0%, #107A34 100%); +} + +.blueBtn{ + background: linear-gradient(180deg, #2E50A7 0%, #0993F7 100%); +} + +.blueBtn:active{ + background: linear-gradient(180deg, #0993F7 0%, #2E50A7 100%); +} + +/*Недавно просмотренные*/ +.viewedSection{ + margin-top: 46px; +} + +.viewedTittle{ + display: flex; + justify-content: space-between; +} + +.viewedTittle h2{ + font-weight: 700; + font-size: 20px; + color: #222; +} + +.viewedTittle span{ + margin-left: 30px; + font-size: 16px; + color: #A9A9A9; +} + +/*Кнопки*/ +.viewedBtnSection{ + display: flex; +} + +/*Кнопка "посмотреть все недавние"*/ +.btnViewed{ + width: 208px; + height: 32px; + margin-right: 22px; + background: #fff; + border: 1px solid #CCCCCC; + border-radius: 12px; + font-size: 14px; + font-weight: 500; + color: #ccc; +} + +/*Кнопки "предыдущие" и "следующие"*/ +.viewedBtn{ + display: flex; + align-items: center; +} + +/*Недавно просмотренные квартиры*/ +.viewedBlock{ + display: flex; + justify-content: space-between; + margin-top: 27px; +} + +/*Квартира*/ +.viewedElem{ + width: 24%; + padding-bottom: 1%; + background: #fff; + border: 2px solid #ccc; + border-radius: 20px; +} + +.viewedElem img{ + width: 100%; + margin-bottom: 3%; +} + +.viewedElem h3, p{ + margin-left: 5%; +} + +.viewedElem h3{ + font-weight: 600; + font-size: 24px; + color: #222; +} + +.viewedElem p{ + font-weight: 500; + font-size: 16px; + color: #222; +} + +/*Домики на футере*/ +.footerHouses{ + margin: 5% 0 0 5%; +} + +/*Футере*/ +.footerBlock{ + width: 100%; + height: 250px; + margin-top: -0.5%; + background-color: #D9D9D9; +} \ No newline at end of file diff --git a/pairent_frontend/src/styleFavorites.css b/pairent_frontend/src/styleFavorites.css new file mode 100644 index 0000000..5a29fd2 --- /dev/null +++ b/pairent_frontend/src/styleFavorites.css @@ -0,0 +1,486 @@ +*{ + margin: 0; + padding: 0; + box-sizing: border-box; + font-family: 'Inter', sans-serif; + color: #000; +} + +button{ + cursor: pointer; + border: 0; +} + +a{ + text-decoration: none; +} + +header{ + display: flex; + justify-content: space-around; + align-items: center; + margin: 18px 0px 11px 0px; +} + +.logoSection{ + display: flex; + align-items: center; +} + +/*Логотип*/ +.logoSection img{ + width: 100px; + height: 32px; +} + +.verticalLine{ + width: 3px; + height: 37px; + margin: 0px 17px 0px 17px; + background-color: #A9A9A9; +} + +/*Название сервиса*/ +.logoSection h1{ + font-weight: 700; + font-size: 32px; + color: #222; +} + +/*Кнопка локации*/ +.btnLocation{ + width: 150px; + height: 28px; + margin-left: 37px; + border-radius: 40px; + background-color: #CCC; + font-size: 15px; +} + +/*Навигация*/ +nav { + display: flex; + align-items: center; +} + +nav div{ + margin-right: 55px; +} + +nav a, nav svg{ + transition: 0.3s; + fill: #222; +} + +nav svg:hover{ + fill: #0050A1; +} + +nav a:hover{ + color: #0050A1; +} + +/*Личный кабинет*/ +.userIcon{ + border-radius: 20px; + background-color: #fff; +} + +main{ + margin: 0 5% 0 5%; +} + +/*Горизонтальная линия под шапкой*/ +.horizontalLine{ + width: 100%; + height: 1px; + background-color: #CCC; +} + +/*Заголовок страницы*/ +h2{ + margin-top: 14px; + margin-bottom: 21px; + padding-left: 2%; + font-weight: 600; + font-size: 24px; + color: #222; +} + +/*Квартира*/ +.apartmentSection{ + display: flex; + justify-content: space-between; + margin-top: 22px; +} + +.apartmentSectionLeft{ + display: flex; +} + +/*Фото квартиры*/ +.apartmentSectionLeft img{ + width: 350px; + height: 250px; +} + +/*Площадь квартиры*/ +.characteristics h3{ + margin-left: 34px; + font-weight: 600; + font-size: 24px; + color: #222; +} + +/*Адрес*/ +.address{ + margin-top: 4px; + margin-left: 34px; + font-size: 16px; + color: #222; +} + +/*Транспорт*/ +.transport{ + display: flex; + margin-top: 10px; + margin-left: 34px; +} + +/*Время транспорта*/ +.transport p{ + font-weight: 500; + font-size: 15px; + color: #A9A9A9; +} + +.transportBas, .transportSubway{ + display: flex; + justify-content: space-around; + align-items: center; + width: 96px; + height: 32px; + border: 2px solid #A9A9A9; + border-radius: 20px; +} + +.transportSubway{ + margin-left: 11px; +} + +/*Удобства*/ +.amenities{ + margin-top: 23px; + margin-left: 18px; + display: flex; +} + +.amenitiesBlock{ + max-width: 95px; + display: flex; + flex-wrap: wrap; + align-items: center; + +} + +.amenitiesBlock svg{ + margin-left: 16px; +} + +/*Вертикальная линия*/ +.amenitiesLine{ + width: 2px; + height: 55px; + background-color: #A9A9A9; +} + +/*Кнопки*/ +.apartmentBtn{ + display: flex; + margin-top: 43px; + margin-left: 34px; +} + +/*Кнопка "Показать телефон"*/ +.contactBtn{ + display: flex; + justify-content: space-around; + align-items: center; + width: 192px; + height: 32px; + background: #E3F0FF; + border-radius: 12px; + font-weight: 600; + font-size: 16px; + color: #007EFF; +} + +/*Кнопка "Избранное", "Закладки" и "Заметки"*/ +.favoritesBtn, .markBtn, .noteBtn{ + display: flex; + justify-content: center; + align-items: center; + margin-left: 12px; + width: 32px; + height: 32px; + background: #fff; + border-radius: 20px; + border: 1px solid #ccc; +} + +.apartmentSectionRight{ + text-align: right; +} + +/*Цена квартиры*/ +.apartmentPrice{ + display: flex; + justify-content: end; + align-items: center; +} + +.apartmentPrice svg{ + margin-right: 5px; +} + +.apartmentPrice h3{ + font-weight: 600; + font-size: 24px; + color: #222; +} + +/*Частота оплаты*/ +.month{ + margin-right: 25px; + font-size: 16px; +} + +/*Описание квартиры*/ +.description{ + margin-top: 56px; + font-size: 15px; + line-height: 18px; + word-wrap: break-word; +} + +/*Дата публикации*/ +.date{ + margin-top: 45px; + font-size: 15px; +} + +.month, .description, .date{ + font-weight: 500; + color: #A9A9A9; +} + +/*Разделение секции*/ +.separationLine{ + margin-top: 22px; + margin-left: 34%; + border: 1px solid #ccc; +} + +/*Кнопки выбора страницы*/ +.btnSection{ + display: flex; + margin-top: 24px; +} + +/*Кнопка "Показать весь список*/ +.allBtn{ + width: 208px; + height: 32px; + background-color: #fff; + border: 1px solid #ccc; + border-radius: 12px; + font-weight: 500; + font-size: 14px; +} + +/*Кнопки переключения страниц*/ +.choiceBtn{ + display: flex; + margin-left: auto; + margin-right: auto; +} + +/*Кнопки "предыдущая" и "следующая"*/ +.btnPrevious, .btnNext { + display: flex; + align-items: center; + justify-content: center; + width: 32px; + height: 32px; + border-radius: 20px; + background: #fff; + box-shadow: 0px 0px 12px rgba(0, 0, 0, 0.25); +} + +.btnNext{ + margin-left: 10px; +} + +.pageBtn{ + width: 36px; + height: 36px; + margin-left: 10px; + background: #D9D9D9; + border-radius: 12px; + font-weight: 700; + font-size: 16px; +} + +.activePage{ + border: 2px solid #175FA9; + background-color: #fff; + color: #175FA9; +} + +/*Кнопки с вопросами*/ +.questionBtnSection{ + display: flex; + justify-content: space-between; + margin-top: 55px; +} + +.questionBtn{ + width: 323px; + height: 128px; + padding: 2% 5% 2% 3%; + border-radius: 12px; + text-align: left; +} + +.questionBtn h3{ + font-size: 18px; + color: #fff; +} + +.questionBtn p{ + margin-top: 16px; + font-size: 16px; + line-height: 19px; + color: #fff; +} + +.orangeBtn{ + background: linear-gradient(180deg, #F76D09 0%, #FFA800 100%); +} + +.orangeBtn:active{ + background: linear-gradient(180deg, #FFA800 0%, #F76D09 100%); +} + +.greenBtn{ + background: linear-gradient(180deg, #107A34 0%, #51A633 100%); +} + +.greenBtn:active{ + background: linear-gradient(180deg, #51A633 0%, #107A34 100%); +} + +.blueBtn{ + background: linear-gradient(180deg, #2E50A7 0%, #0993F7 100%); +} + +.blueBtn:active{ + background: linear-gradient(180deg, #0993F7 0%, #2E50A7 100%); +} + +/*Недавно просмотренные*/ +.viewedSection{ + margin-top: 46px; +} + +.viewedTittle{ + display: flex; + justify-content: space-between; +} + +.viewedTittle h2{ + font-weight: 700; + font-size: 20px; + color: #222; +} + +.viewedTittle span{ + margin-left: 30px; + font-size: 16px; + color: #A9A9A9; +} + +/*Кнопки*/ +.viewedBtnSection{ + display: flex; +} + +/*Кнопка "посмотреть все недавние"*/ +.btnViewed{ + width: 208px; + height: 32px; + margin-top: 15px; + margin-right: 22px; + background: #fff; + border: 1px solid #CCCCCC; + border-radius: 12px; + font-size: 14px; + font-weight: 500; + color: #ccc; +} + +/*Кнопки "предыдущие" и "следующие"*/ +.viewedBtn{ + display: flex; + align-items: center; +} + +/*Недавно просмотренные квартиры*/ +.viewedBlock{ + display: flex; + justify-content: space-between; + margin-top: 27px; +} + +/*Квартира*/ +.viewedElem{ + width: 24%; + padding-bottom: 1%; + background: #fff; + border: 2px solid #ccc; + border-radius: 20px; +} + +.viewedElem img{ + width: 100%; + margin-bottom: 3%; +} + +.viewedElem h3, .viewedElem p{ + margin-left: 5%; +} + +.viewedElem h3{ + font-weight: 600; + font-size: 24px; + color: #222; +} + +.viewedElem p{ + font-weight: 500; + font-size: 16px; + color: #222; +} + +/*Домики на футере*/ +.footerHouses{ + margin: 5% 0 0 5%; +} + +/*Футер*/ +.footerBlock{ + width: 100%; + height: 250px; + margin-top: -0.5%; + background-color: #D9D9D9; +}