diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index dd84ea7..0000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve -title: '' -labels: '' -assignees: '' - ---- - -**Describe the bug** -A clear and concise description of what the bug is. - -**To Reproduce** -Steps to reproduce the behavior: -1. Go to '...' -2. Click on '....' -3. Scroll down to '....' -4. See error - -**Expected behavior** -A clear and concise description of what you expected to happen. - -**Screenshots** -If applicable, add screenshots to help explain your problem. - -**Desktop (please complete the following information):** - - OS: [e.g. iOS] - - Browser [e.g. chrome, safari] - - Version [e.g. 22] - -**Smartphone (please complete the following information):** - - Device: [e.g. iPhone6] - - OS: [e.g. iOS8.1] - - Browser [e.g. stock browser, safari] - - Version [e.g. 22] - -**Additional context** -Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index bbcbbe7..0000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project -title: '' -labels: '' -assignees: '' - ---- - -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] - -**Describe the solution you'd like** -A clear and concise description of what you want to happen. - -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. - -**Additional context** -Add any other context or screenshots about the feature request here. diff --git a/.vscode/javascript-file-list.html b/.vscode/javascript-file-list.html deleted file mode 100644 index c0d0a44..0000000 --- a/.vscode/javascript-file-list.html +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - - - - directory - - - - - - - - - - diff --git a/.vscode/right.html b/.vscode/right.html deleted file mode 100644 index 00a44cd..0000000 --- a/.vscode/right.html +++ /dev/null @@ -1,564 +0,0 @@ - - - - - --ALL-JS-Files - - - Stable - - - - - - - - - - - - -
Folders
<Go Back>
-
- - - - - - - - - - - - - - - - - -
FileFileFileFileFileFileFileFile
index.html count-up.js greeting.js no-ohs.js print-co...ns.js snippet-0-1.js snippet-5.js total-product.js 
a-tediou...sk.js dare-to-...er.js half.js num-odds.js product-up-to.js snippet-0-2.js spam.js total.js 
age.js div-by-either.js in-range.js number-change.js proper-p...ns.js snippet-0-3.js starts-with-r.js two (2).js 
alternat...ps.js divisibl...ge.js is-div-by-4.js number-e...ns.js raise-power.js snippet-0-4.js stay-positive.js two-sum-pairs.js 
average-...ur.js divisible.js is-long.js number-range.js remove-c...ls.js snippet-1 (2).js string-e...ns.js two-sum.js 
average.js divisors.js keep-it-quiet.js odd-sum.js remove-dupes.js snippet-1.js string-i...te.js two.js 
bleep-vowels.js ends-in-ly.js larger.js one (2).js remove-f...el.js snippet-2 (2).js string-r...er.js wacky-word.js 
boolean-...ns.js ends-with-t.js lengthie...rd.js one-or-none.js remove-s...ds.js snippet-2.js string-size.js whoami.js 
case-changer.js evens.js longer.js one-to-four.js remove-vowels.js snippet-3 (2).js strings-...hs.js word-count.js 
censor-e.js filter-l...ds.js make-acronym.js one.js reverse-array.js snippet-3.js sum-up-to.js your-ave...on.js 
choose-d...es.js five-mul...of.js make-matrix.js pair-print.js reverse-...te.js snippet-4 (2).js thirsty.js zero (2).js 
common-e...ts.js fizz-buzz.js maximum.js parity.js shorten-...ds.js snippet-4.js three (2).js zero.js 
comparisons.js four.js min-to-max.js print-2d.js small-st...ts.js snippet-5 (2).js three.js zipper.js 
contains.js funny-sound.js 
- -

-Folders: 1
-Files: 106
-Size of all files: 63049 KB

- - - \ No newline at end of file diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md deleted file mode 100644 index 18c9147..0000000 --- a/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,128 +0,0 @@ -# Contributor Covenant Code of Conduct - -## Our Pledge - -We as members, contributors, and leaders pledge to make participation in our -community a harassment-free experience for everyone, regardless of age, body -size, visible or invisible disability, ethnicity, sex characteristics, gender -identity and expression, level of experience, education, socio-economic status, -nationality, personal appearance, race, religion, or sexual identity -and orientation. - -We pledge to act and interact in ways that contribute to an open, welcoming, -diverse, inclusive, and healthy community. - -## Our Standards - -Examples of behavior that contributes to a positive environment for our -community include: - -* Demonstrating empathy and kindness toward other people -* Being respectful of differing opinions, viewpoints, and experiences -* Giving and gracefully accepting constructive feedback -* Accepting responsibility and apologizing to those affected by our mistakes, - and learning from the experience -* Focusing on what is best not just for us as individuals, but for the - overall community - -Examples of unacceptable behavior include: - -* The use of sexualized language or imagery, and sexual attention or - advances of any kind -* Trolling, insulting or derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or email - address, without their explicit permission -* Other conduct which could reasonably be considered inappropriate in a - professional setting - -## Enforcement Responsibilities - -Community leaders are responsible for clarifying and enforcing our standards of -acceptable behavior and will take appropriate and fair corrective action in -response to any behavior that they deem inappropriate, threatening, offensive, -or harmful. - -Community leaders have the right and responsibility to remove, edit, or reject -comments, commits, code, wiki edits, issues, and other contributions that are -not aligned to this Code of Conduct, and will communicate reasons for moderation -decisions when appropriate. - -## Scope - -This Code of Conduct applies within all community spaces, and also applies when -an individual is officially representing the community in public spaces. -Examples of representing our community include using an official e-mail address, -posting via an official social media account, or acting as an appointed -representative at an online or offline event. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported to the community leaders responsible for enforcement at -. -All complaints will be reviewed and investigated promptly and fairly. - -All community leaders are obligated to respect the privacy and security of the -reporter of any incident. - -## Enforcement Guidelines - -Community leaders will follow these Community Impact Guidelines in determining -the consequences for any action they deem in violation of this Code of Conduct: - -### 1. Correction - -**Community Impact**: Use of inappropriate language or other behavior deemed -unprofessional or unwelcome in the community. - -**Consequence**: A private, written warning from community leaders, providing -clarity around the nature of the violation and an explanation of why the -behavior was inappropriate. A public apology may be requested. - -### 2. Warning - -**Community Impact**: A violation through a single incident or series -of actions. - -**Consequence**: A warning with consequences for continued behavior. No -interaction with the people involved, including unsolicited interaction with -those enforcing the Code of Conduct, for a specified period of time. This -includes avoiding interactions in community spaces as well as external channels -like social media. Violating these terms may lead to a temporary or -permanent ban. - -### 3. Temporary Ban - -**Community Impact**: A serious violation of community standards, including -sustained inappropriate behavior. - -**Consequence**: A temporary ban from any sort of interaction or public -communication with the community for a specified period of time. No public or -private interaction with the people involved, including unsolicited interaction -with those enforcing the Code of Conduct, is allowed during this period. -Violating these terms may lead to a permanent ban. - -### 4. Permanent Ban - -**Community Impact**: Demonstrating a pattern of violation of community -standards, including sustained inappropriate behavior, harassment of an -individual, or aggression toward or disparagement of classes of individuals. - -**Consequence**: A permanent ban from any sort of public interaction within -the community. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], -version 2.0, available at -https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. - -Community Impact Guidelines were inspired by [Mozilla's code of conduct -enforcement ladder](https://github.com/mozilla/diversity). - -[homepage]: https://www.contributor-covenant.org - -For answers to common questions about this code of conduct, see the FAQ at -https://www.contributor-covenant.org/faq. Translations are available at -https://www.contributor-covenant.org/translations. diff --git a/HTML_PATTERNS.html b/HTML_PATTERNS.html deleted file mode 100644 index 907e4f2..0000000 --- a/HTML_PATTERNS.html +++ /dev/null @@ -1,1261 +0,0 @@ - - - - - - Accessible HTML Content Patterns - - - - - - - - - - - -
- - - - - -
- - -
- - -
-

Headings

- -

First Header h1

-

- One morning, when Gregor Samsa woke from troubled dreams, he found himself transformed in his bed into a horrible vermin. He lay on his armour-like back, and if he lifted his head a little he could see his brown belly, slightly domed and divided by arches into stiff sections. The bedding was hardly able to cover it and seemed ready to slide off any moment. His many legs, pitifully thin compared with the size of the rest of him, waved about helplessly as he looked. -

-

Second header h2

-

- "What's happened to me?" he thought. It wasn't a dream. His room, a proper human room although a little too small, lay peacefully between its four familiar walls. A collection of textile samples lay spread out on the table - Samsa was a travelling salesman - and above it there hung a picture that he had recently cut out of an illustrated magazine and housed in a nice, gilded frame. It showed a lady fitted out with a fur hat and fur boa who sat upright, raising a heavy fur muff that covered the whole of her lower arm towards the viewer. -

-

Third header h3

-

- Gregor then turned to look out the window at the dull weather. Drops of rain could be heard hitting the pane, which made him feel quite sad. "How about if I sleep a little bit longer and forget all this nonsense", he thought, but that was something he was unable to do because he was used to sleeping on his right, and in his present state couldn't get into that position. However hard he threw himself onto his right, he always rolled back to where he was. He must have tried it a hundred times, shut his eyes so that he wouldn't have to look at the floundering legs, and only stopped when he began to feel a mild, dull pain there that he had never felt before. -

-

Fourth header h4

-

- "Oh, God", he thought, "what a strenuous career it is that I've chosen! Travelling day in and day out. Doing business like this takes much more effort than doing your own business at home, and on top of that there's the curse of travelling, worries about making train connections, bad and irregular food, contact with different people all the time so that you can never get to know anyone or become friendly with them. It can all go to Hell!" He felt a slight itch up on his belly; pushed himself slowly up on his back towards the headboard so that he could lift his head better; found where the itch was, and saw that it was covered with lots of little white spots which he didn't know what to make of; and when he tried to feel the place with one of his legs he drew it quickly back because as soon as he touched it he was overcome by a cold shudder. -

-
Fifth header h5
-

- He slid back into his former position. "Getting up early all the time", he thought, "it makes you stupid. You've got to get enough sleep. Other travelling salesmen live a life of luxury. For instance, whenever I go back to the guest house during the morning to copy out the contract, these gentlemen are always still sitting there eating their breakfasts. I ought to just try that with my boss; I'd get kicked out on the spot. But who knows, maybe that would be the best thing for me. -

-
Sixth header h6
-

- If I didn't have my parents to think about I'd have given in my notice a long time ago, I'd have gone up to the boss and told him just what I think, tell him everything I would, let him know just what I feel. He'd fall right off his desk! And it's a funny sort of business to be sitting up there at your desk, talking down at your subordinates from up there, especially when you have to go right up close because the boss is hard of hearing. Well, there's still some hope; once I've got the money together to pay off my parents' debt to him - another five or six years I suppose - that's definitely what I'll do. That's when I'll make the big change. First of all though, I've got to get up, my train leaves at five." -

- -

Subtitles

-

- Title
- Subtitle -

-
-

Title

-

Subtitle

-
-
-

Title

-

Subtitle

-
- -

Notes:

- -
- -
- - -
-

Text-level

- - -
-

Content

-

- And he looked over at the alarm clock, ticking on the chest of drawers. "God in Heaven!" he thought. It was half past six and the hands were quietly moving forwards, it was even later than half past, more like quarter to seven. Had the alarm clock not rung? He see from the bed that it had been set for four o'clock as it should have been; it certainly must have rung. -

-
-

- "Yes, mother, yes, thank-you, I'm getting up now." -

-
- Gregor Samsa -
-
-

- Yes, but was it possible to quietly sleep through that furniture-rattling noise? True, he had not slept peacefully, but probably all the more deeply because of that. What should he do now? The next train went at seven; if he were to catch that he would have to rush like mad and the collection of samples was still not packed, and he did not at all feel particularly fresh and lively. -

-

- The French phrase, C'est le ton qui fait la chanson, might apply here. -

- -

Notes:

- -
- - - - - - - -
-

Lists

-

Unordered List

-
    -
  • Apple
  • -
  • Apricot
  • -
  • Avocado -
      -
    • Fuerte
    • -
    • Gwen
    • -
    • Hass
    • -
    • Pinkerton
    • -
    • Reed
    • -
    -
  • -
  • Banana -
      -
    1. Cavendish
    2. -
    3. Red Dacca
    4. -
    5. Gros Michel
    6. -
    7. East African Highland
    8. -
    9. Bodles Altafort
    10. -
    -
  • -
  • Bilberry
  • -
  • Blackberry
  • -
  • Blackcurrant
  • -
- -
Notes:
-

- VoiceOver will not announce unordered lists properly when either the list-style-type is set to none or display is set to inline. -

- -

Ordered List

-
    -
  1. Alabama
  2. -
  3. Alaska
  4. -
  5. Arizona -
      -
    • Phoenix
    • -
    • Tucson
    • -
    • Mesa
    • -
    • Chandler
    • -
    • Glendale
    • -
    -
  6. -
  7. Arkansas
  8. -
  9. California
  10. -
  11. Colorado
  12. -
  13. Connecticut -
      -
    1. Bridgeport
    2. -
    3. New Haven
    4. -
    5. Hartford
    6. -
    7. Stamford
    8. -
    9. Waterbury
    10. -
    -
  14. -
  15. Delaware
  16. -
  17. Florida
  18. -
  19. Georgia
  20. -
- -

Definition List

-
-
Alternate Character/Glyph
-
- A non-standard (sometimes decorative) variation of a character that comes as an extra option with a font file. -
-
Baseline
-
- The imaginary line on which most letters and other characters sit. -
-
Character
-
- An individual symbol of the full character set that makes up a typeface; may take the form of a letter, number, punctuation mark, etc. -
-
Serif
-
- A short line or stroke attached to or extending from the open ends of a letterform; also refers to the general category of typefaces that have been designed with this feature. -
-
Sans-Serif
-
- Literally “without line”; the general category of typefaces (or an individual typeface) designed without serifs. -
-
-
- - - -
-

Code

- -
-sudo ipfw pipe 1 config bw 256KByte/s
-sudo ipfw add 1 pipe 1 src-port 3000
-      
-
- -
-~/Sites/boilerplate
-❦ ☢ ☭ ☂ ♞
-
-$ ls -gto
-
-total 88
--rw-r--r-- 1 eric staff  6148 Mar 24 11:50 .DS_Store
-drwxr-xr-x 9 eric staff   306 Mar 24 13:36 .git/
--rw-rw-r-- 1 eric staff   862 Oct 13 14:38 .gitignore
--rw-r--r-- 1 eric staff   472 Feb 22 20:58 .htmlhintrc
--rw-r--r-- 1 eric staff  1068 Mar 24 10:57 LICENSE
--rw-r--r-- 1 eric staff  4865 Mar 24 13:34 README.md
--rw-r--r-- 1 eric staff 58601 Mar 24 11:50 index.html
-      
-
- -

Notes:

-

- Apply translate="no" to markup that contains code examples to prevent keywords from being automatically translated. -

-
- - - -
-

Symbols

-
    -
  • +
  • -
  • -
  • ±
  • -
  • ÷
  • -
  • ×
  • -
  • <
  • -
  • -
  • >
  • -
  • -
  • =
  • -
  • -
  • -
- -

Notes:

-

- Certain screen readers will not read certain symbols out loud. Use role="definition" in conjunction with aria-label to ensure the symbol is read. Use this technique with caution and discretion, as it will affect how the symbol is rendered by things like Braille readers. -

-
- - - -
-

Emoji

-
    -
  • 😺
  • -
  • 🎩
  • -
  • ⛄️
  • -
  • 🍺
  • -
  • 🍑
  • -
- -

Notes:

-
    -
  • - Certain screen readers will not read certain symbols out loud. Use role="definition" in conjunction with aria-label to ensure the symbol is read. Use this technique with caution and discretion, as it will affect how the symbol is rendered by things like Braille readers. -
  • -
  • - Use role="img" in conjunction with aria-label to expose an emoji as an image in the accessibility tree, with the label providing author intent. -
  • -
-
- -
- - -
- - -
-

Tables

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Academy Awards for Best Picture - Descriptions of the film title, production company(s), and producers for the years 1980-1989. -
FilmYearProduction Company(s)Producer(s)
Ordinary People1980ParamountRonald L. Schwary
Chariots of Fire1981Enigma Film ProductionsDavid Puttnam
Gandhi1982ColumbiaRichard Attenborough
Terms of Endearment1983ParamountJames L. Brooks
Amadeus1984OrionSaul Zaentz
Out of Africa1985Universal, Mirage EnterprisesSydney Pollack
Platoon1986Orion, HemdaleArnold Kopelson
The Last Emperor1987Recorded Picture Company, Yanco Films, TAO Films, AAA, SoprofilmsJeremy Thomas
Rain Man1988United ArtistsMark Johnson
Driving Miss Daisy1989Warner Bros.Richard D. Zanuck, Lili Fini Zanuck
For the first six ceremonies, the eligibility period spanned two calendar years.
- -

Notes:

-

- Use id and header attributes for tables with complicated markup (colspans, row headers, etc.). -

-
- - -
- - -
-

Interactive

- - -

Details

-
- What payment options do you accept? -

We accept cash, Visa, American Express, money orders, and personal checks.

-
- -

Notes:

-

- The details element is currently not supported by Microsoft Edge or Internet Explorer. These browsers will display the content in an opened state, as if the open attribute was applied. -

- - - -

Dialog

- -

This is a dialog title

-

This is dialog content.

- -
- -

Notes:

-

- The dialog's interactivity needs to be controlled with JavaScript. -

- -
- - -
- - -
-

Embedded

- - -

Image

- Image Example - - - -

Broken Image

- Broken Image - - - -

Figure with Caption

-
- Figure Example -
- An example figure caption. -
-
- - - -

Inline SVG

-
- - A crab - A solid black illustration of a crab. - - -
- Crab by Hea Poh Lin from the Noun Project -
-
- -

Notes:

- - - - -

Picture

- - - - Picture Element - - - - -

Image with Srcset and Sizes

- Image with Srcset and Sizes Example - - - -

Iframe

- - - - -

Audio

- - - - -

Video

- - -

Notes:

-

- Accessibility errors concerning the video's missing audio description should go away once the <track>'s source is linked to a valid caption file. -

- - - -

Object

- - - - - - - - - - - - Your browser does not support the <object> element. - Please consider upgrading your browser or view the video on YouTube. - - - - -

Canvas

- - Your browser does not support the <canvas> element. - Please consider upgrading your browser. - - -

Notes:

-

- Add role="presentation" to <track> to mute epeated announcement of graphic role by some screen readers. -

- -
- - -
- - -
-

Forms

-
- -
- -

Text Input

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Notes:

- -
- - - -
- -

Non-text Input

-
- - - - - - - - - - -

Notes:

-

- Some pointers on styling the range input. -

-
- - - -
- -

Select

-
- - - - - - - - - - -

Notes:

-

- The optgroup element has mixed support with assistive technology. -

-
- - - -
- -

Checkboxes and Radio Buttons

-
- - - - - - - - - - -
- Pizza Toppings - - - - - - - - - - - - - -
- - - - - - - -
- Beverage Size - - - - - - - - - - - - - -
-
- - - -
- -

Buttons

-
- - - - - - - - - - - - - - - - - Text Button - - -

Notes:

-
    -
  • - Add type="button" to <button> elements placed outside of forms to prevent some browsers from attempting to submit form data. -
  • -
  • - Add pointer-events: none; to inline SVG icons placed in buttons. -
  • -
  • - Add focusable="false" to SVG inside of a focusable element (links, buttons, etc.) to prevent a bug with Internet Explorer. -
  • -
  • - Use tabindex="0" in conjunction with role="button" to ensure that the text button is focusable. Use cursor: pointer; in the CSS to communicate that it is interactable. Learn more about When To Use The Button Element. -
  • -
  • - Use enterkeyhint to manipulate the enter key on a virtual keyboard. -
  • -
-
- - - -
- -

Output

-
- - - Output - - - - - - - 350 degrees - -
- - - -
- -

Lockup

-
- - - Can we send you periodic messages about your account? - - -

Notes:

-

- Place messaging above the input field so as to not be lost when magnification or focus on mobile occurs. -

-
- - - -
- -

States and Validation

-
- - -
-

Input

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - -
-

Button States

- - - - -
Notes:
-

- Use :hover, :focus, and :active selectors to control the other button states. Learn more about semantically managing state and using Buttons in Design Systems. -

-
- -
- - - -
- -

Autocomplete

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Notes:

-

- Be sure to reference the Falsehoods Programmers Believe collection for creating bulletproof inputs. -

-
- -
- -
- - -
- - -
- - - - - - - diff --git a/LICENSE b/LICENSE deleted file mode 100644 index b42dc48..0000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2021 Bryan C Guner - -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. diff --git a/README.html b/README.html deleted file mode 100644 index b87f658..0000000 --- a/README.html +++ /dev/null @@ -1,4047 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Document - - - - - - - - - - - - - -
- - -
- - - HOME - -
- -

Prep-Work

-

Notes

-

How to learn effectively

-

Learning: The acquisition of skills and the ability to apply them in the future.

-

What makes an Effective learner?

- -

Why do active learning techniques feel difficult?

- -

Desirable Difficulty

- -

Effective learners space their practice

- -
-

Hello World

- -
-

“Simplicity is prerequisite for reliability.” – Edsger W. Dijkstra

-
-
-

The Number Data Type

-

The number data type in JS is used to represent any numerical values, including integers and - decimal numbers.

-

Basic Arithmetic Operators

-

Operators are the symbols that perform particular operations.

- -

JS evaluates more complex expressions using the general math order of operations aka PEMDAS.

- -

Modulo : Very useful operation to check divisibility of numbers, check for even & odd, - whether a number is prime, and much more! (Discrete Math concept, circular problems can be solved with - modulo)

- -
-

The String Data Type

-

The string data type is a primitive data type that used to represent textual data.

- -
-

The Boolean Data Type

-

The boolean data type is the simplest data type since there are only two values: - true and false.

- -

Comparison Operators

-

All comparison operators will result in a boolean output.

-

The relative comparators

- -
-

Fun Fact: “a” < “b” is considered valid JS Code because string comparisons are compared - lexicographically (meaning dictionary order), so “a” is less than “b” because it appears earlier!

-
-
-

If there is ever a standstill comparison of two string lexicographically (i.e. app vs apple) the - comparison will deem the shorter string lesser.

-
-

Difference between == and ===

- -
-

Variables

-

Variables are used to store information to be referenced and manipulated in a program.

- -

Assignment Shorthand

-
-
let num = 0;
-num += 10; // same as num = num + 10
-num -= 2; // same as num = num - 2
-num /= 4; // same as num = num / 4
-num *= 7; // same as num = num * 7
-
- -
-

Functions

-

A function is a procedure of code that will run when called. Functions are used so that we do not have to - rewrite code to do the same thing over and over. (Think of them as ‘subprograms’)

- -
-

Parameters and Arguments

- -
- - - - - - - - - - - - -

- deployment -

-

0.) Links:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameHyperlink
OKTA - https://lambdaschoolsso.okta.com/login/login.htm?fromURI=%2Fapp%2FUserHome -
Calendar - https://calendar.google.com/calendar/u/0/embed?src=c_2q0kvam9h9k5i6t40qp5n18dh8@group.calendar.google.com -
Slack - https://app.slack.com/client/T4JUEB3ME/G01QG65CN75 -
Prep Work - https://apply.lambdaschool.com/courses/web/ -
-

1.) Platforms we need while attending class:

-

2.) Web Development Software:

-

3.) Pre-Course Work

- - -
-

Prep-Work

- -

deployment

- -

0.) Links:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameHyperlink
OKTAhttps://lambdaschoolsso.okta.com/login/login.htm?fromURI=%2Fapp%2FUserHome -
Calendarhttps://calendar.google.com/calendar/u/0/embed?src=c_2q0kvam9h9k5i6t40qp5n18dh8@group.calendar.google.com -
Slackhttps://app.slack.com/client/T4JUEB3ME/G01QG65CN75 -
Prep Workhttps://apply.lambdaschool.com/courses/web/ -
-

1.) Platforms we need while attending class:

-

2.) Web Development Software:

-

3.) Pre-Course Work

-
.
-├── README.html
-├── README.md
-├── SUMMARY.html
-├── SUMMARY.md
-├── codeswing.json
-├── comparison.png
-├── demo.html
-├── directory.html
-├── index.html
-├── javascript-practice
-│   ├── 00_expressions_variables
-│   │   ├── exercises
-│   │   │   ├── A_executing_code_exercise
-│   │   │   │   ├── README.html
-│   │   │   │   ├── README.md
-│   │   │   │   
-│   │   │   ├── B_expressions_exercise
-│   │   │   │   ├── README.html
-│   │   │   │   ├── README.md
-│   │   │   │   
-│   │   │   ├── C_variables_exercise
-│   │   │   │   ├── README.html
-│   │   │   │   ├── README.md
-│   │   │   │   
-│   │   │   ├── D_string_indexing_and_methods_exercise
-│   │   │   │   ├── README.html
-│   │   │   │   ├── README.md
-│   │   │   │   
-│   │   │   
-│   │   ├──
-│   │   └── solutions
-│   │       ├── A_executing_code_solution
-│   │       │   ├── age.js
-│   │       │   ├── greeting.js
-│   │       │   ├──
-│   │       │   ├── thirsty.js
-│   │       │   └── whoami.js
-│   │       ├── B_expressions_solution
-│   │       │   ├── boolean-expressions.js
-│   │       │   ├── comparisons.js
-│   │       │   ├── number-expressions.js
-│   │       │   ├──
-│   │       │   └── string-expressions.js
-│   │       ├── C_variables_solution
-│   │       │   ├── four.js
-│   │       │   ├── one.js
-│   │       │   ├──
-│   │       │   ├── three.js
-│   │       │   ├── two.js
-│   │       │   └── zero.js
-│   │       ├── D_string_indexing_and_methods_solution
-│   │       │   ├── a-tedious-task.js
-│   │       │   ├── dare-to-decipher.js
-│   │       │   ├── proper-patterns.js
-│   │       │   ├──
-│   │       │   └── small-string-snippets.js
-│   │       
-│   ├── 01_conditionals
-│   │   ├── exercises
-│   │   │   ├── A_conditionals_exercise
-│   │   │   │   ├── README.html
-│   │   │   │   ├── README.md
-│   │   │   │   
-│   │   │   
-│   │   ├──
-│   │   └── solutions
-│   │       ├── A_conditionals_solution
-│   │       │   ├── one.js
-│   │       │   ├──
-│   │       │   ├── three.js
-│   │       │   ├── two.js
-│   │       │   └── zero.js
-│   │       
-│   ├── 02_functions
-│   │   ├── exercises
-│   │   │   ├── A_functions_exercise
-│   │   │   │   ├── README.html
-│   │   │   │   ├── README.md
-│   │   │   │   
-│   │   │   ├── B_functions_exercise
-│   │   │   │   ├── README.html
-│   │   │   │   ├── README.md
-│   │   │   │   
-│   │   │   ├── C_functions_exercise
-│   │   │   │   ├── README.html
-│   │   │   │   ├── README.md
-│   │   │   │   
-│   │   │   
-│   │   ├──
-│   │   └── solutions
-│   │       ├── A_functions_solution
-│   │       │   ├── average.js
-│   │       │   ├── ends-with-t.js
-│   │       │   ├── half.js
-│   │       │   ├── is-div-by-4.js
-│   │       │   ├── is-long.js
-│   │       │   ├── keep-it-quiet.js
-│   │       │   ├──
-│   │       │   ├── snippet-0-1.js
-│   │       │   ├── snippet-0-2.js
-│   │       │   ├── snippet-0-3.js
-│   │       │   └── snippet-0-4.js
-│   │       ├── B_functions_solution
-│   │       │   ├── ends-in-ly.js
-│   │       │   ├── funny-sound.js
-│   │       │   ├── longer.js
-│   │       │   ├── one-or-none.js
-│   │       │   ├── parity.js
-│   │       │   ├──
-│   │       │   ├── starts-with-r.js
-│   │       │   ├── string-size.js
-│   │       │   └── wacky-word.js
-│   │       ├── C_functions_solution
-│   │       │   ├── average-of-four.js
-│   │       │   ├── case-changer.js
-│   │       │   ├── contains.js
-│   │       │   ├── divisible.js
-│   │       │   ├── in-range.js
-│   │       │   ├── larger.js
-│   │       │   ├── number-change.js
-│   │       │   
-│   │       
-│   ├── 03_loops
-│   │   ├── exercises
-│   │   │   ├── A_loops_exercise
-│   │   │   │   ├── README.html
-│   │   │   │   ├── README.md
-│   │   │   │   
-│   │   │   ├── B_loops_exercise
-│   │   │   │   ├── README.html
-│   │   │   │   ├── README.md
-│   │   │   │   
-│   │   │   ├── C_loops_exercise
-│   │   │   │   ├── README.html
-│   │   │   │   ├── README.md
-│   │   │   │   
-│   │   │   
-│   │   ├──
-│   │   └── solutions
-│   │       ├── A_loops_solution
-│   │       │   ├── count-up.js
-│   │       │   ├── evens.js
-│   │       │   ├── min-to-max.js
-│   │       │   ├── one-to-four.js
-│   │       │   ├──
-│   │       │   ├── snippet-1.js
-│   │       │   ├── snippet-2.js
-│   │       │   ├── snippet-3.js
-│   │       │   ├── snippet-4.js
-│   │       │   ├── snippet-5.js
-│   │       │   └── string-iterate.js
-│   │       ├── B_loops_solution
-│   │       │   ├── div-by-either.js
-│   │       │   ├── five-multiples-of.js
-│   │       │   ├── no-ohs.js
-│   │       │   ├── odd-sum.js
-│   │       │   ├── product-up-to.js
-│   │       │   ├──
-│   │       │   ├── string-repeater.js
-│   │       │   └── sum-up-to.js
-│   │       ├── C_loops_solution
-│   │       │   ├── censor-e.js
-│   │       │   ├── divisible-range.js
-│   │       │   ├── fizz-buzz.js
-│   │       │   ├── raise-power.js
-│   │       │   ├── remove-capitals.js
-│   │       │   ├── reverse-iterate.js
-│   │       │   
-│   │       
-│   ├── 04_arrays
-│   │   ├── exercises
-│   │   │   ├── A_arrays_exercise
-│   │   │   │   ├── README.html
-│   │   │   │   ├── README.md
-│   │   │   │   
-│   │   │   ├── B_arrays_exercise
-│   │   │   │   ├── README.html
-│   │   │   │   ├── README.md
-│   │   │   │   
-│   │   │   ├── C_arrays_exercise
-│   │   │   │   ├── README.html
-│   │   │   │   ├── README.md
-│   │   │   │   
-│   │   │   
-│   │   ├──
-│   │   └── solutions
-│   │       ├── A_arrays_solution
-│   │       │   ├── bleep-vowels.js
-│   │       │   ├── divisors.js
-│   │       │   ├── filter-long-words.js
-│   │       │   ├── num-odds.js
-│   │       │   ├──
-│   │       │   ├── stay-positive.js
-│   │       │   ├── strings-to-lengths.js
-│   │       │   └── total.js
-│   │       ├── B_arrays_solution
-│   │       │   ├── choose-divisibles.js
-│   │       │   ├── make-acronym.js
-│   │       │   ├── maximum.js
-│   │       │   ├── reverse-array.js
-│   │       │   ├──
-│   │       │   ├── word-count.js
-│   │       │   └── your-average-function.js
-│   │       ├── C_arrays_solution
-│   │       │   ├── alternating-caps.js
-│   │       │   ├── common-elements.js
-│   │       │   ├── lengthiest-word.js
-│   │       │   ├── number-range.js
-│   │       │   ├── remove-short-words.js
-│   │       │   
-│   │       
-│   ├── 05_nesting
-│   │   ├── exercises
-│   │   │   ├── A_nested_loops_exercise
-│   │   │   │   ├── README.html
-│   │   │   │   ├── README.md
-│   │   │   │   
-│   │   │   ├── B_two_dimensional_arrays_exercise
-│   │   │   │   ├── README.html
-│   │   │   │   ├── README.md
-│   │   │   │   
-│   │   │   ├── C_more_problems_exercise
-│   │   │   │   ├── README.html
-│   │   │   │   ├── README.md
-│   │   │   │   
-│   │   │   
-│   │   ├──
-│   │   └── solutions
-│   │       ├── A_nested_loops_solution
-│   │       │   ├── pair-print.js
-│   │       │   ├── print-combinations.js
-│   │       │   ├──
-│   │       │   ├── snippet-1.js
-│   │       │   ├── snippet-2.js
-│   │       │   ├── snippet-3.js
-│   │       │   ├── snippet-4.js
-│   │       │   ├── snippet-5.js
-│   │       │   └── two-sum.js
-│   │       ├── B_two_dimensional_arrays_solution
-│   │       │   ├── make-matrix.js
-│   │       │   ├── print-2d.js
-│   │       │   ├──
-│   │       │   ├── total-product.js
-│   │       │   ├── two-sum-pairs.js
-│   │       │   └── zipper.js
-│   │       ├── C_more_problems_solution
-│   │       │   ├── remove-dupes.js
-│   │       │   ├── remove-first-vowel.js
-│   │       │   ├── remove-vowels.js
-│   │       │   ├──
-│   │       │   ├── shorten-long-words.js
-│   │       │   └── spam.js
-│   │       
-│   ├── 06_decomposition_pattern
-│   │   ├── A_decomposing_problems_exercise
-│   │   │   ├── README.html
-│   │   │   ├── README.md
-│   │   │   
-│   │   ├── B_decomposing_problems_exercise
-│   │   │   ├── README.html
-│   │   │   ├── README.md
-│   │   │   
-│   │   ├── C_decomposing_problems_exercise
-│   │   │   ├── README.html
-│   │   │   ├── README.md
-│   │   │   
-│   │   
-│   ├── 07_objects
-│   │   ├── A_objects_exercise
-│   │   │   ├── README.html
-│   │   │   ├── README.md
-│   │   │   
-│   │   ├── B_objects_exercise
-│   │   │   ├── README.html
-│   │   │   ├── README.md
-│   │   │   
-│   │   ├── C_objects_exercise
-│   │   │   ├── README.html
-│   │   │   ├── README.md
-│   │   │   
-│   │   
-│   ├── 08_higher_order_functions
-│   │   ├── A_native_callback_methods_exercise
-│   │   │   ├── README.html
-│   │   │   ├── README.md
-│   │   │   
-│   │   ├── B_native_callback_methods_exercise
-│   │   │   ├── README.html
-│   │   │   ├── README.md
-│   │   │   
-│   │   
-│   
-├── js.js
-├── one-of-every-tag.html
-├── readme
-│   ├── README.html
-│   ├── README_files
-│   │   ├── katex.min.css
-│   │   
-│   
-├── resources.html
-├── resources.md
-├── script.js
-├── style.css
-└── tree.md
-
-66 directories, 241 files
-
-
-
-
-
-
-

WEEK 1
Introduction - to JavaScript (Part 1)

- -
-

Expression Learning Objectives
- Intro to Functions Learning - Objectives

- -

Control Flow and Array Learning - Objectives

- -

Intermediate Functions Learning - Objectives

- -
- Introduction - -
-

Expression Learning Objectives

- -

Below is a complete list of the terminal learning objectives for this lesson.
- When you complete this lesson, you should be able to perform each of the
- following objectives. These objectives capture how you may be evaluated on the
- assessment for this lesson.

-
    -
  1. -

    Given a working REPL interface, write and execute a statement that will print
    - "hello world" using console.log

    -
  2. -
  3. -

    Identify that strings are a list of characters defined by using double or
    - single quotes

    -
  4. -
  5. -

    Given an arithmetic expression using +, -, *, /, %, compute its value

    -
  6. -
  7. -

    Given an expression, predict if its value is NaN

    -
  8. -
  9. -

    Construct the truth tables for &&, ||, !

    -
  10. -
  11. -

    Given an expression consisting of >, >=, ===, <, <=, compute it's value

    -
  12. -
  13. -

    Apply De Morgan's law to a boolean expression

    -
  14. -
  15. -

    Given an expression that utilizes operator precedence, compute its value

    -
  16. -
  17. -

    Given an expression, use the grouping operator to change it's evaluation

    -
  18. -
  19. -

    Given expressions using == and ===, compute their values

    -
  20. -
  21. -

    Given a code snippet using postfix ++, postfix --, +=, -=, /=, *=, predict
    - the value of labeled lines

    -
  22. -
  23. -

    Create and assign a variable using let to a string, integer, and a
    - boolean. Read its value and print to the console.l learning objectives for this lesson.
    - When you complete this lesson, you should be able to perform each of the
    - following objectives. These objectives capture how you may be evaluated on the
    - assessment for this lesson.

    -
  24. -
  25. -

    Given a working REPL interface, write and execute a statement that will print
    - "hello world" using console.log

    -
  26. -
  27. -

    Identify that strings are a list of characters defined by using double or
    - single quotes

    -
  28. -
  29. -

    Given an arithmetic expression using +, -, *, /, %, compute its value

    -
  30. -
  31. -

    Given an expression, predict if its value is NaN

    -
  32. -
  33. -

    Construct the truth tables for &&, ||, !

    -
  34. -
  35. -

    Given an expression consisting of >, >=, ===, <, <=, compute it's value

    -
  36. -
  37. -

    Apply De Morgan's law to a boolean expression

    -
  38. -
  39. -

    Given an expression that utilizes operator precedence, compute its value

    -
  40. -
  41. -

    Given an expression, use the grouping operator to change it's evaluation

    -
  42. -
  43. -

    Given expressions using == and ===, compute their values

    -
  44. -
  45. -

    Given a code snippet using postfix ++, postfix --, +=, -=, /=, *=, predict
    - the value of labeled lines

    -
  46. -
  47. -

    Create and assign a variable using let to a string, integer, and a
    - boolean. Read its value and print to the console.

    -
  48. -
-
-

Intro to Functions Learning Objectives -

- -

Below is a complete list of the terminal learning objectives for this lesson.
- When you complete this lesson, you should be able to perform each of the
- following objectives. These objectives capture how you may be evaluated on the
- assessment for this lesson.

-
    -
  1. -

    Define a function using function declaration

    -
  2. -
  3. -

    Define a function that calculates the average of two numbers, call it,
    - pass in arguments, and print it's return value

    -
  4. -
  5. -

    Identify the difference between parameters vs argument terminal learning objectives for this - lesson.
    - When you complete this lesson, you should be able to perform each of the
    - following objectives. These objectives capture how you may be evaluated on the
    - assessment for this lesson.

    -
  6. -
  7. -

    Define a function using function declaration

    -
  8. -
  9. -

    Define a function that calculates the average of two numbers, call it,
    - pass in arguments, and print it's return value

    -
  10. -
  11. -

    Identify the difference between parameters vs arguments

    -
  12. -
-
-

Hello World

- -

Hey Programmer! Welcome to the JavaScript module. In the next few sections,
- we'll be learning the fundamentals of the JavaScript programming language. If
- it's your first time programming, don't worry; we designed this course
- especially for you. We'll have you executing your first lines of code in no
- time!

-

When you finish this article, you should be able to:

- -

Getting visual feedback in your - programs

- -

The first command we'll learn in JavaScript is console.log. This command is
- used to print something onto the screen. As we write our first lines of code,
- we'll be using console.log frequently as a way to visually see the output of
- our programs. Let's write our first program:

-
console.log("hello world");
-console.log("how are you?");
-
-

Executing the program above would print out the following:

-
hello world
-how are you?
-
-

Nothing too ground breaking here, but pay close attention to the exact way we
- wrote the program. In particular, notice how we lay out the periods,
- parentheses, and quotation marks. We'll also terminate lines with semicolons
- (😉.

-
-

Depending on how you structure your code, sometimes you'll be able to omit
- semicolons at the end of lines. For now, you'll want to include them
- just as we do.

-
-

Syntax

- -

We refer to the exact arrangement of the symbols, characters, and keywords as
- syntax. These details matter - your computer will only be able to
- "understand" proper JavaScript syntax. A programming language is similar to a
- spoken language. A spoken language like English has grammar rules that we should
- follow in order to be understood by fellow speakers. In the same way, a
- programming language like JavaScript has syntax rules that we ought to follow!

-

As you write your first lines of code in this new language, you may make many
- syntax errors. Don't get frustrated! This is normal - all new programmers go
- through this phase. Every time we recognize an error in our code, we have an
- opportunity to reinforce your understanding of correct syntax. Adopt a growth
- mindset and learn from your mistakes.

-

Additionally, one of the best things about programming is that we can get such
- immediate feedback from our creations. There is no penalty for making a mistake
- when programming. Write some code, run the code, read the errors, fix the
- errors, rinse and repeat!

-

Code comments

- -

Occasionally we'll want to leave comments or notes in our code. Commented
- lines will be ignored by our computer. This means that we can use comments to
- write plain english or temporarily avoid execution of some JavaScript lines. The
- proper syntax for writing a comment is to begin the line with double forward
- slashes (//):

-
// let's write another program!!!
-console.log("hello world");
-
-// console.log("how are you?");
-
-console.log("goodbye moon");
-
-

The program above would only print:

-
hello world
-goodbye moon
-
-

Comments are useful when annotating pieces of code to offer an explanation of
- how the code works. We'll want to strive to write straightforward code that is
- self-explanatory when possible, but we can also use comments to add additional
- clarity. The real art of programming is to write code so elegantly that it is
- easy to follow.

-

"Simplicity is prerequisite for reliability." — Edsger W. Dijkstra

-

Remember

- - -
-

The Number Type

- -

The Number data type in JavaScript does exactly what you expect! It is used
- to represent any numerical values, this includes integers and decimal numbers.
- As one of our first data types, we'll be interested in what operations we can
- use with numbers.

-

When you finish this article, you should be able to:

- -

All the numbers

- -

JavaScript's Number encompasses numerical values. All of the following values are of - number type:

-
42;
--5;
-3.14159;
-7.0;
-
-

The basic arithmetic operators

- -

For any given data type, we're interested in what operations we can perform with
- that type. We use the word operator to refer to the symbol that performs a
- particular operation. For example, the + operator performs the addition
- operation. Here are the common arithmetic operators in JS:

- -

With number values and arithmetic operators in hand, we can evaluate our first
- expressions:

-
console.log(2 + 3); // => 5
-console.log(42 - 42); // => 0
-console.log(-4 * 1.5); // => -6
-console.log(25 / 8); // => 3.125
-
-

Nothing too groundbreaking about the results above. An expression consists of
- values and operators. JavaScript will evaluate an expression into a single
- value.

-

We can write more complex expressions using multiple operators. However, we'll
- want to be aware of the general math order of operations. That is, we perform
- multiplication-division operations first and then addition-subtraction
- operations. To force a specific order of operation, we can use the grouping
- operator, ( ), around a part of the expression:

-
console.log(5 * 3 + 2); // => 17
-console.log(2 + 3 * 5); // => 17
-console.log((2 + 3) * 5); // => 25
-
-

The modulo operation

- -

All of the math operators listed above are the simple operations you use
- everyday, except for maybe modulo %. Modulo gives us the remainder that
- results from a division.
For example, 10 % 3 is 1 because when we divide 10
- by 3, we are left with a remainder of 1. We can read 10 % 3 as "ten modulo
- three" or "ten mod three."

-
console.log(10 % 3); // => 1
-console.log(14 % 5); // => 4
-console.log(20 % 17); // => 3
-console.log(18 % 6); // => 0
-console.log(7 % 9); // => 7
-
-

Modulo is a very useful operation in the realm of computers. We can use it to
- check the divisibility of numbers, whether numbers are even, whether they are
- prime, and much, much more. Don't take this seemingly simple operation from
- granted! We'll provide a ton of practice using these modulo patterns as we move through the course.

-

In the order of operations, modulo has the the same precedence as
- multiplication-division. So our complete order of math operations in JS is
- parentheses, multiplication-division-modulo, addition-subtraction.

-
// modulo has precedence over addition
-console.log(4 + 12 % 5); // => 6
-console.log((4 + 12) % 5); // => 1
-
-

Remember

- - -
-

The String Type

- -

This article is about one of JavaScript's primitive data types, String.
- Strings are what we'll use to represent textual data. This means that strings
- are useful in representing things like messages, names, poems, and so on. A
- string is a sequence of characters.

-

When you finish this article, you should be able to:

- -

Writing a valid string

- -

Strings are always wrapped by a pair of single quotation marks (') or by a
- pair of double quotation marks ("). Between the enclosing quotation marks, we
- can put any characters! Here are a six examples of strings:

-
"potato";
-"New York";
-"azablan@.io";
-"Follow the yellow brick road, please!";
-"365 days a year";
-"";
-
-

Above, notice that we are free to mix in any characters into a string. This
- includes spaces, numerics, punctuation, and other symbols. The sixth string
- above is the empty string; it contains zero characters!

-

You are probably wondering why we are allowed to use either single or double
- quotes when denoting a string - why is this useful? Maybe we want a string that
- contains quotation marks:

-
// valid strings
-'Shakespeare wrote, "To be or not to be"';
-"That's a great string";
-
-
// invalid string
-'That's a bad string'
-
-

If we want to use a single quote as a character of a string, we simply need to
- enclose the string in double quotes, and vice versa.

-

Calculating length

- -

Since a single string can contain any number of characters, we may find it
- useful to count the number of characters in a string using .length:

-
console.log("ramen".length); // => 5
-console.log("go home!".length); // => 8
-console.log("".length); // => 0
-
-

Indexing a string

- -

Strings consist of multiple characters. These characters are numbered by
- indices starting at 0. So in the string 'bootcamp', 'b' is at - index 0,
- 'o' is at index 1, 'o' is at index 2, 't' is at index 3, and so on. - We can
- look at particular characters of a string by using [] and specifying an index:

-
console.log("bootcamp"[0]); // => 'b'
-console.log("bootcamp"[1]); // => 'o'
-console.log("bootcamp"[2]); // => 'o'
-console.log("bootcamp"[3]); // => 't'
-console.log("bootcamp"[7]); // => 'p'
-console.log("bootcamp"[10]); // => undefined
-console.log("bootcamp"[-3]); // => undefined
-
-

In general, when we index a string using the expression string[i], we get back
- the single character at position i. Looking at the last two examples
- above, if we use an invalid index with a string, the value returned is
- undefined. This makes since because there is no character at the given
- position! It's also worth mentioning that an index should always be a number.

-

The classic "off by one" error

- -

Bear in mind that indices begin at 0 and not 1! Forgetting this nuance can lead
- to incorrect code for both new and experienced programmers alike. Let's hone in
- on an important distinction: the index of the last character of a string is
- always one less than it's length.

-
console.log("cat".length); // => 3
-console.log("cat"[3]); // => undefined
-console.log("cat"[2]); // => 't'
-
-

In other words, although the length of 'cat' is 3, the index of the last
- character ('t') is 2.

-

Using indexOf

- -

We can also calculate the index of a given character within a string by using
- indexOf:

-
console.log("bagel".indexOf("b")); // => 0
-console.log("bagel".indexOf("a")); // => 1
-console.log("bagel".indexOf("l")); // => 4
-console.log("bagel".indexOf("z")); // => -1
-
-

If we attempt to search for a character that is not present in a string,
- indexOf will return -1. This makes sense because we know that -1 is not a
- valid string index. The smallest index possible is 0!

-

If we search for a character that appears more than once in a string,
- indexOf will return the index of the first occurance of that character.

-

We can also use indexOf to search for a substring of characters. Under this
- circumstance, indexOf will return the index where the substring begins in the
- main string:

-
console.log("door hinge".indexOf("oor")); // => 1
-console.log("door hinge".indexOf("hi")); // => 5
-console.log("door hinge".indexOf("hint")); // => -1
-
-

Concatenation

- -

Concatenation is just a fancy word for joining strings together into a single
- string. To concatenate strings, we use the + operator:

-
console.log("hello" + "world"); // => 'helloworld'
-console.log("goodbye" + " " + "moon"); // => 'goodbye moon'
-
-

Remember

- - -
-

The Boolean Type

- -

The Boolean data type is perhaps the simplest type since there are only two
- possible values, true and false. However, we'll find booleans very useful
- because they will act as components of later concepts. As programmers, we'll use
- booleans to describe the validity of statements. In an abstract sense, "Today
- is Monday"
and "one plus one equals ten" are examples of statements with
- boolean values. That is, they are either true or false.

-

When you finish this article, you should be able to:

- -

Logical Operators

- -

In the long run, we'll be using booleans to establish logic in our code. For
- this reason, the boolean operators can also be referred to as the logical
- operators
. There are only three such operators:

- -

Logical NOT

- -

The not (!) operator will reverse a boolean value:

-
console.log(!true); // => false
-console.log(!false); // => true
-console.log(!!false); // => false
-
-

It's worth mentioning that ! is a unary operator. This means that the not
- operation is applied to a single value. This is in contrast to a binary operator
- such as multiplication, which is applied between two values. It does not make
- sense to ! two values together.

-

Logical AND

- -

The and (&&) operator will take two boolean values and will only evaluate to
- true when both input values are true. Otherwise, it will return - false:

-
console.log(false && false); // => false
-console.log(false && true); // => false
-console.log(true && false); // => false
-console.log(true && true); // => true
-
-

Logical OR

- -

The or (||) operator will take two boolean values and will only evaluate to
- false when both input values are false. Otherwise, it will return - true:

-
console.log(false || false); // => false
-console.log(false || true); // => true
-console.log(true || false); // => true
-console.log(true || true); // => true
-
-

Logical order of operations

- -

We can write boolean expressions that consist of multiple logical operations, but we should be aware of - the order of operations. JavaScript will evaluate ! then && then - ||.

-
console.log(true || true && false);    // => true
-console.log(false && !(false || true)); // => false
-
-

In general, A || B && C is equivalent to A || (B && C) where - A, B, C are booleans.

-

De Morgan's Law

- -

A common mistake in boolean logic is to incorrectly distribute ! across parentheses. Say we - had boolean values of A, B. Here is something to remember:

- -

In other words, to correctly distribute ! across parentheses, we must also flip the - operation within parentheses. Beware that:

- -

We call this property De Morgan's Law. Shout out to Augustus De Morgan of Great Britain. -

-

Remember

- - -

These are just the basics of the type. We'll be seeing more booleans in the upcoming section, so stay - tuned for that!

-
-

Comparison Operators

- -

In our previous introduction to the boolean data type, we described booleans as
- way to represent the validity of an expression. We'll continue this conversation
- by exploring comparison operators. As you learn about these operators, bear
- in mind that all comparisons will result in a boolean, true or false.

-

When you finish this article, you should be able to:

- -

The relative comparators

- - -

Using these operators is pretty straightforward. Here are a few examples:

-
console.log(10 > 5); // => true
-console.log(10 < 5); // => false
-console.log(1 < 7); // => true
-console.log(7 <= 7); // => true
-console.log(5 === 6); // => false
-console.log(5 !== 6); // => true
-console.log("a" !== "A"); // => true
-console.log(false === false); // => true
-
-

Notice that a comparison expression always evaluate to a boolean value (true
- or false). Comparison operators like === are a useful to compare strings,
- booleans, etc. not just numbers.

-

Did you know? 'a' < 'b' is valid JS code? When you relatively - compare
- strings using > or < you will be comparing them lexicographically.
- Lexicographically is fancy shmancy talk for "dictionary" order! A "lesser"
- string is one that would appear earlier in the dictionary:

-
console.log("a" < "b"); // => true
-console.log("apple" < "abacus"); // => false
-console.log("app" < "apple"); // => true
-console.log("zoo" > "mississippi"); // => true
-
-

Gotcha capitilized letters are considered lexicographically less than
- lower case letters. i.e "A" < "z" // => true.

-

=== vs ==

- -

In JavaScript there are two equality operators triple-equals (===) and
- double-equals (==). The operators differ in how they compare across differing
- types. Triple-equals performs the strict equality, meaning it will only return
- true if the types are the same. Double-equals performs the loose equality,
- meaning it can return true even if the values are of different type.
- Double-equals may coerce a value into another type for the comparison, and
- this behavior is hard to predict:

-
console.log(5 === "5"); // false
-console.log(5 == "5"); // true
-console.log(0 === false); // false
-console.log(0 == false); //true
-
-

Whoa! Surprised by these results? It can be hard to predict how == behaves, so
- we will avoid using it in this course and as a best practice. Stick to using
- === because it respects data types.

-

Remember

- - -
-

Basic Variables

- -

Variables are used to store information to be referenced and manipulated in a
- computer program. They also provide a way of labeling data with a descriptive
- name, so our programs can be understood more clearly by programmers. It is
- helpful to think of variables as containers that hold information. Their sole
- purpose is to label and store data in computer memory. This data can then be
- used and even changed throughout the lifetime of your program.

-

When you finish this reading, you should be able to:

- -

Initializing a variable

- -

To initialize a variable in JavaScript we'll need two new pieces of syntax:
- let and =. We can give the variable any name that we wish and assign it a
- value. Once we initialize a variable, the variable will evaluate to the value
- assigned:

-
let bootcamp = "";
-console.log(bootcamp); // ''
-
-let birthYear = 2012;
-console.log(birthYear); // 2012
-
-

Did you know? JavaScript variables names can contain any alphanumeric
- characters, underscore (_), or dollar sign ($). However, they cannot begin
- with a number.

-

Above are examples of how you'll create variables most of the time, so we'll
- grow very familiar with the syntax. As a best practice, we should name our
- variables in a way that is descriptive and concise.

-

The variable initializations above really consist of two steps: declaration
- with let and assignment with =. Let's break these two steps down.

-

Declaring a variable

- -

In JavaScript, in order to use a variable, we must declare it. Variable
- declaration is the act of introducing the variable to the environment.

-

To declare a variable, use the let keyword, followed by a space and then the
- name of the variable.

-
let bootcamp;
-console.log(bootcamp); // undefined
-
-

Once a variable is declared, it will contain undefined as it's value.
- undefined is a common default value in JavaScript, we'll see it come up in a
- few different places. You can think of undefined as showing that the variable
- is empty.

-

Assigning a variable

- -

Once a variable has been declared, we can assign it a value using single-equals
- = :

-
let bootcamp;
-console.log(bootcamp); // undefined
-bootcamp = "";
-console.log(bootcamp); // ''
-
-

Manipulating variables

- -

To change the value of a variable, we need to reassign it to a new value with
- = :

-
let num = 42;
-console.log(num + 8); // => 50
-console.log(num); // => 42
-
-num = num + 10;
-console.log(num); // => 52
-
-

In the code above, num + 8 will evaluate to 50, but it will not change the - num
- variable to 50. If we want to change the num variable, we must reassign to
- it.

-

Assignment Shorthand

- -

Changing the value of a number variable is something fairly common in the
- programming world. Luckily there is some shorthand operators we can use:

-
let number = 0;
-number += 10; // equivalent to number = number + 10
-number -= 2; // equivalent to number = number - 2
-number /= 4; // equivalent to number = number / 4
-number *= 7; // equivalent to number = number * 7
-console.log(number); // 14
-
-

We also have other shorthand to add or subtract exactly 1 from a variable, the
- increment (++) and decrement (--) operators:

-
let year = 3004;
-year++;
-console.log(year); // 3005
-year--;
-console.log(year); // 3004
-
-

NaN

- -

Now that we have the ability to perform arithmetic with variables, let's take a
- look at a common programming mistake, getting a result of NaN (not a number):

-
let num;
-console.log(num + 3); // NaN
-
-

The above code gives NaN because the unassigned num variable contains
- undefined; adding 3 to undefined results in NaN. In - general, any
- nonsensical arithmetic will result in NaN. Math operations involving
- undefined is perhaps the most common mistake:

-
console.log(undefined + 3); // NaN
-console.log("fish" * 2); // NaN
-
-

Remember

- - -
-

Introduction to Functions

- -

We hope you are ready - because you are on the brink of one of the most fun
- parts of writing JavaScript: writing functions. A function is a procedure of
- code that will run when called. We only "write" a function once (function
- declaration
), but we can "use" it as many times as we please (function
- calls
). Functions are the fundamental building blocks of JavaScript and
- mastering them is a big step on the road to JavaScript mastery.

-

When you finish this reading, you should be able to:

-
    -
  1. Describe what a function in JavaScript is.
  2. -
  3. Demonstrate how to invoke a function.
  4. -
  5. Write a function using function declaration.
  6. -
  7. Use the return keyword to return a value from a function.
  8. -
-

Writing Functions

- -

A function is a set procedure of code that will run when called. Functions
- really start to make sense when put in the perspective of solving problems. So
- for example say you want to find the average of two given numbers. Meaning we
- want to take two numbers, add them together then divide by 2:

-
> (5 + 5) / 2
-5
-
-> (15 + 3) / 2
-9
-
-> (7 + 2) / 2
-4.5
-
-

Writing out the same code again and again gets tedious fast. What you can do
- instead is write a new function.

-

Function Declaration

- -

A function definition consists of the function keyword, followed by three
- things:

-
    -
  1. The name of the function.
  2. -
  3. A list of parameters to the function, enclosed in parentheses, ().
  4. -
  5. The code to be run when this function is run, enclosed in curly
    - brackets,{ }.
  6. -
-

So for our above example of averaging two numbers we could write a function that
- would do that for us! We would write something like the following:

-
// 1. average is the name of the function
-// 2. number1 & number2 are the parameters being passed in
-function average(number1, number2) {
-  // 3. this is the code run every time this function is used
-  return (number1 + number2) / 2;
-}
-
-

First thing to notice for the above average function is that we didn't use any
- real numbers. You always want to write functions to accept as wide a range of
- data as possible. Utilizing the incoming parameters to a function is one of
- the keys to making functions flexible.

-

In the case of the average function, we want to use it to calculate the
- average of any two numbers. number1 and number2 are the parameters for - the
- average function. In other words, the average function expects to be given
- two numbers, number1 and number2. We'll be talking a lot more about
- parameters later - but for now know that when you define a function with
- parameters you are declaring those parameters as usable variables within that
- function.

-

The beauty of a function is that if we define it in a clever way, it will work
- on a whole slew of data! For example, we want average to work on any two
- numbers, whether or not they are whole numbers, decimal, negative, etc.

-

Invoking or "calling" a function

- -

Now that we've written a function how do we actually use it? Once defined a
- function can be invoked or "called" as many times as we please.

-

Order of code

- -

Let's step away from average for a bit to see how a simple function call
- works. Say we run JavaScript code that looks like this:

-
console.log("First!");
-
-console.log("Second!");
-
-

Running this code will return exactly as we expect. We will see First! printed
- out, followed by Second!. In other words, JavaScript will evaluate your code
- left-to-right and top-to-bottom. Very intuitive! It's exactly how you are
- reading these notes right now.

-

However, when JavaScript sees a function definition, JavaScript will not
- evaluate the code inside of the definition. It will only "remember" the code so
- we can execute it later. The code below only prints First! followed by
- Fourth!:

-
console.log("First!");
-
-function callMe() {
-  console.log("Second!");
-  console.log("Third!");
-}
-
-console.log("Fourth");
-
-// when run this code is ran it will print out:
-// "First!"
-// "Fourth"
-
-

To actually get the code within callMe to evaluate, we must call it by using
- callMe(). The code below will now print out in order:

-
function callMe() {
-  console.log("Second!");
-  console.log("Third!");
-}
-
-console.log("First!");
-// we call the function by adding ending parenthesis
-callMe();
-console.log("Fourth!");
-
-// when run this code is ran it will print out:
-// "First!"
-// "Second!"
-// "Third!"
-// "Fourth"
-
-

Let's say JavaScript is running the file above. Here are the steps it would
- take, starting from the tippy top of the code:

-
    -
  1. JS sees a definition for callMe. It will remember this definition in case
    - we call the function later. It will not evaluate the code inside the
    - function yet.
  2. -
  3. JS prints out First!
  4. -
  5. JS sees that we are calling callMe(). At this point it will look at the
    - prior callMe definition and run the code inside. It is as if we are
    - "jumping" to inside the function definition. This means it will print
    - Second! followed by Third!
  6. -
  7. JS sees there is no more code to be run inside of callMe, so it "jumps"
    - back to where we originally called callMe()
  8. -
  9. JS will continue evaluating in order and print Fourth!
  10. -
-

An average example

- -

So a declared function is "saved for later use", and will be executed later,
- when it is called, also known as being invoked. So thinking back to our
- average function we can declare the function and then invoke it.

-

When we specify what data to use for a function call, we refer to that process
- passing arguments to the function.

-
// this is a function definition
-function average(number1, number2) {
-  return (number1 + number2) / 2;
-}
-
-// this is a function call with the arguments being 15 & 3
-> average(15, 3)
-9
-
-// this is a function call with the arguments being 5 & 5
-> average(10, 5)
-7.5
-
-

When we call the function average(15, 3), we run the code inside the
- definition for average. That is, we plug in the parameters with real numbers
- (number1 becomes 10 and number2 becomes 16). Think of - number1 and
- number2 as variables that contain the values we pass in when we called the
- function. Then we proceed by running the code inside the function. The parameter
- names number1 and number2 used through the body of the function and behave
- like variables.

-

Returning a value

- -

Now that we know how functions are declared and invoked let's talk about the
- inside of the function. We'll start with a statement: Every function in
- JavaScript returns undefined unless otherwise specified.

-

Now what does that mean? We'll start with a simple example:

-
function sayNumber(number) {
-  console.log(number);
-}
-
-> sayNumber(1); // prints 1
-1
-undefined
-
-

So what happened there? Let's do a quick step by step:

-
    -
  1. We declared the sayNumber function
  2. -
  3. sayNumber was called handing in the argument of 1
  4. -
  5. The number parameter is printed to the console
  6. -
  7. Then the function ends without encountering a return statement. Since
    - nothing was specifically returned then the function returned the default
    - value for a function which is undefined.
  8. -
-

Now let's change our above example to use the keyword return to return a
- value:

-
function sayNumber(number) {
-  console.log(number);
-  return true;
-}
-
-> sayNumber(1);
-1 // sayNumber still prints 1
-true // but now sayNumber returns as true
-
-

Let's go back to our previous average function and talk about the return we
- used there:

-
function average(number1, number2) {
-  return (number1 + number2) / 2;
-}
-
-// the function call for average(10, 16) will return 13
-// so the result variable will be set to 13
-let result = average(10, 16);
-
-// if we want to check what a function returns we can do this:
-console.log(result); // prints `13`
-
-// we could alternatively do this:
-console.log(average(10, 16));
-
-

When we call a function, we jump to the function definition and run the code
- inside. When we hit a return statement, we immediately exit the - function,
- jump back to where we called the function, and evaluate the function call to
- the value it returned.

-

Every function call evaluates to it's return value! In other words, the
- expression average(10, 16) evaluates to 13 just like how the expression
- 1 + 1 evaluates to 2.

-

Another important rule of the return statement is that it stops function
- execution immediately. This means that any code after a return will not be
- executed!

-
function average(number1, number2) {
-  let sum = number1 + number2;
-  return sum;
-  // anything under the first return will not be executed
-  console.log("this will not run")
-  return false;
-}
-
- // when the first return is encountered the entire function will return a value
-> average(2, 7);
-9
-
-

So the three things to remember about return statements is:

-
    -
  1. Every function call evaluates to it's return value.
  2. -
  3. Every function in JavaScript returns undefined unless a return is
    - specified
  4. -
  5. Once a return statement is encountered the function will immediately stop
    - and return the value, ignoring any code below the return statement.
  6. -
-

The importance of naming

- -

A quick but very important side note about good naming. Take this to heart right
- now: Good names are important. Do yourself, and every other programmer
- reading your code, a favor by always using significant function and variable
- names.

-

For example, x is a very non-descriptive name for a variable or function. As
- we tackle more complicated problems and our code grows to be more complex, we
- are likely to forget what badly named variables originally stood for and what
- their purpose was. Non-descriptive names make our code error-prone. Great code
- reads like English and almost explains itself.
As programmers, our goal is to
- write code that is not only "correct", but also elegant, readable, and
- maintainable! Hold yourself to this high standard.

-

As far as syntax goes in JavaScript we always name our functions and variables
- camelCase for multiple words. (Ex: tipCalculator, - currentNumber,
- puppyPartyFinder). Other languages use other conventions so it's best to pick
- up the standard for your chosen language and stick with it.

-

Review

- -

By writing a function we can reuse code over and over again to solve similar
- problems with different input data (arguments). This will make your life easier
- and allow you to start working on more complex problems.

-

This reading covered:

- -
-

Parameters and Arguments

- -

When talking about functions one of the first things we mentioned was the word
- parameters. In this reading we will be covering what exactly a parameter is -
- as well as the differentiation between parameters and arguments.

-

When you finish this reading, you should be able to:

-
    -
  1. Identify the difference between parameters and arguments.
  2. -
  3. Write a function that utilizes declared parameters.
  4. -
  5. Invoking a function with passed in arguments.
  6. -
-

The difference between - Parameters and Arguments

- -

Let's start off by talking about the difference between arguments and
- parameters and how to identify which is which.

-
    -
  1. Parameters are comma separated variables specified as part of a
    - function's declaration.
  2. -
  3. Arguments are values passed to the function when it is invoked.
  4. -
-

So by defining parameters when we declare our function we are effectively
- setting accessible variables within the function:

-
function add(firstParameter, secondParameter) {
-  console.log(firstParameter + secondParameter);
-}
-
-// the add function declares two parameters
-> add(1, 2); //=> 3
-
-

In the above example we declared our parameters when we declared our function.
- Now arguments work slightly differently - when the function is invoked we are
- passing in arguments. So in the above example when we invoked add(1, 2) the
- (1,2) were the arguments being passed in. So when a function is invoked the
- value of the declared parameters is assigned to the passed in arguments.

-

You can think of it parameters and arguments like a recipe. A recipe is a
- list of ingredients (parameters) and list of steps (the code to be run). When
- someone cooks the recipe (invokes the function) they add the ingredients they
- actually have(arguments). The result of cooking the recipe is the delicious
- return value!

-

Extra arguments

- -

In JavaScript a function will not throw an error if the number of arguments
- passed during a function invocation is different than the number of parameters
- listed during function declaration. This is very important to know!

-

Let's use the above function to demonstrate:

-
function add(firstParameter, secondParameter) {
-  console.log(firstParameter + secondParameter);
-}
-
-// this will ignore the 17 & 14
-// the first two arguments passed in will be assigned to the first two parameters
-> add(1, 2, 17, 14); //=> 3
-
-

Notice in the above example we passed in 4 arguments (1, 2, 17, 14) to add.
- Since the function was only looking for two parameters that is all it uses.

-

Not enough arguments

- -

Now what happens if we pass in less arguments then needed?

-
function add(firstParameter, secondParameter) {
-  console.log(firstParameter + secondParameter);
-}
-
-> add(5); //=> NaN
-
-

Whoa what happened there? Let's do a play-by-play:

-
    -
  1. firstParameter was set to equal the first passed in argument which in the
    - above case is 5.
  2. -
  3. Since there is no second argument then secondParameter is declared as a
    - variable but is set to the default value of undefined.
  4. -
  5. The function then tries to add 5 to undefined which is definitely not a
    - number! So we get NaN (which means Not A Number) printed to the console.
  6. -
-

As you write more functions you'll grow very comfortable using both arguments
- and parameters to accomplish your function's goal.

-

Review

- - -
- - -
-

Control Flow and Array Learning - Objectives

- -

Below is a complete list of the terminal learning objectives for this lesson.
- When you complete this lesson, you should be able to perform each of the
- following objectives. These objectives capture how you may be evaluated on the
- assessment for this lesson.

-
    -
  1. -

    Define a function that accepts a sentence string and two words as args. The
    - function should return a boolean indicating if the sentence includes either
    - word.

    -
  2. -
  3. -

    Identify a pair of mutually exclusive conditions

    -
  4. -
  5. -

    Given a for loop, translate it into a while loop, and vice-versa

    -
  6. -
  7. -

    Write a function that iterates through a provided string argument

    -
  8. -
  9. -

    Given a description of pig latin, write a function that takes in a string
    - argument and utilizes String#slice to translate the string into pig latin.

    -
  10. -
  11. -

    Write a function that takes in an array of words and a string as arguments
    - and returns a boolean indicating whether the string is located inside of the
    - array. The function must use Array#indexOf.

    -
  12. -
  13. -

    Define that an array literal is an ordered list of values defined by using
    - bracket and individual values are read by indexing.

    -
  14. -
  15. -

    Prevent code that can throw an exception from causing the program to crash. the terminal learning - objectives for this lesson.
    - When you complete this lesson, you should be able to perform each of the
    - following objectives. These objectives capture how you may be evaluated on the
    - assessment for this lesson.

    -
  16. -
  17. -

    Define a function that accepts a sentence string and two words as args. The
    - function should return a boolean indicating if the sentence includes either
    - word.

    -
  18. -
  19. -

    Identify a pair of mutually exclusive conditions

    -
  20. -
  21. -

    Given a for loop, translate it into a while loop, and vice-versa

    -
  22. -
  23. -

    Write a function that iterates through a provided string argument

    -
  24. -
  25. -

    Given a description of pig latin, write a function that takes in a string
    - argument and utilizes String#slice to translate the string into pig latin.

    -
  26. -
  27. -

    Write a function that takes in an array of words and a string as arguments
    - and returns a boolean indicating whether the string is located inside of the
    - array. The function must use Array#indexOf.

    -
  28. -
  29. -

    Define that an array literal is an ordered list of values defined by using
    - bracket and individual values are read by indexing.

    -
  30. -
  31. -

    Prevent code that can throw an exception from causing the program to crash.

    -
  32. -
-
-

Control Flow - Conditional Statements

- -

So far the code you've written has been pretty direct in it's intent. You can
- define functions and variables but, so far the functions you've created haven't
- been able to do that much for you yet. It's time to start writing functions
- that can do things conditionally by utilizing control flow.

-

In simple terms - control flow is the order in which instructions are
- executed within a program. One modifies control flow using control structures,
- expressions that alter the control flow based on given parameters. The control
- structures within JavaScript allow the program flow to change within a unit of
- code or a function.

-

This reading will be covering one of the two main control structures you
- will use time and time again - Conditional statements. Conditional
- statements
are used to perform different actions based on different conditions.

-

When you finish this reading, you should be able to:

- -

A Quick Word on Syntax

- -

Before we get started we'll quickly go over the terms we'll be using to
- represent syntax.

-
    -
  1. [ ] are square brackets
  2. -
  3. { } are curly braces
  4. -
  5. ( ) are parentheses
  6. -
-

Writing Conditional Statements

- -

Conditional Statements are the second fundamental control structure for
- writing JavaScript and are pretty straight forward. The simplest conditional
- statement is the if statement. An if statement has two parts, the test
- expression
(the code that immediately follows the if which goes in
- parentheses), and the then expression (this code belongs in braces after the
- if expression). The then expression will only run when the if - expression
- is truthy.

-

Here is an example of a simple if statement:

-
// this is the test expression
-if (3 === 3) {
-  // this is the then expression
-  // this code will run if the above statement is true
-  console.log("this is a three!");
-}
-
-

The if statement above allows you to specify what should happen if your
- particular expression evaluates to true. You can chain additional test
- expressions
onto this if statement by using a else if statement.

-

The syntax for else if is very similar as an if statement:

-
function mathFun() {
-  let x = 2 + 3;
-
-  if (x === 3) {
-    console.log("we have a 3");
-  } else if (x === 4) {
-    // this code will run if the above statement is true
-    console.log("we have a 4");
-  } else if (x === 5) {
-    // this code will run if the above statement is true
-    console.log("we have a 5");
-  }
-};
-
-mathFun(); // => "we have a 5"
-
-

The else if and if statements do not, however, provide the option to - specify
- something else that should happen in the event that all of the above expressions
- evaluate to be falsey. The if...else statement reads just like English. The
- JS interpreter will execute the else statement if all the above conditions
- given are falsey. See below for an example:

-
function mathFun() {
-  let x = 19;
-  if (x === 3) {
-    console.log("we have a 3");
-  } else if (x === 4) {
-    console.log("we have a 4");
-  } else {
-    console.log("I will return if everything above me is falsey!");
-  }
-};
-
-mathFun(); // => "I will return if everything above me is falsey!"
-
-

You can chain an arbitrary number of else if statements but there can only be
- one if statement and one optional else statement. The if introduces - the control
- structure and the else acts as a fail safe to catch everything that didn't
- meet the above conditions.

-

Only one then expression is ever executed in an if, if...else, or
- if...else statement. If one of the test expressions is truthy, then the
- result of its then expression is the result of the entire conditional
- statement:

-
let x = 3;
-if (x === 3) {
-  console.log("this will run");
-} else {
-  console.log("this will not run");
-}
-
-

Additionally, you can nest conditional statements within each other but it will
- get hard to read pretty quickly and is discouraged:

-
function mathFun(x) {
-  if (x === "math") {
-    if (x === "math" && x[0] === "m") {
-      if (x[1] === "a") {
-        console.log("this got confusing fast");
-      } else {
-        console.log("that is not math!");
-      }
-    } else {
-      console.log("that is for sure not math!");
-    }
-  } else {
-    console.log("I will return if everything above me is false!");
-  }
-};
-
-mathFun("math"); // => "this got confusing fast"
-
-

Review

- - -
-

Mutually Exclusive Conditions

- -

You have now learned how to write conditional statements. Now we'll talk a
- little bit more about how to write them using best practices.

-

When you finish this reading, you should be able to:

- -

When to use if statements

- -

Say you are given the challenge to write a function that that will call another
- function named bigNumber if the given argument is greater than 100 or - call
- a function named smallNumber if it the given argument is smaller. You could
- write a function to do that which would look like this:

-
function numberSeparator(number) {
-  if (number < 100) {
-    // number is smaller than 100 so we invoke smallNumber
-    smallNumber();
-  }
-  if (number === 100) {
-    // number is equal to 100 so we invoke smallNumber
-    smallNumber();
-  }
-  if (number > 100) {
-    // number is larger than 100 so we invoke bigNumber
-    bigNumber();
-  }
-}
-
-

As you can probably tell the above function uses a lot of code to do a simple
- task. To be clear the function above would work for our aim - but it repeats
- itself. There is an age old principal for writing good code named DRY or
- Don't repeat yourself. As good programmers we always want our code to be
- clear, concise, and efficient.

-

A general rule of thumb is that if you are working with a condition that is
- mutually exclusive, meaning if one condition is true the other condition
- must be false, then you should use an if/else statement. You can also think of
- mutually exclusivity like a coin flip - it can be either heads or tails but
- not both.

-

Going back to the original problem at hand we can see it makes intuitive sense
- with the way the challenge is phrased: If the number is larger than 100 then
- we'll call bigNumber, otherwise we invoke is smallNumber.

-

So let's rewrite the above function to read a little more clearly:

-
function numberSeparator(number) {
-  if (number > 100) {
-    bigNumber();
-  } else {
-    smallNumber();
-  }
-}
-
-// this also works
-function numberSeparator(number) {
-  if (number <= 100) {
-    smallNumber();
-  } else {
-    bigNumber();
-  }
-}
-
-

Look at how much clearer that is! Writing good code is an art - devote yourself
- to becoming an artist!

-

Review

- - -
-

Control Flow - Looping

- -

A quick reminder before we start - control flow is the order in which
- instructions are executed within a program. One modifies control flow using
- control structures, expressions that alter the control flow based on given
- parameters. This reading will be covering the second of the main control
- structures
you will use time and time again - loops.

-

When you finish this reading, you should be able to:

-
    -
  1. Know how to write a while loop and a for loop. -
      -
    • Know how to convert a for loop into a while loop
    • -
    -
  2. -
  3. Know that index variables conventionally start at zero.
  4. -
  5. Explain what an iteration is.
  6. -
-

Looping

- -

Imagine you are at a friend's house and your friend has six dogs. Someone left
- the back gate open and all the dogs go out in the yard and get super muddy. Now
- your friend wants to clean their dogs but they only have one bathtub! You can't
- wash all the dogs at once. So the only option is to give the dogs a bath one at
- a time until they are all clean. When you start 0 dogs are clean and 6 dogs are
- dirty.

-

While there are still dirty dogs you still have a job to do. That is your
- condition - you will stop giving baths once all 6 dogs are clean. So after
- one bath you you have 1 clean dog and 5 dirty dogs. You've
- incremented(increased by one) your number of clean dogs. After each bath you
- check your condition again until you have 6 clean dogs so you know you can
- stop!

-

What we've described above is the idea of looping - setting a condition,
- executing an action, doing something to make sure our condition will be met
- eventually, and rechecking our condition before executing our next action.

-

Loops are a fundamental control structure for writing JavaScript.
- Loops will repeatedly execute a section of code while a condition is true. Loops
- are simple to write and incredibly powerful! There are many variations of loop
- but we will be covering the two most fundamental loops now - while loops and
- for loops.

-

While Loops

- -

One of the simplest loops in JavaScript is the while loop. As with all
- loops, the while loop will execute a block of code as long as a specified
- condition is true. The while loop starts with the keyword while then states a
- condition in parentheses. The code in the following braces will be run until the
- above condition is met.

-
while (condition) {
-  // code block to be executed
-}
-
-

In the following example, the code in the loop will run, over and over again, as
- long as a variable (index) is less than 10:

-
let index = 0;
-
-// this is the condition that will be checked every time this loop is run
-while (index < 10) {
-  console.log("The number is " + index);
-  // this is common shorthand for index = index + 1
-  index++;
-}
-
-

The most important thing to remember when writing any loop is to always be
- working towards your condition. In the example above if we did not increment the
- index variable by 1 each time the loop ran then we would be stuck with what we
- call an infinite loop:

-
let index = 0;
-
-// this is an infinite loop because our condition will never be met
-while (index < 10) {
-  console.log("The number is " + index);
-  // if we do not increase the index then our condition is never met
-  // Meaning this will run forever!
-}
-
-

The above code will run until whatever interpreter you are using crashes.

-

Important Loop Knowledge

- -

A quick word before we learn about the next loop.

-

The index is the traditional word for the variable that keeps track of how
- many times the loop has been run. Don't write loops with indices starting at
- one; you'll confuse other programmers and yourself. Indices have started at zero
- for a long time, and for good reason. It's much easier to use loops that start
- with an index of zero because Array and String indices also start at zero.

-
let array = [0, 1, 2];
-let index = 0;
-
-while (index < array.length) {
-  console.log(
-    "Both the index and the current array position are " + array[index]
-  );
-  index++;
-}
-
-

In the above code we will do one loop for each digit in the Array above. We call
- each of those loops an "iteration". An iteration is the act of repeating a
- procedure, hence looping is an iterative technique. Each repetition itself
- is also called an "iteration." So you can use loops to iterate through Arrays
- and Strings.

-

For Loops

- -

A for loop can be broken down into three sections:

-
    -
  1. The initial expression which will be run once at the beginning of the loop.
  2. -
  3. The condition which is checked every time the loop is run. If this
    - condition is true the loop will run again. If this condition is false the
    - loop will end.
  4. -
  5. The loopEnd expression which will be run at the end of the loop before
    - checking the condition again.
  6. -
-
for (<initial expression>;<condition>;<loopEnd expression>)
-
-

The for loop is usually used with an integer counter:

-
for (let index = 0; index < 10; index += 1) {
-  // the code inside this block will run 10 times
-}
-
-

While the loopEnd expression is normally used to increase a variable by one
- per loop iteration, it can contain any statement, such as one that decreasing
- the counter, or increasing it by 2.

-

You can use the for loop to iterate through all kinds of things. Check out the
- example below for how to iterate through a String:

-
let testString = "testing";
-
-// we can use the testString's length as our condition!
-// Since we know the testString's index starts at 0
-// and our index starts at 0 we can access each letter:
-for (let index = 0; index < testString.length; index += 1) {
-  let letter = testString[index];
-  console.log(letter);
-}
-
-

These are the most basic types of loops. If all else fails, you can always fall
- back on these two loops. All the other loop forms are just more convenient forms
- of these basic loop styles.

-

Translating From One Loop to Another

- -

So far we have covered both while and for loops. Once you understand the
- concept of looping it's easy to translate one loop to another:

-
// these two do the exact same thing!
-function forLoopDoubler (array) {
-  // it is convention to shorten index to just i in most cases
-  for (let i = 0; i < array.length; i++) {
-    array[i] = array[i] * 2;
-  }
-  return array;
-};
-
-function forLoopDoubler (array) {
-  let i = 0;
-  while (i < array.length) {
-    array[i] = array[i] * 2;
-    i++;
-  }
-  return array;
-};
-
-forLoopDoubler([1, 2, 3]); // => [2,4,6]
-whileLoopDoubler([1, 2, 3]); //=> [2,4,6]
-
-

Review

- - -
-

The Array Type

- -

This reading will be about one of JavaScript's global objects, the Array
- type. JavaScript arrays are used to store multiple values all within a single
- structure, much like a creating a list. Arrays can hold strings, integers and
- even other arrays! Arrays are incredibly useful for holding a bunch of different
- information all in one place.

-

When you finish this reading, you should be able to:

- -

Using arrays

- -

While coding you will find that you often find yourself needing to refer to a
- bunch of data at once. For instance, what if you wanted to refer to the entire
- English alphabet. Sure, you could create a bunch variables for each letter in
- the alphabet:

-
let a = "a";
-let b = "b";
-let c = "c";
-let d = "d";
-// and so on for way too long...
-
-

However this becomes cumbersome and unmanageable quickly. An Array is a data
- structure that solves this problem. Arrays are always wrapped in square
- brackets, [], and store their comma separated values in sequential order.
- Arrays in JavaScript are also very flexible: we can put elements into an array,
- replace elements in an array, and remove elements from the array.

-

So going back to our first example of containing the alphabet:

-
let alphabet = [
-  "a", "b", "c", "d", "e", "f",
-  "g", "h", "i", "j", "k", "l",
-  "m", "n", "o", "p", "q", "r",
-  "s", "t", "u", "v", "w", "x",
-  "y", "z"
-];
-
-

Indexing arrays

- -

Calculating the length of an array

- -

Since an array can container any number of values you will find it useful to
- count the number of values available to you using .length:

-
console.log([4, 7, 9].length); // => 3
-console.log([1, 2].length); // => 2
-console.log([].length); // => 0
-
-

Properly indexing an array

- -

Arrays consist of multiple values all stored in sequential order. These value
- are numbered by indices starting at 0 (just like indexing a string!). So
- given the below example:

-
let numbersAndLetters = ["b", "z", 17, "cat"];
-
-

In the above numbersAndLetters array if we access numbersAndLetters at the
- index of 0 we get back the value of "b". If we access numbersAndLetters at the
- index of 1 we get "z", at the index of 3 we get 17, etc. We can specify which
- value we'd like to access in an array by using square brackets,[], and
- specifying an index:

-
console.log(numbersAndLetters[0]); // => "b"
-console.log(numbersAndLetters[1]); // => "z"
-console.log(numbersAndLetters[2]); // => 17
-console.log(numbersAndLetters[3]); // => "cat"
-
-

Notice that even though the index at numbersAndLetters[3] has the value of a
- string with multiple characters ("cat") we return the entire value listed at
- that index.

-

Reminder: Arrays always start at the index of 0, not 1. This is the
- convention in programming. Additionally, indices should always be a number.

-

We can access a value in an array directly by providing an index for the value
- we'd like to access in that array (array[index]). See below for an example:

-
console.log(["a", "b", "c"][0]); // => "a"
-console.log(["a", "b", "c"][1]); // => "b"
-console.log(["a", "b", "c"][2]); // => "c"
-console.log(["a", "b", "c"][3]); // => `undefined`
-
-

As we see in the code above, if we try to access an element at an index that is
- not inside the array, we get back undefined. This makes sense because there is
- no value at that given position!

-

The classic "off by one" error

- -

Arrays are similar to strings in that both of their indices start at 0 instead
- of 1. Forgetting this fact can lead to some pretty confusing situations. Let's
- focus on an important distinction: the index of the last value of an array is
- always one less than its length.

-
console.log([4, 7, 9].length); // => 3
-console.log([4, 7, 9][3]); // => undefined
-console.log([4, 7, 9][2]); // => 9
-
-

In other words, although the length of [4, 7, 9] is 3, the index of the - last
- value (9) is 2. A good rule of thumb of accessing the last index of an array
- is to find the length and then subtract one:

-
let testArray = [4, 7, 9];
-let finalIndex = testArray.length - 1; // => (3 - 1) = 2
-console.log(testArray[finalIndex]); // => 9
-
-

Working with arrays

- -

Containing data in arrays

- -

By packaging groups of related data into a single array, we gain the added
- benefit of being able to refer to that data as a single collection. Arrays don't
- have to just hold single characters- they are capable of holding entire strings,
- numbers, and even other arrays!

-
let wackyArray = [2, 17, "apple", "cat", ["apple"]];
-
-console.log(wackyArray[0]); // => 2
-console.log(wackyArray[1]); // => 17
-console.log(wackyArray[3]); // => "cat"
-console.log(wackyArray[4]); // => ["apple"]
-
-

Just think of all the possibilities of what you can store in a single array!
- However, just because you can doesn't mean you should. In practice we will
- almost always be storing similar kinds of data, that are coming from a common
- source (i.e. items in a shopping list, ID numbers, tasks on a todo list).

-

Using indexOf with arrays

- -

We can also calculate the index of a given value within an array by using
- indexOf:

-
console.log([1, 3, 5, "apple", "jet"].indexOf(3)); // => 1
-console.log([1, 3, 5, "apple", "jet"].indexOf(5)); // => 2
-console.log([1, 3, 5, "apple", "jet"].indexOf("jet")); // => 4
-
-// this won't be found in the array
-console.log([1, 3, 5, "apple", "jet"].indexOf("potato")); // => -1
-
-

If we attempt to search for a value that is not present in an array,
- indexOf will return -1. This makes sense because we know that -1 is not a
- valid array index. The smallest index possible is 0!

-

Concatenation with arrays

- -

As a reminder, concatenation is just a fancy word for joining things together
- into a single collection. Now, this is where arrays will differ from strings.
- The + operator only exists for numbers and strings. If you try to use the +
- on an array it will try to help you out by converting your arrays into
- strings
.

-
console.log([1, 2, 3] + [4, 5, 6]); // => 1,2,34,5,6
-
-

JavaScript was just trying to help! However that is probably not what you meant
- to do. Good thing JavaScript has a seperate method for putting two array
- together. To concatenate arrays, we can use the aptly named .concat method:

-
console.log([1, 2, 3].concat([4, 5, 6])); // => [1, 2, 3, 4, 5, 6]
-
-

Remember

- - -
- DAY-3
Intermediate Functions - -
-

Intermediate Functions Learning - Objectives

- -

Below is a complete list of the terminal learning objectives across all
- "Intermediate Function" lessons. When you complete these lessons, you should be
- able to perform each of the following objectives. These objectives capture how
- you may be evaluated on the assessment for these lessons.

-
    -
  1. -

    Identify that strings are immutable and arrays are mutable

    -
  2. -
  3. -

    Define a function using both function declaration and function expression
    - syntax

    -
  4. -
  5. -

    Utilize Array#push, #pop, #shift, #unshift to mutate an array

    -
  6. -
  7. -

    List the arguments that can be used with Array#splice

    -
  8. -
  9. -

    Write a function that sums up elements of an array, given an array of numbers
    - as an argument

    -
  10. -
  11. -

    Utilize Array#forEach, #map, #filter, #reduce in a function

    -
  12. -
  13. -

    Define a function that takes in an array of numbers and returns a new array
    - containing only the primes

    -
  14. -
  15. -

    Define a function that takes in a 2D array of numbers and returns the total
    - sum of all elements in the array

    -
  16. -
  17. -

    Define a function that takes in an array of elements and returns a 2d array
    - where the subarrays represent unique pairs of elements

    -
  18. -
  19. -

    Define a function that takes in an array of numbers as an argument and
    - returns the smallest value in the array; if the array is empty return null the terminal learning - objectives across all
    - "Intermediate Function" lessons. When you complete these lessons, you should be
    - able to perform each of the following objectives. These objectives capture how
    - you may be evaluated on the assessment for these lessons.

    -
  20. -
  21. -

    Identify that strings are immutable and arrays are mutable

    -
  22. -
  23. -

    Define a function using both function declaration and function expression
    - syntax

    -
  24. -
  25. -

    Utilize Array#push, #pop, #shift, #unshift to mutate an array

    -
  26. -
  27. -

    List the arguments that can be used with Array#splice

    -
  28. -
  29. -

    Write a function that sums up elements of an array, given an array of numbers
    - as an argument

    -
  30. -
  31. -

    Utilize Array#forEach, #map, #filter, #reduce in a function

    -
  32. -
  33. -

    Define a function that takes in an array of numbers and returns a new array
    - containing only the primes

    -
  34. -
  35. -

    Define a function that takes in a 2D array of numbers and returns the total
    - sum of all elements in the array

    -
  36. -
  37. -

    Define a function that takes in an array of elements and returns a 2d array
    - where the subarrays represent unique pairs of elements

    -
  38. -
  39. -

    Define a function that takes in an array of numbers as an argument and
    - returns the smallest value in the array; if the array is empty return null

    -
  40. -
-
-

Function Expressions

- -

You may have noticed that we've been writing many functions so far in the
- course! We will continue to do so since functions are the building blocks of the
- eventual applications that we will build. That being said, let's begin to
- broaden the way we think about functions. In particular, we'll want think of
- functions as expressions that we can store in variables - just like our classic
- data types of number, string, boolean, array, and object!

-

When you finish this article, you should be able to:

- -

Functions as first-class objects

- -

JavaScript is well known for being a programming language that treats functions
- as "first-class objects". This fancy talk means that you can treat a function as
- a "normal" value by storing it in a variable. We'll leverage this key concept in
- very clever ways later in the course. For now, let's begin with a simple example
- that shows the "first-class object" nature of functions:

-
let calculateAverage = function(a, b) {
-  return (a + b) / 2;
-};
-
-console.log(calculateAverage(10, 20)); // 15
-
-

In the code snippet above, we define the calculateAverage by assigning a
- variable to contain the function's definition. By doing this, the variable's
- name is effectively the function's name. So to call the function, we simply
- refer to the variable name. Note that we do not write the function's name after
- the function keyword, where we normally would. We will refer to this new way
- of defining functions as function expression syntax and the classic way of
- defining functions as function declaration syntax. In general, we can define
- functions using either syntax:

-
// function declaration syntax
-function myFunctionName(arg1, arg2) {}
-
-// function expression syntax
-let myFunctionName = function(arg1, arg2) {};
-
-

In the coming sections, we'll highlight moments when we'll prefer one syntax
- over the other. For now, get acquainted with the new syntax as it is something
- you'll be seeing a lot of as a programmer!

-

A peek under the hood

- -

Perhaps you're finding it tough to understand what it means for a variable to
- contain a function - it is indeed a very abstract idea for new programmers.
- Let's draw a comparison. We know that when we assign an expression to variable,
- the expression first evaluates to a single value, which we then store in the
- variable name:

-
let myNum = 4 + 4;
-console.log(myNum); // prints 8
-console.log(myNum * 3); // prints 24
-
-

In the same way we can treat a function definition as an expression that
- evaluates!

-
let myFunc = function() {
-  console.log("I'm a function");
-};
-
-console.log(myFunc); // prints [Function: myFunc]
-myFunc(); // prints "I'm a function"
-
-

Looking at the snippet immediately above, you'll notice that when we print the
- myFunc variable directly, without calling the function with parentheses,
- JavaScript simply says the variable contains a function named myFunc
- ([Function: myFunc]). You can truly imagine a function as a value that we can
- store and use as we please.

-
-

The term anonymous function may also be used to describe a function
- expression before it is assigned to any variable. Following the example above,
- we'll use the word anonymous function to describe the function expression
- before the assignment to the myFunc variable is complete. Once the
- assignment is complete, it would be silly to refer to myFunc as an
- anonymous function because an anonymous function has no name.

-
-

Remember

- - -
-

Two-Dimensional Arrays (2D Arrays)

- -

Time to broaden our understanding of arrays! We've already explore the
- fundamentals of arrays. Mainly, we can store any type of data we please as
- elements of an array and even mix types together. However, what happens if we
- store an array as an element of an array?

-

When you finish this article, you should be able to:

- -

Multidimensional Arrays

- -

When we store arrays as elements of other arrays, we refer to those structures
- as multidimensional arrays. If the "depth" of the nested arrays is at exactly 2 (an
- outer array containing inner arrays), then we'll refer to it as a
- two-dimensional array:

-
let twoDimensional = [["a", "b", "c"], ["d", "e"], ["f", "g", "h"]];
-
-console.log(twoDimensional[1]); // [ 'd', 'e' ]
-console.log(twoDimensional[1][0]); // 'd'
-
-let subArr = twoDimensional[1];
-console.log(subArr[0]); // 'd'
-
-

Note that indexing the outer twoDimensional array will return an element like
- usual, it's just that element happens to be another array. To gain access to the
- innermost elements, we simply need to apply another set of indexing brackets!

-

If we style our 2D arrays nicely so that each subarray is on a new line, we can
- interpret the double indices as [row][column]:

-
let twoDimensional = [
-  ["a", "b", "c"],
-  ["d", "e"],
-  ["f", "g", "h"]];
-
-// get the element in the 0th row, 2nd col:
-console.log(twoDimensional[0][2]); // 'c'
-
-

Iterating through 2D Arrays

- -

Since a 2D array is just an array of arrays. We'll need to use a loop within a
- loop to iterate through a 2D array:

-
let array = [["a", "b", "c"], ["d", "e"], ["f", "g", "h"]];
-
-for (let i = 0; i < array.length; i++) {
-  let subArray = array[i];
-  console.log(subArray);
-
-  for (let j = 0; j < subArray.length; j++) {
-    console.log(subArray[j]);
-  }
-}
-
-

In the nested loops above, the i index refers to the current "row" and the - j
- index refers to the current "column". It's worth noting that since the inner
- subArrays have different length, we'll want to specifically reference the length
- of that subarray in our inner loop condition j < subArray.length. The code
- above will print:

-
[ 'a', 'b', 'c' ]
-a
-b
-c
-[ 'd', 'e' ]
-d
-e
-[ 'f', 'g', 'h' ]
-f
-g
-h
-
-

When is a 2D array practical?

- -

As a preview of things to come let's briefly mention when you'll find a 2D array
- useful in your future projects. Imagine how'd you represent a "grid":

- -

Remember

- - -
-

Mutability in JavaScript

- -

So far in the course we've explored a handful of methods that manipulate data.
- We'll be growing our arsenal of methods further overtime, so we'll want to gain
- awareness for exactly how we should expect these methods to manipulate the
- data we give them. To this end, let's analyze which methods will modify existing
- data and which methods do not. We refer to this concept as mutability.

-

When you finish this article, you should be able to:

- -

What is mutability?

- -

At its face value, mutability is a simple concept. You may be familiar with
- the word mutation, which refers to a alteration (usually in DNA). Something
- that is mutable can be changed, while something that is immutable is
- unchanging and permanent. To illustrate this concept, we'll begin with strings
- and arrays. We've spent some time with these two data types and by now we
- recognize that the two types share many similarities. Both have indices,
- length, and even share common methods like slice. However, they differ
- greatly in their mutability:

-
let myArr = ["b", "e", "a", "m"];
-myArr[0] = "s";
-console.log(myArr); // 'seam'
-
-let myStr = "beam";
-myStr[0] = "s";
-console.log(myStr); // 'beam'
-
-

Above we have shown that we can assign a new element to an index of an array,
- but we cannot assign a new character to an index of a string. In other words,
- arrays are mutable, but strings are immutable.

-

An implication of this discovery is that there are some array methods that
- will modify an existing array but zero methods that will modify an existing
- string. Methods that manipulate string data typically return a new string and
- never modify an existing one. A prime example is toUpperCase:

-
let word = "piñata";
-let newWord = word.toUpperCase();
-console.log(word); // 'piñata'
-console.log(newWord); // 'PIÑATA'
-
-

Above, notice that the toUpperCase method returns a capitalized version of the
- string, but does not change the original string. It's also worth noting that not
- every array method will mutate. For example, the slice method does not mutate
- for both strings and arrays. As we learn about methods in the future, we'll be
- certain to note what mutates and what does not.

-

Mutable or immutable, that is the - question

- -

Now that we have a grasp of mutability, let's take inventory and identify
- JavaScript's data types as mutable or immutable.

-

Mutable

- -

Immutable

- -

A quick way to remember the above list is to identify that the composite types
- (the types that can contain multiple values) of array and object are mutable.
- The remaining "simpler" types of number, string, and boolean are immutable.

-

The mutability misconception

- -

Maybe you are having a tough time believing what we have just claimed. We don't
- blame you, you've probably heard the saying that change is the only constant in
- the universe. Let's debunk a common argument to turn you into a believer. The
- skeptical programmer may use this as an argument to show that numbers are
- mutable:

-
let myNum = 42;
-myNum += 8;
-console.log(myNum); // 50
-
-

Because the myNum variable now contains 50 where it once contained - 42, it
- may seem we have mutated the number, but this is not truly the case. Recall that
- myNum += 8 is shorthand for myNum = myNum + 8. Since the right hand side of
- the assignment evaluates first, we are simply taking the new number of 50 and
- reassigning it to the myNum variable. This reassignment of a variable name is
- not a mutation of the original number.

-

Remember

- - -
-

Array Splice

- -

Time to a learn yet another array method! The Array#splice - method
- deserves its own reading because of how versatile it is. Feel free to use this
- article as a quick reference; let's jump right in.

-

When you finish reading this article, you should be able to:

- -

Notation

- -

For clarity in this article and moving forward in the course, we'll be notating
- methods with # to clarify how they should be called. For example,
- Array#splice refers to the method that should be called on an array,
- arr.splice() where arr is some array variable. Likewise - String#toUpperCase
- refers to the method that should be called on a string, str.toUpperCase()
- where str is some string variable. We'll opt to refer to methods using this
- notation because some methods can be called on multiple data types, such as
- Array#slice and String#slice.

-

What can Array#splice do?

- -

Before we explore the nitty-gritty details of the Array#splice method, the
- first thing to be aware of is that the method will mutate the array that it
- is called on. That is, Array#splice will modify the existing array and not
- return a new array.

-

Using splice to remove

- -

The usage of the Array#splice method is easy to mix up because it can be used
- to remove or insert elements into an array. That's right - it can perform
- "opposite" operations, even at the same time! For now, we'll begin by only
- removing elements from an array:

-
let colors = ["red", "yellow", "blue", "green", "orange", "brown", "gray"];
-let returnVal = colors.splice(2, 3);
-console.log(colors); // [ 'red', 'yellow', 'brown', 'gray' ]
-console.log(returnVal); // [ 'blue', 'green', 'orange' ]
-
-

The first two arguments for splice correspond to 1) the target index and 2) how
- many elements to remove. The call colors.splice(2, 3), will remove the next
- three elements beginning at index 2. This means that the elements at indices 2,
- 3, and 4 are removed.

-

Note that splice returns an array containing the elements that were removed and
- also has the effect of removing the elements from the original array, mutating
- it in-place.

-

Using splice to insert

- -

To use the splice method to insert new elements into an array, we can pass in
- any number of additional arguments representing the values to insert:

-
let colors = ["red", "yellow", "blue"];
-let returnVal = colors.splice(1, 0, "RebeccaPurple", "CornflowerBlue");
-console.log(colors); // [ 'red', 'RebeccaPurple', 'CornflowerBlue', 'yellow', 'blue' ]
-console.log(returnVal); // []
-
-

The method call colors.splice(1, 0, 'RebeccaPurple', 'CornflowerBlue')
- translates to "target index 1, remove the next 0 elements, then insert
- 'RebeccaPurple' and 'CornflowerBlue'."

-

Using splice like a pro

- -

Naturally, we can combine these two functionalities! Say we wanted to target
- index 2, remove the next 3 elements, then insert 'Gainsboro', 'Ivory', and
- 'Khaki':

-
let colors = ["red", "yellow", "blue", "green", "black", "beige"];
-let removed = colors.splice(2, 3, "Gainsboro", "Ivory", "Khaki");
-console.log(colors); // [ 'red', 'yellow', 'Gainsboro', 'Ivory', 'Khaki', 'beige' ]
-console.log(removed); // [ 'blue', 'green', 'black' ]
-
-

Bam. What a versatile method! Always feel free to reference the
- documentation - for the method when you are struggling to remember
- its usage:

-

Remember

- - -
-

String#split and Array#join

- -

We've seen previously that strings and arrays share many similar properties. For
- example, strings and arrays both have a length and can have multiple indices.
- Because of this, you may find it useful to "convert" between the two types.

-

When you finish this article, you should be able to:

- -

String#split

- -

The String#split - method is called on a string and accepts a
- "separator" string as an argument. The method will return an array where the
- elements are the resulting substrings when we cut at the "separators":

-
let sentence = "follow the yellow brick road";
-let words = sentence.split(" ");
-console.log(words); // [ 'follow', 'the', 'yellow', 'brick', 'road' ]
-console.log(sentence); // 'follow the yellow brick road'
-
-

Note that the original string is not mutated, rather a new array is returned.
- A common pattern is to split a sentence string on a space (' '), but you can
- split on any separator as you see fit:

-
let sentence = "follow the yellow brick road";
-console.log(sentence.split(" ")); // [ 'follow', 'the', 'yellow', 'brick', 'road' ]
-console.log(sentence.split("the")); // [ 'follow ', ' yellow brick road' ]
-console.log(sentence.split("o")); // [ 'f', 'll', 'w the yell', 'w brick r', 'ad' ]
-
-

A pattern you may find useful is that when you split on a separator string, it
- is guaranteed that that separator will not be in the resulting array,
- effectively removing it. See the example of sentence.split('the') above. This
- may come in handy, so keep it in mind!

-

Array#join

- -

The Array#join - method is called on an array and accepts a
- "separator" string as an argument. The method will return a string where
- elements of the array are concatenated together with the "separator" between
- each element:

-
let words = ["run", "around", "the", "block"];
-let sentence = words.join(" ");
-console.log(sentence); // 'run around the block'
-console.log(words); // [ 'run', 'around', 'the', 'block' ]
-
-console.log(words.join("_")); // 'run_around_the_block'
-console.log(words.join("HI")); // 'runHIaroundHItheHIblock'
-
-

Array#join does not mutate the original array, instead it will return a new
- string.

-

A clever combination

- -

It's pretty evident that String#split and Array#join are "opposite" - methods.
- That is:

- -

By combining these two methods we can accomplish some cool behavior:

-
let str = "I don't know what I want to eat";
-let newStr = str.split("I").join("we");
-console.log(newStr); // 'we don't know what we want to eat'
-
-

Whoa! We were able to replace every substring "I" with the substring "we". We
- know that the line str.split('I').join('we') evaluates from left to right.
- This means that the split will cut the string wherever there is an 'I',
- leaving a gap where the 'I's were. Then, the join will fill those gaps with
- 'we's.

-

Remember

- - -
- - -
-

Determining Types

- -

Sometimes you want to know the type of value store in a variable so that you can
- safely do things with it. If your function expects an array in its parameter but
- gets a number, you can't call the map method on that!

-

In this article you will learn how to figure out if a value in a variable is

- -

The typeof operator

- -

Not all operators in JavaScript require two arguments like the + operator for
- addition, the = for assignment, and the % operator for modulo division.
- Those are all called binary operators because they take two (bi-) operands,
- or things that are operated on.

-

JavaScript kindly gives you the operator typeof which acts on a single value.
- Operators that take only one operand are called unary operators because "u
- only give them one value!" (That's a joke. "uni-" or "una-" is one.)

-

Here are some examples of what you'd expect to see with the typeof operator.

-
let s = 'This is a string';
-console.log(typeof s);    // 'string'
-
-let n = 6.28;
-console.log(typeof n);    // 'number'
-
-let sum = function (a, b) {
-  return a + b;
-}
-console.log(typeof sum);  // 'function'
-
-

Note that the value returned from the typeof operator is a String data type.
- So, if you want to check if a value is a number, you could do this.

-
if (typeof n === 'number') {
-  // It is a number. Do some maths!
-} else {
-  console.log('I really wanted a number. :-(');
-}
-
-

How to tell if a value is an array

- -

Unfortunately, due to a really old bug in the way that JavaScript works, a bug
- that no one can fix because people wrote code that relies on the bug for
- decades, you cannot use the typeof operator to figure out if something is an
- array.

-
let a = [1, 2, 3];
-console.log(typeof a);  // 'object'
-
-

Gee, JavaScript. That's not helpful. Thanks.

-

Luckily, it only took 12 years for JavaScript to include a way to test if a
- value is an array. To do so, you use the Array.isArray method like this.

-
let a = [1, 2, 3];
-Array.isArray(a);  // true
-
-let n = 6.28;
-Array.isArray(n);  // false
-
-let f = function () {}
-Array.isArray(f);  // false
-
-

Practical use in "real" code

- -

Oddly enough, you won't see a lot of code in real-world applications testing if
- a value is one type or another. A lot of JavaScript functions just assume that
- they will get arguments of the right kind because the parameter names imply what
- kind of value to pass in. For example, the following function has a parameter
- named sentence.

-
function reverseTheSentence(sentence) {
-  // ... code here ...
-}
-
-

Most developers will know that the function probably wants sentence to be a
- string value. They just won't pass in an array or number or ... well, anything
- other than a string. Because that's just not polite. They'd expect any other
- kind of value to cause the reverseTheSentence to malfunction. Only when you
- know that people that don't respect your code will use it should you add in some
- kind of check like this.

-
function reverseTheSentence(sentence) {
-  if (typeof sentence !== 'string') {
-    // Tell the developer they are using
-    // the function wrong.
-  }
-  // ... code here ...
-}
-
-

Remember

- -

This article has shown you two ways to determine if a value is a kind of type:

- -

Use them as much (or as little) as you need!

-
-

The Null Type (And Undefined)

- -

You've met numbers and string, Booleans and arrays. There's another type often
- used in JavaScript: the Null type. And, it's a special type.

-

In this article, you will learn about the Null type, its value, and how to work
- with it in JavaScript.

-

A type with only one value

- -

You have seen that the String type can have an "infinite" number of values
- (within the limits of your computer memory). For example, the String type
- represents any of the following values.

-
// Examples of values with the String type
-'hello, world'
-"this is a string"
-`Where is my pudding?`
-''
-'A really long string.........................................................'
-
-

The Number type also has this aspect. Any number that you can reasonable express
- in JavaScript has the Number type.

-
// Examples of values with the Number type
--100
-99
-6.28
-Infinity
-
-

You also know about the Boolean type. It can have only two values.

-
// The only two values of Boolean type
-true
-false
-
-

There are not more Boolean values. You can't dream up more. There are only
- two, those two.

-

The Null type has one and exactly one value.

-
// The only value that has the Null type
-null
-
-

It's just that word: null. No quotation marks. No other fancy things. Just
- null.

-

The meaning of null

- -

This is a harder subject to tackle because it's a philosophical subject. Many
- people ask, "What does the value of null mean in a program?" There are a
- couple of answers that programmers give to this. None of them are wrong. None of
- them are right. They just are. In the presence of null, the code you write
- determines which of the following meanings null has.

- -

During your software programming career, you will likely have all three of those
- opinions, sometimes at the same time. Let's take a look at some examples to try
- to figure this out.

-

The absence of a value

- -

Let's say you wrote a function that splits a string into words, reverses them,
- and puts them back together in reverse order. You can do that with the methods

- -

That function could look like this.

-
function reverseTheSentence(sentence) {
-  let parts = sentence.split(' ');
-  parts.reverse();
-  return parts.join(' ');
-}
-
-

That's great! It works! But, what happens if someone doesn't care about what
- your function and just decides to pass in something that's not a string? It
- would make sense that reversing something that is not a string should lead to no
- value, the absence of a value, because the input to the function doesn't make
- sense. In that case, you can just return a null because there is no value
- that the function can return that would make sense.

-
function reverseTheSentence(sentence) {
-  if (typeof sentence !== 'string') {
-    return null;
-  }
-  let parts = sentence.split(' ');
-  parts.reverse();
-  return parts.join(' ');
-}
-
-

An unknown value

- -

There are a lot of programmers that will argue that null cannot be an unknown
- value. "The value is known!" they'll exclaim. "The value is 'null'! It's known!
- It's 'null'! Stop saying it's not known!"

-

There are programmers that vehemently disagree with that.

-

shrug

-

Checking if a value is null

- -

If you had hoped that you could use the typeof operator to check if a value is
- null, then you're out of luck.

-
// Useless code.
-console.log(typeof null);  // 'object'
-
-

Silly JavaScript. Instead of using the typeof operator, you can just compare
- the value to null because there is only one value of the Null data type and
- it's always null. Take a look at the following code and figure out what you
- think it will produce.

-
let a = [];
-let x = null;
-
-if (a === null) {
-  console.log('a is null');
-} else if (x === null) {
-  console.log('x is null');
-}
-
-

Oh, and there's that undefined value, - too

- -

Just like the null value that is the only value of the Null data type, there
- is undefined which is the only value of the Undefined data type.

-

If you're asking yourself, "Wait, if 'null' is no value or the absence of a
- value, then what the heck does 'undefined' mean?", well you're not the only one.

-

Have a look at this code.

-
let value;
-
-value = 6.28;
-console.log(value);
-
-

You probably will not be surprised to see that it will print out "6.28" because
- that's the value of value. But, what if you did this? What does that new
- console.log print?

-
let value;
-console.log(value); // <- what does this print?
-
-value = 6.28;
-console.log(value);
-
-

If you guessed that it prints "undefined", you're right! When you declare a
- variable, it's very first value is undefined. Most of the time, though, you'll
- just immediately set it to a value.

-
let value = 6.28;
-
-

So, an uninitialized variable has the value undefined which is the only value
- of the Undefined data type. To test for it, you can use the typeof operator
- or the strict equality operator. Using the strict equality operator is the
- more common way to do that, now.

-
// Test if a value is undefined
-if (value === undefined) {
-  // do a thing
-}
-
-// You can also do it this way, but
-// it is considered passé.
-if (typeof value === 'undefined') {
-  // do a thing
-}
-
-

What happens when...

- -

Interestingly enough, all functions actually do return values. Have a look at
- this function. What value does it return? (Not a trick question.)

-
function returnsTrue() {
-  return true;
-}
-
-

Yes, it returns the value true. But, what about this function?

-
function returnsWhat() {
-  return;
-}
-
-

There's a return statement there but it does not specify a value. If there is
- not value specified, what do you think this function returns? Try putting the
- function definition above and the code below into a code runner and seeing what
- happens.

-
console.log(returnsWhat());
-
-

One you figure that out, try the same experiment but with this function. What
- do you think it returns. It doesn't even have a return statement in it!

-
function whatIsThis() {
-}
-
-

Remember

- -

There is a special value in JavaScript represented as null which means "no
- value" or "unknown value". It is the only value of the Null data type. You can
- check that a value is null by using the strict equality operator x === null.

-

The value undefined is used by JavaScript for variables that have not been
- assigned a value. Also, functions that do not return an explicit value return
- the value undefined. You can test if a value is undefined by using the
- strict equality operator x === undefined.

-
-

Catch Me If You Can

- -

Sometimes bad things happen to good programs. Some person may enter some badly
- formatted information. Another computer may try to attack your program by
- sending it wonky data. A network could go down. A file can become corrupt. When
- this happens, your running software will have some errors. This article is about
- how you can recover from those errors with "structured exception handling".

-

In this article you'll learn the answers to:

- -

Structured exception handling

- -

Oddly enough, there are very few error-handling mechanisms in use, today, in all
- programming languages. There are really only three ways that programming
- language provide structured exception handling.

- -

In the stack-unwinding paradigm, which is the one you'll use in JavaScript, when
- an error occurs, the JavaScript interpreter (the thing running your JavaScript
- code) looks for some kind of handler for that error. It has a very specific way
- of searching for those handlers. The way JavaScript searches for the handlers is
- very similar to the way it happens in Python, C++, Java, C#, and a lot of other
- languages. Once you learn it, here, you will be able to handle errors when
- writing code in all of those languages.

-

Try and catch

- -

Say you have some code that may have an error. For example:

-
function sumArray(array) {
-  let sum = 0;
-  for (let i = 0; i < array.length; i += 1) {
-    sum += array[i];
-  }
-  return sum;
-}
-
-

If someone calls the above function with the code sumArray(null), then they
- will get the error because the for loop is trying to get the length property
- of the array parameter which is null.

-
TypeError: Cannot read property 'length' of null
-
-

To prevent this from ruining your program, you wrap code that may have an error
- in a try block. Now, you've seen other blocks already: if blocks, - for
- blocks, function blocks. Basically, if there are curly braces around some
- lines of code, that's a code block of some kind. A try block is just some
- curly braces with the try keyword.

-
// THIS IS AN INCOMPLETE BLOCK OF CODE
-function sumArray(array) {
-  let sum = 0;
-
-  // The try block wraps the for loop. If some
-  // error occurs, the try block will give you
-  // a chance to react to it so that the program
-  // doesn't terminate.
-  try {
-    for (let i = 0; i < array.length; i += 1) {
-      sum += array[i];
-    }
-  } // needs something more here
-
-  return sum;
-}
-
-

The try block tells JavaScript that it needs to watch the code inside the
- curly braces for an error. Now, you have to tell JavaScript what to do when
- there is an error. You do that in the catch block that should immediately
- follow the try block. The catch block accepts a single parameter that
- (usually) contains an object that describes the error that occurred. In the
- case of the sumArray method, if an error occurs, you could return the value
- undefined rather than letting an error terminate your program. You could also
- log the error to the "error" output.

-
function sumArray(array) {
-  let sum = 0;
-
-  try {
-    for (let i = 0; i < array.length; i += 1) {
-      sum += array[i];
-    }
-  } catch (e) {
-    console.log(e);
-    return null;
-  }
-
-  return sum;
-}
-
-sumArray(null);
-
-

Just to state it, again: the catch block runs when an error occurs in the try
- block
. If no error occurs in the try block, the catch block does not
- run
.

-

That (e) after the word catch is a variable that contains any error that - was
- thrown and caught by this try-catch block. It doesn't have to be named e.

-
function sumArray(array) {
-  let sum = 0;
-
-  try {
-    for (let i = 0; i < array.length; i += 1) {
-      sum += array[i];
-    }
-  } catch (pancakes) {
-    console.log(pancakes);
-    return null;
-  }
-
-  return sum;
-}
-
-sumArray(null);
-
-

Here is the same code but, instead of a variable named "e", there is a variable
- named "pancakes". Now, if an error is thrown, the variable "pancakes" will
- contain it. By long-standing tradition, the variables used with the catch block
- are normally "e", "err", or "error".

-
// CODE SNIPPET, WILL NOT RUN
-} catch (e) {
-
-
// CODE SNIPPET, WILL NOT RUN
-} catch (err) {
-
-
// CODE SNIPPET, WILL NOT RUN
-} catch (error) {
-
-

Now, when you run the code sumArray(null), you should see something like the
- following, if you run it in the online code editor.

-
TypeError: Cannot read property 'length' of null
-  at sumArray (/tmp/file.js:5:31)
-  at Object.<anonymous> (/tmp/file.js:16:1)
-  at Module._compile (internal/modules/cjs/loader.js:1158:30)
-  at Object.Module._extensions..js (internal/modules/cjs/loader.js:1178:10)
-  at Module.load (internal/modules/cjs/loader.js:1002:32)
-  at Function.Module._load (internal/modules/cjs/loader.js:901:14)
-  at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:74:12)
-  at internal/main/run_main_module.js:18:47
-
-

In that code sample, after the sumArray(null) call, the lines that begins
- TypeError is the error that occurred. The next 10 lines are what is known as a
- stack trace. You'll end up seeing these a lot, most likely, as you continue
- your career in software programming. This is the first line in understanding
- errors in your code. The stack trace shows on the first line where the error
- occurred: sumArray (/tmp/file.js:5:31) means that it occurred in the
- sumArray method on line 5 of the content, at character 31. If you open up one
- of the coding problems, paste that code block in, and run it, you'll see similar
- output in the output block.

-

The last line undefined is the return value of the sumArray(null) - invocation
- that now happens when an error occurs.

-

That is how the so-called try-catch block works.

-

How can I make my own errors?

- -

To create your own errors with structured exception handling, you first need to
- create an error object with the message that describes the error. Then, you need
- to "throw" the error. That code would look like either of these two lines, the
- only difference being the new keyword. They both work exactly the same.

-
throw Error('this happened because I wanted it to');
-throw new Error('this happened because I wanted it to');
-
-

What else is there?

- -

Turns out that you can have one more block on the try-catch block. It is the
- finally block. The finally block runs whether or not an error occurs. It
- always runs.

-
function sumArray(array) {
-  let sum = 0;
-
-  try {
-    for (let i = 0; i < array.length; i += 1) {
-      sum += array[i];
-    }
-  } catch (e) {
-    console.log(e);
-    return null;
-  } finally {
-    console.log('you will always see this.');
-  }
-
-  return sum;
-}
-
-

How do I best use this?

- -

At this point, you may be asking yourself, "Self, since errors can occur
- everywhere, shouldn't I just wrap all of my code in these try-catch blocks?"

-

No. No, you shouldn't.

-

Every try-catch block introduces another slow-down in your code. If you're
- writing code that you want to run as fast as possible, then you write as few
- try-catch blocks as possible. Also, it makes the code pretty cluttered with
- all of the indentation and curly braces. When at all possible, you should write
- defensive code which checks for bad values before errors get thrown in your
- code. Rather than using a try-catch block in the sumArray function, you
- could defend against bad values of the array parameter like so.

-
function sumArray(array) {
-  if (array === null) {
-    return null;
-  }
-
-  let sum = 0;
-  for (let i = 0; i < array.length; i += 1) {
-    sum += array[i];
-  }
-  return sum;
-}
-
-

Review

- -

The try-catch-finally block is a mechanism to handle errors in your code. You
- should not wrap all of your code in these blocks because it can seriously
- degrade the performance of your application. Instead, only wrap those portions
- of the code that you want to guard against throwing exceptions.

-

A better choice, in JavaScript and all programming languages, is to be
- defensive about your programming and choose to check that the value that you
- have has the functionality that you desire by adding code like

-
if (value !== undefined) {}
-if (value !== null) {}
-
-
-
- -
- - - - - - - - - - - - - - - diff --git a/README.md b/README.md index 67a4d10..756e3e8 100644 --- a/README.md +++ b/README.md @@ -1,18991 +1,7 @@ # Prep-Work -## [deployment](https://lambda-prep.netlify.app/) -## [GitHub Pages](https://bgoonz.github.io/lambda-prep/) -## [Backup-Deployment:](https://bgoonz-c1f6696402.drafts.github.io/lambda-prep/) - -0.\) Links: - - - -[HTML TAG EXAMPLES](./one-of-every-tag.html) -[Navigation](./directory.html) -[Playground](https://code-playground.netlify.app/) -[Quiz Me](https://web-dev-interview-prep-quiz-website.netlify.app/) -[Text-Tools](https://devtools42.netlify.app/) -[Github HTML FilePreviewer](https://githtmlpreview.netlify.app/)[simple-sidebar-template](./_Resources\simple-side-bar\directory.html) -[My Blog Posts](https://bryanguner.medium.com/) - - - - -| Name | Hyperlink | -| :-------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| OKTA | [https://lambdaschoolsso.okta.com/login/login.htm?fromURI=%2Fapp%2FUserHome](https://lambdaschoolsso.okta.com/login/login.htm?fromURI=%2Fapp%2FUserHome) | -| Calendar | [https://calendar.google.com/calendar/u/0/embed?src=c\_2q0kvam9h9k5i6t40qp5n18dh8@group.calendar.google.com](https://calendar.google.com/calendar/u/0/embed?src=c_2q0kvam9h9k5i6t40qp5n18dh8@group.calendar.google.com) | -| Slack | [https://app.slack.com/client/T4JUEB3ME/G01QG65CN75](https://app.slack.com/client/T4JUEB3ME/G01QG65CN75) | -| | | -| | | -| | | -| | | -| | | -| Prep Work | [https://apply.lambdaschool.com/courses/web/](https://apply.lambdaschool.com/courses/web/) | - - - - - -![google-analytics](./analytics.PNG) - - -3.\) Pre-Course Work -[![Edit epic-hawking-rdij1](https://codesandbox.io/static/img/play-codesandbox.svg)](https://codesandbox.io/s/epic-hawking-rdij1?autoresize=1&expanddevtools=1&fontsize=10&hidenavigation=1&theme=dark) - -``` -. -├── README.html -├── README.md -├── SUMMARY.html -├── SUMMARY.md -├── codeswing.json -├── comparison.png -├── demo.html -├── directory.html -├── index.html -├── javascript-practice -│   ├── 00_expressions_variables -│   │   ├── exercises -│   │   │   ├── A_executing_code_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   ├── B_expressions_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   ├── C_variables_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   ├── D_string_indexing_and_methods_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   -│   │   ├── -│   │   └── solutions -│   │   ├── A_executing_code_solution -│   │   │   ├── age.js -│   │   │   ├── greeting.js -│   │   │   ├── -│   │   │   ├── thirsty.js -│   │   │   └── whoami.js -│   │   ├── B_expressions_solution -│   │   │   ├── boolean-expressions.js -│   │   │   ├── comparisons.js -│   │   │   ├── number-expressions.js -│   │   │   ├── -│   │   │   └── string-expressions.js -│   │   ├── C_variables_solution -│   │   │   ├── four.js -│   │   │   ├── one.js -│   │   │   ├── -│   │   │   ├── three.js -│   │   │   ├── two.js -│   │   │   └── zero.js -│   │   ├── D_string_indexing_and_methods_solution -│   │   │   ├── a-tedious-task.js -│   │   │   ├── dare-to-decipher.js -│   │   │   ├── proper-patterns.js -│   │   │   ├── -│   │   │   └── small-string-snippets.js -│   │   -│   ├── 01_conditionals -│   │   ├── exercises -│   │   │   ├── A_conditionals_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   -│   │   ├── -│   │   └── solutions -│   │   ├── A_conditionals_solution -│   │   │   ├── one.js -│   │   │   ├── -│   │   │   ├── three.js -│   │   │   ├── two.js -│   │   │   └── zero.js -│   │   -│   ├── 02_functions -│   │   ├── exercises -│   │   │   ├── A_functions_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   ├── B_functions_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   ├── C_functions_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   -│   │   ├── -│   │   └── solutions -│   │   ├── A_functions_solution -│   │   │   ├── average.js -│   │   │   ├── ends-with-t.js -│   │   │   ├── half.js -│   │   │   ├── is-div-by-4.js -│   │   │   ├── is-long.js -│   │   │   ├── keep-it-quiet.js -│   │   │   ├── -│   │   │   ├── snippet-0-1.js -│   │   │   ├── snippet-0-2.js -│   │   │   ├── snippet-0-3.js -│   │   │   └── snippet-0-4.js -│   │   ├── B_functions_solution -│   │   │   ├── ends-in-ly.js -│   │   │   ├── funny-sound.js -│   │   │   ├── longer.js -│   │   │   ├── one-or-none.js -│   │   │   ├── parity.js -│   │   │   ├── -│   │   │   ├── starts-with-r.js -│   │   │   ├── string-size.js -│   │   │   └── wacky-word.js -│   │   ├── C_functions_solution -│   │   │   ├── average-of-four.js -│   │   │   ├── case-changer.js -│   │   │   ├── contains.js -│   │   │   ├── divisible.js -│   │   │   ├── in-range.js -│   │   │   ├── larger.js -│   │   │   ├── number-change.js -│   │   │   -│   │   -│   ├── 03_loops -│   │   ├── exercises -│   │   │   ├── A_loops_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   ├── B_loops_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   ├── C_loops_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   -│   │   ├── -│   │   └── solutions -│   │   ├── A_loops_solution -│   │   │   ├── count-up.js -│   │   │   ├── evens.js -│   │   │   ├── min-to-max.js -│   │   │   ├── one-to-four.js -│   │   │   ├── -│   │   │   ├── snippet-1.js -│   │   │   ├── snippet-2.js -│   │   │   ├── snippet-3.js -│   │   │   ├── snippet-4.js -│   │   │   ├── snippet-5.js -│   │   │   └── string-iterate.js -│   │   ├── B_loops_solution -│   │   │   ├── div-by-either.js -│   │   │   ├── five-multiples-of.js -│   │   │   ├── no-ohs.js -│   │   │   ├── odd-sum.js -│   │   │   ├── product-up-to.js -│   │   │   ├── -│   │   │   ├── string-repeater.js -│   │   │   └── sum-up-to.js -│   │   ├── C_loops_solution -│   │   │   ├── censor-e.js -│   │   │   ├── divisible-range.js -│   │   │   ├── fizz-buzz.js -│   │   │   ├── raise-power.js -│   │   │   ├── remove-capitals.js -│   │   │   ├── reverse-iterate.js -│   │   │   -│   │   -│   ├── 04_arrays -│   │   ├── exercises -│   │   │   ├── A_arrays_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   ├── B_arrays_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   ├── C_arrays_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   -│   │   ├── -│   │   └── solutions -│   │   ├── A_arrays_solution -│   │   │   ├── bleep-vowels.js -│   │   │   ├── divisors.js -│   │   │   ├── filter-long-words.js -│   │   │   ├── num-odds.js -│   │   │   ├── -│   │   │   ├── stay-positive.js -│   │   │   ├── strings-to-lengths.js -│   │   │   └── total.js -│   │   ├── B_arrays_solution -│   │   │   ├── choose-divisibles.js -│   │   │   ├── make-acronym.js -│   │   │   ├── maximum.js -│   │   │   ├── reverse-array.js -│   │   │   ├── -│   │   │   ├── word-count.js -│   │   │   └── your-average-function.js -│   │   ├── C_arrays_solution -│   │   │   ├── alternating-caps.js -│   │   │   ├── common-elements.js -│   │   │   ├── lengthiest-word.js -│   │   │   ├── number-range.js -│   │   │   ├── remove-short-words.js -│   │   │   -│   │   -│   ├── 05_nesting -│   │   ├── exercises -│   │   │   ├── A_nested_loops_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   ├── B_two_dimensional_arrays_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   ├── C_more_problems_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   -│   │   ├── -│   │   └── solutions -│   │   ├── A_nested_loops_solution -│   │   │   ├── pair-print.js -│   │   │   ├── print-combinations.js -│   │   │   ├── -│   │   │   ├── snippet-1.js -│   │   │   ├── snippet-2.js -│   │   │   ├── snippet-3.js -│   │   │   ├── snippet-4.js -│   │   │   ├── snippet-5.js -│   │   │   └── two-sum.js -│   │   ├── B_two_dimensional_arrays_solution -│   │   │   ├── make-matrix.js -│   │   │   ├── print-2d.js -│   │   │   ├── -│   │   │   ├── total-product.js -│   │   │   ├── two-sum-pairs.js -│   │   │   └── zipper.js -│   │   ├── C_more_problems_solution -│   │   │   ├── remove-dupes.js -│   │   │   ├── remove-first-vowel.js -│   │   │   ├── remove-vowels.js -│   │   │   ├── -│   │   │   ├── shorten-long-words.js -│   │   │   └── spam.js -│   │   -│   ├── 06_decomposition_pattern -│   │   ├── A_decomposing_problems_exercise -│   │   │   ├── README.html -│   │   │   ├── README.md -│   │   │   -│   │   ├── B_decomposing_problems_exercise -│   │   │   ├── README.html -│   │   │   ├── README.md -│   │   │   -│   │   ├── C_decomposing_problems_exercise -│   │   │   ├── README.html -│   │   │   ├── README.md -│   │   │   -│   │   -│   ├── 07_objects -│   │   ├── A_objects_exercise -│   │   │   ├── README.html -│   │   │   ├── README.md -│   │   │   -│   │   ├── B_objects_exercise -│   │   │   ├── README.html -│   │   │   ├── README.md -│   │   │   -│   │   ├── C_objects_exercise -│   │   │   ├── README.html -│   │   │   ├── README.md -│   │   │   -│   │   -│   ├── 08_higher_order_functions -│   │   ├── A_native_callback_methods_exercise -│   │   │   ├── README.html -│   │   │   ├── README.md -│   │   │   -│   │   ├── B_native_callback_methods_exercise -│   │   │   ├── README.html -│   │   │   ├── README.md -│   │   │   -│   │   -│   -├── js.js -├── one-of-every-tag.html -├── readme -│   ├── README.html -│   ├── README_files -│   │   ├── katex.min.css -│   │   -│   -├── resources.html -├── resources.md -├── script.js -├── style.css -└── tree.md - -66 directories, 241 files - - - - - -``` -# WEEK 1
*Introduction to JavaScript (Part 1)* {ignore=true} -________________________________________________________________________________ - - - -[**Expression Learning Objectives**](#expression-learning-objectives) -[**Intro to Functions Learning Objectives**](#intro-to-functions-learning-objectives) -- [Hello World](#hello-world) - - [Getting visual feedback in your programs](#getting-visual-feedback-in-your-programs) - - [Code comments](#code-comments) -- [The Number Type](#the-number-type) - - [All the numbers](#all-the-numbers) - - [The basic arithmetic operators](#the-basic-arithmetic-operators) -- [The String Type](#the-string-type) - - [Writing a valid string](#writing-a-valid-string) - - [Calculating length](#calculating-length) - - [Indexing a string](#indexing-a-string) - - [Concatenation](#concatenation) -- [The Boolean Type](#the-boolean-type) - - [Logical Operators](#logical-operators) - - [De Morgan's Law](#de-morgans-law) -- [Comparison Operators](#comparison-operators) - - [The relative comparators](#the-relative-comparators) - - [=== vs ==](#vs) -- [Basic Variables](#basic-variables) - - [Initializing a variable](#initializing-a-variable) - - [Manipulating variables](#manipulating-variables) - - [NaN](#nan) -- [Introduction to Functions](#introduction-to-functions) - - [Writing Functions](#writing-functions) - - [Invoking or "calling" a function](#invoking-or-calling-a-function) - - [Returning a value](#returning-a-value) - - [The importance of naming](#the-importance-of-naming) -- [Parameters and Arguments](#parameters-and-arguments) - - [The difference between Parameters and Arguments](#the-difference-between-parameters-and-arguments) - -[**Control Flow and Array Learning Objectives**](#control-flow-and-array-learning-objectives) -- [Control Flow - Conditional Statements](#control-flow-conditional-statements) - - [A Quick Word on Syntax](#a-quick-word-on-syntax) - - [Writing Conditional Statements](#writing-conditional-statements) -- [Mutually Exclusive Conditions](#mutually-exclusive-conditions) - - [When to use if statements](#when-to-use-if-statements) -- [Control Flow - Looping](#control-flow-looping) - - [Looping](#looping) - - [Translating From One Loop to Another](#translating-from-one-loop-to-another) -- [The Array Type](#the-array-type) - - [Using arrays](#using-arrays) - - [Indexing arrays](#indexing-arrays) - - [Working with arrays](#working-with-arrays) - - [Concatenation with arrays](#concatenation-with-arrays) - -[**Intermediate Functions Learning Objectives**](#intermediate-functions-learning-objectives) -- [Function Expressions](#function-expressions) - - [Functions as first-class objects](#functions-as-first-class-objects) -- [Two-Dimensional Arrays (2D Arrays)](#two-dimensional-arrays-2d-arrays) - - [Multidimensional Arrays](#multidimensional-arrays) - - [Iterating through 2D Arrays](#iterating-through-2d-arrays) - - [When is a 2D array practical?](#when-is-a-2d-array-practical) -- [Mutability in JavaScript](#mutability-in-javascript) - - [What is mutability?](#what-is-mutability) - - [Mutable or immutable, that is the question](#mutable-or-immutable-that-is-the-question) - - [The mutability misconception](#the-mutability-misconception) -- [Array Splice](#array-splice) - - [Notation](#notation) - - [What can Array#splice do?](#what-can-arraysplice-do) -- [String#split and Array#join](#stringsplit-and-arrayjoin) - - [String#split](#stringsplit) - - [Array#join](#arrayjoin) - - [A clever combination](#a-clever-combination) -- [Determining Types](#determining-types) - - [The typeof operator](#the-typeof-operator) - - [How to tell if a value is an array](#how-to-tell-if-a-value-is-an-array) - - [Practical use in "real" code](#practical-use-in-real-code) -- [The Null Type (And Undefined)](#the-null-type-and-undefined) - - [A type with only one value](#a-type-with-only-one-value) - - [The meaning of null](#the-meaning-of-null) - - [The absence of a value](#the-absence-of-a-value) - - [An unknown value](#an-unknown-value) - - [Checking if a value is null](#checking-if-a-value-is-null) - - [Oh, and there's that undefined value, too](#oh-and-theres-that-undefined-value-too) - - [What happens when...](#what-happens-when) -- [Catch Me If You Can](#catch-me-if-you-can) - - [Structured exception handling](#structured-exception-handling) - - [Try and catch](#try-and-catch) - - [How can I make my own errors?](#how-can-i-make-my-own-errors) - - [What else is there?](#what-else-is-there) - - [How do I best use this?](#how-do-i-best-use-this) - - -________________________________________________________________________________ -# WEEK-01 DAY-1
*Function Introduction* {ignore=true} -________________________________________________________________________________ -# Expression Learning Objectives - -Below is a complete list of the terminal learning objectives for this lesson. -When you complete this lesson, you should be able to perform each of the -following objectives. These objectives capture how you may be evaluated on the -assessment for this lesson. - -1. Given a working REPL interface, write and execute a statement that will print - "hello world" using console.log -2. Identify that strings are a list of characters defined by using double or - single quotes -3. Given an arithmetic expression using +, -, \*, /, %, compute its value -4. Given an expression, predict if its value is NaN -5. Construct the truth tables for &&, ||, ! -6. Given an expression consisting of >, >=, ===, <, <=, compute it's value -7. Apply De Morgan's law to a boolean expression -8. Given an expression that utilizes operator precedence, compute its value -9. Given an expression, use the grouping operator to change it's evaluation -10. Given expressions using == and ===, compute their values -11. Given a code snippet using postfix ++, postfix --, +=, -=, /=, \*=, predict - the value of labeled lines -12. Create and assign a variable using `let` to a string, integer, and a - boolean. Read its value and print to the console.l learning objectives for this lesson. -When you complete this lesson, you should be able to perform each of the -following objectives. These objectives capture how you may be evaluated on the -assessment for this lesson. - -1. Given a working REPL interface, write and execute a statement that will print - "hello world" using console.log -2. Identify that strings are a list of characters defined by using double or - single quotes -3. Given an arithmetic expression using +, -, \*, /, %, compute its value -4. Given an expression, predict if its value is NaN -5. Construct the truth tables for &&, ||, ! -6. Given an expression consisting of >, >=, ===, <, <=, compute it's value -7. Apply De Morgan's law to a boolean expression -8. Given an expression that utilizes operator precedence, compute its value -9. Given an expression, use the grouping operator to change it's evaluation -10. Given expressions using == and ===, compute their values -11. Given a code snippet using postfix ++, postfix --, +=, -=, /=, \*=, predict - the value of labeled lines -12. Create and assign a variable using `let` to a string, integer, and a - boolean. Read its value and print to the console. - -________________________________________________________________________________ -# Intro to Functions Learning Objectives - -Below is a complete list of the terminal learning objectives for this lesson. -When you complete this lesson, you should be able to perform each of the -following objectives. These objectives capture how you may be evaluated on the -assessment for this lesson. - -1. Define a function using function declaration -2. Define a function that calculates the average of two numbers, call it, - pass in arguments, and print it's return value -3. Identify the difference between parameters vs argument terminal learning objectives for this lesson. -When you complete this lesson, you should be able to perform each of the -following objectives. These objectives capture how you may be evaluated on the -assessment for this lesson. - -1. Define a function using function declaration -2. Define a function that calculates the average of two numbers, call it, - pass in arguments, and print it's return value -3. Identify the difference between parameters vs arguments -________________________________________________________________________________ -# Hello World - -Hey Programmer! Welcome to the JavaScript module. In the next few sections, -we'll be learning the fundamentals of the JavaScript programming language. If -it's your first time programming, don't worry; we designed this course -especially for you. We'll have you executing your first lines of code in no -time! - -When you finish this article, you should be able to: - -- use the `console.log` command to print out messages -- use double slashes (`//`) to write code comments - -## Getting visual feedback in your programs - -The first command we'll learn in JavaScript is `console.log`. This command is -used to _print_ something onto the screen. As we write our first lines of code, -we'll be using `console.log` frequently as a way to visually see the output of -our programs. Let's write our first program: - -```javascript -console.log("hello world"); -console.log("how are you?"); -``` - -Executing the program above would print out the following: - -```plaintext -hello world -how are you? -``` - -Nothing too ground breaking here, but pay close attention to the exact way we -wrote the program. In particular, notice how we lay out the periods, -parentheses, and quotation marks. We'll also terminate lines with semicolons -(;). - -> Depending on how you structure your code, sometimes you'll be able to omit -> semicolons at the end of lines. For now, you'll want to include them -> just as we do. - -### Syntax - -We refer to the exact arrangement of the symbols, characters, and keywords as -**syntax**. These details matter - your computer will only be able to -"understand" proper JavaScript syntax. A programming language is similar to a -spoken language. A spoken language like English has grammar rules that we should -follow in order to be understood by fellow speakers. In the same way, a -programming language like JavaScript has syntax rules that we ought to follow! - -As you write your first lines of code in this new language, you may make many -syntax errors. Don't get frustrated! This is normal - all new programmers go -through this phase. Every time we recognize an error in our code, we have an -opportunity to reinforce your understanding of correct syntax. Adopt a growth -mindset and learn from your mistakes. - -Additionally, one of the best things about programming is that we can get such -immediate feedback from our creations. There is no penalty for making a mistake -when programming. Write some code, run the code, read the errors, fix the -errors, rinse and repeat! - -## Code comments - -Occasionally we'll want to leave **comments** or notes in our code. Commented -lines will be ignored by our computer. This means that we can use comments to -write plain english or temporarily avoid execution of some JavaScript lines. The -proper _syntax_ for writing a comment is to begin the line with double forward -slashes (`//`): - -```javascript -// let's write another program!!! -console.log("hello world"); - -// console.log("how are you?"); - -console.log("goodbye moon"); -``` - -The program above would only print: - -```plaintext -hello world -goodbye moon -``` - -Comments are useful when annotating pieces of code to offer an explanation of -how the code works. We'll want to strive to write straightforward code that is -self-explanatory when possible, but we can also use comments to add additional -clarity. The real art of programming is to write code so elegantly that it is -easy to follow. - -"Simplicity is prerequisite for reliability." — Edsger W. Dijkstra - -## Remember - -- `console.log` can be used to print to the screen -- using `//` at the front of a line will turn it into a comment; comments are - ignored by JavaScript - -________________________________________________________________________________ -# The Number Type - -The **Number** data type in JavaScript does exactly what you expect! It is used -to represent any numerical values, this includes integers and decimal numbers. -As one of our first data types, we'll be interested in what operations we can -use with numbers. - -When you finish this article, you should be able to: - -- predict the evaluation of arithmetic expressions -- explain the order of operations for JavaScript's arithmetic operators -- use the grouping operator, `()`, to manipulate the order of operations in an - expression - -## All the numbers - -JavaScript's **Number** encompasses numerical values. All of the following values are of number type: - -```javascript -42; --5; -3.14159; -7.0; -``` - -## The basic arithmetic operators - -For any given data type, we're interested in what operations we can perform with -that type. We use the word _operator_ to refer to the symbol that performs a -particular _operation_. For example, the `+` operator performs the addition -operation. Here are the common arithmetic operators in JS: - -- `+` (addition) -- `-` (subtraction) -- `*` (multiplication) -- `/` (division) -- `%` (modulo) - -With number values and arithmetic operators in hand, we can evaluate our first -expressions: - -```javascript -console.log(2 + 3); // => 5 -console.log(42 - 42); // => 0 -console.log(-4 * 1.5); // => -6 -console.log(25 / 8); // => 3.125 -``` - -Nothing too groundbreaking about the results above. An expression consists of -values and operators. JavaScript will evaluate an expression into a single -value. - -We can write more complex expressions using multiple operators. However, we'll -want to be aware of the general math order of operations. That is, we perform -multiplication-division operations first and then addition-subtraction -operations. To force a specific order of operation, we can use the grouping -operator, `( )`, around a part of the expression: - -```javascript -console.log(5 * 3 + 2); // => 17 -console.log(2 + 3 * 5); // => 17 -console.log((2 + 3) * 5); // => 25 -``` - -### The modulo operation - -All of the math operators listed above are the simple operations you use -everyday, except for maybe modulo `%`. **Modulo gives us the remainder that -results from a division.** For example, `10 % 3` is 1 because when we divide 10 -by 3, we are left with a remainder of 1. We can read `10 % 3` as "ten modulo -three" or "ten mod three." - -```javascript -console.log(10 % 3); // => 1 -console.log(14 % 5); // => 4 -console.log(20 % 17); // => 3 -console.log(18 % 6); // => 0 -console.log(7 % 9); // => 7 -``` - -Modulo is a very useful operation in the realm of computers. We can use it to -check the divisibility of numbers, whether numbers are even, whether they are -prime, and much, much more. Don't take this seemingly simple operation from -granted! We'll provide a ton of practice using these modulo patterns as we move through the course. - -In the order of operations, modulo has the the same precedence as -multiplication-division. So our complete order of math operations in JS is -parentheses, multiplication-division-modulo, addition-subtraction. - -```javascript -// modulo has precedence over addition -console.log(4 + 12 % 5); // => 6 -console.log((4 + 12) % 5); // => 1 -``` - -## Remember - -- The **Number** type is used to represent integer and decimal values -- The operators `+`, `-`, `/`, `*` perform the normal math operations of - addition, subtraction, division, multiplication respectively -- `a % b` returns the remainder when we divide `a` by `b`; we call this - operation modulo -- JavaScript follows the usual mathematical order of operations and we can use - the `()` to force precedence - -________________________________________________________________________________ -# The String Type - -This article is about one of JavaScript's primitive data types, **String**. -Strings are what we'll use to represent textual data. This means that strings -are useful in representing things like messages, names, poems, and so on. A -string is a sequence of characters. - -When you finish this article, you should be able to: - -- Write strings using correct syntax -- Use `.length` to obtain a count of the numbers of characters that comprise a - string -- Index a string to refer to a single character -- Concatenate strings together - -## Writing a valid string - -Strings are always wrapped by a pair of single quotation marks (`'`) or by a -pair of double quotation marks (`"`). Between the enclosing quotation marks, we -can put any characters! Here are a six examples of strings: - -```javascript -"potato"; -"New York"; -"azablan@.io"; -"Follow the yellow brick road, please!"; -"365 days a year"; -""; -``` - -Above, notice that we are free to mix in **any** characters into a string. This -includes spaces, numerics, punctuation, and other symbols. The sixth string -above is the empty string; it contains zero characters! - -You are probably wondering why we are allowed to use either single or double -quotes when denoting a string - why is this useful? Maybe we want a string that -_contains_ quotation marks: - -```javascript -// valid strings -'Shakespeare wrote, "To be or not to be"'; -"That's a great string"; -``` - -```javascript -// invalid string -'That's a bad string' -``` - -If we want to use a single quote as a character of a string, we simply need to -enclose the string in double quotes, and vice versa. - -## Calculating length - -Since a single string can contain any number of characters, we may find it -useful to count the number of characters in a string using `.length`: - -```javascript -console.log("ramen".length); // => 5 -console.log("go home!".length); // => 8 -console.log("".length); // => 0 -``` - -## Indexing a string - -Strings consist of multiple characters. These characters are numbered by -**indices** starting at 0. So in the string `'bootcamp'`, `'b'` is at index 0, -`'o'` is at index 1, `'o'` is at index 2, `'t'` is at index 3, and so on. We can -look at particular characters of a string by using `[]` and specifying an index: - -```javascript -console.log("bootcamp"[0]); // => 'b' -console.log("bootcamp"[1]); // => 'o' -console.log("bootcamp"[2]); // => 'o' -console.log("bootcamp"[3]); // => 't' -console.log("bootcamp"[7]); // => 'p' -console.log("bootcamp"[10]); // => undefined -console.log("bootcamp"[-3]); // => undefined -``` - -In general, when we index a string using the expression `string[i]`, we get back -the **single character** at position `i`. Looking at the last two examples -above, if we use an invalid index with a string, the value returned is -`undefined`. This makes since because there is no character at the given -position! It's also worth mentioning that an index should always be a number. - -### The classic "off by one" error - -Bear in mind that indices begin at 0 and not 1! Forgetting this nuance can lead -to incorrect code for both new and experienced programmers alike. Let's hone in -on an important distinction: the index of the last character of a string is -always one less than it's length. - -```javascript -console.log("cat".length); // => 3 -console.log("cat"[3]); // => undefined -console.log("cat"[2]); // => 't' -``` - -In other words, although the `length` of `'cat'` is 3, the index of the last -character (`'t'`) is 2. - -### Using indexOf - -We can also calculate the index of a given character within a string by using -`indexOf`: - -```javascript -console.log("bagel".indexOf("b")); // => 0 -console.log("bagel".indexOf("a")); // => 1 -console.log("bagel".indexOf("l")); // => 4 -console.log("bagel".indexOf("z")); // => -1 -``` - -If we attempt to search for a character that is **not** present in a string, -`indexOf` will return -1. This makes sense because we know that -1 is not a -valid string index. The smallest index possible is 0! - -If we search for a character that appears more than once in a string, -`indexOf` will return the index of the first occurance of that character. - -We can also use `indexOf` to search for a substring of characters. Under this -circumstance, `indexOf` will return the index where the substring begins in the -main string: - -```javascript -console.log("door hinge".indexOf("oor")); // => 1 -console.log("door hinge".indexOf("hi")); // => 5 -console.log("door hinge".indexOf("hint")); // => -1 -``` - -## Concatenation - -Concatenation is just a fancy word for joining strings together into a single -string. To concatenate strings, we use the `+` operator: - -```javascript -console.log("hello" + "world"); // => 'helloworld' -console.log("goodbye" + " " + "moon"); // => 'goodbye moon' -``` - -## Remember - -- a **String** is a data type that contains multiple characters enclosed in - quotation marks -- `string.length` returns the number of characters in the `string` -- each character of a string is associated with a number index; the first - character of a string is at index 0 -- we can use `string.indexOf(char)` to obtain the index of `char` within - `string`; if `char` is not found, then -1 is returned -- we can use `+` to concatenate multiple strings, combining them into a single - string - -________________________________________________________________________________ -# The Boolean Type - -The **Boolean** data type is perhaps the simplest type since there are only two -possible values, `true` and `false`. However, we'll find booleans very useful -because they will act as components of later concepts. As programmers, we'll use -booleans to describe the validity of statements. In an abstract sense, _"Today -is Monday"_ and _"one plus one equals ten"_ are examples of statements with -boolean values. That is, they are either `true` or `false`. - -When you finish this article, you should be able to: - -- predict the evaluation of expressions that use the boolean operations of `!`, - `||`, and `&&` -- explain DeMorgan's law - -## Logical Operators - -In the long run, we'll be using booleans to establish logic in our code. For -this reason, the _boolean operators_ can also be referred to as the _logical -operators_. There are only three such operators: - -- `!` (not) -- `&&` (and) -- `||` (or) - -### Logical NOT - -The not (`!`) operator will reverse a boolean value: - -```javascript -console.log(!true); // => false -console.log(!false); // => true -console.log(!!false); // => false -``` - -It's worth mentioning that `!` is a unary operator. This means that the not -operation is applied to a single value. This is in contrast to a binary operator -such as multiplication, which is applied between two values. It does not make -sense to `!` two values together. - -### Logical AND - -The and (`&&`) operator will take two boolean values and will only evaluate to -`true` when both input values are `true`. Otherwise, it will return `false`: - -```javascript -console.log(false && false); // => false -console.log(false && true); // => false -console.log(true && false); // => false -console.log(true && true); // => true -``` - -### Logical OR - -The or (`||`) operator will take two boolean values and will only evaluate to -`false` when both input values are `false`. Otherwise, it will return `true`: - -```javascript -console.log(false || false); // => false -console.log(false || true); // => true -console.log(true || false); // => true -console.log(true || true); // => true -``` - -### Logical order of operations - -We can write boolean expressions that consist of multiple logical operations, but we should be aware of the order of operations. JavaScript will evaluate `!` then `&&` then `||`. - -```javascript -console.log(true || true && false); // => true -console.log(false && !(false || true)); // => false -``` - -In general, `A || B && C` is equivalent to `A || (B && C)` where `A`, `B`, `C` are booleans. - -## De Morgan's Law - -A common mistake in boolean logic is to incorrectly distribute `!` across parentheses. Say we had boolean values of `A`, `B`. Here is something to remember: - -* `!(A || B)` is equivalent to `!A && !B` -* `!(A && B)` is equivalent to `!A || !B` - - -In other words, to correctly distribute `!` across parentheses, we must also flip the operation within parentheses. Beware that: - -* `!(A || B)` is not equivalent to `!A || !B` -* `!(A && B)` is not equivalent to `!A && !B` - -We call this property **De Morgan's Law**. Shout out to Augustus De Morgan of Great Britain. - -## Remember - -* `!`, `&&`, `||` are the boolean operators that we can use to establish logic in our code -* De Morgan's Law should be used to distribute `!` against parentheses - -These are just the basics of the type. We'll be seeing more booleans in the upcoming section, so stay tuned for that! - -________________________________________________________________________________ -# Comparison Operators - -In our previous introduction to the boolean data type, we described booleans as -way to represent the validity of an expression. We'll continue this conversation -by exploring **comparison** operators. As you learn about these operators, bear -in mind that all comparisons will result in a boolean, `true` or `false`. - -When you finish this article, you should be able to: - -- Predict the result of expressions that utilize the operators `>`, `<`, `>=` - `<=`, `===`, and `!==` -- Explain the difference between the equality operators `==` and `===` - -## The relative comparators - -- `>` (greater than) -- `<` (less than) -- `>=` (greater than or equal to) -- `<=` (less than or equal to) -- `===` (equal to) -- `!==` (not equal to) - -Using these operators is pretty straightforward. Here are a few examples: - -```javascript -console.log(10 > 5); // => true -console.log(10 < 5); // => false -console.log(1 < 7); // => true -console.log(7 <= 7); // => true -console.log(5 === 6); // => false -console.log(5 !== 6); // => true -console.log("a" !== "A"); // => true -console.log(false === false); // => true -``` - -Notice that a comparison expression always evaluate to a boolean value (`true` -or `false`). Comparison operators like `===` are a useful to compare strings, -booleans, etc. not just numbers. - -**Did you know?** `'a' < 'b'` is valid JS code? When you relatively compare -strings using `>` or `<` you will be comparing them lexicographically. -Lexicographically is fancy shmancy talk for "dictionary" order! A "lesser" -string is one that would appear earlier in the dictionary: - -```javascript -console.log("a" < "b"); // => true -console.log("apple" < "abacus"); // => false -console.log("app" < "apple"); // => true -console.log("zoo" > "mississippi"); // => true -``` - -**Gotcha** capitilized letters are considered lexicographically less than -lower case letters. i.e "A" < "z" // => true. - - -## === vs == - -In JavaScript there are two equality operators triple-equals (`===`) and -double-equals (`==`). The operators differ in how they compare across differing -types. Triple-equals performs the _strict equality_, meaning it will only return -`true` if the types are the same. Double-equals performs the _loose equality_, -meaning it can return `true` even if the values are of different type. -Double-equals may _coerce_ a value into another type for the comparison, and -this behavior is hard to predict: - -```javascript -console.log(5 === "5"); // false -console.log(5 == "5"); // true -console.log(0 === false); // false -console.log(0 == false); //true -``` - -Whoa! Surprised by these results? It can be hard to predict how `==` behaves, so -we will avoid using it in this course and as a best practice. Stick to using -`===` because it respects data types. - -## Remember - -- `>`, `<`, `>=`,`<=`, `===`, and `!==` can be used to compare values -- we prefer to use `===` to check for equality because it takes the type into - account. - -________________________________________________________________________________ -# Basic Variables - -Variables are used to store information to be referenced and manipulated in a -computer program. They also provide a way of labeling data with a descriptive -name, so our programs can be understood more clearly by programmers. It is -helpful to think of variables as containers that hold information. Their sole -purpose is to label and store data in computer memory. This data can then be -used and even changed throughout the lifetime of your program. - -When you finish this reading, you should be able to: - -- declare variables using the `let` keyword -- assign values to variables using the assignment operator (`=`) -- use the shortcuts `+=`, `-=`, `++`, `--` to reassign variables -- identify `undefined` as the default value for unassigned variables - -## Initializing a variable - -To initialize a variable in JavaScript we'll need two new pieces of syntax: -`let` and `=`. We can give the variable any name that we wish and assign it a -value. Once we initialize a variable, the variable will evaluate to the value -assigned: - -```javascript -let bootcamp = ""; -console.log(bootcamp); // '' - -let birthYear = 2012; -console.log(birthYear); // 2012 -``` - -**Did you know?** JavaScript variables names can contain any alphanumeric -characters, underscore (\_), or dollar sign (\$). However, they _cannot_ begin -with a number. - -Above are examples of how you'll create variables most of the time, so we'll -grow very familiar with the syntax. As a best practice, we should name our -variables in a way that is descriptive and concise. - -The variable initializations above really consist of two steps: _declaration_ -with `let` and _assignment_ with `=`. Let's break these two steps down. - -### Declaring a variable - -In JavaScript, in order to use a variable, we must _declare_ it. Variable -**declaration** is the act of introducing the variable to the environment. - -To declare a variable, use the `let` keyword, followed by a space and then the -name of the variable. - -```javascript -let bootcamp; -console.log(bootcamp); // undefined -``` - -Once a variable is declared, it will contain `undefined` as it's value. -`undefined` is a common default value in JavaScript, we'll see it come up in a -few different places. You can think of `undefined` as showing that the variable -is empty. - -### Assigning a variable - -Once a variable has been declared, we can assign it a value using single-equals -`=` : - -```javascript -let bootcamp; -console.log(bootcamp); // undefined -bootcamp = ""; -console.log(bootcamp); // '' -``` - -## Manipulating variables - -To change the value of a variable, we need to reassign it to a new value with -`=` : - -```javascript -let num = 42; -console.log(num + 8); // => 50 -console.log(num); // => 42 - -num = num + 10; -console.log(num); // => 52 -``` - -In the code above, `num + 8` will evaluate to `50`, but it will not change the `num` -variable to `50`. If we want to change the `num` variable, we must reassign to -it. - -### Assignment Shorthand - -Changing the value of a number variable is something fairly common in the -programming world. Luckily there is some shorthand operators we can use: - -```javascript -let number = 0; -number += 10; // equivalent to number = number + 10 -number -= 2; // equivalent to number = number - 2 -number /= 4; // equivalent to number = number / 4 -number *= 7; // equivalent to number = number * 7 -console.log(number); // 14 -``` - -We also have other shorthand to add or subtract exactly 1 from a variable, the -increment (`++`) and decrement (`--`) operators: - -```javascript -let year = 3004; -year++; -console.log(year); // 3005 -year--; -console.log(year); // 3004 -``` - -## NaN - -Now that we have the ability to perform arithmetic with variables, let's take a -look at a common programming mistake, getting a result of `NaN` (not a number): - -```javascript -let num; -console.log(num + 3); // NaN -``` - -The above code gives `NaN` because the unassigned `num` variable contains -`undefined`; adding `3` to `undefined` results in `NaN`. In general, any -nonsensical arithmetic will result in `NaN`. Math operations involving -`undefined` is perhaps the most common mistake: - -```javascript -console.log(undefined + 3); // NaN -console.log("fish" * 2); // NaN -``` - -## Remember - -- variables are declared with `let` and will contain the value `undefined` by - default -- we can use single-equals `=` to assign variables -- changing a variable requires a reassignment, for which there are many - shortcuts for (`+=`, `-=`, etc.) - -________________________________________________________________________________ -# Introduction to Functions - -We hope you are ready - because you are on the brink of one of the most fun -parts of writing JavaScript: writing **functions**. A function is a procedure of -code that will run when called. We only "write" a function once (**function -declaration**), but we can "use" it as many times as we please (**function -calls**). Functions are the fundamental building blocks of JavaScript and -mastering them is a big step on the road to JavaScript mastery. - -When you finish this reading, you should be able to: - -1. Describe what a function in JavaScript is. -2. Demonstrate how to invoke a function. -3. Write a function using function declaration. -4. Use the `return` keyword to return a value from a function. - -## Writing Functions - -A function is a set procedure of code that will run when called. Functions -really start to make sense when put in the perspective of solving problems. So -for example say you want to find the average of two given numbers. Meaning we -want to take two numbers, add them together then divide by 2: - -```js -> (5 + 5) / 2 -5 - -> (15 + 3) / 2 -9 - -> (7 + 2) / 2 -4.5 -``` - -Writing out the same code again and again gets tedious fast. What you can do -instead is write a new _function_. - -### Function Declaration - -A _function definition_ consists of the function keyword, followed by three -things: - -1. The **name** of the function. -2. A list of _parameters_ to the function, enclosed in parentheses, `()`. -3. The code to be run when this function is run, enclosed in curly - brackets,`{ }`. - -So for our above example of averaging two numbers we could write a function that -would do that for us! We would write something like the following: - -```js -// 1. average is the name of the function -// 2. number1 & number2 are the parameters being passed in -function average(number1, number2) { - // 3. this is the code run every time this function is used - return (number1 + number2) / 2; -} -``` - -First thing to notice for the above `average` function is that we didn't use any -_real_ numbers. You always want to write functions to accept as wide a range of -data as possible. Utilizing the incoming _parameters_ to a function is one of -the keys to making functions flexible. - -In the case of the `average` function, we want to use it to calculate the -average of any two numbers. `number1` and `number2` are the _parameters_ for the -`average` function. In other words, the `average` function expects to be given -two numbers, `number1` and `number2`. We'll be talking a lot more about -parameters later - but for now know that when you define a function with -parameters you are declaring those parameters as usable variables within that -function. - -The beauty of a function is that if we define it in a clever way, it will work -on a whole slew of data! For example, we want `average` to work on any two -numbers, whether or not they are whole numbers, decimal, negative, etc. - -## Invoking or "calling" a function - -Now that we've written a function how do we actually use it? Once defined a -function can be invoked or "called" as many times as we please. - -### Order of code - -Let's step away from `average` for a bit to see how a simple function call -works. Say we run JavaScript code that looks like this: - -```js -console.log("First!"); - -console.log("Second!"); -``` - -Running this code will return exactly as we expect. We will see `First!` printed -out, followed by `Second!`. In other words, JavaScript will evaluate your code -left-to-right and top-to-bottom. Very intuitive! It's exactly how you are -reading these notes right now. - -However, when JavaScript sees a function definition, JavaScript will **not** -evaluate the code inside of the definition. It will only "remember" the code so -we can execute it later. The code below only prints `First!` followed by -`Fourth!`: - -```js -console.log("First!"); - -function callMe() { - console.log("Second!"); - console.log("Third!"); -} - -console.log("Fourth"); - -// when run this code is ran it will print out: -// "First!" -// "Fourth" -``` - -To actually get the code within `callMe` to evaluate, we must _call_ it by using -`callMe()`. The code below will now print out in order: - -```js -function callMe() { - console.log("Second!"); - console.log("Third!"); -} - -console.log("First!"); -// we call the function by adding ending parenthesis -callMe(); -console.log("Fourth!"); - -// when run this code is ran it will print out: -// "First!" -// "Second!" -// "Third!" -// "Fourth" -``` - -Let's say JavaScript is running the file above. Here are the steps it would -take, starting from the tippy top of the code: - -1. JS sees a definition for `callMe`. It will remember this definition in case - we call the function later. It will **not** evaluate the code inside the - function yet. -2. JS prints out `First!` -3. JS sees that we are calling `callMe()`. At this point it will look at the - prior `callMe` definition and run the code inside. It is as if we are - "jumping" to inside the function definition. This means it will print - `Second!` followed by `Third!` -4. JS sees there is no more code to be run inside of `callMe`, so it "jumps" - back to where we originally called `callMe()` -5. JS will continue evaluating in order and print `Fourth!` - -### An average example - -So a declared function is "saved for later use", and will be executed later, -when it is called, also known as being **invoked**. So thinking back to our -average function we can declare the function and then _invoke_ it. - -When we specify what data to use for a function call, we refer to that process -**passing arguments to the function**. - -```js -// this is a function definition -function average(number1, number2) { - return (number1 + number2) / 2; -} - -// this is a function call with the arguments being 15 & 3 -> average(15, 3) -9 - -// this is a function call with the arguments being 5 & 5 -> average(10, 5) -7.5 -``` - -When we call the function `average(15, 3)`, we run the code inside the -_definition_ for `average`. That is, we plug in the parameters with real numbers -(`number1` becomes `10` and `number2` becomes 16). Think of `number1` and -`number2` as _variables_ that contain the values we pass in when we called the -function. Then we proceed by running the code inside the function. The parameter -names `number1` and `number2` used through the body of the function and behave -like variables. - -## Returning a value - -Now that we know how functions are declared and invoked let's talk about the -inside of the function. We'll start with a statement: _Every function in -JavaScript returns `undefined` unless otherwise specified._ - -Now what does that mean? We'll start with a simple example: - -```js -function sayNumber(number) { - console.log(number); -} - -> sayNumber(1); // prints 1 -1 -undefined -``` - -So what happened there? Let's do a quick step by step: - -1. We declared the `sayNumber` function -2. `sayNumber` was called handing in the argument of 1 -3. The `number` parameter is printed to the console -4. Then the function ends without encountering a `return` statement. Since - nothing was specifically returned then the function returned the default - value for a function which is `undefined`. - -Now let's change our above example to use the keyword `return` to return a -value: - -```js -function sayNumber(number) { - console.log(number); - return true; -} - -> sayNumber(1); -1 // sayNumber still prints 1 -true // but now sayNumber returns as true -``` - -Let's go back to our previous `average` function and talk about the `return` we -used there: - -```js -function average(number1, number2) { - return (number1 + number2) / 2; -} - -// the function call for average(10, 16) will return 13 -// so the result variable will be set to 13 -let result = average(10, 16); - -// if we want to check what a function returns we can do this: -console.log(result); // prints `13` - -// we could alternatively do this: -console.log(average(10, 16)); -``` - -When we _call_ a function, we jump to the function definition and run the code -inside. When we hit a `return` statement, we immediately **exit** the function, -jump back to where we _called_ the function, and evaluate the function call to -the value it _returned_. - -**Every function call evaluates to it's return value!** In other words, the -expression `average(10, 16)` evaluates to `13` just like how the expression -`1 + 1` evaluates to `2`. - -Another important rule of the return statement is that it stops function -execution immediately. This means that any code after a `return` will not be -executed! - -```js -function average(number1, number2) { - let sum = number1 + number2; - return sum; - // anything under the first return will not be executed - console.log("this will not run") - return false; -} - - // when the first return is encountered the entire function will return a value -> average(2, 7); -9 -``` - -So the three things to remember about return statements is: - -1. Every function call evaluates to it's return value. -2. Every function in JavaScript returns `undefined` unless a `return` is - specified -3. Once a `return` statement is encountered the function will immediately stop - and return the value, ignoring any code below the `return` statement. - -## The importance of naming - -A quick but very important side note about good naming. Take this to heart right -now: **Good names are important**. Do yourself, and every other programmer -reading your code, a favor by always using significant function and variable -names. - -For example, `x` is a very non-descriptive name for a variable or function. As -we tackle more complicated problems and our code grows to be more complex, we -are likely to forget what badly named variables originally stood for and what -their purpose was. Non-descriptive names make our code error-prone. **Great code -reads like English and almost explains itself.** As programmers, our goal is to -write code that is not only "correct", but also elegant, readable, and -maintainable! Hold yourself to this high standard. - -As far as syntax goes in JavaScript we always name our functions and variables -`camelCase` for multiple words. (Ex: `tipCalculator`, `currentNumber`, -`puppyPartyFinder`). Other languages use other conventions so it's best to pick -up the standard for your chosen language and stick with it. - -## Review - -By writing a function we can reuse code over and over again to solve similar -problems with different input data (arguments). This will make your life easier -and allow you to start working on more complex problems. - -This reading covered: - -- How to define and invoke a function in JavaScript. -- How to use the `return` keyword to return a value from a function. -- Writing readable JavaScript code by using significant names and following - `camelCase` conventions for multiple word variables and functions - -________________________________________________________________________________ -# Parameters and Arguments - -When talking about functions one of the first things we mentioned was the word -_parameters_. In this reading we will be covering what exactly a parameter is - -as well as the differentiation between _parameters_ and _arguments_. - -When you finish this reading, you should be able to: - -1. Identify the difference between parameters and arguments. -2. Write a function that utilizes declared parameters. -3. Invoking a function with passed in arguments. - -## The difference between Parameters and Arguments - -Let's start off by talking about the difference between _arguments_ and -_parameters_ and how to identify which is which. - -1. **Parameters** are comma separated variables specified as part of a - function's declaration. -2. **Arguments** are values passed to the function when it is invoked. - -So by defining _parameters_ when we declare our function we are effectively -setting accessible variables within the function: - -```js -function add(firstParameter, secondParameter) { - console.log(firstParameter + secondParameter); -} - -// the add function declares two parameters -> add(1, 2); //=> 3 -``` - -In the above example we declared our parameters when we declared our function. -Now _arguments_ work slightly differently - when the function is invoked we are -passing in _arguments_. So in the above example when we invoked `add(1, 2)` the -`(1,2)` were the _arguments_ being passed in. So when a function is invoked the -value of the declared parameters is assigned to the passed in _arguments_. - -You can think of it _parameters_ and _arguments_ like a recipe. A recipe is a -list of ingredients (_parameters_) and list of steps (the code to be run). When -someone cooks the recipe (_invokes_ the function) they add the ingredients they -actually have(_arguments_). The result of cooking the recipe is the delicious -`return` value! - -### Extra arguments - -In JavaScript a function will not throw an error if the number of _arguments_ -passed during a function invocation is different than the number of parameters -listed during function declaration. This is very important to know! - -Let's use the above function to demonstrate: - -```js -function add(firstParameter, secondParameter) { - console.log(firstParameter + secondParameter); -} - -// this will ignore the 17 & 14 -// the first two arguments passed in will be assigned to the first two parameters -> add(1, 2, 17, 14); //=> 3 -``` - -Notice in the above example we passed in 4 arguments (1, 2, 17, 14) to `add`. -Since the function was only looking for two parameters that is all it uses. - -### Not enough arguments - -Now what happens if we pass in less arguments then needed? - -```js -function add(firstParameter, secondParameter) { - console.log(firstParameter + secondParameter); -} - -> add(5); //=> NaN -``` - -Whoa what happened there? Let's do a play-by-play: - -1. `firstParameter` was set to equal the first passed in argument which in the - above case is 5. -2. Since there is no second argument then `secondParameter` is declared as a - variable but is set to the default value of `undefined`. -3. The function then tries to add 5 to `undefined` which is definitely not a - number! So we get `NaN` (which means `Not A Number`) printed to the console. - -As you write more functions you'll grow very comfortable using both arguments -and parameters to accomplish your function's goal. - -## Review - -- Parameters are variables defined as a part of a function's declaration. -- Arguments are values passed to the function when it is invoked. -- JavaScript functions can intake a different number of arguments than the - number of parameters listed during function declaration. - -________________________________________________________________________________ -# WEEK-01 DAY-2
*Control Flow* {ignore=true} -________________________________________________________________________________ -# Control Flow and Array Learning Objectives - -Below is a complete list of the terminal learning objectives for this lesson. -When you complete this lesson, you should be able to perform each of the -following objectives. These objectives capture how you may be evaluated on the -assessment for this lesson. - -1. Define a function that accepts a sentence string and two words as args. The - function should return a boolean indicating if the sentence includes either - word. -2. Identify a pair of mutually exclusive conditions -3. Given a for loop, translate it into a while loop, and vice-versa -4. Write a function that iterates through a provided string argument -5. Given a description of pig latin, write a function that takes in a string - argument and utilizes String#slice to translate the string into pig latin. -6. Write a function that takes in an array of words and a string as arguments - and returns a boolean indicating whether the string is located inside of the - array. The function must use Array#indexOf. -7. Define that an array literal is an ordered list of values defined by using - bracket and individual values are read by indexing. -8. Prevent code that can throw an exception from causing the program to crash. the terminal learning objectives for this lesson. -When you complete this lesson, you should be able to perform each of the -following objectives. These objectives capture how you may be evaluated on the -assessment for this lesson. - -1. Define a function that accepts a sentence string and two words as args. The - function should return a boolean indicating if the sentence includes either - word. -2. Identify a pair of mutually exclusive conditions -3. Given a for loop, translate it into a while loop, and vice-versa -4. Write a function that iterates through a provided string argument -5. Given a description of pig latin, write a function that takes in a string - argument and utilizes String#slice to translate the string into pig latin. -6. Write a function that takes in an array of words and a string as arguments - and returns a boolean indicating whether the string is located inside of the - array. The function must use Array#indexOf. -7. Define that an array literal is an ordered list of values defined by using - bracket and individual values are read by indexing. -8. Prevent code that can throw an exception from causing the program to crash. - -________________________________________________________________________________ -# Control Flow - Conditional Statements - -So far the code you've written has been pretty direct in it's intent. You can -define functions and variables but, so far the functions you've created haven't -been able to do that much for you _yet_. It's time to start writing functions -that can do things _conditionally_ by utilizing _control flow_. - -In simple terms - **control flow** is the order in which instructions are -executed within a program. One modifies control flow using _control structures_, -expressions that alter the control flow based on given parameters. The control -structures within JavaScript allow the program flow to change within a unit of -code or a function. - -This reading will be covering one of the two main _control structures_ you -will use time and time again - _Conditional statements_. _Conditional -statements_ are used to perform different actions based on different conditions. - -When you finish this reading, you should be able to: - -- Write `if`, `else if`, `if...else` conditional statements. -- Know that conditional statements can have only one `if` and one `else` - statement. -- Identify that conditional statements can be nested. - -## A Quick Word on Syntax - -Before we get started we'll quickly go over the terms we'll be using to -represent syntax. - -1. `[ ]` are square **brackets** -2. `{ }` are curly **braces** -3. `( )` are **parentheses** - -## Writing Conditional Statements - -Conditional Statements are the second fundamental _control structure_ for -writing JavaScript and are pretty straight forward. The simplest conditional -statement is the `if` statement. An `if` statement has two parts, the _test -expression_ (the code that immediately follows the `if` which goes in -parentheses), and the _then expression_ (this code belongs in braces after the -`if` expression). The _then_ expression will only run when the `if` expression -is truthy. - -Here is an example of a simple `if` statement: - -```js -// this is the test expression -if (3 === 3) { - // this is the then expression - // this code will run if the above statement is true - console.log("this is a three!"); -} -``` - -The `if` statement above allows you to specify what should happen if your -particular expression evaluates to true. You can chain additional _test -expressions_ onto this `if` statement by using a `else if` statement. - -The syntax for `else if` is very similar as an `if` statement: - -```js -function mathFun() { - let x = 2 + 3; - - if (x === 3) { - console.log("we have a 3"); - } else if (x === 4) { - // this code will run if the above statement is true - console.log("we have a 4"); - } else if (x === 5) { - // this code will run if the above statement is true - console.log("we have a 5"); - } -}; - -mathFun(); // => "we have a 5" -``` - -The `else if` and `if` statements do not, however, provide the option to specify -something else that should happen in the event that all of the above expressions -evaluate to be `falsey`. The `if...else` statement reads just like English. The -JS interpreter will execute the `else` statement if all the above conditions -given are `falsey`. See below for an example: - -```js -function mathFun() { - let x = 19; - if (x === 3) { - console.log("we have a 3"); - } else if (x === 4) { - console.log("we have a 4"); - } else { - console.log("I will return if everything above me is falsey!"); - } -}; - -mathFun(); // => "I will return if everything above me is falsey!" -``` - -You can chain an arbitrary number of `else if` statements but there can only be -one `if` statement and one optional `else` statement. The `if` introduces the control -structure and the `else` acts as a fail safe to catch everything that didn't -meet the above conditions. - -Only one _then expression_ is ever executed in an `if`, `if...else`, or -`if...else` statement. If one of the _test expressions_ is truthy, then the -result of its _then expression_ is the result of the **entire** conditional -statement: - -```js -let x = 3; -if (x === 3) { - console.log("this will run"); -} else { - console.log("this will not run"); -} -``` - -Additionally, you can nest conditional statements within each other but it will -get hard to read pretty quickly and is discouraged: - -```js -function mathFun(x) { - if (x === "math") { - if (x === "math" && x[0] === "m") { - if (x[1] === "a") { - console.log("this got confusing fast"); - } else { - console.log("that is not math!"); - } - } else { - console.log("that is for sure not math!"); - } - } else { - console.log("I will return if everything above me is false!"); - } -}; - -mathFun("math"); // => "this got confusing fast" -``` - -## Review - -- Conditional statements allow us to control what actions should be taken based - on a boolean (truthy or falsey) expression -- In a chain of _then expressions_ (`if...else if...else`), only one of the - _then expressions_ will be executed. -- Conditional statements can have only one `if` and one `else` statement. -- Conditional statements can be nested. - -________________________________________________________________________________ -# Mutually Exclusive Conditions - -You have now learned how to write conditional statements. Now we'll talk a -little bit more about how to write them using best practices. - -When you finish this reading, you should be able to: - -- Identify a pair of mutually exclusive conditions. - -## When to use if statements - -Say you are given the challenge to write a function that that will call another -function named `bigNumber` if the given argument is **greater** than 100 or call -a function named `smallNumber` if it the given argument is smaller. You could -write a function to do that which would look like this: - -```js -function numberSeparator(number) { - if (number < 100) { - // number is smaller than 100 so we invoke smallNumber - smallNumber(); - } - if (number === 100) { - // number is equal to 100 so we invoke smallNumber - smallNumber(); - } - if (number > 100) { - // number is larger than 100 so we invoke bigNumber - bigNumber(); - } -} -``` - -As you can probably tell the above function uses a lot of code to do a simple -task. To be clear the function above would work for our aim - but it repeats -itself. There is an age old principal for writing good code named **DRY** or -**Don't repeat yourself**. As good programmers we always want our code to be -clear, concise, and efficient. - -A general rule of thumb is that if you are working with a condition that is -**mutually exclusive**, meaning if one condition is true the other condition -must be false, then you should use an `if/else` statement. You can also think of -**mutually exclusivity** like a coin flip - it can be either heads or tails but -not both. - -Going back to the original problem at hand we can see it makes intuitive sense -with the way the challenge is phrased: If the number is larger than 100 then -we'll call `bigNumber`, otherwise we invoke is `smallNumber`. - -So let's rewrite the above function to read a little more clearly: - -```js -function numberSeparator(number) { - if (number > 100) { - bigNumber(); - } else { - smallNumber(); - } -} - -// this also works -function numberSeparator(number) { - if (number <= 100) { - smallNumber(); - } else { - bigNumber(); - } -} -``` - -Look at how much clearer that is! Writing good code is an art - devote yourself -to becoming an artist! - -## Review - -- How to identify a pair of mutually exclusive conditions. -- DRY - don't repeat yourself! - -________________________________________________________________________________ -# Control Flow - Looping - -A quick reminder before we start - **control flow** is the order in which -instructions are executed within a program. One modifies control flow using -_control structures_, expressions that alter the control flow based on given -parameters. This reading will be covering the second of the main _control -structures_ you will use time and time again - _loops_. - -When you finish this reading, you should be able to: - -1. Know how to write a `while` loop and a `for` loop. - - Know how to convert a `for` loop into a `while` loop -2. Know that index variables conventionally start at zero. -3. Explain what an _iteration_ is. - -## Looping - -Imagine you are at a friend's house and your friend has six dogs. Someone left -the back gate open and all the dogs go out in the yard and get super muddy. Now -your friend wants to clean their dogs but they only have one bathtub! You can't -wash all the dogs at once. So the only option is to give the dogs a bath one at -a time until they are all clean. When you start 0 dogs are clean and 6 dogs are -dirty. - -_While_ there are still dirty dogs you still have a job to do. That is your -**condition** - you will stop giving baths once all 6 dogs are clean. So after -one bath you you have 1 clean dog and 5 dirty dogs. You've -_incremented_(increased by one) your number of clean dogs. After each bath you -check your **condition** again until you have 6 clean dogs so you know you can -stop! - -What we've described above is the idea of looping - setting a condition, -executing an action, doing something to make sure our condition will be met -eventually, and rechecking our condition before executing our next action. - -Loops are a fundamental _control structure_ for writing JavaScript. -Loops will repeatedly execute a section of code while a condition is true. Loops -are simple to write and incredibly powerful! There are many variations of loop -but we will be covering the two most fundamental loops now - **while** loops and -**for** loops. - -### While Loops - -One of the simplest loops in `JavaScript` is the `while` loop. As with all -loops, the `while` loop will execute a block of code as long as a specified -condition is true. The while loop starts with the keyword `while` then states a -condition in parentheses. The code in the following braces will be run until the -above condition is met. - -```js -while (condition) { - // code block to be executed -} -``` - -In the following example, the code in the loop will run, over and over again, as -long as a variable (`index`) is less than 10: - -```js -let index = 0; - -// this is the condition that will be checked every time this loop is run -while (index < 10) { - console.log("The number is " + index); - // this is common shorthand for index = index + 1 - index++; -} -``` - -The most important thing to remember when writing any loop is to always be -working towards your condition. In the example above if we did not increment the -`index` variable by 1 each time the loop ran then we would be stuck with what we -call an **infinite loop**: - -```js -let index = 0; - -// this is an infinite loop because our condition will never be met -while (index < 10) { - console.log("The number is " + index); - // if we do not increase the index then our condition is never met - // Meaning this will run forever! -} -``` - -The above code will run until whatever interpreter you are using crashes. - -### Important Loop Knowledge - -A quick word before we learn about the next loop. - -The _index_ is the traditional word for the variable that keeps track of how -many times the loop has been run. Don't write loops with indices starting at -one; you'll confuse other programmers and yourself. Indices have started at zero -for a long time, and for good reason. It's much easier to use loops that start -with an index of zero because Array and String indices also start at zero. - -```js -let array = [0, 1, 2]; -let index = 0; - -while (index < array.length) { - console.log( - "Both the index and the current array position are " + array[index] - ); - index++; -} -``` - -In the above code we will do one loop for each digit in the Array above. We call -each of those loops an "iteration". An iteration is the act of repeating a -procedure, hence looping is an **iterative** technique. Each repetition itself -is also called an "iteration." So you can use loops to _iterate_ through Arrays -and Strings. - -### For Loops - -A `for` loop can be broken down into three sections: - -1. The _initial expression_ which will be run once at the beginning of the loop. -2. The _condition_ which is checked every time the loop is run. If this - condition is true the loop will run again. If this condition is false the - loop will end. -3. The _loopEnd expression_ which will be run at the end of the loop before - checking the _condition_ again. - -```js -for (;;) -``` - -The `for` loop is usually used with an integer counter: - -```js -for (let index = 0; index < 10; index += 1) { - // the code inside this block will run 10 times -} -``` - -While the _loopEnd expression_ is normally used to increase a variable by one -per loop iteration, it can contain any statement, such as one that decreasing -the counter, or increasing it by 2. - -You can use the `for` loop to iterate through all kinds of things. Check out the -example below for how to iterate through a String: - -```js -let testString = "testing"; - -// we can use the testString's length as our condition! -// Since we know the testString's index starts at 0 -// and our index starts at 0 we can access each letter: -for (let index = 0; index < testString.length; index += 1) { - let letter = testString[index]; - console.log(letter); -} -``` - -These are the most basic types of loops. If all else fails, you can always fall -back on these two loops. All the other loop forms are just more convenient forms -of these basic loop styles. - -## Translating From One Loop to Another - -So far we have covered both `while` and `for` loops. Once you understand the -concept of looping it's easy to translate one loop to another: - -```js -// these two do the exact same thing! -function forLoopDoubler (array) { - // it is convention to shorten index to just i in most cases - for (let i = 0; i < array.length; i++) { - array[i] = array[i] * 2; - } - return array; -}; - -function forLoopDoubler (array) { - let i = 0; - while (i < array.length) { - array[i] = array[i] * 2; - i++; - } - return array; -}; - -forLoopDoubler([1, 2, 3]); // => [2,4,6] -whileLoopDoubler([1, 2, 3]); //=> [2,4,6] -``` - -## Review - -- We can use a `for` or `while` loop to repeat a block of code repeatedly. -- While the loop condition is true, we will execute another iteration of the - loop. -- When the loop condition is false, we will exit the loop. - -________________________________________________________________________________ -# The Array Type - -This reading will be about one of JavaScript's global objects, the **Array** -type. JavaScript arrays are used to store multiple values all within a single -structure, much like a creating a list. Arrays can hold strings, integers and -even other arrays! Arrays are incredibly useful for holding a bunch of different -information all in one place. - -When you finish this reading, you should be able to: - -- Write arrays using correct syntax -- Identify that an array is an ordered list of values defined by using brackets -- Use `.length` to obtain a count of the numbers of elements that comprise an - array -- Index an array to refer to a single value -- Concatenate multiple arrays together - -## Using arrays - -While coding you will find that you often find yourself needing to refer to a -bunch of data at once. For instance, what if you wanted to refer to the entire -English alphabet. Sure, you could create a bunch variables for each letter in -the alphabet: - -```js -let a = "a"; -let b = "b"; -let c = "c"; -let d = "d"; -// and so on for way too long... -``` - -However this becomes cumbersome and unmanageable quickly. An Array is a data -structure that solves this problem. Arrays are always wrapped in square -brackets, `[]`, and store their comma separated values in sequential order. -Arrays in JavaScript are also very flexible: we can put elements into an array, -replace elements in an array, and remove elements from the array. - -So going back to our first example of containing the alphabet: - -```js -let alphabet = [ - "a", "b", "c", "d", "e", "f", - "g", "h", "i", "j", "k", "l", - "m", "n", "o", "p", "q", "r", - "s", "t", "u", "v", "w", "x", - "y", "z" -]; -``` - -## Indexing arrays - -### Calculating the length of an array - -Since an array can container any number of values you will find it useful to -count the number of values available to you using `.length`: - -```js -console.log([4, 7, 9].length); // => 3 -console.log([1, 2].length); // => 2 -console.log([].length); // => 0 -``` - -### Properly indexing an array - -Arrays consist of multiple values all stored in sequential order. These value -are numbered by **indices** starting at 0 (just like indexing a string!). So -given the below example: - -```js -let numbersAndLetters = ["b", "z", 17, "cat"]; -``` - -In the above `numbersAndLetters` array if we access `numbersAndLetters` at the -index of 0 we get back the value of "b". If we access `numbersAndLetters` at the -index of 1 we get "z", at the index of 3 we get 17, etc. We can specify which -value we'd like to access in an array by using square brackets,`[]`, and -specifying an index: - -```js -console.log(numbersAndLetters[0]); // => "b" -console.log(numbersAndLetters[1]); // => "z" -console.log(numbersAndLetters[2]); // => 17 -console.log(numbersAndLetters[3]); // => "cat" -``` - -Notice that even though the index at `numbersAndLetters[3]` has the value of a -string with multiple characters ("cat") we return the _entire value_ listed at -that index. - -**Reminder:** Arrays **always** start at the index of 0, not 1. This is the -convention in programming. Additionally, indices should always be a number. - -We can access a value in an array directly by providing an index for the value -we'd like to access in that array (`array[index]`). See below for an example: - -```js -console.log(["a", "b", "c"][0]); // => "a" -console.log(["a", "b", "c"][1]); // => "b" -console.log(["a", "b", "c"][2]); // => "c" -console.log(["a", "b", "c"][3]); // => `undefined` -``` - -As we see in the code above, if we try to access an element at an index that is -not inside the array, we get back `undefined`. This makes sense because there is -no value at that given position! - -### The classic "off by one" error - -Arrays are similar to strings in that both of their indices start at 0 instead -of 1. Forgetting this fact can lead to some pretty confusing situations. Let's -focus on an important distinction: the index of the last value of an array is -always one less than its length. - -```javascript -console.log([4, 7, 9].length); // => 3 -console.log([4, 7, 9][3]); // => undefined -console.log([4, 7, 9][2]); // => 9 -``` - -In other words, although the `length` of `[4, 7, 9]` is 3, the index of the last -value (`9`) is 2. A good rule of thumb of accessing the last index of an array -is to find the length and then subtract one: - -```js -let testArray = [4, 7, 9]; -let finalIndex = testArray.length - 1; // => (3 - 1) = 2 -console.log(testArray[finalIndex]); // => 9 -``` - -## Working with arrays - -### Containing data in arrays - -By packaging groups of related data into a single array, we gain the added -benefit of being able to refer to that data as a single collection. Arrays don't -have to just hold single characters- they are capable of holding entire strings, -numbers, and even other arrays! - -```js -let wackyArray = [2, 17, "apple", "cat", ["apple"]]; - -console.log(wackyArray[0]); // => 2 -console.log(wackyArray[1]); // => 17 -console.log(wackyArray[3]); // => "cat" -console.log(wackyArray[4]); // => ["apple"] -``` - -Just think of all the possibilities of what you can store in a single array! -However, just because you can _doesn't_ mean you should. In practice we will -almost always be storing similar kinds of data, that are coming from a common -source (i.e. items in a shopping list, ID numbers, tasks on a todo list). - -### Using indexOf with arrays - -We can also calculate the index of a given value within an array by using -`indexOf`: - -```javascript -console.log([1, 3, 5, "apple", "jet"].indexOf(3)); // => 1 -console.log([1, 3, 5, "apple", "jet"].indexOf(5)); // => 2 -console.log([1, 3, 5, "apple", "jet"].indexOf("jet")); // => 4 - -// this won't be found in the array -console.log([1, 3, 5, "apple", "jet"].indexOf("potato")); // => -1 -``` - -If we attempt to search for a value that is **not** present in an array, -`indexOf` will return -1. This makes sense because we know that -1 is not a -valid array index. The smallest index possible is 0! - -## Concatenation with arrays - -As a reminder, concatenation is just a fancy word for joining things together -into a single collection. Now, this is where arrays will differ from strings. -The `+` operator only exists for numbers and strings. If you try to use the `+` -on an array it will try to help you out by _converting your arrays into -strings_. - -```js -console.log([1, 2, 3] + [4, 5, 6]); // => 1,2,34,5,6 -``` - -JavaScript was just trying to help! However that is probably not what you meant -to do. Good thing JavaScript has a seperate method for putting two array -together. To concatenate arrays, we can use the aptly named `.concat` method: - -```javascript -console.log([1, 2, 3].concat([4, 5, 6])); // => [1, 2, 3, 4, 5, 6] -``` - -## Remember - -- An **Array** is a data type that contains a list of in order values surrounded - in square brackets `[]`. -- `array.length` returns the number of values in the `array`. -- Each value of an array is associated with a number index; the first value of - an array is at the index of 0. -- We can use `array.indexOf(value)` to obtain the index of `value` within - `array`; if `value` is not found, then -1 is returned. -- We can use `.concat` to concatenate multiple arrays, combining them into a - single array. - -________________________________________________________________________________ -# WEEK-01 DAY-3
*Intermediate Functions* {ignore=true} -________________________________________________________________________________ -# Intermediate Functions Learning Objectives - -Below is a complete list of the terminal learning objectives across all -"Intermediate Function" lessons. When you complete these lessons, you should be -able to perform each of the following objectives. These objectives capture how -you may be evaluated on the assessment for these lessons. - -1. Identify that strings are immutable and arrays are mutable -2. Define a function using both function declaration and function expression - syntax -3. Utilize Array#push, #pop, #shift, #unshift to mutate an array -4. List the arguments that can be used with Array#splice -5. Write a function that sums up elements of an array, given an array of numbers - as an argument -6. Utilize Array#forEach, #map, #filter, #reduce in a function -7. Define a function that takes in an array of numbers and returns a new array - containing only the primes -8. Define a function that takes in a 2D array of numbers and returns the total - sum of all elements in the array -9. Define a function that takes in an array of elements and returns a 2d array - where the subarrays represent unique pairs of elements -10. Define a function that takes in an array of numbers as an argument and - returns the smallest value in the array; if the array is empty return null the terminal learning objectives across all -"Intermediate Function" lessons. When you complete these lessons, you should be -able to perform each of the following objectives. These objectives capture how -you may be evaluated on the assessment for these lessons. - -1. Identify that strings are immutable and arrays are mutable -2. Define a function using both function declaration and function expression - syntax -3. Utilize Array#push, #pop, #shift, #unshift to mutate an array -4. List the arguments that can be used with Array#splice -5. Write a function that sums up elements of an array, given an array of numbers - as an argument -6. Utilize Array#forEach, #map, #filter, #reduce in a function -7. Define a function that takes in an array of numbers and returns a new array - containing only the primes -8. Define a function that takes in a 2D array of numbers and returns the total - sum of all elements in the array -9. Define a function that takes in an array of elements and returns a 2d array - where the subarrays represent unique pairs of elements -10. Define a function that takes in an array of numbers as an argument and - returns the smallest value in the array; if the array is empty return null - -________________________________________________________________________________ -# Function Expressions - -You may have noticed that we've been writing many functions so far in the -course! We will continue to do so since functions are the building blocks of the -eventual applications that we will build. That being said, let's begin to -broaden the way we think about functions. In particular, we'll want think of -functions as expressions that we can store in variables - just like our classic -data types of number, string, boolean, array, and object! - -When you finish this article, you should be able to: - -- identify functions as first-class objects in JavaScript -- define a function using function expression syntax - -## Functions as first-class objects - -JavaScript is well known for being a programming language that treats functions -as "first-class objects". This fancy talk means that you can treat a function as -a "normal" value by storing it in a variable. We'll leverage this key concept in -very clever ways later in the course. For now, let's begin with a simple example -that shows the "first-class object" nature of functions: - -```javascript -let calculateAverage = function(a, b) { - return (a + b) / 2; -}; - -console.log(calculateAverage(10, 20)); // 15 -``` - -In the code snippet above, we define the `calculateAverage` by assigning a -variable to contain the function's definition. By doing this, the variable's -name is effectively the function's name. So to call the function, we simply -refer to the variable name. Note that we do not write the function's name after -the `function` keyword, where we normally would. We will refer to this new way -of defining functions as _function expression syntax_ and the classic way of -defining functions as _function declaration syntax_. In general, we can define -functions using either syntax: - -```javascript -// function declaration syntax -function myFunctionName(arg1, arg2) {} - -// function expression syntax -let myFunctionName = function(arg1, arg2) {}; -``` - -In the coming sections, we'll highlight moments when we'll prefer one syntax -over the other. For now, get acquainted with the new syntax as it is something -you'll be seeing a lot of as a programmer! - -### A peek under the hood - -Perhaps you're finding it tough to understand what it means for a variable to -contain a function - it is indeed a very abstract idea for new programmers. -Let's draw a comparison. We know that when we assign an expression to variable, -the expression first evaluates to a single value, which we then store in the -variable name: - -```javascript -let myNum = 4 + 4; -console.log(myNum); // prints 8 -console.log(myNum * 3); // prints 24 -``` - -In the same way we can treat a function definition as an expression that -evaluates! - -```javascript -let myFunc = function() { - console.log("I'm a function"); -}; - -console.log(myFunc); // prints [Function: myFunc] -myFunc(); // prints "I'm a function" -``` - -Looking at the snippet immediately above, you'll notice that when we print the -`myFunc` variable directly, without calling the function with parentheses, -JavaScript simply says the variable contains a function named myFunc -(`[Function: myFunc]`). You can truly imagine a function as a value that we can -store and use as we please. - -> The term _anonymous function_ may also be used to describe a function -> expression before it is assigned to any variable. Following the example above, -> we'll use the word _anonymous function_ to describe the function expression -> _before_ the assignment to the `myFunc` variable is complete. Once the -> assignment is complete, it would be silly to refer to `myFunc` as an -> `anonymous function` because an _anonymous function_ has no name. - -## Remember - -- functions can be stored in variables; just like any other values in - JavaScript! - -________________________________________________________________________________ -# Two-Dimensional Arrays (2D Arrays) - -Time to broaden our understanding of arrays! We've already explore the -fundamentals of arrays. Mainly, we can store any type of data we please as -elements of an array and even mix types together. However, what happens if we -store an array as an element of an array? - -When you finish this article, you should be able to: - -- index into the inner elements of a 2D array -- use nested loops to iterate through a 2D array - -## Multidimensional Arrays - -When we store arrays as elements of other arrays, we refer to those structures -as multidimensional arrays. If the "depth" of the nested arrays is at exactly 2 (an -outer array containing inner arrays), then we'll refer to it as a -two-dimensional array: - -```javascript -let twoDimensional = [["a", "b", "c"], ["d", "e"], ["f", "g", "h"]]; - -console.log(twoDimensional[1]); // [ 'd', 'e' ] -console.log(twoDimensional[1][0]); // 'd' - -let subArr = twoDimensional[1]; -console.log(subArr[0]); // 'd' -``` - -Note that indexing the outer `twoDimensional` array will return an element like -usual, it's just that element happens to be another array. To gain access to the -innermost elements, we simply need to apply another set of indexing brackets! - -If we style our 2D arrays nicely so that each subarray is on a new line, we can -interpret the double indices as `[row][column]`: - -```javascript -let twoDimensional = [ - ["a", "b", "c"], - ["d", "e"], - ["f", "g", "h"]]; - -// get the element in the 0th row, 2nd col: -console.log(twoDimensional[0][2]); // 'c' -``` - -## Iterating through 2D Arrays - -Since a 2D array is just an array of arrays. We'll need to use a loop within a -loop to iterate through a 2D array: - -```javascript -let array = [["a", "b", "c"], ["d", "e"], ["f", "g", "h"]]; - -for (let i = 0; i < array.length; i++) { - let subArray = array[i]; - console.log(subArray); - - for (let j = 0; j < subArray.length; j++) { - console.log(subArray[j]); - } -} -``` - -In the nested loops above, the `i` index refers to the current "row" and the `j` -index refers to the current "column". It's worth noting that since the inner -subArrays have different length, we'll want to specifically reference the length -of that subarray in our inner loop condition `j < subArray.length`. The code -above will print: - -```plaintext -[ 'a', 'b', 'c' ] -a -b -c -[ 'd', 'e' ] -d -e -[ 'f', 'g', 'h' ] -f -g -h -``` - -## When is a 2D array practical? - -As a preview of things to come let's briefly mention when you'll find a 2D array -useful in your future projects. Imagine how'd you represent a "grid": - -- tic-tac-toe (3x3 grid) -- chess (8x8 grid) -- sudoku (9x9 grid) -- excel (a sheet is an arbitrarily sized 2D array) - -## Remember - -- an array can contain arrays as elements, we call this a 2D arrays -- to iterate through a 2D array, used nested loops - -________________________________________________________________________________ -# Mutability in JavaScript - -So far in the course we've explored a handful of methods that manipulate data. -We'll be growing our arsenal of methods further overtime, so we'll want to gain -awareness for **exactly** how we should expect these methods to manipulate the -data we give them. To this end, let's analyze which methods will modify existing -data and which methods do not. We refer to this concept as **mutability**. - -When you finish this article, you should be able to: - -- Explain what "mutability" is -- Correctly label JavaScript data types as immutable or mutable - -## What is mutability? - -At its face value, _mutability_ is a simple concept. You may be familiar with -the word _mutation_, which refers to a alteration (usually in DNA). Something -that is _mutable_ can be changed, while something that is _immutable_ is -unchanging and permanent. To illustrate this concept, we'll begin with strings -and arrays. We've spent some time with these two data types and by now we -recognize that the two types share many similarities. Both have indices, -`length`, and even share common methods like `slice`. However, they differ -greatly in their mutability: - -```javascript -let myArr = ["b", "e", "a", "m"]; -myArr[0] = "s"; -console.log(myArr); // 'seam' - -let myStr = "beam"; -myStr[0] = "s"; -console.log(myStr); // 'beam' -``` - -Above we have shown that we can assign a new element to an index of an array, -but we cannot assign a new character to an index of a string. In other words, -arrays are _mutable_, but strings are _immutable_. - -An implication of this discovery is that there are _some_ array methods that -will modify an existing array but _zero_ methods that will modify an existing -string. Methods that manipulate string data typically return a _new_ string and -never modify an existing one. A prime example is `toUpperCase`: - -```javascript -let word = "piñata"; -let newWord = word.toUpperCase(); -console.log(word); // 'piñata' -console.log(newWord); // 'PIÑATA' -``` - -Above, notice that the `toUpperCase` method returns a capitalized version of the -string, but does not change the original string. It's also worth noting that not -every array method will mutate. For example, the `slice` method does not mutate -for both strings and arrays. As we learn about methods in the future, we'll be -certain to note what mutates and what does not. - -## Mutable or immutable, that is the question - -Now that we have a grasp of _mutability_, let's take inventory and identify -JavaScript's data types as mutable or immutable. - -**Mutable** - -- array -- object (we'll learn these soon) - -**Immutable** - -- number -- string -- boolean - -A quick way to remember the above list is to identify that the composite types -(the types that can contain multiple values) of array and object are mutable. -The remaining "simpler" types of number, string, and boolean are immutable. - -## The mutability misconception - -Maybe you are having a tough time believing what we have just claimed. We don't -blame you, you've probably heard the saying that change is the only constant in -the universe. Let's debunk a common argument to turn you into a believer. The -skeptical programmer may use this as an argument to show that numbers are -mutable: - -```javascript -let myNum = 42; -myNum += 8; -console.log(myNum); // 50 -``` - -Because the `myNum` variable now contains `50` where it once contained `42`, it -may seem we have mutated the number, but this is not truly the case. Recall that -`myNum += 8` is shorthand for `myNum = myNum + 8`. Since the right hand side of -the assignment evaluates first, we are simply taking the new number of `50` and -reassigning it to the `myNum` variable. This reassignment of a variable name is -not a mutation of the original number. - -## Remember - -- data types that can be changed are mutable, those that cannot be changed are - immutable -- arrays and objects are mutable -- numbers, strings, and booleans are immutable - -________________________________________________________________________________ -# Array Splice - -Time to a learn yet another array method! The [Array#splice][mdn-splice] method -deserves its own reading because of how versatile it is. Feel free to use this -article as a quick reference; let's jump right in. - -When you finish reading this article, you should be able to: - -- list all possible arguments that can be used with the `Array#splice` method - -## Notation - -For clarity in this article and moving forward in the course, we'll be notating -methods with `#` to clarify how they should be called. For example, -`Array#splice` refers to the method that should be called on an array, -`arr.splice()` where `arr` is some array variable. Likewise `String#toUpperCase` -refers to the method that should be called on a string, `str.toUpperCase()` -where `str` is some string variable. We'll opt to refer to methods using this -notation because some methods can be called on multiple data types, such as -`Array#slice` and `String#slice`. - -## What can Array#splice do? - -Before we explore the nitty-gritty details of the `Array#splice` method, the -first thing to be aware of is that the method will **mutate** the array that it -is called on. That is, `Array#splice` will modify the existing array and _not_ -return a new array. - -### Using splice to remove - -The usage of the `Array#splice` method is easy to mix up because it can be used -to remove or insert elements into an array. That's right - it can perform -"opposite" operations, even at the same time! For now, we'll begin by _only_ -removing elements from an array: - -```javascript -let colors = ["red", "yellow", "blue", "green", "orange", "brown", "gray"]; -let returnVal = colors.splice(2, 3); -console.log(colors); // [ 'red', 'yellow', 'brown', 'gray' ] -console.log(returnVal); // [ 'blue', 'green', 'orange' ] -``` - -The first two arguments for splice correspond to 1) the target index and 2) how -many elements to remove. The call `colors.splice(2, 3)`, will remove the next -three elements beginning at index 2. This means that the elements at indices 2, -3, and 4 are removed. - -Note that splice returns an array containing the elements that were removed and -also has the effect of removing the elements from the _original_ array, mutating -it in-place. - -### Using splice to insert - -To use the splice method to insert new elements into an array, we can pass in -any number of additional arguments representing the values to insert: - -```javascript -let colors = ["red", "yellow", "blue"]; -let returnVal = colors.splice(1, 0, "RebeccaPurple", "CornflowerBlue"); -console.log(colors); // [ 'red', 'RebeccaPurple', 'CornflowerBlue', 'yellow', 'blue' ] -console.log(returnVal); // [] -``` - -The method call `colors.splice(1, 0, 'RebeccaPurple', 'CornflowerBlue')` -translates to "target index 1, remove the next 0 elements, then insert -`'RebeccaPurple'` and `'CornflowerBlue'`." - -### Using splice like a pro - -Naturally, we can combine these two functionalities! Say we wanted to target -index 2, remove the next 3 elements, then insert `'Gainsboro'`, `'Ivory'`, and -`'Khaki'`: - -```javascript -let colors = ["red", "yellow", "blue", "green", "black", "beige"]; -let removed = colors.splice(2, 3, "Gainsboro", "Ivory", "Khaki"); -console.log(colors); // [ 'red', 'yellow', 'Gainsboro', 'Ivory', 'Khaki', 'beige' ] -console.log(removed); // [ 'blue', 'green', 'black' ] -``` - -Bam. What a versatile method! Always feel free to reference the -[documentation][mdn-splice] for the method when you are struggling to remember -its usage: - -## Remember - -- Array#splice has two required arguments - - the target index - - the number of elements to remove beginning at that target index -- Array#splice can also take in any number of values to be inserted at the - target index - -[mdn-splice]: - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice - -________________________________________________________________________________ -# String#split and Array#join - -We've seen previously that strings and arrays share many similar properties. For -example, strings and arrays both have a `length` and can have multiple indices. -Because of this, you may find it useful to "convert" between the two types. - -When you finish this article, you should be able to: - -- use the `String#split` method to turn a string into an array -- use the `Array#join` method to turn an array into a string - -## String#split - -The [String#split][string-split-mdn] method is called on a string and accepts a -"separator" string as an argument. The method will return an array where the -elements are the resulting substrings when we cut at the "separators": - -```javascript -let sentence = "follow the yellow brick road"; -let words = sentence.split(" "); -console.log(words); // [ 'follow', 'the', 'yellow', 'brick', 'road' ] -console.log(sentence); // 'follow the yellow brick road' -``` - -Note that the original string is _not mutated_, rather a new array is returned. -A common pattern is to split a sentence string on a space (' '), but you can -split on any separator as you see fit: - -```javascript -let sentence = "follow the yellow brick road"; -console.log(sentence.split(" ")); // [ 'follow', 'the', 'yellow', 'brick', 'road' ] -console.log(sentence.split("the")); // [ 'follow ', ' yellow brick road' ] -console.log(sentence.split("o")); // [ 'f', 'll', 'w the yell', 'w brick r', 'ad' ] -``` - -A pattern you may find useful is that when you split on a separator string, it -is guaranteed that that separator will not be in the resulting array, -effectively removing it. See the example of `sentence.split('the')` above. This -may come in handy, so keep it in mind! - -## Array#join - -The [Array#join][array-join-mdn] method is called on an array and accepts a -"separator" string as an argument. The method will return a string where -elements of the array are concatenated together with the "separator" between -each element: - -```javascript -let words = ["run", "around", "the", "block"]; -let sentence = words.join(" "); -console.log(sentence); // 'run around the block' -console.log(words); // [ 'run', 'around', 'the', 'block' ] - -console.log(words.join("_")); // 'run_around_the_block' -console.log(words.join("HI")); // 'runHIaroundHItheHIblock' -``` - -`Array#join` does not mutate the original array, instead it will return a new -string. - -## A clever combination - -It's pretty evident that `String#split` and `Array#join` are "opposite" methods. -That is: - -- we use split to turn a string into a array -- we use join to turn an array into a string - -By combining these two methods we can accomplish some cool behavior: - -```javascript -let str = "I don't know what I want to eat"; -let newStr = str.split("I").join("we"); -console.log(newStr); // 'we don't know what we want to eat' -``` - -Whoa! We were able to replace every substring "I" with the substring "we". We -know that the line `str.split('I').join('we')` evaluates from left to right. -This means that the `split` will cut the string wherever there is an 'I', -leaving a gap where the 'I's were. Then, the `join` will fill those gaps with -'we's. - -## Remember - -- we can use `String#split` and `Array#join` to convert between strings and - arrays -- both methods do not mutate their input - -[string-split-mdn]: - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split -[array-join-mdn]: - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/join - -________________________________________________________________________________ -# WEEK-01 DAY-5
*Control Flow* {ignore=true} -________________________________________________________________________________ -# Determining Types - -Sometimes you want to know the type of value store in a variable so that you can -safely do things with it. If your function expects an array in its parameter but -gets a number, you can't call the `map` method on that! - -In this article you will learn how to figure out if a value in a variable is - -* A string -* A number -* A function -* An array - -## The typeof operator - -Not all operators in JavaScript require two arguments like the `+` operator for -addition, the `=` for assignment, and the `%` operator for modulo division. -Those are all called _binary_ operators because they take two (bi-) operands, -or things that are operated on. - -JavaScript kindly gives you the operator `typeof` which acts on a single value. -Operators that take only one operand are called _unary_ operators because "u -only give them one value!" (That's a joke. "uni-" or "una-" is one.) - -Here are some examples of what you'd expect to see with the `typeof` operator. - -```js -let s = 'This is a string'; -console.log(typeof s); // 'string' - -let n = 6.28; -console.log(typeof n); // 'number' - -let sum = function (a, b) { - return a + b; -} -console.log(typeof sum); // 'function' -``` - -Note that the value returned from the `typeof` operator is a String data type. -So, if you want to check if a value is a number, you could do this. - -```js -if (typeof n === 'number') { - // It is a number. Do some maths! -} else { - console.log('I really wanted a number. :-('); -} -``` - -## How to tell if a value is an array - -Unfortunately, due to a _really old bug_ in the way that JavaScript works, a bug -that no one can fix because people wrote code that relies on the bug for -decades, you cannot use the `typeof` operator to figure out if something is an -array. - -```js -let a = [1, 2, 3]; -console.log(typeof a); // 'object' -``` - -Gee, JavaScript. That's not helpful. Thanks. - -Luckily, it only took 12 years for JavaScript to include a way to test if a -value is an array. To do so, you use the `Array.isArray` method like this. - -```js -let a = [1, 2, 3]; -Array.isArray(a); // true - -let n = 6.28; -Array.isArray(n); // false - -let f = function () {} -Array.isArray(f); // false -``` - -## Practical use in "real" code - -Oddly enough, you won't see a lot of code in real-world applications testing if -a value is one type or another. A lot of JavaScript functions just _assume_ that -they will get arguments of the right kind because the parameter names imply what -kind of value to pass in. For example, the following function has a parameter -named `sentence`. - -```js -function reverseTheSentence(sentence) { - // ... code here ... -} -``` - -Most developers will know that the function probably wants `sentence` to be a -string value. They just won't pass in an array or number or ... well, anything -other than a string. Because that's just not polite. They'd expect any other -kind of value to cause the `reverseTheSentence` to malfunction. Only when you -know that people that don't respect your code will use it should you add in some -kind of check like this. - -```js -function reverseTheSentence(sentence) { - if (typeof sentence !== 'string') { - // Tell the developer they are using - // the function wrong. - } - // ... code here ... -} -``` - -## Remember - -This article has shown you two ways to determine if a value is a kind of type: - -* the `typeof` operator to use to test if a value is a number, a string, or - a function; and, -* the `Array.isArray` method to check if a value is an array. - -Use them as much (or as little) as you need! - -________________________________________________________________________________ -# The Null Type (And Undefined) - -You've met numbers and string, Booleans and arrays. There's another type often -used in JavaScript: the Null type. And, it's a special type. - -In this article, you will learn about the Null type, its value, and how to work -with it in JavaScript. - -## A type with only one value - -You have seen that the String type can have an "infinite" number of values -(within the limits of your computer memory). For example, the String type -represents _any_ of the following values. - -```js -// Examples of values with the String type -'hello, world' -"this is a string" -`Where is my pudding?` -'' -'A really long string.........................................................' -``` - -The Number type also has this aspect. Any number that you can reasonable express -in JavaScript has the Number type. - -```js -// Examples of values with the Number type --100 -99 -6.28 -Infinity -``` - -You also know about the Boolean type. It can have only two values. - -```js -// The only two values of Boolean type -true -false -``` - -There are not _more_ Boolean values. You can't dream up more. There are only -two, those two. - -The Null type has one and exactly one value. - -```js -// The only value that has the Null type -null -``` - -It's just that word: `null`. No quotation marks. No other fancy things. Just -`null`. - -## The meaning of null - -This is a harder subject to tackle because it's a _philosophical_ subject. Many -people ask, "What does the value of `null` mean in a program?" There are a -couple of answers that programmers give to this. None of them are wrong. None of -them are right. They just are. In the presence of `null`, the code you write -determines which of the following meanings `null` has. - -* The value `null` means _the absence of a value_ or _no value_ -* The value `null` means _an unknown value_ -* The value `null` is a nuisance and I hate it and wish it were never invented - -During your software programming career, you will likely have all three of those -opinions, sometimes at the same time. Let's take a look at some examples to try -to figure this out. - -## The absence of a value - -Let's say you wrote a function that splits a string into words, reverses them, -and puts them back together in reverse order. You can do that with the methods - -* `String#split` [link][split]; -* `Array#reverse` [link][reverse]; and, -* `Array#join` [link][join]. - -That function could look like this. - -```js -function reverseTheSentence(sentence) { - let parts = sentence.split(' '); - parts.reverse(); - return parts.join(' '); -} -``` - -That's great! It works! But, what happens if someone doesn't care about what -your function and just decides to pass in something that's not a string? It -would make sense that reversing something that is not a string should lead to no -value, the absence of a value, because the input to the function doesn't make -sense. In that case, you can just return a `null` because there is _no value_ -that the function can return that would make sense. - -```js -function reverseTheSentence(sentence) { - if (typeof sentence !== 'string') { - return null; - } - let parts = sentence.split(' '); - parts.reverse(); - return parts.join(' '); -} -``` - -## An unknown value - -There are a lot of programmers that will argue that `null` cannot be an unknown -value. "The value is known!" they'll exclaim. "The value is 'null'! It's known! -It's 'null'! Stop saying it's not known!" - -There are programmers that vehemently disagree with that. - -![shrug](images/woman-shrugging_1f937-200d-2640-fe0f.png) - -## Checking if a value is null - -If you had hoped that you could use the `typeof` operator to check if a value is -`null`, then you're out of luck. - -```js -// Useless code. -console.log(typeof null); // 'object' -``` - -Silly JavaScript. Instead of using the `typeof` operator, you can just _compare_ -the value to `null` because there is only one value of the Null data type and -it's always `null`. Take a look at the following code and figure out what you -think it will produce. - -```js -let a = []; -let x = null; - -if (a === null) { - console.log('a is null'); -} else if (x === null) { - console.log('x is null'); -} -``` - -## Oh, and there's that undefined value, too - -Just like the `null` value that is the only value of the Null data type, there -is `undefined` which is the only value of the Undefined data type. - -If you're asking yourself, "Wait, if 'null' is no value or the absence of a -value, then what the heck does 'undefined' mean?", well you're not the only one. - -Have a look at this code. - -```js -let value; - -value = 6.28; -console.log(value); -``` - -You probably will not be surprised to see that it will print out "6.28" because -that's the value of `value`. But, what if you did this? What does that new -`console.log` print? - -```js -let value; -console.log(value); // <- what does this print? - -value = 6.28; -console.log(value); -``` - -If you guessed that it prints "undefined", you're right! When you declare a -variable, it's very first value is `undefined`. Most of the time, though, you'll -just immediately set it to a value. - -```js -let value = 6.28; -``` - -So, an uninitialized variable has the value `undefined` which is the only value -of the Undefined data type. To test for it, you can use the `typeof` operator -_or_ the strict equality operator. Using the strict equality operator is the -more common way to do that, now. - -```js -// Test if a value is undefined -if (value === undefined) { - // do a thing -} - -// You can also do it this way, but -// it is considered passé. -if (typeof value === 'undefined') { - // do a thing -} -``` - -## What happens when... - -Interestingly enough, all functions actually _do_ return values. Have a look at -this function. What value does it return? (Not a trick question.) - -```js -function returnsTrue() { - return true; -} -``` - -Yes, it returns the value `true`. But, what about this function? - -```js -function returnsWhat() { - return; -} -``` - -There's a `return` statement there but it does not specify a value. If there is -not value specified, what do you think this function returns? Try putting the -function definition above and the code below into a code runner and seeing what -happens. - -```js -console.log(returnsWhat()); -``` - -One you figure that out, try the same experiment but with this function. What -do you think it returns. It doesn't even have a `return` statement in it! - -```js -function whatIsThis() { -} -``` - -## Remember - -There is a special value in JavaScript represented as `null` which means "no -value" or "unknown value". It is the only value of the Null data type. You can -check that a value is `null` by using the strict equality operator `x === null`. - -The value `undefined` is used by JavaScript for variables that have not been -assigned a value. Also, functions that do not return an explicit value return -the value `undefined`. You can test if a value is `undefined` by using the -strict equality operator `x === undefined`. - -[reverse]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reverse -[split]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/split -[join]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/join - -________________________________________________________________________________ -# Catch Me If You Can - -Sometimes bad things happen to good programs. Some person may enter some badly -formatted information. Another computer may try to attack your program by -sending it wonky data. A network could go down. A file can become corrupt. When -this happens, your running software will have some errors. This article is about -how you can recover from those errors with "structured exception handling". - -In this article you'll learn the answers to: - -* What _is_ structured exception handling? -* How can I do that in JavaScript? -* How can I make my own errors? -* What else can I do with it? -* Shouldn't I just always do this? - -## Structured exception handling - -Oddly enough, there are very few error-handling mechanisms in use, today, in all -programming languages. There are really only three ways that programming -language provide structured exception handling. - -* **Error or error code reporting** as found in languages like C and Go -* **Continuable exceptions** as found in Common Lisp -* **Stack unwinding** which is found in almost every modern programming - language including JavaScript and Python - -In the stack-unwinding paradigm, which is the one you'll use in JavaScript, when -an error occurs, the JavaScript interpreter (the thing running your JavaScript -code) looks for some kind of handler for that error. It has a very specific way -of searching for those handlers. The way JavaScript searches for the handlers is -very similar to the way it happens in Python, C++, Java, C#, and a lot of other -languages. Once you learn it, here, you will be able to handle errors when -writing code in all of those languages. - -## Try and catch - -Say you have some code that may have an error. For example: - -```js -function sumArray(array) { - let sum = 0; - for (let i = 0; i < array.length; i += 1) { - sum += array[i]; - } - return sum; -} -``` - -If someone calls the above function with the code `sumArray(null)`, then they -will get the error because the `for` loop is trying to get the `length` property -of the `array` parameter which is `null`. - -``` -TypeError: Cannot read property 'length' of null -``` - -To prevent this from ruining your program, you wrap code that may have an error -in a **try block**. Now, you've seen other blocks already: `if` blocks, `for` -blocks, `function` blocks. Basically, if there are curly braces around some -lines of code, that's a **code block** of some kind. A _try block_ is just some -curly braces with the `try` keyword. - -```js -// THIS IS AN INCOMPLETE BLOCK OF CODE -function sumArray(array) { - let sum = 0; - - // The try block wraps the for loop. If some - // error occurs, the try block will give you - // a chance to react to it so that the program - // doesn't terminate. - try { - for (let i = 0; i < array.length; i += 1) { - sum += array[i]; - } - } // needs something more here - - return sum; -} -``` - -The `try` block tells JavaScript that it needs to watch the code inside the -curly braces for an error. Now, you have to tell JavaScript what to do when -there _is_ an error. You do that in the `catch` block that should immediately -follow the `try` block. The `catch` block accepts a single parameter that -(usually) contains an object that describes the error that occurred. In the -case of the `sumArray` method, if an error occurs, you could return the value -`undefined` rather than letting an error terminate your program. You could also -log the error to the "error" output. - -```js -function sumArray(array) { - let sum = 0; - - try { - for (let i = 0; i < array.length; i += 1) { - sum += array[i]; - } - } catch (e) { - console.log(e); - return null; - } - - return sum; -} - -sumArray(null); -``` - -Just to state it, again: the _catch block_ runs when an error occurs in the _try -block_. If no error occurs in the _try block_, the _catch block_ **does not -run**. - -That `(e)` after the word `catch` is a variable that contains any error that was -thrown and caught by this `try-catch` block. It doesn't have to be named `e`. - -```js -function sumArray(array) { - let sum = 0; - - try { - for (let i = 0; i < array.length; i += 1) { - sum += array[i]; - } - } catch (pancakes) { - console.log(pancakes); - return null; - } - - return sum; -} - -sumArray(null); -``` - -Here is the same code but, instead of a variable named "e", there is a variable -named "pancakes". Now, if an error is thrown, the variable "pancakes" will -contain it. By long-standing tradition, the variables used with the catch block -are normally "e", "err", or "error". - -```js -// CODE SNIPPET, WILL NOT RUN -} catch (e) { -``` - -```js -// CODE SNIPPET, WILL NOT RUN -} catch (err) { -``` - -```js -// CODE SNIPPET, WILL NOT RUN -} catch (error) { -``` - -Now, when you run the code `sumArray(null)`, you should see something like the -following, if you run it in the online code editor. - -``` -TypeError: Cannot read property 'length' of null - at sumArray (/tmp/file.js:5:31) - at Object. (/tmp/file.js:16:1) - at Module._compile (internal/modules/cjs/loader.js:1158:30) - at Object.Module._extensions..js (internal/modules/cjs/loader.js:1178:10) - at Module.load (internal/modules/cjs/loader.js:1002:32) - at Function.Module._load (internal/modules/cjs/loader.js:901:14) - at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:74:12) - at internal/main/run_main_module.js:18:47 -``` - -In that code sample, after the `sumArray(null)` call, the lines that begins -`TypeError` is the error that occurred. The next 10 lines are what is known as a -**stack trace**. You'll end up seeing these a lot, most likely, as you continue -your career in software programming. This is the first line in understanding -errors in your code. The _stack trace_ shows on the first line where the error -occurred: `sumArray (/tmp/file.js:5:31)` means that it occurred in the -`sumArray` method on line 5 of the content, at character 31. If you open up one -of the coding problems, paste that code block in, and run it, you'll see similar -output in the output block. - -The last line `undefined` is the return value of the `sumArray(null)` invocation -that now happens when an error occurs. - -That is how the so-called **try-catch block** works. - -## How can I make my own errors? - -To create your own errors with structured exception handling, you first need to -create an error object with the message that describes the error. Then, you need -to "throw" the error. That code would look like either of these two lines, the -only difference being the `new` keyword. They both work exactly the same. - -```js -throw Error('this happened because I wanted it to'); -throw new Error('this happened because I wanted it to'); -``` - -## What else is there? - -Turns out that you can have one more block on the _try-catch block_. It is the -**finally block**. The _finally block_ runs whether or not an error occurs. It -_always_ runs. - -```js -function sumArray(array) { - let sum = 0; - - try { - for (let i = 0; i < array.length; i += 1) { - sum += array[i]; - } - } catch (e) { - console.log(e); - return null; - } finally { - console.log('you will always see this.'); - } - - return sum; -} -``` - -## How do I best use this? - -At this point, you may be asking yourself, "Self, since errors can occur -everywhere, shouldn't I just wrap _all_ of my code in these _try-catch blocks_?" - -No. No, you shouldn't. - -Every **try-catch block** introduces another slow-down in your code. If you're -writing code that you want to run as fast as possible, then you write as few -_try-catch blocks_ as possible. Also, it makes the code pretty cluttered with -all of the indentation and curly braces. When at all possible, you should write -**defensive code** which checks for bad values before errors get thrown in your -code. Rather than using a _try-catch block_ in the `sumArray` function, you -could defend against bad values of the `array` parameter like so. - -```js -function sumArray(array) { - if (array === null) { - return null; - } - - let sum = 0; - for (let i = 0; i < array.length; i += 1) { - sum += array[i]; - } - return sum; -} -``` - -## Review - -The _try-catch-finally block_ is a mechanism to handle errors in your code. You -should _not_ wrap all of your code in these blocks because it can seriously -degrade the performance of your application. Instead, only wrap those portions -of the code that you want to guard against throwing exceptions. - -A better choice, in JavaScript and all programming languages, is to be -defensive about your programming and choose to check that the value that you -have has the functionality that you desire by adding code like - -```js -if (value !== undefined) {} -if (value !== null) {} -``` - - ----- - -
_Resources/node_modules/jquery/ - -### [_Resources/node_modules/jquery/README.md](_Resources/node_modules/jquery/README.md) -# jQuery - -> jQuery is a fast, small, and feature-rich JavaScript library. - -For information on how to get started and how to use jQuery, please see [jQuery's documentation](https://api.jquery.com/). -For source files and issues, please visit the [jQuery repo](https://github.com/jquery/jquery). - -If upgrading, please see the [blog post for 3.6.0](https://blog.jquery.com/2021/03/02/jquery-3-6-0-released/). This includes notable differences from the previous version and a more readable changelog. - -## Including jQuery - -Below are some of the most common ways to include jQuery. - -### Browser - -#### Script tag - -```html - -``` - -#### Babel - -[Babel](https://babeljs.io/) is a next generation JavaScript compiler. One of the features is the ability to use ES6/ES2015 modules now, even though browsers do not yet support this feature natively. - -```js -import $ from "jquery"; -``` - -#### Browserify/Webpack - -There are several ways to use [Browserify](http://browserify.org/) and [Webpack](https://webpack.github.io/). For more information on using these tools, please refer to the corresponding project's documentation. In the script, including jQuery will usually look like this... - -```js -var $ = require( "jquery" ); -``` - -#### AMD (Asynchronous Module Definition) - -AMD is a module format built for the browser. For more information, we recommend [require.js' documentation](https://requirejs.org/docs/whyamd.html). - -```js -define( [ "jquery" ], function( $ ) { - -} ); -``` - -### Node - -To include jQuery in [Node](https://nodejs.org/), first install with npm. - -```sh -npm install jquery -``` - -For jQuery to work in Node, a window with a document is required. Since no such window exists natively in Node, one can be mocked by tools such as [jsdom](https://github.com/jsdom/jsdom). This can be useful for testing purposes. - -```js -const { JSDOM } = require( "jsdom" ); -const { window } = new JSDOM( "" ); -const $ = require( "jquery" )( window ); -``` - - - - - -
_Resources/node_modules/loadashes6/lodash/ - -### [_Resources/node_modules/loadashes6/lodash/README.md](_Resources/node_modules/loadashes6/lodash/README.md) - - - - - -### [_Resources/node_modules/loadashes6/lodash/release.md](_Resources/node_modules/loadashes6/lodash/release.md) - - - -
_Resources/node_modules/mout/ - -### [_Resources/node_modules/mout/CHANGELOG.md](_Resources/node_modules/mout/CHANGELOG.md) -mout changelog -============== -v1.1.1 (2019/04/18) --------------------- - - fixed `object/get` throwing an exception for null or undefined input objects - -v1.1.0 (2017/10/04) --------------------- - - update dependencies - - optimize `function/bind` - - optimize `lang/kindOf` - -v0.12.0 (2016/03/03) --------------------- - - add `array/indicesOf` - - add `function/memoize` - - add `array/reverse` - - add `math/overflow` - - fix `query/getQuery` - - fix `object/deepMatches` - - optimize `function/partial` - - updates license - - -v0.11.0 (2014/11/17) --------------------- - - - add `array/take`; - - remove unused variable from `date/totalDaysInMonth`; - - fix case insensitive RegExp cloning on `lang/clone`; - - -v0.10.0 (2014/09/02) --------------------- - - - add `array/equals`; - - add `array/groupBy`; - - add `array/last`; - - add `function/wrap`; - - add `lang/GLOBAL`; - - add `lang/isPrimitive`; - - add `number/MAX_SAFE_INTEGER`; - - add `object/omit`; - - add `object/result`; - - add `object/result`; - - add `random/randString`; - - change `lang/isEmpty` behavior to return `true` for any value that isn't - a collection. - - fix `array/findLastIndex` to stop at zero index; - - improve `function/partial` to accept placeholders; - - improve `math.norm` behavior for values outside the range and for cases - where `val === min === max`; - - improve `object/get` behavior to return properties from any value that is - not `null` or `undefined`; - - move `object/deepEquals` to `lang/deepEquals` (improving the behavior); - - -v0.9.1 (2014/04/08) -------------------- - - - fix `array/slice` behavior when start and end are higher than length. - - -v0.9.0 (2014/02/04) -------------------- - - - add `date/quarter`; - - add `function/constant`; - - add `random/randBool`; - - add un-padded 12-hour (`%l`) to `date/strftime`; - - fix `array/slice` on IE < 9 by using a custom implementation. - - fix `object/forIn` iteration for IE < 9 constructor property; - - improve `lang/inheritPrototype` by returning the `prototype`; - - improve `string/removeNonWord` to cover more chars; - - improve `string/repeat` performance; - - improve `string/unescapeHtml` by accepting leading zeros for `'`; - - -v0.8.0 (2013/11/22) -------------------- - - - add `array/findLast`. - - add `array/findLastIndex`. - - add `array/slice` and use it internally. - - add `array/sortBy` - - add `function/awaitDelay`. - - add `function/identity` - - add `number/isNaN`. - - add `number/nth`. - - add `number/ordinal`. - - allows nested replacement patterns in `string/interpolate`. - - change `function/makeIterator_` behavior (uses `identity` by default). - - simplify `string/escapeRegExp`. - - support custom equality on `array/compare`. - - -v0.7.1 (2013/09/18) -------------------- - - - fix `null` value handling in object/get. - - -v0.7.0 (2013/09/05) -------------------- - - - add bower ignores. - - add german translation for date localization. - - alias `function` package as `fn` since "function" is a reserved keyword. - - allow second argument on `array/pick`. - - improve `string/makePath` to not remove "//" after protocol. - - make sure methods inside `number` package works with mixed types. - - support arrays on `queryString/encode`. - - support multiple values for same property on `queryString/decode`. - - add `cancel()` method to `throttled/debounced` functions. - - add `function/times`. - - add `lang/toNumber`. - - add `string/insert`. - - add `super_` to constructor on `lang/inheritPrototype`. - - -v0.6.0 (2013/05/22) -------------------- - - - add optional delimeter to `string/unCamelCase` - - allow custom char on `number/pad` - - allow underscore characters in `string/removeNonWord` - - accept `level` on `array/flatten` instead of a flag - - convert underscores to camelCase in `string/camelCase` - - remove `create()` from number/currencyFormat - - add `date/dayOfTheYear` - - add `date/diff` - - add `date/isSame` - - add `date/startOf` - - add `date/strftime` - - add `date/timezoneAbbr` - - add `date/timezoneOffset` - - add `date/totalDaysInYear` - - add `date/weekOfTheYear` - - add `function/timeout` - - add `object/bindAll` - - add `object/functions` - - add `time/convert` - - -v0.5.0 (2013/04/04) -------------------- - - - add `array/collect` - - add `callback` parameter to `object/equals` and `object/deepEquals` to allow - custom compare operations. - - normalize behavior in `array/*` methods to treat `null` values as empty - arrays when reading from array - - add `date/parseIso` - - add `date/isLeapYear` - - add `date/totalDaysInMonth` - - add `object/deepMatches` - - change `function/makeIterator_` to use `deepMatches` (affects nearly all - iteration methods) - - add `thisObj` parameter to `array/min` and `array/max` - - -v0.4.0 (2013/02/26) -------------------- - - - add `object/equals` - - add `object/deepEquals` - - add `object/matches`. - - add `lang/is` and `lang/isnt`. - - add `lang/isInteger`. - - add `array/findIndex`. - - add shorthand syntax to `array/*`, `object/*` and `collection/*` methods. - - improve `number/sign` behavior when value is NaN or +0 or -0. - - improve `lang/isNaN` to actually check if value *is not a number* without - coercing value; so `[]`, `""`, `null` and `"12"` are considered NaN (#39). - - improve `string/contains` to match ES6 behavior (add fromIndex argument). - - -v0.3.0 (2013/02/01) -------------------- - - - add `lang/clone`. - - add `lang/toString`. - - add `string/replace`. - - add `string/WHITE_SPACES` - - rename `function/curry` to `function/partial`. - - allow custom chars in `string/trim`, `ltrim`, and `rtrim`. - - convert values to strings in the `string/*` functions. - - -v0.2.0 (2013/01/13) -------------------- - - - fix bug in `math/ceil` for negative radixes. - - change `object/deepFillIn` and `object/deepMixIn` to recurse only if both - existing and new values are plain objects. Will not recurse into arrays - or objects not created by the Object constructor. - - add `lang/isPlainObject` to check if a file is a valid object and is created - by the Object constructor - - change `lang/clone` behavior when dealing with custom types (avoid cloning - it by default) and add second argument to allow custom behavior if needed. - - rename `lang/clone` to `lang/deepClone`. - - add VERSION property to index.js - - simplify `math/floor`, `math/round`, `math/ceil` and `math/countSteps`. - - -v0.1.0 (2013/01/09) -------------------- - -- Rename project from "amd-utils" to "mout" - - - - - -### [_Resources/node_modules/mout/CONTRIBUTING.md](_Resources/node_modules/mout/CONTRIBUTING.md) - -# Contributing - -Fork the repo at https://github.com/mout/mout - - > "Write clearly, don't be too clever" - The Elements of Programming Style - -Avoid unnamed functions and follow the other modules structure. By only using named functions it will be easier to extract the code from the AMD module if needed and it will also give better error messages, JavaScript minifiers like [Google Closure Compiler](http://code.google.com/closure/compiler/) and [UglifyJS](https://github.com/mishoo/UglifyJS) will make sure code is as small/optimized as possible. - - > "Make it clear before you make it faster." - The Elements of Programming Style - -Be sure to always create tests for each proposed module. Features will only be merged if they contain proper tests and documentation. - - > "Good code is its own best documentation." - Steve McConnell - -We should do a code review before merging to make sure names makes sense and implementation is as good as possible. - -Try to split your pull requests into logical groups, the smaller the easier to be reviewed/merged. - - - -## Tests & Code Coverage ## - -Tests can be found inside the `tests` folder, to execute them in the browser open the `tests/runner.html`. The same tests also work on node.js by running `npm test`. - -We should have tests for all methods and ensure we have a high code coverage through our continuous integration server ([travis](https://travis-ci.org/mout/mout)). When you ask for a pull request Travis will automatically run the tests on node.js and check the code coverage as well. - -We run `node build pkg` automatically before any `npm test`, so specs and packages should always be in sync. (will avoid human mistakes) - -To check code coverage run `npm test --coverage`, it will generate the reports inside the `coverage` folder and also log the results. Please note that node.js doesn't execute all code branches since we have some conditionals that are only met on old JavaScript engines (eg. IE 7-8), so we will never have 100% code coverage (but should be close to it). - - - -## Build Script ## - -The [build script](https://github.com/mout/mout/wiki/Build-Script) can be extremely helpful and can avoid human mistakes, use it. - - - -## Admins / Pull Requests ## - -Even if you are an admin (have commit rights) please do pull requests when adding new features or changing current behavior, that way we can review the work and discuss. Feel free to push changes that doesn't affect behavior without asking for a pull request (readme, changelog, build script, typos, refactoring, ...). - - - -## Large changes ## - -If you are proposing some major change, please create an issue to discuss it first. (maybe it's outside the scope of the project) - - - -## Questions / IRC / Wiki / Issue Tracker ## - -When in doubt ask someone on IRC to help you ([#moutjs on irc.freenode.net](http://webchat.freenode.net/?channels=moutjs)) or create a [new issue](http://github.com/mout/mout/issues). - -The [project wiki](https://github.com/mout/mout/wiki) can also be a good resource of information. - - ---- - -Check the [contributors list at github](https://github.com/mout/mout/contributors). - - - -
_Resources/node_modules/mout/doc/ - -### [_Resources/node_modules/mout/doc/array.md](_Resources/node_modules/mout/doc/array.md) -# array # - -Array utilities. - - - - -## append(arr1, arr2):Array - -Appends an array to the end of the other. -The first array will be modified and will contain the appended items. - -See: [`union()`](#union), [`combine()`](#combine) - -```js -var foo = ['a', 'b'], - bar = ['b', 'd']; - -append(foo, bar); // ['a', 'b', 'b', 'd'] -``` - - - -## collect(arr, callback, [thisObj]):Array - -Maps the items in `arr` and concatenates the resulting arrays. - -See: [`map()`](#map) - -```js -collect([1, 2, 3], function(val) { - return [val, val % 2]; -}); // [1, 1, 2, 0, 3, 1]; - -collect(['a', 'bb', ''], function(val) { - return val.split(''); -}); // ['a', 'b', 'b'] -``` - -It also supports a shorthand syntax: - -```js -var items = [{ a: [1] }, { b: 'foo' }, { a: [2, 3] }]; -collect(items, 'a'); // [1, 2, 3]; -``` - - - -## combine(arr1, arr2):Array - -Combines an array with all the items of another. -The first array will be modified and will contain the combined items. -Does not allow duplicates and is case and type sensitive. - -See: [`union()`](#union), [`append()`](#append) - -```js -var foo = ['a', 'b'], - bar = ['b', 'd']; - -combine(foo, bar); // ['a', 'b', 'd'] -``` - - - -## compact(arr):Array - -Returns a new Array without any `null` or `undefined` values. Note that it will -keep empty strings and other falsy values (simillar to Ruby Array#compact). - -```js -var arr = [0, 1, null, false, '', 'foo', undefined, 'bar']; -compact(arr); // [0, 1, false, '', 'foo', 'bar']; -``` - - - -## contains(arr, value):Boolean - -Checks if Array contains value. Alias to `indexOf(arr, val) !== -1`. - -```js -var arr = [1, 2, 3]; -contains(arr, 2); // true -contains(arr, 'foo'); // false -``` - - - -## difference(...arrs):Array - -Return a new Array with elements that aren't present in the other Arrays -besides the first one. - -Works like [Python set#difference](http://docs.python.org/library/stdtypes.html#set.difference). - -It will remove duplicates. - -See: [`xor()`](#xor), [`intersection()`](#intersection) - -```js -var a = ['a', 'b', 1]; -var b = ['c', 1]; -difference(a, b); // ['a', 'b'] -``` - - -## equals(a, b, [compare]):Boolean - -Checks if both arrays are equal. - -```js -equals([1, 2], [1, 2]); // true -equals([2, 4], [1, 2]); // false -``` - -By default it uses the [lang/is](lang.html#is) as the `compare` function but -you can pass a custom function to change the behavior. - -```js -function loose(a, b) { - return a == b; -} -equals(['1', 2], [1, 2], loose); // true -``` - -See: [object/equals](object.html#equals), [lang/deepEquals](lang.html#deepEquals) - - - -## every(arr, callback, [thisObj]):Array - -Crossbrowser `Array.every()`. - -Tests whether all elements in the array pass the test implemented by the provided function. - -It differs from ES5 since it will also loop over sparse items in the array to -normalize the behavior across browsers (avoid inconsistencies). - -```js -var items = [1, 'foo', 'bar']; -every(items, isString); // false -every(items, isFunction); // false -every(items, function(val, key, arr){ - return val != null; -}); // true -``` - -more info at [MDN Array#every](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/every) - -It also supports a shorthand syntax: - -```js -var items = [{id:1, active:true}, {id:3, active:true}, {id:8, active:true}]; -// all items with `id === 8` -every(items, {id:8}); // false -// `active` is truthy on all items -every(items, 'active'); // true -``` - - - -## filter(arr, callback, [thisObj]):Array - -Crossbrowser `Array.filter()`. - -Creates a new array with all elements that pass the callback test. - -It differs from ES5 since it will also loop over sparse items in the array to -normalize the behavior across browsers (avoid inconsistencies). - -```js -var nums = [1, 2, 3, 4, 5, 6]; -var oddNumbers = filter(nums, function(val, key, arr){ - return (val % 2) !== 0; -}); -// > [1, 3, 5] -``` - -more info at [MDN Array#filter](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/filter) - -Filter also supports shorthand notation: - -```js -var users = [ - {name:'john', surname:'connor', beard:false}, - {name:'john', surname:'doe', beard:true}, - {name:'jane', surname:'doe', beard:false} -]; -// filter item that matches all properties/values pairs -filter(users, {name:'john', beard:false}); -// > [{name:'john', surnname:'connor', beard:false}] -// items where 'beard' is a truthy value -filter(users, 'beard'); -// > [{name:'john', surnname:'doe', beard:true}] -``` - -See [`reject()`](#reject) - - - -## find(arr, callback, [thisObj]):* - -Loops through all the items in the Array and returns the first one that passes -a truth test (callback). - -```js -var arr = [123, {a:'b'}, 'foo', 'bar']; -find(arr, isString); // "foo" -find(arr, isNumber); // 123 -find(arr, isObject); // {a:'b'} -``` - -Find also supports shorthand notation: - -```js -var users = [ - {name:'john', surname:'connor', beard:false}, - {name:'john', surname:'doe', beard:true} -]; -// first item that matches all properties/values pairs -find(users, {name:'john'}); // {name:'john', surnname:'connor', beard:false} -// first item where 'beard' is a truthy value -find(users, 'beard'); // {name:'john', surnname:'doe', beard:true} -``` - -See: [findIndex()](#findIndex), [findLast()](#findLast), -[findLastIndex()](#findLastIndex) - - - -## findLast(arr, callback, [thisObj]):* - -Loops through all the items in the Array (starting from last item) and returns -the first one that passes a truth test (callback). - -```js -var arr = [123, {a:'b'}, 'foo', 'bar']; -findLast(arr, isString); // "bar" -findLast(arr, isNumber); // 123 -findLast(arr, isObject); // {a:'b'} -``` - -`findLast` also supports shorthand notation: - -```js -var users = [ - {name:'john', surname:'connor', beard:false}, - {name:'john', surname:'doe', beard:true} -]; -// last item that matches all properties/values pairs -findLast(users, {name:'john'}); // {name:'john', surnname:'doe', beard:true} -// last item where 'beard' is a truthy value -findLast(users, 'beard'); // {name:'john', surnname:'doe', beard:true} -``` - -See: [find()](#find), [findIndex()](#findIndex), -[findLastIndex()](#findLastIndex) - - - -## findIndex(arr, iterator, [thisObj]):Number - -Loops through the items in the Array and returns the index of the first one -that passes a truth test (callback). - -Returns `-1` if no item was found that passes the truth test. - -```js -var arr = [1, { a: 1 }, 'foo', 'bar']; -findIndex(arr, isString); // 2 -findIndex(arr, isNumber); // 0 -findIndex(arr, isObject); // 1 -findIndex(arr, isRegExp); // -1 -``` - -`findIndex` also supports shorthand notation: - -```js -var pets = [ - { pet: 'dog', name: 'Sam' }, - { pet: 'dog', name: 'Maggie' } -]; - -findIndex(pets, { pet: 'dog' }); // 0 -findIndex(pets, { name: 'Maggie' }); // 1 -``` - -See: [find()](#find), [findLastIndex()](#findLastIndex) - - - -## findLastIndex(arr, iterator, [thisObj]):Number - -Loops through the items in the Array on the reverse order and returns the index -of the first one that passes a truth test (callback). - -Returns `-1` if no item was found that passes the truth test. - -```js -var arr = [1, { a: 1 }, 'foo', 'bar']; -findLastIndex(arr, isString); // 3 -findLastIndex(arr, isNumber); // 0 -findLastIndex(arr, isObject); // 1 -findLastIndex(arr, isRegExp); // -1 -``` - -`findLastndex` also supports shorthand notation: - -```js -var pets = [ - { pet: 'dog', name: 'Sam' }, - { pet: 'dog', name: 'Maggie' } -]; - -findLastIndex(pets, { pet: 'dog' }); // 1 -findLastIndex(pets, { name: 'Sam' }); // 0 -``` - -See: [find()](#find), [findIndex()](#findIndex) - - - -## flatten(arr, [level]):Array - -Recursively flattens an array. A new array containing all the elements is -returned. If `level` is specified, it will only flatten up to that level. -Note that arrays within objects will not be flattened. - -### Example - -```js -flatten([1, [2], [3, [4, 5]]]); -// > [1, 2, 3, 4, 5] -flatten([1, [2], [3, [4, 5]]], 1); -// > [1, 2, 3, [4, 5]] -``` - -See: [`object/flatten()`](./object.html#flatten) - - -## forEach(arr, callback, [thisObj]):void - -Crossbrowser `Array.forEach()`. - -It allows exiting the iteration early by returning `false` on the callback. - -It differs from ES5 since it will also loop over sparse items in the array to -normalize the behavior across browsers (avoid inconsistencies). - -```js -var items = ['foo', 'bar', 'lorem', 'ipsum']; -forEach(items, function(val, key, arr){ - console.log(key +' : '+ val); - if (val === 'lorem') { - // stop iteration (break) - return false; - } -}); -``` - -more info at [MDN Array#forEach](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/forEach) - - - -## groupBy(arr, [categorize=identity], [thisObj]):Object - -Groups array elements by the `key` returned from the `categorize` function. - -It will use the [function/identity](function.html#identity) as the default -`categorize` function. - -```js -var items = ['lorem', 'ipsum', 'foo', 'bar', 'baz']; -groupBy(items, function(val) { return val.length }); -// > {'3': ['foo', 'bar', 'baz'], '5': ['lorem', 'ipsum']} -``` - - - -## indexOf(arr, item, [fromIndex]):Number - -Crossbrowser `Array.indexOf()`. - -It differs from ES5 since it will also loop over sparse items in the array to -normalize the behavior across browsers (avoid inconsistencies). - -more info at [MDN Array#indexOf](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf) - - - - -## indicesOf(arr, item, [fromIndex]):Number - -Returns an array of indices where `item` is found in the array. - -Like `array/indexOf` it does loop over sparse items in the array. The optional -`fromIndex` parameter can limit the scope, the same way as it does in indexOf. - -```js -var items = ['lorem', 'ipsum', 'foo', 'ipsum', 'ipsum']; - -indicesOf(items, 'ipsum'); -// > [1, 3, 4] - -indicesOf(items, 'ipsum', 1); -// > [3, 4] -``` - - - - - -## insert(arr, ...items):Number - -Push items into array only if they aren't contained by it. Returns the new -`length` of the array. - -See: [`remove()`](#remove), [`removeAll()`](#removeAll), -[`contains()`](#contains) - -```js -var arr = ['a', 'b']; -insert(arr, 'a'); // 2 : ['a', 'b'] -insert(arr, 'c'); // 3 : ['a', 'b', 'c'] -insert(arr, 1, 2, 'b'); // 5 : ['a', 'b', 'c', 1, 2] -``` - - - -## intersection(...arrs):Array - -Return a new Array with elements common to all Arrays. - -Similar to Python set#intersection and underscore.js intersection. - -It will remove duplicates. - -See: [`difference()`](#difference), [`xor()`](#xor) - -```js -var a = ['a', 'b', 1], - b = ['c', 1], - c = [1, 2, 3]; -intersection(a, b, c); // [1] -``` - - - -## invoke(arr, methodName[, ...args]):Array - -Call `methodName` on each item of the array passing custom arguments if needed. - -```js -invoke([[3,2,1], [9,5,2]], 'sort'); // [[1,2,3], [2,5,9]] -``` - - - -## join(arr, [separator]):String - -Joins the strings in `arr`, inserting `separator` between each value. - -This ignores null values and empty strings that are in the array. `separator` -defaults to an empty string. This will convert all non-string objects in the -array to a string. - -### Example - -```js -join(['a', 'b', 'c']); // 'abc' -join(['foo', 'bar'], ', '); // 'foo, bar' -join([null, 'foo', '', 'bar', undefined], ':'); // 'foo:bar' -``` - - -## last(arr):* - -Returns the last element of an array without modifying the array. - - -```js -last( [1, 2, 3, 4] ) // > 4 -last( ['foo', 'bar'] ) // > 'bar' -``` - - -## lastIndexOf(arr, item, [fromIndex]):Number - -Crossbrowser `Array.lastIndexOf()`. - -It differs from ES5 since it will also loop over sparse items in the array to -normalize the behavior across browsers (avoid inconsistencies). - -more info at [MDN Array#lastIndexOf](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/lastIndexOf) - - - -## map(arr, callback, [thisObj]]):Array - -Crossbrowser `Array.map()`. - -Creates a new array with the results of calling a provided function on every -element in this array. - -It differs from ES5 since it will also loop over sparse items in the array to -normalize the behavior across browsers (avoid inconsistencies). - -See: [`collect()`](#collect) - -```js -var nums = [1,2,3,4]; -var double = map(nums, function(val, key, arr){ - return val * 2; -}); -// > [2, 4, 6, 8] -``` - -more info at [MDN Array#map](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/map) - -It also supports a shorthand notation which can be used to achieve same result -as [`array/pluck`](#pluck): - -```js -var src = ['lorem', 'ipsum', 'foo', 'amet']; -// grab the "length" property of all items -var lengths = map(src, 'length'); // [5, 5, 3, 4] -``` - - - -## max(arr, [iterator], [thisObj]):* - -Returns maximum value inside array or use a custom iterator to define how items -should be compared. - -See: [`min()`](#min) - -```js -max([10, 2, 7]); // 10 -max(['foo', 'lorem', 'amet'], function(val){ - return val.length; -}); // 'lorem' -``` - -It also supports a shorthand notation: - -```js -max(['foo', 'lorem', 'amet'], 'length'); // "lorem" -``` - - - -## min(arr, [iterator], [thisObj]):* - -Returns minimum value inside array or use a custom iterator to define how items -should be compared. - -See: [`max()`](#max) - -```js -min([10, 2, 7]); // 2 -min(['foo', 'lorem', 'amet'], function(val){ - return val.length; -}); // 'foo' -``` - -It also supports a shorthand notation: - -```js -min(['foo', 'lorem', 'amet'], 'length'); // "foo" -``` - - - -## pick(arr, [nItems]):* - -Gets random item(s) and removes it from the original array. - -If `nItems` is specified it will return a new Array contained the *picked* -items otherwise it returns a single item. - -See: [`random/choice()`](./random.html#choice) - -### Example: - -```js -var arr = [1, 2, 3, 4, 5, 6]; -var item1 = pick(arr); // 4 -var item2 = pick(arr); // 1 -var items = pick(arr, 2); // [5, 2] -console.log(arr); // [3, 6] -``` - - - -## pluck(arr, propName):Array - -Extract a list of property values. - -See: [`function/prop()`](function.html#prop) - -```js -var users = [{name : 'John', age: 21}, {name: 'Jane', age : 27}]; -var names = pluck(users, 'name'); // ["John", "Jane"] -var ages = pluck(users, 'age'); // [21, 27] -``` - - - -## range([start], stop[, step]):Array - -Creates a new Array with all the values inside the range. Works similarly to -Python#range or PHP#range. - -### Arguments - - 1. `[start]` (Number) : Range start. Default is `0`. - 2. `stop` (Number) : Range limit. - 3. `[step]` (Number) : Step size. Default is `1`. - -### Example - -```js -range(5); // [0, 1, 2, 3, 4, 5] -range(0, 5); // [0, 1, 2, 3, 4, 5] -range(0, 5, 2); // [0, 2, 4] -range(20, 40, 5); // [20, 25, 30, 35, 40] -``` - - - -## reduce(arr, fn):* - -Crossbrowser `Array.reduce()`. - -Apply a function against an accumulator and each value of the array (from -left-to-right) as to reduce it to a single value. - -It differs from ES5 since it will also loop over sparse items in the array to -normalize the behavior across browsers (avoid inconsistencies). - -more info at [MDN Array#reduce](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/reduce) - - - -## reduceRight(arr, fn):* - -Crossbrowser `Array.reduceRight()`. - -Apply a function simultaneously against two values of the array (from -right-to-left) as to reduce it to a single value. - -It differs from ES5 since it will also loop over sparse items in the array to -normalize the behavior across browsers (avoid inconsistencies). - -more info at [MDN Array#reduceRight](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/reduceRight) - - - -## reject(arr, fn, thisObj):Array - -Creates a new array with all the elements that do **not** pass the truth test. -Opposite of [`filter()`](#filter). - -See [`filter()`](#filter) - -### Example - -```js -var numbers = [1, 2, 3, 4, 5, 6]; -reject(numbers, function(x) { return (x % 2) !== 0; }); // [2, 4, 6] -``` - -It also supports a shorthand syntax: - -```js -var users = [ - {name:'john', surname:'connor', beard:false}, - {name:'john', surname:'doe', beard:true}, - {name:'jane', surname:'doe', beard:false} -]; -// reject items that matches all properties/values pairs -reject(arr, {name:'john'}); -// > [{name:'jane', surnname:'doe', beard:false}] -// reject items where 'beard' is a truthy value -filter(arr, 'beard'); -// > [{name:'john', surnname:'connor', beard:false}, -// {name:'jane', surname:'doe', beard:false}] -``` - - - -## remove(arr, item):void - -Remove a single item from the array. - -IMPORTANT: it won't remove duplicates, just a single item. - -### Example - -```js -var foo = [1, 2, 3, 4]; -remove(foo, 2); -console.log(foo); // [1, 3, 4] -``` - - - -## removeAll(arr, item):void - -Remove all instances of an item from the array. - -### Example - -```js -var foo = [1, 2, 3, 4, 2, 2]; -removeAll(foo, 2); -console.log(foo); // [1, 3, 4]; -``` - -## reverse(arr):void - -Returns a copy of the array with all elements in reversed order. - -### Example - -```js -var foo = [1, 2, 3, 4, 5]; -var bar = reverse(foo); -console.log(bar); // [5, 4, 3, 2, 1]; - -console.log(foo); // [1, 2, 3, 4, 5]; -``` - - - - -## shuffle(arr):Array - -Returns a new Array with items randomly sorted (shuffled). Similar to Ruby Array#shuffle. - -### Example - -```js -var arr = ['a', 'b', 'c', 'd', 'e']; -shuffle(arr); // ['b', 'd', 'e', 'c', 'a'] -``` - - - -## slice(arr, [start], [end]):Array - -Returns a new array containing the items from `arr` from the start index to the -end index. - -If `start` is omitted, it will start at `0`. If `end` is omitted, it will used -the last index of the array. If `start` or `end` is negative, it is used as an -offset from the end of the array. - -It will also convert array-like objects to arrays. - -### Example - -```js -slice([1, 2, 3, 4], 1, 2); // [2, 3] -slice([1, 2, 3], 1); // [2, 3] -slice([1, 2, 3]); // [1, 2, 3] -slice({ length: 2, 0: 'a', 1: 'b' }); // ['a', 'b'] -slice([1, 2, 3], 0, -1); // [1, 2] -slice([1, 2, 3], -2); // [2, 3] -``` - - - -## some(arr, callback, [thisObj]):Array - -Crossbrowser `Array.some()`. - -Tests whether some element in the array passes the test implemented by the provided function. - -It differs from ES5 since it will also loop over sparse items in the array to -normalize the behavior across browsers (avoid inconsistencies). - -```js -var items = [1, 'foo', 'bar']; -some(items, isString); // true -some(items, isFunction); // false -``` - -more info at [MDN Array#some](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/some) - -It also supports a shorthand syntax: - -```js -var items = [{id:1, active:true}, {id:3, active:false}, {id:8, active:false}]; -// at least one item with `id === 8` -some(items, {id:8}); // true -// `active` is truthy on at least one item -some(items, 'active'); // true -``` - -see also: [`object/matches`](object.html#matches) - - - -## sort(arr, [compareFn]):Array - -Returns a sorted Array using the [Merge Sort](http://en.wikipedia.org/wiki/Merge_sort) algorithm (stable sort). - -The `Array.prototype.sort` browser implementations differ since the sorting algorithm isn't described in the ES spec - [in V8 it isn't stable](http://code.google.com/p/v8/issues/detail?id=90) and [on Firefox it is stable](https://bugzilla.mozilla.org/show_bug.cgi?id=224128) - so this function doesn't use the browser native implementation and is recommended in cases where a stable sort is required (items should preserve same order if already sorted). - -**Important:** It does logical comparisson by default (greater/less than) and -not a string comparisson like the native `Array#sort`. - -### compareFn - -If `compareFn` is supplied elements are sorted based on the value returned by -the `compareFn`. - - - If `compareFn(a, b)` is less than `0`, sort `a` to a lower index than `b`. - - If `compareFn(a, b)` returns `0`, leave `a` and `b` unchanged with respect - to each other, but sorted with respect to all different elements. - - If `compareFn(a, b)` is greater than `0`, sort `b` to a lower index than - `a`. - -See: [`sortBy`](#sortBy) - -### Example - -```js -sort([187, 23, 47, 987, 12, 59, 0]); // [0, 12, 23, 47, 59, 187, 987] -sort(['a', 'z', 'c', 'beta', 'b']); // ['a', 'b', 'beta', 'c', 'z'] - -// ['sit', 'amet', 'lorem', 'ipsum'] -sort(['lorem', 'ipsum', 'sit', 'amet'], function(a, b){ - // sort by length, items with same length - // will keep the relative order (stable) - return a.length - b.length; -}); - -// [4, 3, 2, 1] -sort([2, 3, 1, 4], function(a, b){ - // reverse sort - return b - a; -}); -``` - - - -## sortBy(arr, callback, [context]):Array - -Returns an array sorted by the result of the callback. - -The callback is called for each item that is to be sorted, and the -results of the callback are used to sort the array. The callback -is called with the item as the first parameter, optionally with -the provided context. - -It also supports a shorthand notation which can be used to sort by a property -name. - -See: [`sort`](#sort) - -```js -// Returns [{ a: 1 }, { a: 2 }, { a: 3 }] -sortBy([{ a: 1 }, { a: 3 }, { a: 2 }], - function(item) { return item.a; }); - -// Same as above, using shorthand notation -sortBy([{ a: 1 }, { a: 3 }, { a: 2 }], 'a'); -``` - - - -## split(arr, [segments]):Array - -Splits an array into a fixed number of segments. - -The number of segments is specified by `segments` and defaults to 2. If the -array cannot be evenly split, the first segments will contain the extra items. -If `arr` is empty, an empty array is returned. If `arr.length` is less than -`segments`, then the resulting array will have `arr.length` number of -single-element arrays. - -### Example -```js -split([1, 2, 3, 4, 5], 3) // [ [1, 2], [3, 4], [5] ] -split([1, 2, 3, 4, 5]) // [ [1, 2, 3], [4, 5] ] -split([]) // [] -split([1, 2], 3) // [ [1], [2] ] -``` - - - -## take(times, callback, [thisObj]):Array - -Builds a new array based on the returned values from the given `callback`. - -```js -take(4, function(i, total) { - return i / total; -}); -// > [0, 0.25, 0.5, 0.75] -``` - -see: [function/times](../function.html#times) - - - -## toLookup(arr, key):Object - -Create an object that indexes the items in the array by a key. If `key` is a function, the key for each value in the resulting object will be the result of calling the function with the value as an argument. Otherwise `key` specifies the property on each value to use as the key. - -### Example - -```js -var foo = [{ name: 'a', thing: 1 }, { name: 'b', thing: 2 }]; -// { a: { name: 'a', thing: 1 }, b: { name: 'b', thing: 2 } } -toLookup(foo, 'name'); -// same as above -toLookup(foo, function (value) { return value.name; }); -``` - - - -## union(...arrs):Array - -Concat multiple arrays removing duplicates. - -```js -var a = ['a', 'b'], - b = ['c', 'a'], - c = [1, 'b', 2, 3, 'a']; - -//note that unique remove from begin to end -union(a, b, c); // ['c', 1, 'b', 2, 3, 'a'] -``` - - - -## unique(arr, [compare]):Array - -Return a new Array of unique items. - -**IMPORTANT:** duplicates are removed starting from begining of array. - -```js -var arr = [1, 2, 3, 4, 2, 2, 4]; -var foo = unique(arr); -console.log(foo); -// > [1, 3, 2, 4]; - -// you also have the option to set a custom compare function -var users = [{name: 'john'}, {name: 'paul'}, {name: 'john'}]; -var uniqueNames = unique(arr, function(a, b){ - return a.name === b.name; -}); -console.log(uniqueNames); -// > [{name: 'paul'}, {name: 'john'}] -``` - - - -## xor(arr1, arr2):Array - -Exclusive OR. Returns items that are present in a single array. - -Works like [Python set#symmetric_difference](http://docs.python.org/library/stdtypes.html#set.symmetric_difference) renamed for brevity. - -It will remove duplicates. - -See: [`difference()`](#difference), [`intersection()`](#intersection) - -```js -var a = ['a', 'b', 1]; -var b = ['c', 1]; -xor(a, b); // ['a', 'b', 'c'] -``` - - - -## zip(...arrs):Array - -Groups the elements of each array at their corresponding indexes. - -Useful for separate data sources that are coordinated through matching array -indexes. For a matrix of nested arrays, `zip.apply(...)` can transpose the -matrix in a similar fashion. - -```js -// [['moe', 30, true], ['larry', 40, false], ['curly', 50, false]] -zip(['moe', 'larry', 'curly'], [30, 40, 50], [true, false, false]); -``` - - - - -------------------------------------------------------------------------------- - -For more usage examples check specs inside `/tests` folder. Unit tests are the -best documentation you can get... - - - - - - -### [_Resources/node_modules/mout/doc/collection.md](_Resources/node_modules/mout/doc/collection.md) - -# collection # - -Methods for dealing with collections (Array or Objects). - - - -## contains(list, value):Boolean - -Checks if collection contains value. - -```js -contains({a: 1, b: 2, c: 'bar'}, 2); // true -contains([1, 2, 3], 'foo'); // false -``` - -See: [array/contains](array.html#contains), [object/contains](object.html#contains) - - - -## every(list, callback, [thisObj]):Boolean - -Tests whether all values in the collection pass the test implemented by the -provided callback. - -```js -var obj = { - a: 1, - b: 2, - c: 3, - d: 'string' -}; - -every(obj, isNumber); // false -``` - -See: [array/every](array.html#every), [object/every](object.html#every) - - - -## filter(list, callback, [thisObj]):Array - -Filter collection properties. - -See: [array/filter](array.html#filter), [object/filter](object.html#filter) - - - -## find(list, callback, [thisObj]):* - -Loops through all the values in the collection and returns the first one that -passes a truth test (callback). - -**Important:** loop order over objects properties isn't guaranteed to be the -same on all environments. - -```js -find({a: 'foo', b: 12}, isString); // 'foo' -find(['foo', 12], isNumber); // 12 -``` - -See: [array/find](array.html#find), [object/find](object.html#find) - - - -## forEach(list, callback, [thisObj]) - -Loop through all values of the collection. - -See: [array/forEach](array.html#forEach), [object/forOwn](object.html#forOwn) - - - -## map(list, callback, [thisObj]):Array - -Returns a new collection where the properties values are the result of calling -the callback for each property in the original collection. - -See: [array/map](array.html#map), [object/map](object.html#map) - - - -## max(list, [iterator]):* - -Returns maximum value inside collection or use a custom iterator to define how -items should be compared. - -See: [`min()`](#min), [array/max](array.html#max), [object/max](object.html#max) - -```js -max({a: 100, b: 2, c: 1, d: 3, e: 200}); // 200 -max(['foo', 'lorem', 'amet'], function(val){ - return val.length; -}); // 'lorem' -``` - - - -## min(list, [iterator]):* - -Returns minimum value inside collection or use a custom iterator to define how -items should be compared. - -See: [`max()`](#max), [array/min](array.html#min), [object/min](object.html#min) - -```js -min([10, 2, 7]); // 2 -min({a: 'foo', b: 'lorem', c: 'amet'}, function(val){ - return val.length; -}); // 'foo' -``` - - - -## pluck(list, propName):Array - -Extract a list of property values. - -```js -var users = [ - { - name : 'John', - age : 21 - }, - { - name : 'Jane', - age : 27 - } -]; - -pluck(users, 'name'); // ["John", "Jane"] -pluck(users, 'age'); // [21, 27] - -users = { - first: { - name : 'John', - age : 21 - }, - second: { - name : 'Mary', - age : 25 - } -}; - -pluck(users, 'name'); // ['John', 'Mary'] -``` - -See: [array/pluck](array.html#pluck), [object/pluck](object.html#pluck) - - - -## reduce(list, callback, initial, [thisObj]):* - -Apply a function against an accumulator and each value in the collection as to -reduce it to a single value. - -```js -var obj = {a: 1, b: 2, c: 3, d: 4}; - -function sum(prev, cur, key, list) { - return prev + cur; -} - -reduce(obj, sum); // 10 -``` - -See: [array/reduce](array.html#reduce), [object/reduce](object.html#reduce) - - - -## reject(list, fn, [thisObj]):Array - -Creates a new array with all the elements that do **not** pass the truth test. -Opposite of [`filter()`](#filter). - -### Example - -```js -var numbers = [1, 2, 3, 4, 5]; -reject(numbers, function(x) { return (x % 2) !== 0; }); // [2, 4] - -var obj = {a: 1, b: 2, c: 3, d: 4, e: 5}; -reject(obj, function(x) { return (x % 2) !== 0; }); // [2, 4] -``` - -See: [array/reject](array.html#reject), [object/reject](object.html#reject) - - - -## size(list):Number - -Returns the number of values in the collection. - -```js -var obj = { - foo : 1, - bar : 2, - lorem : 3 -}; -size(obj); // 3 -size([1,2,3]); // 3 -size(null); // 0 -``` - -See: [object/size](object.html#size) - - - -## some(list, callback, [thisObj]):Boolean - -Tests whether any values in the collection pass the test implemented by the -provided callback. - -```js -var obj = { - a: 1, - b: 2, - c: 3, - d: 'string' -}; - -some(obj, isNumber); // true -some(obj, isString); // true -some([1, 2, 3], isNumber) // true -some([1, 2, 3], isString) // false -``` - -See: [array/some](array.html#some), [object/some](object.html#some) - - -------------------------------------------------------------------------------- - -For more usage examples check specs inside `/tests` folder. Unit tests are the -best documentation you can get... - - -### [_Resources/node_modules/mout/doc/date.md](_Resources/node_modules/mout/doc/date.md) - -# date # - -Date utilities. - - -## dayOfTheYear(date):Number - -How many days elapsed since begining of the year (following gregorian -calendar). - -```js -// Jan 1st -dayOfTheYear(new Date(2013, 0, 1)); // 1 -// Dec 31th -dayOfTheYear(new Date(2013, 11, 31)); // 364 -``` - - - -## diff(date1, date2, [unitName]):Number - -Calculate the difference between dates (range). - -The returned value is always positive. The default `unitName` is `"ms"`. - -Available units: `year`, `month`, `week`, `day`, `hour`, `minute`, `second`, -`millisecond`. - -See: [`time/convert()`](time.html#convert) - -```js -var d1 = new Date(2012, 4, 5); -var d2 = new Date(2013, 4, 8); -diff(d1, d2); // 31795200000 -diff(d1, d2, 'hour'); // 8832 -diff(d1, d2, 'week'); // 52.57142857142857 -diff(d1, d2, 'month'); // 12.096774193548388 -diff(d1, d2, 'year'); // 1.0082191780821919 -``` - - - -## isLeapYear(fullYear|date):Boolean - -Checks if it's a [leap year](http://en.wikipedia.org/wiki/Leap_year) according -to the Gregorian calendar. - -see: [`totalDaysInMonth()`](#totalDaysInMonth) - -```js -isLeapYear(2012); // true -isLeapYear(2013); // false -isLeapYear(new Date(2012, 2, 28)); // true -``` - - -## isSame(date1, date2[, period]):Boolean - -Check if both dates are the "same". - -You can pass an optional *period* used to set the comparisson precision. - -Available periods: `year`, `month`, `week`, `day`, `hour`, `minute`, `second`. - -```js -var date1 = new Date(2013, 1, 3); -var date2 = new Date(2013, 2, 9); -isSame(date1, date2); // false -isSame(date1, date2, 'day'); // false -isSame(date1, date2, 'month'); // false -isSame(date1, date2, 'year'); // true -``` - - - -## parseIso(str):Number - -Parses an [ISO8601](http://en.wikipedia.org/wiki/Iso8601) date and returns the -number of milliseconds since January 1, 1970, 00:00:00 UTC, or `NaN` if it is -not a valid ISO8601 date. - -This parses *all* ISO8601 dates, including dates without times, [ordinal -dates](https://en.wikipedia.org/wiki/ISO_8601#Ordinal_dates), and the compact -representation (omitting delimeters). The only exception is [ISO week -dates](https://en.wikipedia.org/wiki/ISO_week_date), which are not parsed. - -If no time zone offset is specified, it assumes UTC time. - -```js -// Jan 01, 1970 00:00 GMT -parseIso('1970-01-01T00:00:00') // 0 -parseIso('1970-001') // 0 -parseIso('1970-01-01') // 0 -parseIso('19700101T000000.00') // 0 -parseIso('1970-01-01T02:00+02:00') // 0 - -// Jan 02, 2000 20:10 GMT+04:00 -parseIso('2000-01-02T20:10+04:00') // 946829400000 -``` - - -## quarter(date):Number - -Get a number between 1 to 4 that represents the quarter of the year. - -```js -quarter(new Date(2013, 1, 19)); // 1 -quarter(new Date(2013, 4, 12)); // 2 -quarter(new Date(2013, 7, 25)); // 3 -quarter(new Date(2013, 10, 8)); // 4 -``` - - -## startOf(date, period):Date - -Get a new Date at the start of the period. - -Available periods: `year`, `month`, `week`, `day`, `hour`, `minute`, `second`. - -```js -// Apr 05 2013 11:27:43 -var date = new Date(2013, 3, 5, 11, 27, 43, 123); -startOf(date, 'year'); // Jan 01 2013 00:00:00 -startOf(date, 'month'); // Apr 01 2013 00:00:00 -startOf(date, 'day'); // Apr 05 2013 00:00:00 -startOf(date, 'hour'); // Apr 05 2013 11:00:00 -``` - - - -## strftime(date, format, [l10n]):String - -Format date based on strftime format. - -Replaced tokens: - -
-
%a
locale's abbreviated weekday name.
-
%A
locale's full weekday name.
-
%b
locale's abbreviated month name.
-
%B
locale's full month name.
-
%c
locale's appropriate date and time representation.
-
%C
century number (the year divided by 100 and truncated -to an integer) as a decimal number [00..99].
-
%d
day of the month as a decimal number [01..31].
-
%D
same as %m/%d/%y.
-
%e
day of the month as a decimal number [1..31]; -a single digit is preceded by a space.
-
%F
The ISO 8601 date format (%Y-%m-%d)
-
%h
same as %b.
-
%H
hour (24-hour clock) as a decimal number [00..23].
-
%I
hour (12-hour clock) as a decimal number [01..12].
-
%j
day of the year as a decimal number [001..366].
-
%l
hour (12-hour clock) as a decimal number (range 1 to 12); single digits are preceded by a blank
-
%L
zero-padded milliseconds [000..999]
-
%m
month as a decimal number [01..12].
-
%M
minute as a decimal number [00..59].
-
%n
newline character.
-
%p
locale's equivalent of either "am" or "pm"
-
%P
locale's equivalent of either "AM" or "PM"
-
%r
time in a.m. and -p.m. notation; in the POSIX locale this is equivalent to %I:%M:%S %p.
-
%R
time in 24 hour notation (%H:%M).
-
%s
seconds since Epoch (1970-01-01 00:00:00 UTC)
-
%S
second as a decimal number [00..60].
-
%t
tab character.
-
%T
time (%H:%M:%S).
-
%u
weekday as a decimal number [1..7], with 1 representing -Monday.
-
%U
week number of the year (Sunday as the first day of -the week) as a decimal number [00..53].
-
%V
week number of the year (Monday as the first day of the -week) as a decimal number [01..53]. If the week containing 1 January has -four or more days in the new year, then it is considered week 1. Otherwise, -it is the last week of the previous year, and the next week is week 1.
-
%w
weekday as a decimal number [0..6], with 0 representing -Sunday.
-
%W
week number of the year (Monday as the first day of -the week) as a decimal number [00..53]. All days in a new year preceding -the first Monday are considered to be in week 0.
-
%x
locale's appropriate date representation.
-
%X
locale's appropriate time representation.
-
%y
year without century as a decimal number [00..99].
-
%Y
year with century as a decimal number.
-
%Z
timezone name or abbreviation, or by no bytes -if no timezone information exists.
-
%%
is replaced by %.
-
- -```js -var date = new Date(2013, 3, 8, 9, 2, 4); -strftime(date, '%Y-%m-%d'); // "2013-04-08" -strftime(date, '%R'); // "09:02" -strftime(date, '%Y-%m-%dT%H:%M:%S%z'); // "2013-04-08T09:02:04+0000" -``` - -You can also set a custom locale: - -```js -var ptBr = require('mout/date/i18n/pt-BR'); -strftime(date, '%a, %d %b', ptBr); // 'Seg, 08 Abr' -strftime(date, '%A, %d %B', ptBr); // 'Segunda, 08 Abril' -``` - -To set it globally: - -```js -require('mout/date/i18n_').set( customLocaleData ); -``` - -See [date/i18n](https://github.com/mout/mout/tree/master/src/date/i18n) -for localization examples. - - - -## timezoneAbbr(date):String - -Return timezone abbreviation or similar data. - -The result will vary based on the OS/browser since some environments doesn't -provide enough info about the current locale. - -```js -// IE 7-8 -timezoneAbbr(new Date()); // "-0500" -// Chrome, FF, V8 -timezoneAbbr(new Date()); // "EST" -``` - - - -## timezoneOffset(date):String - -Return time zone as hour and minute offset from UTC (e.g. +0900). - -It's important to note that JavaScript Date object will use the system locale -info to determinate the [timezone -offset](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/getTimezoneOffset) -and that daylight saving time affects the result. - -```js -// if system locale is EST -timezoneOffset(new Date()); // -0500 -``` - - - -## totalDaysInMonth(fullYear, monthIndex):Number - -Returns the amount of days in the month taking into consideration leap years -(following Gregorian calendar). - -see: [`isLeapYear()`](#isLeapYear) - -```js -totalDaysInMonth(2008, 1); // 29 (leap year) -totalDaysInMonth(2009, 1); // 28 - -// you can also pass a Date object as single argument -totalDaysInMonth( new Date(2013, 0, 1) ); // 31 -``` - - -## totalDaysInYear(fullYear):Number - -Returns the amount of days in the year taking into consideration leap years -(following Gregorian calendar). - -see: [`isLeapYear()`](#isLeapYear), [`totalDaysInMonth()`](#totalDaysInMonth) - -```js -totalDaysInYear(2008); // 366 (leap year) -totalDaysInYear(2009); // 365 - -// you can also pass a Date object as single argument -totalDaysInYear( new Date(2013, 0, 1) ); // 365 -``` - - - -## weekOfTheYear(date, [firstDayOfWeek]):Number - -Returns how many weeks elapsed since start of the year (`0..53`). - -`firstDayOfWeek` can be `0` (Sunday) or `1` (Monday). By default weeks start at -Sunday. - -It will return `0` if `date` is before the first `firstDayOfWeek` of the year. - -```js -// Tue Jan 01 2013 -weekOfTheYear( new Date(2013,0,1) ); // 0 -// Wed Jan 09 2013 -weekOfTheYear( new Date(2013,0,9) ); // 1 -// Sun Jan 01 2012 -weekOfTheYear( new Date(2012,0,1) ); // 1 -// Mon Jan 09 2012 -weekOfTheYear( new Date(2012,0,9) ); // 2 -``` - - - -------------------------------------------------------------------------------- - -For more usage examples check specs inside `/tests` folder. Unit tests are the -best documentation you can get... - - - -### [_Resources/node_modules/mout/doc/function.md](_Resources/node_modules/mout/doc/function.md) - -# function # - -Function*(al)* utilities. - -## after(fn, n):Function - -This creates a function that will only call `fn` if it was called `n` or more times. - - -```js -function onLoaded() { - console.log('all images loaded'); -} - -var imagePaths = ['1.jpg', '2.jpg', '3.jpg']; -var callback = after(onLoaded, imagePaths.length); - -forEach(imagePaths, function(path) { - asyncLoad(path, callback); -}); -``` - -## awaitDelay(fn, delay):Function - -Returns a function that ensures that `fn` is only called *after* `delay` -milliseconds have elapsed. When the returned function is called before the -delay has elapsed, it will wait until the delay has elapsed and then call `fn`. -When the returned function is called after the delay has elapsed, it will call -`fn` after the next "tick" (it will always be called asynchronously). The -context and arguments that the returned function is called in are applied to -`fn`. - -In the below example `onLoaded` will not be executed before a 1000 millisecond -delay. Even if `loadImages` loads and calls `callback` earlier. However, say -the images take 1500 milliseconds to load, it will trigger `onLoaded` -immediately. - -```js -var callback = awaitDelay(onLoaded, 1000); -loadImages(callback); -function onLoaded(){ - console.log('loaded'); -} -``` - -You can also cancel de delayed call by simply using the native `clearTimeout` -method (like a regular `setTimeout` call). - -```js -var timeoutId = callback(); -// onLoaded won't be called since it was canceled before the 1000ms delay -clearTimeout(timeoutId); -``` - -### Arguments: - - 1. `fn` (Function) : Target Function - 2. `delay` (Number) : Delay of execution in milliseconds - -See: [`debounce()`](#debounce) - - - -## bind(fn, context, [...args]):Function - -Return a function that will execute in the given context, optionally adding any additional supplied parameters to the beginning of the arguments collection. - -### Arguments - - 1. `fn` (Function) : Target Function - 2. `context` (Object) : Execution context (object used as `this`) - 3. `[...args]` (*) : Arguments (0...n arguments) - -See: [`partial()`](#partial), [object/bindAll](./object.html#bindAll) - - - -## compose(...fn):Function - -Returns the composition of a list of functions, where each function consumes -the return value of the function that follows. In math terms, composing the -functions `f()`, `g()`, and `h()` produces `f(g(h()))`. - -```js -function add2(x) { return x + 2 } -function multi2(x) { return x * 2 } -map([1, 2, 3], compose(add2, multi2)); // [4, 6, 8] - -//same as -map([1, 2, 3], function(x){ - return add2( multi2(x) ); -}); -``` - - - -## constant(value):Function - -Returns a new function that will always return `value` when called. - -```js -var f = constant('foo'); -f(); // 'foo' - -// Provided arguments are ignored; value is always returned -f(1); // 'foo' - -f = constant({ foo: 'bar' }); -f(); // { foo: 'bar' } -``` - - - -## debounce(fn, delay[, isAsap]):Function - -Creates a function that will delay the execution of `fn` until after `delay` -milliseconds have elapsed since the last time it was invoked. - -Subsequent calls to the debounced function will return the result of the last -`fn` call. - -```js -// sometimes less is more -var lazyRedraw = debounce(redraw, 300); -foo.on.resize.add(lazyRedraw); -``` - -In this visualization, `|` is a debounced-function call and `X` is the actual -callback execution: - - Default - ||||||||||||||||||||||||| (pause) ||||||||||||||||||||||||| - X X - - Debounced with `isAsap == true`: - ||||||||||||||||||||||||| (pause) ||||||||||||||||||||||||| - X X - -You also have the option to cancel the debounced call if it didn't happen yet: - -```js -lazyRedraw(); -// lazyRedraw won't be called since `cancel` was called before the `delay` -lazyRedraw.cancel(); -``` - -See: [`throttle()`](#throttle) - - -## func(name):Function - -Returns a function that calls a method with given `name` on supplied object. -Useful for iteration methods like `array/map` and `array/forEach`. - -See: [`prop()`](#prop) - -```js -// will call the method `getName()` for each `user` -var names = map(users, func('getName')); -``` - - - -## identity(val):* - -Returns the first argument provided to it. - -```js -identity(3); // 3 -identity(1,2,3); // 1 -identity('foo'); // "foo" -``` - - - -## partial(fn, [...args]):Function - -Return a partially applied function supplying default arguments. - -This method is similar to [`bind`](#bind), except it does not alter the this -binding. - -### Arguments - - 1. `fn` (Function) : Target Function - 2. `[...args]` (*) : Arguments (0...n arguments) - -See: [`bind()`](#bind) - -```js -function add(a, b){ return a + b } -var add10 = partial(add, 10); -console.log( add10(2) ); // 12 -``` - - - -## prop(name):Function - -Returns a function that gets a property with given `name` from supplied object. -Useful for using in conjunction with `array/map` and/or for creating getters. - -See: [`array/pluck()`](array.html#pluck) - -```js -var users = [{name:"John", age:21}, {name:"Jane", age:25}]; -// ["John", "Jane"] -var names = map(users, prop('name')); -``` - - - -## series(...fn):Function - -Returns a function that will execute all the supplied functions in order and -passing the same parameters to all of them. Useful for combining multiple -`array/forEach` into a single one and/or for debugging. - -```js -// call `console.log()` and `doStuff()` for each item item in the array -forEach(arr, series(console.log, doStuff)); -``` - - - -## throttle(fn, interval):Function - -Creates a function that, when executed, will only call the `fn` function at -most once per every `interval` milliseconds. - -If the throttled function is invoked more than once during the wait timeout, -`fn` will also be called on the trailing edge of the timeout. - -Subsequent calls to the throttled function will return the result of the last -`fn` call. - -```js -// sometimes less is more -var lazyRedraw = throttle(redraw, 300); -foo.on.resize.add(lazyRedraw); -``` - -In this visualization, `|` is a throttled-function call and `X` is the actual -`fn` execution: - - ||||||||||||||||||||||||| (pause) ||||||||||||||||||||||||| - X X X X X X X X X X X X - -You also have the option to cancel the throttled call if it didn't happen yet: - -```js -lazyRedraw(); -setTimeout(function(){ - lazyRedraw(); - // lazyRedraw will be called only once since `cancel` was called before - // the `interval` for 2nd call completed - lazyRedraw.cancel(); -}, 250); -``` - -See: [`debounce()`](#debounce) - - -## timeout(fn, millis, context, [...args]):Number - -Functions as a wrapper for `setTimeout`. Calls a the function `fn` after a given delay `millis` in milliseconds. -The function is called within the specified context. The return value can be used to clear the timeout using `clearTimeout`. - -```js -var id = timeout(doStuff, 300, this); - -clearTimeout(id); -``` - -## times(n, callback, [context]):void - -Iterates over a callback `n` times. - -### Arguments - - 1. `n` (Number) : Number of iterations - 2. `callback` (Function) : Closure executed for every iteration - 3. `context` (Object) : Execution context (object used as `this`) - -```js -var output = ''; -times(5, function(i) { - output += i.toString(); -}); -// output: 01234 -``` - -## wrap(fn, wrapper):Function - -Wraps the first `fn` inside of the `wrapper` function, passing it as the first argument. This allows the `wrapper` to execute code before and after the `fn` runs, adjust the arguments, and execute it conditionally. - -```js -var hello = function(name) { return "hello: " + name; }; -hello = wrap(hello, function(func) { - return "before, " + func("moe") + ", after"; -}); -hello(); -// output: 'before, hello: moe, after' -``` - -See: [`partial()`](#partial) -------------------------------------------------------------------------------- - -For more usage examples check specs inside `/tests` folder. Unit tests are the -best documentation you can get... - - -### [_Resources/node_modules/mout/doc/lang.md](_Resources/node_modules/mout/doc/lang.md) - -# lang # - -Language Utilities. Easier inheritance, scope handling, type checks. - - - -## clone(val):* - -Clone native types like Object, Array, RegExp, Date and primitives. - -This method will not clone values that are referenced within `val`. It will -only copy the value reference to the new value. If the value is not a plain -object but is an object, it will return the value unchanged. - -### Example - -```js -var a = { foo: 'bar' }; -var b = clone(a); -console.log(a === b); // false -console.log(a.foo === b.foo); // true - -var c = [1, 2, 3]; -var d = clone(b); -console.log(c === d); // false -console.log(c); // [1, 2, 3] -``` - -See: [`deepClone()`](#deepClone) - - - -## createObject(parent, [props]):Object - -Create Object using prototypal inheritance and setting custom properties. - -Mix between [Douglas Crockford Prototypal Inheritance](http://javascript.crockford.com/prototypal.html) and [`object/mixIn`](./object.html#mixIn). - -### Arguments - - 1. `parent` (Object) : Parent Object - 2. `[props]` (Object) : Object properties - -### Example - -```js -var base = { - trace : function(){ - console.log(this.name); - } -}; - -var myObject = createObject(base, { - name : 'Lorem Ipsum' -}); - -myObject.trace(); // "Lorem Ipsum" -``` - - - -## ctorApply(constructor, args):Object - -Do `Function.prototype.apply()` on a constructor while maintaining prototype -chain. - -```js -function Person(name, surname) { - this.name = name; - this.surname = surname; -} - -Person.prototype.walk = function(){ - console.log(this.name +' is walking'); -}; - -var args = ['John', 'Doe']; - -// "similar" effect as calling `new Person("John", "Doe")` -var john = ctorApply(Person, args); -john.walk(); // "John is walking" -``` - - - -## deepClone(val, [instanceClone]):* - -Deep clone native types like Object, Array, RegExp, Date and primitives. - -The `instanceClone` function will be invoked to clone objects that are not -"plain" objects (as defined by [`isPlainObject`](#isPlainObject)) if it is -provided. If `instanceClone` is not specified, it will not attempt to clone -non-plain objects, and will copy the object reference. - -### Example - -```js -var a = {foo:'bar', obj: {a:1, b:2}}; -var b = deepClone(a); // {foo:'bar', obj: {a:1, b:2}} -console.log( a === b ); // false -console.log( a.obj === b.obj ); // false - -var c = [1, 2, [3, 4]]; -var d = deepClone(c); // [1, 2, [3, 4]] -var e = c.concat(); // [1, 2, [3, 4]] - -console.log( c[2] === d[2] ); // false -// concat doesn't do a deep clone, arrays are passed by reference -console.log( e[2] === d[2] ); // true - -function Custom() { } -function cloneCustom(x) { return new Custom(); } -var f = { test: new Custom() }; -var g = deepClone(f, cloneCustom); -g.test === f.test // false, since new Custom instance will be created -``` - -See: [`clone()`](#clone) - - - -## deepEquals(a, b, [callback]):Boolean - -Recursively tests whether two values contains the same keys and values. - -`callback` specifies the equality comparison function used to compare -non-object values. It defaults to using the [`is()`](#is) function. - -If the values are both an object or array, it will recurse into both values, -checking if their keys/values are equal. It will only check the keys and values -contained by the objects; it will not check the objects' prototypes. If either -of the values are not objects, they will be checked using the `callback` -function. - -Example: - -```js -deepEquals({ a: 1 }, { a: 1 }); // true -deepEquals({ value: { a: 1 } }, { value: { a: 1 } }); // true -deepEquals({ value: { a: 1 } }, { value: { a: 2 } }); // false -deepEquals({ value: { a: 1 } }, { value: { a: 1, b: 2 } }); // false -deepEquals({}, null); // false -deepEquals(null, null); // true -deepEquals( - { a: { b: 1 } }, - { a: { b: '1' } }, - function(a, b) { return a == b; }); // true -``` - -See: [object/equals](object.html#equals), [array/equals](array.html#equals) - - - -## defaults(val, ...defaults):void - -Return first value that isn't `null` or `undefined`. - - function doSomethingAwesome(foo, bar) { - // default arguments - foo = defaults(foo, 'lorem'); - bar = defaults(bar, 123); - // ... - } - - - -## GLOBAL:Object - -Reference to the global context (`window` inside a browser, `global` on -node.js). Works on ES3 and ES5 strict-mode. - - - -## inheritPrototype(childCtor, parentCtor):Object - -Inherit the prototype methods from one constructor into another. - -Similar to [node.js util/inherits](http://nodejs.org/docs/latest/api/util.html#util_util_inherits_constructor_superconstructor). - -It returns the the `childCtor.prototype` for convenience. - -```js -function Foo(name){ - this.name = name; -} -Foo.prototype = { - getName : function(){ - return this.name; - } -}; - -function Bar(name){ - Foo.call(this, name); -} -//should be called before calling constructor -var proto = inheritPrototype(Bar, Foo); - -// for convenience we return the new prototype object -console.log(proto === Bar.prototype); // true - -var myObj = new Bar('lorem ipsum'); -myObj.getName(); // "lorem ipsum" - -console.log(myObj instanceof Foo); // true - -// you also have access to the "super" constructor -console.log(Bar.super_ === Foo); // true -``` - - -## is(x, y):Boolean - -Check if both values are identical/egal. - -```js -// wtfjs -NaN === NaN; // false --0 === +0; // true - -is(NaN, NaN); // true -is(-0, +0); // false -is('a', 'b'); // false -``` - -See: [`isnt()`](#isnt) - - - -## isnt(x, y):Boolean - -Check if both values are not identical/egal. - -```js -// wtfjs -NaN === NaN; // false --0 === +0; // true - -isnt(NaN, NaN); // false -isnt(-0, +0); // true -isnt('a', 'b'); // true -``` - -See: [`is()`](#is) - - - - -## isArguments(val):Boolean - -If value is an "Arguments" object. - - - -## isArray(val):Boolean - -If value is an Array. Uses native ES5 `Array.isArray()` if available. - - - -## isBoolean(val):Boolean - -If value is a Boolean. - - - -## isDate(val):Boolean - -If value is a Date. - - - -## isEmpty(val):Boolean - -Checks if Array/Object/String is empty. - -Will return `true` for any object that doesn't contain enumerable properties -and also to any type of value that isn't considered a collection (boolean, -null, undefined, function, etc). - -```js -isEmpty(''); // true -isEmpty('bar'); // false -isEmpty([]); // true -isEmpty([1, 2]); // false -isEmpty({}); // true -isEmpty({a:1, b:2}); // false -// null, undefined, booleans, numbers are considered as "empty" values -isEmpty(null); // true -isEmpty(undefined); // true -isEmpty(123); // true -isEmpty(true); // true -``` - - -## isFinite(val):Boolean - -Checks if value is Finite. - -**IMPORTANT:** This is not the same as native `isFinite`, which will return -`true` for values that can be coerced into finite numbers. See -http://es5.github.com/#x15.1.2.5. - -```js -isFinite(123); // true -isFinite(Infinity); // false - -// this is different than native behavior -isFinite(''); // false -isFinite(true); // false -isFinite([]); // false -isFinite(null); // false -``` - - -## isFunction(val):Boolean - -If value is a Function. - - - -## isKind(val, kind):Boolean - -If value is of "kind". (used internally by some of the *isSomething* checks). - -Favor the other methods since strings are commonly mistyped and also because -some "kinds" can only be accurately checked by using other methods (e.g. -`Arguments`), some of the other checks are also faster. - -```js -isKind([1,2], 'Array'); // true -isKind(3, 'Array'); // false -isKind(3, 'Number'); // true -``` - -See: [`kindOf()`](#kindOf) - - - -## isInteger(val):Boolean - -Check if value is an integer. - -```js -isInteger(123); // true -isInteger(123.45); // false -isInteger({}); // false -isInteger('foo'); // false -isInteger('123'); // false -``` - - - -## isNaN(val):Boolean - -Check if value is not a number. - -It doesn't coerce value into number before doing the check, giving better -results than native `isNaN`. Returns `true` for everything besides numeric -values. - -**IMPORTANT:** behavior is very different than the native `isNaN` and way more -useful!!! See: http://es5.github.io/#x15.1.2.4 - -```js -isNaN(123); // false - -isNaN(NaN); // true -isNaN({}); // true -isNaN(undefined); // true -isNaN([4,5]); // true - -// these are all "false" on native isNaN and main reason why this module exists -isNaN(''); // true -isNaN(null); // true -isNaN(true); // true -isNaN(false); // true -isNaN("123"); // true -isNaN([]); // true -isNaN([5]); // true -``` - - - -## isNull(val):Boolean - -If value is `null`. - - - -## isNumber(val):Boolean - -If value is a Number. - - - -## isObject(val):Boolean - -If value is an Object. - - - -## isPlainObject(val):Boolean - -If the value is an Object created by the Object constructor. - - - -## isRegExp(val):Boolean - -If value is a RegExp. - - - -## isString(val):Boolean - -If value is a String. - - - -## isUndefined(val):Boolean - -If value is `undefined`. - - - -## kindOf(val):String - -Gets kind of value (e.g. "String", "Number", "RegExp", "Null", "Date"). -Used internally by `isKind()` and most of the other *isSomething* checks. - -```js -kindOf([1,2]); // "Array" -kindOf('foo'); // "String" -kindOf(3); // "Number" -``` - -See: [`isKind()`](#isKind) - - -## toArray(val):Array - -Convert array-like object into Array or wrap value into Array. - -```js -toArray({ - "0" : "foo", - "1" : "bar", - "length" : 2 -}); // ["foo", "bar"] - -function foo(){ - return toArray(arguments); -} -foo("lorem", 123); // ["lorem", 123] - -toArray("lorem ipsum"); // ["lorem ipsum"] -toArray(window); // [window] -toArray({foo:"bar", lorem:123}); // [{foo:"bar", lorem:123}] -``` - -See: object/values() - - - -## toNumber(val):Number - -Convert value into number. - -```js -// numeric values are typecasted as Number -toNumber('123'); // 123 -toNumber(-567); // -567 - -// falsy values returns zero -toNumber(''); // 0 -toNumber(null); // 0 -toNumber(undefined); // 0 -toNumber(false); // 0 - -// non-numeric values returns NaN -toNumber('asd'); // NaN -toNumber({}); // NaN -toNumber([]); // NaN - -// Date objects return milliseconds since epoch -toNumber(new Date(1985, 6, 23)); // 490935600000 -``` - - - -## toString(val):String - -Convert any value to its string representation. - -Will return an empty string for `undefined` or `null`, otherwise will convert -the value to its string representation. - -```js -// null and undefined are converted into empty strings -toString(null); // "" -toString(undefined); // "" - -toString(1); // "1" -toString([1,2,3]); // "1,2,3" -toString(false); // "false" - -// uses `val.toString()` to convert value -toString({toString:funtion(){ return 'foo'; }}); // "foo" -``` - - - -------------------------------------------------------------------------------- - -For more usage examples check specs inside `/tests` folder. Unit tests are the -best documentation you can get... - - -### [_Resources/node_modules/mout/doc/math.md](_Resources/node_modules/mout/doc/math.md) - -# math # - -Math utilities. - - -## ceil(val[, step]):Number - -Round value up to full steps. Similar to `Math.ceil()` but can round value -to an arbitrary *radix*. - - ceil(7.2); // 8 - ceil(7.8); // 8 - ceil(7, 5); // 10 - ceil(11, 5); // 15 - ceil(15, 5); // 15 - -### Common use cases - -Round values by increments of 5/10/1000/etc. - -See: [`round()`](#round), [`floor()`](#floor), [`countSteps()`](#countSteps) - - - -## clamp(val, min, max):Number - -Clamps value inside range. - -`clamp()` is extremely useful in cases where you need to limit a value inside -a certain range. So instead of doing a complex `if/else` to filter/process the -value you can restrict it to always be inside the desired range: - - clamp(-5, 0, 10); // 0 - clamp(7, 1, 10); // 7 - clamp(8, 1, 10); // 8 - clamp(10, 1, 10); // 10 - clamp(11, 1, 10); // 10 - -If the value is smaller than `min` it returns the `min`, if `val` is higher -than `max` it returns `max`. - -### Common use cases - -Any situation where you need to limit a number inside a range like: slider -position, image galleries (so user can't skip to an image that doesn't -exist), drag and drop, scroll boundaries, etc. - -See: [`loop()`](#loop) - - - - -## countSteps(val, step[, overflow]):Number - -Count number of full steps. - -### Arguments: - - 1. `val` (Number) : Value. - 2. `step` (Number) : Step size. - 3. `[overflow]` (Number) : Maximum number of steps, nSteps will loop if -`>=` than overflow. - - -Count steps is very useful for cases where you need to know how many "full -steps" the number *completed*. Think of it as a division that only returns -integers and ignore remainders. - - countSteps(3, 5); // 0 - countSteps(6, 5); // 1 - countSteps(12, 5); // 2 - countSteps(18, 5); // 3 - countSteps(21, 5); // 4 - -You can also set an `overflow` which will reset the *counter* before reaching -this number. - - countSteps(3, 5, 3); // 0 - countSteps(6, 5, 3); // 1 - countSteps(12, 5, 3); // 2 - countSteps(18, 5, 3); // 0 - countSteps(21, 5, 3); // 1 - -### Common use cases - -#### How many items fit inside an area: - - var containerWidth = 100; - var itemWidth = 8; - var howManyFit = countSteps(containerWidth, itemWidth); // 12 - -#### Split value into different scales or convert value from one scale to another - -From [mout/time/parseMs](time.html#parseMs): - - function parseMs(ms){ - return { - milliseconds : countSteps(ms, 1, 1000), - seconds : countSteps(ms, 1000, 60), - minutes : countSteps(ms, 60000, 60), - hours : countSteps(ms, 3600000, 24), - days : countSteps(ms, 86400000) - }; - } - - // {days:27, hours:4, minutes:26, seconds:5, milliseconds:454} - parseMs(2348765454); - - - -## floor(val[, step]):Number - -Round value down to full steps. Similar to `Math.floor()` but can round value -to an arbitrary *radix*. (formerly `snap`) - - floor(7.2); // 7 - floor(7.8); // 7 - floor(7, 5); // 5 - floor(11, 5); // 10 - floor(15, 5); // 15 - -### Common use cases - -Round values by increments of 5/10/1000/etc. - -See: [`round()`](#round), [`ceil()`](#ceil), [`countSteps()`](#countSteps) - - - -## inRange(val, min, max[, threshold]):Boolean - -Checks if value is inside the range. - - inRange(-6, 1, 10); // false - inRange( 5, 1, 10); // true - inRange(12, 1, 10); // false - -The threshold can be useful when you want granular control of what should match -and/or the precision could change at runtime or by some configuration option, -avoids the clutter of adding/subtracting the `threshold` from `mix` and `max`. - - inRange(12, 1, 10, 2); // true - inRange(13, 1, 10, 2); // false - -### Common use cases - -Anything that needs to check if value is inside a range, be it collision -detection, limiting interaction by mouse position, ignoring parts of the logic -that shouldn't happen if value isn't valid, simplify `if/else` conditions, -making code more readable, etc... - - - - -## isNear(val, target, threshold):Boolean - -Check if value is close to target. - -Similar to `inRange()` but used to check if value is close to a certain value -or match the desired value. Basically to simplify `if/else` conditions and to -make code clearer. - - isNear( 10.2, 10, 0.5); // true - isNear( 10.5, 10, 0.5); // true - isNear(10.51, 10, 0.5); // false - -### Common use cases - -Games where a certain action should happen if an *actor* is close to a target, -gravity fields, any numeric check that has some tolerance. - - - - -## lerp(ratio, start, end):Number - -Linear interpolation. - - lerp(0.5, 0, 10); // 5 - lerp(0.75, 0, 10); // 7.5 - -### Common use cases - -Linear interpolation is commonly used to create animations of elements moving -from one point to another, where you simply update the current ratio (which in -this case represents time) and get back the position of the element at that -"frame". - -The core idea of `lerp` is that you are using a number that goes from `0` to -`1` to specify a ratio inside that scale. This concept can be applied to -convert numbers from different scales easily. - -See: [`map()`](#map), [`norm()`](#norm) - - - - -## loop(val, min, max):Number - -Loops value inside range. Will return `min` if `val > max` and `max` if `val -< min`, otherwise it returns `val`. - - loop(-1, 0, 10); // 10 - loop( 1, 0, 10); // 1 - loop( 5, 0, 10); // 5 - loop( 9, 0, 10); // 9 - loop(10, 0, 10); // 10 - loop(11, 0, 10); // 0 - -Similar to [`clamp()`](#clamp) but *loops* the value inside the range when an -overflow occurs. - -### Common use cases - -Image galleries, infinite scroll, any kind of logic that requires that the -first item should be displayed after the last one or the last one should be -displayed after first if going on the opposite direction. - -See: [`clamp()`](#clamp) - - - - -## map(val, min1, max1, min2, max2):Number - -Maps a number from one scale to another. - - map(3, 0, 4, -1, 1) // 0.5 - map(3, 0, 10, 0, 100) // 30 - -### Common use cases - -Very useful to convert values from/to multiple scales. - -Let's suppose we have a slider that needs to go from `2000` to `5000` and that slider -has `300px` of width, here is how we would translate the knob position into the -current value: - - var knobX = 123; - var sliderWid = 300; - var minVal = 2000; - var maxVal = 5000; - - var curVal = map(knobX, 0, sliderWid, minVal, maxVal); // 3230 - -See: [`lerp()`](#lerp), [`norm()`](#norm) - - - - -## norm(val, min, max):Number - -Gets normalized ratio of value inside range. - -If `val < min` or `val > max` it will throw a `RangeError` since we can't -normalize the value. - - norm(50, 0, 100); // 0.5 - norm(75, 0, 100); // 0.75 - norm(100, 0, 100); // 1 - norm(-50, 0, 100); // RangeError: value (-50) must be between 0 and 100 - -### Common use cases - -Convert values between scales, used by [`map()`](#map) internally. Direct -opposite of [`lerp()`](#lerp). - -See: [`lerp()`](#lerp), [`map()`](#map) - - -## overflow(val[, min], max):Number - -Wraps number within [min, max). When no `min` is given, the value `0` is assumed. -A number larger or equal `max` loops around and starts over at `min`. For positive numbers larger -or equal max this method behaves identical to the modulo operator. -Numbers smaller than min loop around and start over at `max`. - - overflow(13, 5, 10); // 8 - overflow(3, 5, 10); // 8 - overflow(23, 5); // 3 - overflow(-10, -7, -1); // -4 - -See: [`loop()`](#loop) - - -## round(val[, step]):Number - -Round value to full steps. Similar to `Math.round()` but allow setting an -arbitrary *radix*. - - // default - round(0.22); // 0 - round(0.49); // 0 - round(0.51); // 1 - - // custom radix - round(0.22, 0.5); // 0 - round(0.49, 0.5); // 0.5 - round(0.51, 0.5); // 0.5 - round(0.74, 0.5); // 0.5 - round(0.75, 0.5); // 1 - round(1.24, 0.5); // 1 - round(1.25, 0.5); // 1.5 - round(1.74, 0.5); // 1.5 - -### Common use cases - -Round values by increments of 0.5/5/10/1000/etc. - -See: [`floor()`](#floor), [`ceil()`](#ceil), [`countSteps()`](#countSteps) - - -------------------------------------------------------------------------------- - -For more usage more info check the specs and source code. - - - -### [_Resources/node_modules/mout/doc/number.md](_Resources/node_modules/mout/doc/number.md) - -# number # - -Number utilities. - - -## abbreviate(val[, nDecimalDigits, dictionary]):String - -Abbreviate number to thousands (K), millions (M) or billions (B). - -The default value for `nDecimalDigits` is `1`. - -### Example - - abbreviate(123456); // "123.5K" - abbreviate(12345678); // "12.3M" - abbreviate(1234567890); // "1.2B" - -You can set the amount of decimal digits (default is `1`): - - abbreviate(543); // "0.5K" - abbreviate(543, 1); // "0.5K" - abbreviate(543, 2); // "0.54K" - abbreviate(543, 3); // "0.543K" - -You can customize the abbreviation by passing a custom "dictionary": - - var _ptbrDict = { - thousand: ' mil', - million: ' Mi', - billion: ' Bi' - }; - function customAbbr(val) { - return abbreviate(val, 1, _ptbrDict); - } - - customAbbr(123456); // "123.5 mil" - customAbbr(12345678); // "12.3 Mi" - customAbbr(1234567890); // "1.2 Bi" - - - -## currencyFormat(val[, nDecimalDigits, decimalSeparator, thousandsSeparator]):String - -Format a number as currency. - -### Example: - - currencyFormat(1000); // "1,000.00" - currencyFormat(1000, 1); // "1,000.0" - currencyFormat(1000, 2, ',', '.'); // "1.000,00" - - - -## enforcePrecision(val, nDecimalDigits):Number - -Enforce a specific amount of decimal digits and also fix floating point -rounding issues. - -### Example: - -```js -enforcePrecision(0.615, 2); // 0.62 -enforcePrecision(0.625, 2); // 0.63 -//floating point rounding "error" (rounds to odd number) -+(0.615).toFixed(2); // 0.61 -+(0.625).toFixed(2); // 0.63 -``` - - -## isNaN(val):Boolean - -ES6 `Number.isNaN()`, checks if supplied value is `NaN`. - -```js -// only returns `true` for `NaN` -isNaN(NaN); // true -isNaN(0 / 0); // true - -// everything else is `false` -isNaN(true); // false -isNaN(123); // false -isNaN('asd'); // false -isNaN('NaN'); // false -``` - - -## MAX_INT:Number - -Maximum 32-bit signed integer value. `Math.pow(2, 31) - 1` - -### Example: - -```js -console.log( MAX_INT ); // 2147483647 -``` - - -## MAX_SAFE_INTEGER:Number - -Maximum safe integer. `Math.pow(2,53) − 1` - - -## MAX_UINT:Number - -Maximum 32-bit unsigned integer value. `Math.pow(2, 32) - 1` - -### Example: - -```js -console.log( MAX_UINT ); // 4294967295 -``` - - -## MIN_INT:Number - -Minimum 32-bit signed integer value. `Math.pow(2, 31) * -1`. - -### Example: - -```js -console.log( MIN_INT ); // -2147483648 -``` - - -## nth(n):String - -Returns the "nth" of number. (`"st"`, `"nd"`, `"rd"`, `"th"`) - -```js -nth(1); // "st" -nth(2); // "nd" -nth(12); // "th" -nth(22); // "nd" -nth(23); // "rd" -nth(34); // "th" -``` - -See: [`ordinal()`](#ordinal) - - - -## ordinal(n):String - -Converts number into ordinal form (1st, 2nd, 3rd, 4th, ...) - -```js -ordinal(1); // "1st" -ordinal(2); // "2nd" -ordinal(3); // "3rd" -ordinal(14); // "14th" -ordinal(21); // "21st" -``` - -See: [`nth()`](#nth) - - - -## pad(n, minLength[, char]):String - -Add padding zeros if `n.length` < `minLength`. - -### Example: - -```js -pad(1, 5); // "00001" -pad(12, 5); // "00012" -pad(123, 5); // "00123" -pad(1234, 5); // "01234" -pad(12345, 5); // "12345" -pad(123456, 5); // "123456" - -// you can also specify the "char" used for padding -pad(12, 5, '_'); // "___12" -``` - -see: [string/lpad](./string.html#lpad) - - - -## rol(val, shift):Number - -Bitwise circular shift left. - -More info at [Wikipedia#Circular_shift](http://en.wikipedia.org/wiki/Circular_shift) - - - -## ror(val, shift):Number - -Bitwise circular shift right. - -More info at [Wikipedia#Circular_shift](http://en.wikipedia.org/wiki/Circular_shift) - - - -## sign(val):Number - -Returns `-1` if value is negative, `0` if the value is `0` and `1` if value is positive. Useful for -multiplications. - -```js -sign(-123); // -1 -sign(123); // 1 -sign(0); // 0 -``` - - - -## toInt(val):Number - -"Convert" value into an 32-bit integer. Works like `Math.floor` if `val > 0` and -`Math.ceil` if `val < 0`. - -**IMPORTANT:** val will wrap at [number/MIN_INT](#MIN_INT) and -[number/MAX_INT](#MAX_INT). - -Created because most people don't know bitwise operations and also because this -feature is commonly needed. - -[Perf tests](http://jsperf.com/vs-vs-parseint-bitwise-operators/7) - -### Example: - -```js -toInt(1.25); // 1 -toInt(0.75); // 0 -toInt(-0.55); // 0 -toInt(-5.0001) // -5 -``` - - - -## toUInt(val):Number - -"Convert" value into an 32-bit unsigned integer. - -Works like AS3#uint(). - -**IMPORTANT:** val will wrap at 2^32. - -### Example: - -```js -toUInt(1.25); // 1 -toUInt(0.75); // 0 -toUInt(-0.55); // 0 -toUInt(-5.0001); // 4294967291 -toUInt(Math.pow(2,32) - 0.5); // 4294967295 -toUInt(Math.pow(2,32) + 0.5); // 0 -``` - - -## toUInt31(val):Number - -"Convert" value into an 31-bit unsigned integer (since 1 bit is used for sign). - -Useful since all bitwise operators besides `>>>` treat numbers as signed -integers. - -**IMPORTANT:** val will wrap at 2^31 and negative numbers will be treated as -`zero`. - -### Example: - -```js -toUInt31(1.25); // 1 -toUInt31(0.75); // 0 -toUInt31(-0.55); // 0 -toUInt31(-5.0001); // 0 -toUInt31(Math.pow(2,31) - 0.5); // 21474836470 -toUInt31(Math.pow(2,31) + 0.5); // 0 -``` - - -------------------------------------------------------------------------------- - -For more usage examples check specs inside `/tests` folder. Unit tests are the -best documentation you can get... - - - -### [_Resources/node_modules/mout/doc/object.md](_Resources/node_modules/mout/doc/object.md) - -# object # - -Object utilities. - - - -## bindAll(obj, [...methodNames]):void - -Bind methods of the target object to always execute on its own context -(ovewritting the original function). - -See: [function/bind](./function.html#bind) - -```js -var view = { - name: 'Lorem Ipsum', - logNameOnClick: function() { - console.log(this.name); - } -}; - -// binds all methods by default -bindAll(view); -jQuery('#docs').on('click', view.logNameOnClick); -``` - -You can also specify the list of methods that you want to bind (in case you -just want to bind a few of them). - -```js -// only the listed methods will be bound to `obj` context -bindAll(obj, 'logNameOnClick', 'doAwesomeStuffOnDrag'); -``` - - - -## contains(obj, value):Boolean - -Similar to [Array/contains](array.html#contains). Checks if Object contains -value. - -```js -var obj = { - a: 1, - b: 2, - c: 'bar' -}; -contains(obj, 2); // true -contains(obj, 'foo'); // false -``` - - - -## deepFillIn(target, ...objects):Object - -Fill missing properties recursively. - -It's different from `deepMixIn` since it won't override any existing property. -It's also different from `merge` since it won't clone child objects during the -process. - -It returns the target object and mutates it in place. - -See: [`fillIn()`](#fillIn), [`deepMixIn()`](#deepMixIn), [`merge()`](#merge) - -```js -var base = { - foo : { - bar : 123 - }, - lorem : 'ipsum' -}; -var options = deepFillIn({foo : { baz : 45 }, lorem : 'amet'}, base); -// > {foo: {bar:123, baz : 45}, lorem : 'amet'} -``` - - - -## deepMatches(target, pattern):Boolean - -Recursively checks if object contains all properties/value pairs. When both -the target and pattern values are arrays, it checks that the target value -contain matches for all the items in the pattern array (independent of order). - -```js -var john = { - name: 'John', - age: 22, - pets: [ - { type: 'cat', name: 'Grumpy Cat' }, - { type: 'dog', name: 'Hawk' } - ] -}; - -deepMatches(john, { name: 'John' }); // true -deepMatches(john, { age: 21 }); // false -deepMatches(john, { pets: [ { type: 'cat' } ] }); // true -deepMatches(john, { pets: [ { name: 'Hawk' } ] }); // true -deepMatches(john, { pets: [ { name: 'Hairball' } ] }); // false -``` - -See [`matches()`](#matches) - - - -## deepMixIn(target, ...objects):Object - -Mixes objects into the target object, recursively mixing existing child objects -as well. - -It will only recursively mix objects if both (existing and new) values are -plain objects. - -Returns the target object. Like [`merge()`](#merge), but mutates the target -object, and does not clone child objects. - -```js -var target = { - foo: { - name: "foo", - id: 1 - } -}; - -deepMixIn(target, { foo: { id: 2 } }); -console.log(target); // { foo: { name: "foo", id: 2 } } -``` - -See: [`mixIn()`](#mixIn), [`merge()`](#merge), [`deepFillIn()`](#deepFillIn) - - - -## equals(a, b, [callback]):Boolean - -Tests whether two objects contain the same keys and values. - -`callback` specifies the equality comparison function used to compare the -values. It defaults to using [lang/is](lang.html#is). - -It will only check the keys and values contained by the objects; it will not -check the objects' prototypes. If either of the values are not objects, they -will be compared using the `callback` function. - -```js -equals({}, {}); // true -equals({ a: 1 }, { a: 1 }); // true -equals({ a: 1 }, { a: 2 }); // false -equals({ a: 1, b: 2 }, { a: 1 }); // false -equals({ a: 1 }, { a: 1, b: 2 }); // false -equals(null, null); // true -equals(null, {}); // false -equals({ a: 1 }, { a: '1' }, function(a, b) { return a == b; }); // true -``` - -See: [array/equals](array.html#equals), [lang/deepEquals](lang.html#deepEquals) - - -## every(obj, callback, [thisObj]):Boolean - -Similar to [Array/every](array.html#every). Tests whether all properties in the -object pass the test implemented by the provided callback. - -```js -var obj = { - a: 1, - b: 2, - c: 3, - d: 'string' -}; - -every(obj, isNumber); // false -``` - - - -## fillIn(obj, ...default):Object - -Fill in missing properties in object with values from the *defaults* objects. - - var base = { - foo : 'bar', - num : 123 - }; - - fillIn({foo:'ipsum'}, base); // {foo:'ipsum', num:123} - -PS: it allows merging multiple objects at once, the first ones will take -precedence. - -See: [`mixIn()`](#mixIn), [`merge()`](#merge), [`deepFillIn()`](#deepFillIn) - - - -## filter(obj, callback, [thisObj]) - -Returns a new object containing all properties where `callback` returns true, -similar to Array/filter. It does not use properties from the object's -prototype. - -Callback receives the same arguments as `forOwn()`. - -See: [`forOwn()`](#forOwn), [`forIn()`](#forIn), [`pick()`](#pick) - -```js -var obj = { - foo: 'value', - bar: 'bar value' -}; - -// returns { bar: 'bar value' } -filter(obj, function(v) { return v.length > 5; }); - -// returns { foo: 'value' } -filter(obj, function(v, k) { return k === 'foo'; }); -``` - - - -## find(obj, callback, [thisObj]) - -Loops through all the properties in the Object and returns the first one that -passes a truth test (callback), similar to [Array/find](array.html#find). -Unlike Array/find, order of iteration is not guaranteed. - -```js -var obj = { - a: 'foo', - b: 12 -}; - -find(obj, isString); // 'foo' -find(obj, isNumber); // 12 -``` - - - -## flatten(object, [level]):Object - -Recursively flattens an object. A new object containing all the values is -returned. If `level` is specified, it will only flatten up to that level. -Note that objects within arrays will not be flattened. - -### Example - -```js -flatten({ a: 1, b: { c: 2, d: { e: 3 } } }); -// > { a: 1, 'b.c': 2, 'b.d.e': 3 } -flatten({ a: 1, b: { c: 2, d: { e: 3 } } }, 1); -// > { a: 1, 'b.c': 2, 'b.d': { e: 3 } } -``` - -See: [`array/flatten()`](./array.html#flatten) - - -## forIn(obj, callback[, thisObj]) - -Iterate over all properties of an Object, similar to -[Array/forEach](array.html#forEach). - -It [avoids don't enum bug on IE](https://developer.mozilla.org/en/ECMAScript_DontEnum_attribute#JScript_DontEnum_Bug). -It **will** iterate over inherited (enumerable) properties from the prototype. - -It allows exiting the iteration early by returning `false` on the callback. - -See: [`forOwn()`](#forOwn), [`keys()`](#keys), [`values()`](#values) - -### Callback arguments - -Callback will receive the following arguments: - - 1. Property Value (*) - 2. Key name (String) - 3. Target object (Object) - -### Example - -```js -function Foo(){ - this.foo = 1; - this.bar = 2; -} - -Foo.prototype.lorem = 4; - -var obj = new Foo(); - -var result = 0; -var keys = []; - -forIn(obj, function(val, key, o){ - result += val; - keys.push(key); -}); - -console.log(result); // 7 -console.log(keys); // ['foo', 'bar', 'lorem'] -``` - - - -## forOwn(obj, callback[, thisObj]) - -Iterate over all own properties from an Object, similar to -[Array/forEach](array.html#forEach). - -It [avoids don't enum bug on IE](https://developer.mozilla.org/en/ECMAScript_DontEnum_attribute#JScript_DontEnum_Bug). -Notice that it **won't** iterate over properties from the prototype. - -It allows exiting the iteration early by returning `false` on the callback. - -See: [`forIn()`](#forIn), [`keys()`](#keys), [`values()`](#values) - -### Callback arguments - -Callback will receive the following arguments: - - 1. Property Value (*) - 2. Key name (String) - 3. Target object (Object) - -### Example - -```js -function Foo(){ - this.foo = 1; - this.bar = 2; -} - -// will be ignored -Foo.prototype.lorem = 4; - -var obj = new Foo(); - -var result = 0; -var keys = []; - -forOwn(obj, function(val, key, o){ - result += val; - keys.push(key); -}); - -console.log(result); // 3 -console.log(keys); // ['foo', 'bar'] -``` - - - -## functions(obj):Array - -Returns a sorted list of all enumerable properties that have function values -(including inherited properties). - -```js -var obj = { - foo : function(){}, - bar : 'baz' -}; -functions(obj); // ['foo'] -``` - - - -## get(obj, propName):* - -Returns nested property value. Will return `undefined` if property doesn't -exist or if the object is null or undefined. - -See: [`set()`](#set), [`namespace()`](#namespace), [`has()`](#has) - -```js -var lorem = { - ipsum : { - dolor : { - sit : 'amet' - } - } - }; - -get(lorem, 'ipsum.dolor.sit'); // "amet" -get(lorem, 'foo.bar'); // undefined -get(undefined, 'foo.bar'); // undefined -``` - - - -## has(obj, propName):Boolean - -Checks if object contains a child property. Useful for cases where you need to -check if an object contain a *nested* property. It will get properties -inherited by the prototype. - -see: [`hasOwn()`](#hasOwn), [`get()`](#get) - -```js -var a = { - b : { - c : 123 - } - }; - -has(a, 'b.c'); // true -has(a, 'foo.c'); // false -``` - -### Common use case - -```js -if( has(a, 'foo.c') ){ // false - // ... -} - -if( a.foo.c ){ // ReferenceError: `foo` is not defined - // ... -} -``` - - - -## hasOwn(obj, propName):Boolean - -Safer `Object.hasOwnProperty`. Returns a boolean indicating whether the object -has the specified property. - -see: [`has()`](#has) - -```js -var obj = { - foo: 1, - hasOwnProperty : 'bar' -}; - -obj.hasOwnProperty('foo'); // ERROR! hasOwnProperty is not a function - -hasOwn(obj, 'foo'); // true -hasOwn(obj, 'hasOwnProperty'); // true -hasOwn(obj, 'toString'); // false -``` - - - -## keys(obj):Array - -Returns an array of all own enumerable properties found upon a given object. -It will use the native `Object.keys` if present. - -PS: it won't return properties from the prototype. - -See: [`forOwn()`](#forOwn), [`values()`](#values) - -```js -var obj = { - foo : 1, - bar : 2, - lorem : 3 -}; -keys(obj); // ['foo', 'bar', 'lorem'] -``` - - - -## map(obj, callback, [thisObj]):Object - -Returns a new object where the property values are the result of calling the -callback for each property in the original object, similar to Array/map. - -The callback function receives the same arguments as in `forOwn()`. - -See: [`forOwn()`](#forOwn) - -```js -var obj = { foo: 1, bar: 2 }, - data = { foo: 0, bar: 1 }; - -map(obj, function(v) { return v + 1; }); // { foo: 2, bar: 3 } -map(obj, function(v, k) { return k; }); // { foo: "foo", bar: "bar" } -map(obj, function(v, k) { return this[k]; }, data); // { foo: 0, bar: 1 } -``` - - - -## matches(obj, props):Boolean - -Checks if object contains all properties/values pairs. Useful for validation -and filtering. - -```js -var john = {age:25, hair:'long', beard:true}; -var mark = {age:27, hair:'short', beard:false}; -var hippie = {hair:'long', beard:true}; -matches(john, hippie); // true -matches(mark, hippie); // false -``` - -See [`deepMatches()`](#deepMatches) - - - -## merge(...objects):Object - -Deep merges objects. Note that objects and properties will be cloned during the -process to avoid undesired side effects. It return a new object and won't -affect source objects. - -```js -var obj1 = {a: {b: 1, c: 1, d: {e: 1, f: 1}}}; -var obj2 = {a: {b: 2, d : {f : 'yeah'} }}; - -merge(obj1, obj2); // {a: {b : 2, c : 1, d : {e : 1, f : 'yeah'}}} -``` - -See: [`deepMixIn()`](#deepMixIn), [`deepFillIn()`](#deepFillIn) - - - -## max(obj[, iterator]):* - -Returns maximum value inside object or use a custom iterator to define how -items should be compared. Similar to [Array/max](array.html#max). - -See: [`min()`](#min) - -```js -max({a: 100, b: 2, c: 1, d: 3, e: 200}); // 200 -max({a: 'foo', b: 'lorem', c: 'amet'}, function(val){ - return val.length; -}); // 'lorem' -``` - - - -## min(obj[, iterator]):* - -Returns minimum value inside object or use a custom iterator to define how -items should be compared. Similar to [Array/min](array.html#min). - -See: [`max()`](#max) - -```js -min({a: 100, b: 2, c: 1, d: 3, e: 200}); // 1 -min({a: 'foo', b: 'lorem', c: 'amet'}, function(val){ - return val.length; -}); // 'foo' -``` - - - -## mixIn(target, ...objects):Object - -Combine properties from all the objects into first one. - -This method affects target object in place, if you want to create a new Object -pass an empty object as first parameter. - -### Arguments - - 1. `target` (Object) : Target Object. - 2. `...objects` (...Object) : Objects to be combined (0...n objects). - -### Example - -```js -var a = {foo: "bar"}; -var b = {lorem: 123}; - -mixIn({}, a, b); // {foo: "bar", lorem: 123} -console.log(a); // {foo: "bar"} - -mixIn(a, b); // {foo: "bar", lorem: 123} -console.log(a); // {foo: "bar", lorem: 123} -``` - -See: [`fillIn()`](#fillIn), [`merge()`](#merge) - - - - -## namespace(obj, propName):Object - -Creates an empty object inside namespace if not existent. Will return created -object or existing object. - -See: [`get()`](#get), [`set()`](#set) - -```js -var obj = {}; -namespace(obj, 'foo.bar'); // {} -console.log(obj); // {foo:{bar:{}}} -``` - - -## omit(obj, ...keys):Object - -Return a copy of the object without the blacklisted keys. - -See: [`filter()`](#filter) - -```js -var user = { - firstName : 'John', - lastName : 'Doe', - dob : '1985/07/23', - gender : 'male' -}; - -// can pass an array of keys as second argument -var keys = ['firstName', 'dob'] -omit(user, keys); // {lastName : 'Doe', gender : 'male'} - -// or multiple arguments -omit(user, 'firstName', 'lastName'); // {dob : '1985/07/23', gender : 'male'} -``` - - - -## pick(obj, ...keys):Object - -Return a copy of the object that contains only the whitelisted keys. - -See: [`filter()`](#filter) - -```js -var user = { - firstName : 'John', - lastName : 'Doe', - dob : '1985/07/23', - gender : 'male' -}; - -// can pass an array of keys as second argument -var keys = ['firstName', 'dob'] -pick(user, keys); // {firstName:"John", dob: "1985/07/23"} - -// or multiple arguments -pick(user, 'firstName', 'lastName'); // {firstName:"John", lastName: "Doe"} -``` - - - -## pluck(obj, propName):Object - -Extract an object containing property values with keys as they appear in the -passed object. - -```js -var users = { - first: { - name : 'John', - age : 21 - }, - second: { - name : 'Mary', - age : 25 - } -}; - -pluck(users, 'name'); // {first: 'John', second: 'Mary'} ); -pluck(users, 'age'); // {first: 21, second: 25} ); -``` - - - -## reduce(obj, callback, initial, [thisObj]):* - -Similar to [Array/reduce](array.html#reduce). - -Apply a function against an accumulator and each property of the object (order -is undefined) as to reduce it to a single value. - -```js -var obj = {a: 1, b: 2, c: 3, d: 4}; - -function sum(prev, cur, key, list) { - compare1.push(prev); - return prev + cur; -} - -reduce(obj, sum); // 10 -``` - - - -## reject(obj, callback, thisObj):Object - -Returns a new object containing all properties where `callback` returns true, -similar to [Array/reject](array.html#reject). It does not use properties from -the object's prototype. Opposite of [`filter()`](#filter). - -See [`filter()`](#filter) - -### Example - -```js -var obj = {a: 1, b: 2, c: 3, d: 4, e: 5}; -reject(obj, function(x) { return (x % 2) !== 0; }); // {b: 2, d: 4} -``` - - - -## values(obj):Array - -Returns an array of all own enumerable properties values found upon a given object. - -PS: it won't return properties from the prototype. - -See: [`forOwn()`](#forOwn), [`keys()`](#keys) - -```js -var obj = { - foo : 1, - bar : 2, - lorem : 3 -}; -values(obj); // [1, 2, 3] -``` - - - -## set(obj, propName, value) - -Sets a nested property value. - -See: [`get()`](#get), [`namespace()`](#namespace) - -```js -var obj = {}; -set(obj, 'foo.bar', 123); -console.log(obj.foo.bar); // 123 -console.log(obj); // {foo:{bar:123}} -``` - - - -## size(obj):Number - -Returns the count of own enumerable properties found upon a given object. - -PS: it won't return properties from the prototype. - -See: [`forOwn()`](#forOwn), [`keys()`](#keys) - -```js -var obj = { - foo : 1, - bar : 2, - lorem : 3 -}; -size(obj); // 3 -``` - - - -## some(obj, callback, [thisObj]):Boolean - -Similar to [Array/some](array.html#some). Tests whether any properties in the -object pass the test implemented by the provided callback. - -```js -var obj = { - a: 1, - b: 2, - c: 3, - d: 'string' -}; - -some(obj, isNumber); // true -``` - - - -## unset(obj, propName):Boolean - -Delete object property if existent and returns a boolean indicating succes. It -will also return `true` if property doesn't exist. - -Some properties can't be deleted, to understand why [check this -article](http://perfectionkills.com/understanding-delete/). - -See: [`set()`](#set) - -```js -var lorem = { - ipsum : { - dolor : { - sit : 'amet' - } - } - }; - -unset(lorem, 'ipsum.dolor.sit'); // true -console.log(lorem.ipsum.dolor); // {} -unset(lorem, 'foo.bar'); // true -``` - - - -## result(object, property):Mixed - -Evaluates an objects property and returns result. - -```js -var person = { - name: 'john', - - mood: function() { - // some dynamic calculated property. - return 'happy'; - } -}; - -var name = result(person, 'name'), // john - mood = result(person, 'mood'); // happy -``` - - -### [_Resources/node_modules/mout/doc/queryString.md](_Resources/node_modules/mout/doc/queryString.md) - -# queryString # - -Utilities for query string manipulation. - - - -## contains(url, paramName):Boolen - -Checks if query string contains parameter. - -### Arguments: - - 1. `url` (String) : URL or query string. - 2. `paramName` (String) : Parameter name. - -### Example: - -```js -var url = 'example.com/?lorem=ipsum'; -contains(url, 'lorem'); // true -contains(url, 'foo'); //false -``` - - - -## decode(queryStr[, shouldTypecast]):Object - -Parses query string and creates an object of keys => vals. - -Will typecast value with [`string/typecast`](string.html#typecast) by default -and decode string parameters using `decodeURIComponent()`. - -```js -var query = '?foo=bar&lorem=123'; -decode(query); // {foo: "bar", lorem: 123} -decode(query, false); // {foo: "bar", lorem: "123"} -``` - - -## encode(obj):String - -Encode object into a query string. - -Will encode parameters with `encodeURIComponent()`. - -```js -encode({foo: "bar", lorem: 123}); // "?foo=bar&lorem=123" -``` - - -## getParam(url, param[, shouldTypecast]):* - -Get query parameter value. - -Will typecast value with [`string/typecast`](string.html#typecast) by default. - -See: [`setParam()`](#setParam) - -### Arguments: - - 1. `url` (String) : Url. - 2. `param` (String) : Parameter name. - 3. `[shouldTypecast]` (Boolean) : If it should typecast value. - -### Example: - -```js -var url = 'example.com/?foo=bar&lorem=123&ipsum=false'; -getParam(url, 'dolor'); // "amet" -getParam(url, 'lorem'); // 123 -getParam(url, 'lorem', false); // "123" -``` - - -## parse(url[, shouldTypecast]):Object - -Parses URL, extracts query string and decodes it. - -It will typecast all properties of the query object unless second argument is -`false`. - -Alias to: `decode(getQuery(url))`. - -```js -var url = 'example.com/?lorem=ipsum&a=123'; -parse(url); // {lorem: "ipsum", a: 123} -parse(url, false); // {lorem: "ipsum", a: "123"} -``` - - -## getQuery(url):String - -Gets full query as string with all special chars decoded. - -```js -getQuery('example.com/?lorem=ipsum'); // "?lorem=ipsum" -``` - - -## setParam(url, paramName, value):String - -Add new query string parameter to URL or update existing value. - -See: [`getParam()`](#getParam) - -```js -setParam('?foo=bar&lorem=0', 'lorem', 'ipsum'); // '?foo=bar&lorem=ipsum' -setParam('?lorem=1', 'foo', 123); // '?lorem=1&foo=123' -``` - - -------------------------------------------------------------------------------- - -For more usage examples check specs inside `/tests` folder. Unit tests are the -best documentation you can get... - - -### [_Resources/node_modules/mout/doc/random.md](_Resources/node_modules/mout/doc/random.md) - -# random # - -Pseudo-random generators. - -mout uses `Math.random` by default on all the pseudo-random generators, if -you need a seeded random or a better algorithm see the [`random()`](#random) -documentation for instructions. - - - -## choice(...items):* - -Returns a random element from the supplied arguments or from an array if single -argument is an array. - -### Example: - -```js -choice(1, 2, 3, 4, 5); // 3 - -var arr = ['lorem', 'ipsum', 'dolor']; -choice(arr); // 'dolor' -``` - - - -## guid():String - -Generates a pseudo-random [Globally Unique Identifier](http://en.wikipedia.org/wiki/Globally_unique_identifier) (v4). - -Since the total number of GUIDs is 2122 the chance of generating the -same value twice is negligible. - -**Important:** this method uses `Math.random` by default so the UUID isn't -*safe* (sequence of outputs can be predicted in some cases), check the -[`random()`](#random) documentation for more info on how to replace the default -PRNG if you need extra safety or need *seeded* results. - -See: [`randHex()`](#randHex), [`random()`](#random) - -### Example: - -```js -guid(); // 830e9f50-ac7f-4369-a14f-ed0e62b2fa0b -guid(); // 5de3d09b-e79c-4727-932b-48c49228d508 -``` - - - -## rand([min], [max]):Number - -Gets a random number inside range or snap to min/max values. - -### Arguments: - - 1. `[min]` (Number) : Minimum value. Defaults to `number/MIN_INT`. - 2. `[max]` (Number) : Maximum value. Defaults to `number/MAX_INT`. - - -### Example: - -```js -rand(); // 448740433.55274725 -rand(); // -31797596.097682 -rand(0, 10); // 7.369723 -rand(0, 10); // 5.987042 -``` - -See: [`random()`](#random) - - - -## randBit():Number - -Returns a random "bit" (0 or 1). Useful for addition/subtraction. - -It's slightly faster than `choice(0, 1)` since implementation is simpler (not -that it will make a huge difference in most cases). - -See: [`choice()`](#choice) - -### Example: - -```js -randBit(); // 1 -randBit(); // 0 - -//same effect as -choice(0, 1); -``` - - -## randBool():Boolean - -Returns a random Boolean (`true` or `false`). - -Since this is very common it makes sense to abstract it into a discrete method. - -### Example: - -```js -randBool(); // true -randBool(); // false -``` - - - -## randHex([size]):String - -Returns a random hexadecimal string. - -The default `size` is `6`. - -### Example: - -```js -randHex(); // "dd8575" -randHex(); // "e6baeb" -randHex(2); // "a2" -randHex(30); // "effd7e2ad9a4a3067e30525fab983a" -``` - - - -## randInt([min], [max]):Number - -Gets a random integer inside range or snap to min/max values. - -### Arguments: - - 1. `[min]` (Number) : Minimum value. Defaults to `number/MIN_INT`. - 2. `[max]` (Number) : Maximum value. Defaults to `number/MAX_INT`. - - -### Example: - -```js -randInt(); // 448740433 -randInt(); // -31797596 -randInt(0, 10); // 7 -randInt(0, 10); // 5 -``` - - - -## randSign():Number - -Returns a random "sign" (-1 or 1). Useful for multiplications. - -It's slightly faster than `choice(-1, 1)` since implementation is simpler (not -that it will make a huge difference in most cases). - -See: [`choice()`](#choice) - -### Example: - -```js -randSign(); // -1 -randSign(); // 1 - -//same effect as -choice(-1, 1); -``` - - - -## random():Number - -Returns a random number between `0` and `1`. Same as `Math.random()`. - -```js -random(); // 0.35435103671625257 -random(); // 0.8768321881070733 -``` - -**Important:** No methods inside mout should call `Math.random()` -directly, they all use `random/random` as a proxy, that way we can -inject/replace the pseudo-random number generator if needed (ie. in case we -need a seeded random or a better algorithm than the native one). - -### Replacing the PRNG - -In some cases we might need better/different algorithms than the one provided -by `Math.random` (ie. safer, seeded). - -Because of licensing issues, file size limitations and different needs we -decided to **not** implement a custom PRNG and instead provide a easy way to -override the default behavior. - [issue #99](https://github.com/millermedeiros/amd-utils/issues/99) - -If you are using mout with a loader that supports the [AMD map -config](https://github.com/amdjs/amdjs-api/wiki/Common-Config), such as -[RequireJS](http://requirejs.org/), you can use it to replace the PRNG -(recommended approach): - -```js -requirejs.config({ - map : { - // all modules will load "my_custom_prng" instead of - // "mout/random/random" - '*' : { - 'mout/random/random' : 'my_custom_prng' - } - } -}); -``` - -You also have the option to override `random.get` in case you are using -mout on node.js or with a loader which doesn't support the map config: - -```js -// replace the PRNG -var n = 0; -random.get = function(){ - return ++n % 2? 0 : 1; // not so random :P -}; -random(); // 0 -random(); // 1 -random(); // 0 -random(); // 1 -``` - -See this [detailed explanation about PRNG in -JavaScript](https://github.com/nquinlan/better-random-numbers-for-javascript-mirror) -to understand the issues with the native `Math.random` and also for a list of -algorithms that could be used instead. - - - -## randString([length, dictionary]):String - -Returns a random string. - -By default returns string containing alphanumeric characters (lowercase and uppercase) with a length of 8. - -### Arguments: - - 1. `[length]` (number) : Length of the string to return. Defaults to 8. - 2. `[dictionary]` (string) : A string containing all characters used as a dictionary for the random string construction. Defaults to alphanumeric characters (lowercase and uppercase). - -### Example: - -```js -randString(); // returns a string with length 8. -randString(12); // returns a string of length 12. -randString(-1); // returns a string of length 8. -randString(null, 'pew!'); // returns a random string of length 8 composed of 'p', 'e', 'w' and '!'. -randString(10, '0'); // always returns '0's of length 10. -randString(rand(8, 10)); // returns a random string with length between 8 and 10. -``` - - - -------------------------------------------------------------------------------- - -For more usage examples check specs inside `/tests` folder. Unit tests are the -best documentation you can get... - - -### [_Resources/node_modules/mout/doc/string.md](_Resources/node_modules/mout/doc/string.md) - -# string # - -String utilities. - - -## camelCase(str):String - -Convert string to "camelCase" text. - -See: [`pascalCase()`](#pascalCase), [`unCamelCase()`](#unCamelCase) - -### Example - -```js -camelCase('lorem-ipsum-dolor'); // "loremIpsumDolor" -camelCase('lorem ipsum dolor'); // "loremIpsumDolor" -``` - - - -## contains(str, substring, [fromIndex]):Boolean - -Checks if string contains the given substring. - -See: [`startsWith()`](#startsWith), [`endsWith()`](#endsWith) - -### Example - -```js -contains('lorem', 'or'); // true -contains('lorem', 'bar'); // false -``` - - - -## crop(str, maxChars, [append]):String - -Truncate string at full words. Alias to `truncate(str, maxChars, append, true);`. - -See: [`truncate()`](#truncate) - -### Example - -```js -crop('lorem ipsum dolor', 10); // "lorem..." -crop('lorem ipsum dolor', 10, '+'); // "lorem+" -``` - - - -## endsWith(str, suffix):Boolean - -Checks if string ends with specified suffix. - -See: [`startsWith()`](#startsWith), [`contains()`](#contains) - -### Example - -```js -endsWith('lorem ipsum', 'lorem'); // false -endsWith('lorem ipsum', 'ipsum'); // true -``` - - - -## escapeHtml(str):String - -Escapes the following special characters for use in HTML: - -* `&` becomes `&` -* `<` becomes `<` -* `>` becomes `>` -* `'` becomes `'` -* `"` becomes `"` - -No other characters are escaped. To HTML-escape other characters as well, use a third-party library like [_he_](http://mths.be/he). - -See: [`unescapeHtml()`](#unescapeHtml) - -### Example - -```js -escapeHtml('lorem & "ipsum"'); // "lorem &amp; &quot;ipsum&quot;" -``` - - - -## escapeRegExp(str):String - -Escape special chars to be used as literals in RegExp constructors. - -### Example - -```js -str = escapeRegExp('[lorem.ipsum]'); // "\\[lorem\\.ipsum\\]" -reg = new RegExp(str); // /\[lorem\.ipsum\]/ -``` - - - -## escapeUnicode(str[, shouldEscapePrintable]):String - -Unicode escape chars. - -It will only escape non-printable ASCII chars unless `shouldEscapePrintable` is -set to `true`. - -See: [`unescapeUnicode()`](#unescapeUnicode) - -```js -escapeUnicode('føo bår'); -// > "f\u00f8o b\u00e5r" -escapeUnicode('føo bår', true); -// > "\u0066\u00f8\u006f\u0020\u0062\u00e5\u0072" -``` - - - -## hyphenate(str):String - -Replaces spaces with hyphens, split camelCase text, remove non-word chars, -remove accents and convert to lower case. - -See: [`slugify()`](#slugify), [`underscore()`](#underscore), -[`unhyphenate`](#unhyphenate) - -```js -hyphenate(' %# lorem ipsum ? $ dolor'); // "lorem-ipsum-dolor" -hyphenate('spéçïãl çhârs'); // "special-chars" -hyphenate('loremIpsum'); // "lorem-ipsum" -``` - - - -## insert(str, index, partial):String - -Inserts a `partial` before the given `index` in the provided `str`. -If the index is larger than the length of the string the partial is appended at the end. -A negative index is treated as `length - index` where `length` is the length or the string. - -```js -insert('this is a sentence', 10, 'sample '); // "this is a sample sentence" -insert('foo', 100, 'bar'); // "foobar" -insert('image.png', -4, '-large'); // "image-large.png" -``` - -## interpolate(str, replacements[, syntax]):String - -String interpolation. Format/replace tokens with object properties. - -```js -var tmpl = 'Hello {{name}}!'; -interpolate(tmpl, {name: 'World'}); // "Hello World!" -interpolate(tmpl, {name: 'Lorem Ipsum'}); // "Hello Lorem Ipsum!" - -tmpl = 'Hello {{name.first}}!'; -interpolate(tmpl, {name: {first: 'Lorem'}}); // "Hello Lorem!" -``` - -It uses a mustache-like syntax by default but you can set your own format if -needed. You can also use Arrays for the replacements (since Arrays are -objects as well): - -```js -// matches everything inside "${}" -var syntax = /\$\{([^}]+)\}/g; -var tmpl = "Hello ${0}!"; -interpolate(tmpl, ['Foo Bar'], syntax); // "Hello Foo Bar!" -``` - - - -## lowerCase(str):String - -"Safer" `String.toLowerCase()`. (Used internally) - -### Example - -```js -(null).toLowerCase(); // Error! -(undefined).toLowerCase(); // Error! -lowerCase(null); // "" -lowerCase(undefined); // "" -``` - - - -## lpad(str, minLength[, char]):String - -Pad string from left with `char` if its' length is smaller than `minLen`. - -See: [`rpad()`](#rpad) - -### Example - -```js -lpad('a', 5); // " a" -lpad('a', 5, '-'); // "----a" -lpad('abc', 3, '-'); // "abc" -lpad('abc', 4, '-'); // "-abc" -``` - - - -## ltrim(str, [chars]):String - -Remove chars or white-spaces from beginning of string. - -`chars` is an array of chars to remove from the beginning of the string. If -`chars` is not specified, Unicode whitespace chars will be used instead. - -See: [`rtrim()`](#rtrim), [`trim()`](#trim) - -### Example - -```js -ltrim(' lorem ipsum '); // "lorem ipsum " -ltrim('--lorem ipsum--', ['-']); // "lorem ipsum--" -``` - - - -## makePath(...args):String - -Group arguments as path segments, if any of the args is `null` or `undefined` -it will be ignored from resulting path. It will also remove duplicate "/". - -See: [`array/join()`](array.html#join) - -### Example - -```js -makePath('lorem', 'ipsum', null, 'dolor'); // "lorem/ipsum/dolor" -makePath('foo///bar/'); // "foo/bar/" -``` - - - -## normalizeLineBreaks(str, [lineBreak]):String - -Normalize line breaks to a single format. Defaults to Unix `\n`. - -It handles DOS (`\r\n`), Mac (`\r`) and Unix (`\n`) formats. - -### Example - -```js -// "foo\nbar\nlorem\nipsum" -normalizeLineBreaks('foo\nbar\r\nlorem\ripsum'); - -// "foo\rbar\rlorem\ripsum" -normalizeLineBreaks('foo\nbar\r\nlorem\ripsum', '\r'); - -// "foo bar lorem ipsum" -normalizeLineBreaks('foo\nbar\r\nlorem\ripsum', ' '); -``` - - - -## pascalCase(str):String - -Convert string to "PascalCase" text. - -See: [`camelCase()`](#camelCase) - -### Example - -```js -pascalCase('lorem-ipsum-dolor'); // "LoremIpsumDolor" -pascalCase('lorem ipsum dolor'); // "LoremIpsumDolor" -``` - - - -## properCase(str):String - -UPPERCASE first char of each word, lowercase other chars. - -### Example - -```js -properCase('loRem iPSum'); // "Lorem Ipsum" -``` - - - -## removeNonASCII(str):String - -Remove [non-printable ASCII -chars](http://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters). - -### Example - -```js -removeNonASCII('äÄçÇéÉêlorem-ipsumöÖÐþúÚ'); // "lorem-ipsum" -``` - - - -## removeNonWord(str):String - -Remove non-word chars. - -### Example - -```js -var str = 'lorem ~!@#$%^&*()_+`-={}[]|\\:";\'/?><., ipsum'; -removeNonWord(str); // "lorem - ipsum" -``` - - - -## repeat(str, n):String - -Repeat string n-times. - -### Example - -```js -repeat('a', 3); // "aaa" -repeat('bc', 2); // "bcbc" -repeat('a', 0); // "" -``` - - - -## replace(str, search, replacements):String - -Replace string(s) with the replacement(s) in the source. - -`search` and `replacements` can be an array, or a single item. For every item -in `search`, it will call `str.replace` with the search item and the matching -replacement in `replacements`. If `replacements` only contains one replacement, -it will be used for all the searches, otherwise it will use the replacement at -the same index as the search. - -### Example - -```js -replace('foo bar', 'foo', 'test'); // "test bar" -replace('test 1 2', ['1', '2'], 'n'); // "test n n" -replace('test 1 2', ['1', '2'], ['one', 'two']); // "test one two" -replace('123abc', [/\d/g, /[a-z]/g], ['0', '.']); // "000..." -``` - - - -## replaceAccents(str):String - -Replaces all accented chars with regular ones. - -**Important:** Only covers **Basic Latin** and **Latin-1** unicode chars. - -### Example - -```js -replaceAccents('spéçïãl çhârs'); // "special chars" -``` - - - -## rpad(str, minLength[, char]):String - -Pad string from right with `char` if its' length is smaller than `minLen`. - -See: [`lpad()`](#lpad) - -### Example - -```js -rpad('a', 5); // "a " -rpad('a', 5, '-'); // "a----" -rpad('abc', 3, '-'); // "abc" -rpad('abc', 4, '-'); // "abc-" -``` - - - -## rtrim(str, [chars]):String - -Remove chars or white-spaces from end of string. - -`chars` is an array of chars to remove from the end of the string. If -`chars` is not specified, Unicode whitespace chars will be used instead. - -See: [`trim()`](#trim), [`ltrim()`](#ltrim) - -### Example - -```js -rtrim(' lorem ipsum '); // " lorem ipsum" -rtrim('--lorem ipsum--', ['-']); // "--lorem ipsum" -``` - - - -## sentenceCase(str):String - -UPPERCASE first char of each sentence and lowercase other chars. - -### Example - -```js -var str = 'Lorem IpSum DoLOr. maeCeNnas Ullamcor.'; -sentenceCase(str); // "Lorem ipsum dolor. Maecennas ullamcor." -``` - - - -## stripHtmlTags(str):String - -Remove HTML/XML tags from string. - -### Example - -```js -var str = '

lorem ipsum

'; -stripHtmlTags(str); // "lorem ipsum" -``` - - - -## startsWith(str, prefix):Boolean - -Checks if string starts with specified prefix. - -See: [`endsWith()`](#endsWith), [`contains()`](#contains) - -### Example - -```js -startsWith('lorem ipsum', 'lorem'); // true -startsWith('lorem ipsum', 'ipsum'); // false -``` - - - -## slugify(str[, delimeter]):String - -Convert to lower case, remove accents, remove non-word chars and replace spaces -with the delimeter. The default delimeter is a hyphen. - -Note that this does not split camelCase text. - -See: [`hyphenate()`](#hyphenate) and [`underscore()`](#underscore) - -### Example - -```js -var str = 'loremIpsum dolor spéçïãl chârs'; -slugify(str); // "loremipsum-dolor-special-chars" -slugify(str, '_'); // "loremipsum_dolor_special_chars" -``` - -## stripMargin(str[, marginChar]):String - -Strip leading characters followed by 'marginChar' from every line in a String. -The default margin character is a pipe. - -### Example - -```js -var str = 'this\n'; -str += ' |is a formatted\n'; -str += ' |string'; - - -stripMargin(str); //"this\nis a formatted\nstring" -stripMargin("this\n___#works\n___#too", '#'); //"this\nworks\ntoo" - -``` - - -## trim(str, [chars]):String - -Remove chars or white-spaces from beginning and end of string. - -`chars` is an array of chars to remove from the beginning and end of the -string. If `chars` is not specified, Unicode whitespace chars will be used -instead. - -See: [`rtrim()`](#rtrim), [`ltrim()`](#ltrim) - -### Example - -```js -trim(' lorem ipsum '); // "lorem ipsum" -trim('-+-lorem ipsum-+-', ['-', '+']); // "lorem ipsum" -``` - - - -## truncate(str, maxChars, [append], [onlyFullWords]):String - -Limit number of chars. Returned string `length` will be `<= maxChars`. - -See: [`crop()`](#crop) - -### Arguments - - 1. `str` (String) : String - 2. `maxChars` (Number) : Maximum number of characters including `append.length`. - 3. `[append]` (String) : Value that should be added to the end of string. - Defaults to "...". - 4. `[onlyFullWords]` (Boolean) : If it shouldn't break words. Default is - `false`. (favor [`crop()`](#crop) since code will be clearer). - -### Example - -```js -truncate('lorem ipsum dolor', 11); // "lorem ip..." -truncate('lorem ipsum dolor', 11, '+'); // "lorem ipsu+" -truncate('lorem ipsum dolor', 11, null, true); // "lorem..." -``` - - - -## typecast(str):* - -Parses string and convert it into a native value. - -### Example - -```js -typecast('lorem ipsum'); // "lorem ipsum" -typecast('123'); // 123 -typecast('123.45'); // 123.45 -typecast('false'); // false -typecast('true'); // true -typecast('null'); // null -typecast('undefined'); // undefined -``` - - - -## unCamelCase(str, [delimiter]):String - -Add the delimiter between camelCase text and convert first char of each word to -lower case. - -The delimiter defaults to a space character. - -See: [`camelCase()`][#camelCase] - -### Example - -```js -unCamelCase('loremIpsumDolor'); // "lorem ipsum dolor" -unCamelCase('loremIpsumDolor', '-'); // "lorem-ipsum-color" -``` - - -## underscore(str):String - -Replaces spaces with underscores, split camelCase text, remove non-word chars, -remove accents and convert to lower case. - -See: [`slugify()`](#slugify), [`hyphenate()`](#hyphenate) - -```js -underscore(' %# lorem ipsum ? $ dolor'); // "lorem_ipsum_dolor" -underscore('spéçïãl çhârs'); // "special_chars" -underscore('loremIpsum'); // "lorem_ipsum" -``` - - - -## unescapeHtml(str):String - -Unescapes the following HTML character references back into the raw symbol they map to: - -* `&` becomes `&` -* `<` becomes `<` -* `>` becomes `>` -* `'` becomes `'` -* `"` becomes `"` - -No other HTML character references are unescaped. To HTML-unescape other entities as well, use a third-party library like [_he_](http://mths.be/he). - - -See: [`escapeHtml()`](#escapeHtml) - -### Example - -```js -unescapeHtml('lorem &amp; &quot;ipsum&quot;'); // 'lorem & "ipsum"' -``` - - - -## unescapeUnicode(str):String - -Unescapes unicode char sequences. - -See: [`escapeUnicode()`](#escapeUnicode) - -```js -unescapeUnicode('\\u0066\\u00f8\\u006f\\u0020\\u0062\\u00e5\\u0072'); -// > 'føo bår' -``` - - - -## unhyphenate(str):String - -Replaces hyphens with spaces. (only hyphens between word chars) - -See : [`hyphenate()`](#hyphenate) - -### Example - -```js -unhyphenate('lorem-ipsum-dolor'); // "lorem ipsum dolor" -``` - - -## upperCase(str):String - -"Safer" `String.toUpperCase()`. (Used internally) - -### Example - -```js -(null).toUpperCase(); // Error! -(undefined).toUpperCase(); // Error! -upperCase(null); // "" -upperCase(undefined); // "" -``` - - - -## WHITE_SPACES:Array - -Constant array of all [Unicode white-space -characters](http://en.wikipedia.org/wiki/Whitespace_character). - - - -------------------------------------------------------------------------------- - -For more usage examples check specs inside `/tests` folder. Unit tests are the -best documentation you can get... - - -### [_Resources/node_modules/mout/doc/time.md](_Resources/node_modules/mout/doc/time.md) - -# time # - -Utilities for time manipulation. - - -## convert(value, sourceUnit, [destinationUnit]):Number - -Converts time between units. - -Available units: `millisecond`, `second`, `minute`, `hour`, `day`, `week`. -Abbreviations: `ms`, `s`, `m`, `h`, `d`, `w`. - -We do **not** support year and month as a time unit since their values are not -fixed. - -The default `destinationUnit` is `ms`. - -```js -convert(1, 'minute'); // 60000 -convert(2.5, 's', 'ms'); // 2500 -convert(2, 'm', 's'); // 120 -convert(500, 'ms', 's'); // 0.5 -``` - - - -## now():Number - -Returns the number of milliseconds elapsed since 1 January 1970 00:00:00 UTC. -Uses `Date.now()` if available. - -### Example - -```js -now(); // 1335449614650 -``` - - - -## parseMs(ms):Object - -Parse timestamp (milliseconds) into an object `{milliseconds:number, -seconds:number, minutes:number, hours:number, days:number}`. - -### Example - -```js -// {days:27, hours:4, minutes:26, seconds:5, milliseconds:454} -parseMs(2348765454); -``` - - - -## toTimeString(ms):String - -Convert timestamp (milliseconds) into a time string in the format "[H:]MM:SS". - -### Example - -```js -toTimeString(12513); // "00:12" -toTimeString(951233); // "15:51" -toTimeString(8765235); // "2:26:05" -``` - - -
_Resources/node_modules/mout/ - -### [_Resources/node_modules/mout/LICENSE.md](_Resources/node_modules/mout/LICENSE.md) -# The MIT License (MIT) -## Copyright (c) 2012, 2013 moutjs team and contributors (http://moutjs.com) - -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. - - - - - - -### [_Resources/node_modules/mout/README.md](_Resources/node_modules/mout/README.md) - -![mout](http://moutjs.com/logo.png "Modular JavaScript Utilties") - -http://moutjs.com/ - -[![Build Status](https://travis-ci.org/mout/mout.svg?branch=master)](https://travis-ci.org/mout/mout) -[![Downloads](https://img.shields.io/npm/dm/mout.svg)](https://www.npmjs.com/package/mout) -[![Version](https://img.shields.io/npm/v/mout.svg)](https://www.npmjs.com/package/mout) - -All code is library agnostic and consist mostly of helper methods that aren't -directly related with the DOM, the purpose of this library isn't to replace -Dojo, jQuery, YUI, Mootools, etc, but to provide modular solutions for common -problems that aren't solved by most of them. Consider it as a crossbrowser -JavaScript standard library. - - - -## Main goals ## - - - increase code reuse; - - be clear (code should be clean/readable); - - be easy to debug; - - be easy to maintain; - - follow best practices; - - follow standards when possible; - - **don't convert JavaScript into another language!** - - be compatible with other frameworks; - - be modular; - - have unit tests for all modules; - - work on multiple environments (IE7+, modern browsers, node.js); - - - -## What shouldn't be here ## - - - UI components; - - CSS selector engine; - - Event system - pub/sub; - - Template engine; - - Anything that isn't generic enough to be on a standard library; - - Anything that could be a separate library and/or isn't a modular utility... - - - -## API Documentation ## - -Online documentation can be found at http://moutjs.com/ or inside the -`doc` folder. - - - -## FAQ / Wiki / IRC ## - -For more info about project structure, design decisions, tips, how to -contribute, build system, etc, please check the [project -wiki](https://github.com/mout/mout/wiki). - -We also have an IRC channel [#moutjs on -irc.freenode.net](http://webchat.freenode.net/?channels=moutjs) - - - -## License ## - -Released under the [MIT License](http://www.opensource.org/licenses/mit-license.php). - - - -
_Resources/node_modules/web-dev-utils/GIT-HTML-PREVIEW-TOOL/GIT-HTML-PREVIEW-TOOL-master/ - -### [_Resources/node_modules/web-dev-utils/GIT-HTML-PREVIEW-TOOL/GIT-HTML-PREVIEW-TOOL-master/readme.md](_Resources/node_modules/web-dev-utils/GIT-HTML-PREVIEW-TOOL/GIT-HTML-PREVIEW-TOOL-master/readme.md) - - - - - - -
- - - - - - - -# GIT HTML PREVIEW TOOL . - -[![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/colored.png)](#-) - - - **TOC** - [About](#about) ● [How It Works](#how-it-works) ● [Development](#development) ● [Contact](#contact) - - - - - - [![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/colored.png)](#-) - -GitJavaScriptCSS3HTML5BootstrapBitbucket - - [![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/colored.png)](#-) - - - -# Usage: - -![demo](./git-preview.gif) - -

Still working on getting it to render html hosted on GitLabb - - - - - - - -[![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/colored.png)](#-) - - - - -# GIT HTML PREVIEW TOOL - ->What it does is: load HTML using CORS proxy, then process all links, frames, scripts and styles, and load each of them using CORS proxy, so they can be evaluated by the browser. - - - - - - - ## Live Deployment - [Live Website] - - - -

- - - - - - - - -[![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/colored.png)](#-) - - - - - -
- - ## ➤ About - -#### Many GitHub repositories don't use GitHub Pages to host their HTML files. **GIT HTML PREVIEW TOOL** allows you to render those files without cloning or downloading whole repositories. It is a client-side solution using a CORS proxy to fetch assets. - -#### If you try to open raw version of any HTML, CSS or JS file in a web browser directly from GitHub, all you will see is a source code. GitHub forces them to use the "text/plain" content-type, so they cannot be interpreted. This script overrides it by using a CORS proxy. - - - ---- - - - ->Cross-Origin Resource Sharing (CORS) is a security mechanism that uses additional HTTP headers to tell browsers to give a web application running at one origin, access to selected resources from a different origin. A web application executes a cross-origin HTTP request when it requests a resource(Images, Scripts, CSS files, etc.)that has a different origin (domain, protocol, or port) from its own. - - ->Cross-origin requests, however, mean that servers must implement ways to handle requests from origins outside of their own. CORS allows servers to specify who (i.e., which origins) can access the assets on the server, among many other things. - ->Access-Control-Allow-Origin Header -When Site A tries to fetch content from Site B, Site B can send an Access-Control-Allow-Origin response header to tell the browser that the content of this page is accessible to certain origins. (An origin is a domain, plus a scheme and port number.) By default, Site B's pages are not accessible to any other origin; using the Access-Control-Allow-Origin header opens a door for cross-origin access by specific requesting origins. The Access-Control-Allow-Origin header is critical to resource security. -You can find a description of each CORS header at the following: CORS Headers. -Pre-Flight Request -Most servers will allow GET requests but may block requests to modify resources on the server. Servers don't just blindly block such requests though; they have a process in place that first checks and then communicates to the client (your web browser) which requests are allowed. -When a request is made using any of the following HTTP request methods, a standard preflight request will be made before the original request. -PUT -DELETE -CONNECT -OPTIONS -TRACE -PATCH -Preflight requests use the OPTIONS header. The preflight request is sent before the original request, hence the term "preflight." The purpose of the preflight request is to determine whether or not the original request is safe (for example, a DELETE request). The server will respond to the preflight request and indicate whether or not the original request is safe. If the server specifies that the original request is safe, it will allow the original request. Otherwise, it will block the original request. - ---- - - - - - - - -## ➤ Bryan Guner ---- - -***(Full-stack software developer)*** - ---- - -[![Portfolio](https://img.shields.io/badge/-❤_Portfolio-f58?style=flat-square&logo=a&logoColor=white&link=https://bgoonz.github.io/)](https://bgoonz.github.io)![Resume PDF](https://img.shields.io/badge/-Resume-f00?style=flat-square&logo=adobe-acrobat-reader&logoColor=white)[![Bryan's email](https://img.shields.io/badge/bryan.guner@gmail.com-f4b400?style=flat-square&logo=gmail&logoColor=black&link=mailto:bryan.guner@gmail.com)](mailto:bryan.guner@gmail.com)[![Blog](https://img.shields.io/badge/-Blog-21759b?style=flat-square&logo=WordPress&logoColor=white&link=https://web-dev-hub.com/)](https://web-dev-hub.com/)[![Linkedin](https://img.shields.io/badge/-LinkedIn-0077b5?style=flat-square&logo=Linkedin&logoColor=white&link=https://www.linkedin.com/in/bryan-guner-046199128/)](https://www.linkedin.com/in/bryan-guner-046199128/)[![AngelList](https://img.shields.io/badge/-AngelList-black?style=flat-square&logo=AngelList&logoColor=white&link=https://angel.co/u/bryan-guner)](https://angel.co/u/bryan-guner)[![GitHub bgoonz](https://img.shields.io/github/followers/bgoonz?label=follow&style=social)](https://github.com/bgoonz) - -
- -
- - - -[![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/colored.png)](#-) - - - -
- - - ![logo](https://avatars.githubusercontent.com/u/66654881?s=460&u=fa9d2cc45bc228dd9b7d3dee6d4653f940fab35a&v=4) - - - -
- - - - -------------------------------- - - -[![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/colored.png)](#-) - - -## ➤ Development: - -```js -(() => { - - const previewForm = document.getElementById('previewform'); - - const url = location.search.substring(1).replace(/\/\/github\.com/, '//raw.githubusercontent.com').replace(/\/blob\//, '/'); //Get URL of the raw file - - const replaceAssets = () => { - let frame; - let a; - let link; - const links = []; - let script; - const scripts = []; - let i; - let href; - let src; - //Framesets - if (document.querySelectorAll('frameset').length) - return; //Don't replace CSS/JS if it's a frameset, because it will be erased by document.write() - //Frames - frame = document.querySelectorAll('iframe[src],frame[src]'); - for (i = 0; i < frame.length; ++i) { - src = frame[i].src; //Get absolute URL - if (src.indexOf('//raw.githubusercontent.com') > 0 || src.indexOf('//bitbucket.org') > 0) { //Check if it's from raw.github.com or bitbucket.org - frame[i].src = '//' + location.hostname + location.pathname + '?' + src; //Then rewrite URL so it can be loaded using CORS proxy - } - } - //Links - a = document.querySelectorAll('a[href]'); - for (i = 0; i < a.length; ++i) { - href = a[i].href; //Get absolute URL - if (href.indexOf('#') > 0) { //Check if it's an anchor - a[i].href = '//' + location.hostname + location.pathname + location.search + '#' + a[i].hash.substring(1); //Then rewrite URL with support for empty anchor - } else if ((href.indexOf('//raw.githubusercontent.com') > 0 || href.indexOf('//bitbucket.org') > 0) && (href.indexOf('.html') > 0 || href.indexOf('.htm') > 0)) { //Check if it's from raw.github.com or bitbucket.org and to HTML files - a[i].href = '//' + location.hostname + location.pathname + '?' + href; //Then rewrite URL so it can be loaded using CORS proxy - } - } - //Stylesheets - link = document.querySelectorAll('link[rel=stylesheet]'); - for (i = 0; i < link.length; ++i) { - href = link[i].href; //Get absolute URL - if (href.indexOf('//raw.githubusercontent.com') > 0 || href.indexOf('//bitbucket.org') > 0) { //Check if it's from raw.github.com or bitbucket.org - links.push(fetchProxy(href, null, 0)); //Then add it to links queue and fetch using CORS proxy - } - } - Promise.all(links).then(res => { - for (i = 0; i < res.length; ++i) { - loadCSS(res[i]); - } - }); - //Scripts - script = document.querySelectorAll('script[type="text/htmlpreview"]'); - for (i = 0; i < script.length; ++i) { - src = script[i].src; //Get absolute URL - if (src.indexOf('//raw.githubusercontent.com') > 0 || src.indexOf('//bitbucket.org') > 0) { //Check if it's from raw.github.com or bitbucket.org - scripts.push(fetchProxy(src, null, 0)); //Then add it to scripts queue and fetch using CORS proxy - } else { - script[i].removeAttribute('type'); - scripts.push(script[i].innerHTML); //Add inline script to queue to eval in order - } - } - Promise.all(scripts).then(res => { - for (i = 0; i < res.length; ++i) { - loadJS(res[i]); - } - document.dispatchEvent(new Event('DOMContentLoaded', {bubbles: true, cancelable: true})); //Dispatch DOMContentLoaded event after loading all scripts - }); - }; - - const loadHTML = data => { - if (data) { - data = data.replace(/]*)>/i, '').replace(/ just after and replace - - - - - - - - - - - -``` - - - - - -
_Resources/node_modules/web-dev-utils/ - -### [_Resources/node_modules/web-dev-utils/README.md](_Resources/node_modules/web-dev-utils/README.md) --testing - -
- - - - - - ![logo](https://avatars.githubusercontent.com/u/66654881?s=460&u=fa9d2cc45bc228dd9b7d3dee6d4653f940fab35a&v=4) - - -# MY WEB-DEV UTILITIES NPM PACKAGE - - -### This code is not exclusivley written by me ... it is just a list of files I use often during website development... use at your own risk - - - - -## Copy-2-Clipboard: - -![](./images/copy-2-clip.PNG) - ---- - -## Git-Html Preview-Tool: - -![](images/git-preview.gif) - - - ---- - -## Markdown Templates: - -![](images/markdown-template.png) - ---- - -## Text Tools: - -![](images/TexTools.PNG) - - ---- - -## Automatic Table Of Contents Generator: - -![](images/toc.PNG) - - - ---- - -## Text-File-2-JS-Array: - -![](images/text-file-2-JS-Array.PNG) - - ---- - -### Usage: - -```bash -npm i web-dev-utils -``` - -
---- - -``` -. -├── GIT-HTML-PREVIEW-TOOL -│   └── GIT-HTML-PREVIEW-TOOL-master -├── Markdown-Templates-master -│   └── Markdown-Templates-master -│   └── images -├── TexTools-master -│   └── TexTools-master -│   ├── backup-stable-build -│   │   ├── css -│   │   └── js -│   ├── css -│   ├── js -│   └── sandbox -├── bootstrap-4.3.1-dist -│   ├── css -│   └── js -├── jquery -│   ├── dist -│   ├── external -│   │   └── sizzle -│   │   └── dist -│   └── src -│   ├── ajax -│   │   └── var -│   ├── attributes -│   ├── core -│   │   └── var -│   ├── css -│   │   └── var -│   ├── data -│   │   └── var -│   ├── deferred -│   ├── deprecated -│   ├── effects -│   ├── event -│   ├── exports -│   ├── manipulation -│   │   └── var -│   ├── queue -│   ├── traversing -│   │   └── var -│   └── var -├── loadashes6 -│   └── lodash -│   └── fp -├── mout -│   ├── array -│   ├── collection -│   ├── date -│   │   └── i18n -│   ├── doc -│   ├── function -│   ├── lang -│   ├── math -│   ├── number -│   ├── object -│   ├── queryString -│   ├── random -│   ├── src -│   │   ├── array -│   │   ├── collection -│   │   ├── date -│   │   │   └── i18n -│   │   ├── function -│   │   ├── lang -│   │   ├── math -│   │   ├── number -│   │   ├── object -│   │   ├── queryString -│   │   ├── random -│   │   ├── string -│   │   └── time -│   ├── string -│   └── time -└── personal-utilities - ├── Auto-table-Of-Contents - ├── copy-2-clip - ├── css - ├── html - ├── js - └── prism - -81 directories -``` - - - - - -
_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/ - -### [_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/README.md](_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/README.md) - - -
- - - - -# Deployment: - -[deployment](https://devtools42.netlify.app/) - - -# TexTools . - -[![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/colored.png)](#-) - - - **TOC** - [About](#about) ● [Features](#features) ● [How It Works](#how-it-works) ● [Installation](#installation) ● [Development](#development) ● [Contact](#contact) - - - - ![logo](https://avatars.githubusercontent.com/u/66654881?s=460&u=fa9d2cc45bc228dd9b7d3dee6d4653f940fab35a&v=4) - - [![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/colored.png)](#-) - -GitjQueryJavaScriptNodeJSCSS3HTML5BootstrapBitbucketAdobe XDRepl.it - - [![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/colored.png)](#-) - - - -# Usage: - -

-# Tools - -## \*8 text manipulation tools: . - ->1. Duplicate Remover (duplicate lines... Case and whitespace sensative) - -[![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/colored.png)](#-) - - ->2. Find and Replace - -[![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/colored.png)](#-) - - ->3. Compare Text Files: compares text files and if common text is detected between them only one of them will retain the text that previously existed in both. - -[![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/colored.png)](#-) - - ->4. Add Prefix/Suffix (by line.. not by file) - -[![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/colored.png)](#-) - - ->5. White Space remover (It removes all the whitespace within your text. I use it for creating javascript for iMacros for Firefox) - -[![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/colored.png)](#-) - - ->6. Sort Text Lines (It sorts text lines alphabetically in ascending and descending order) - -[![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/colored.png)](#-) - - ->7. Replace Lines Breaks (Replace line breaks with some text. One of the example where it can be used is to convert a normal text file with line breaks to csv type file.) - -[![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/colored.png)](#-) - - ->8. Letter Case Converter (Converts the letter case of your text. Currently , only upper and lower letter cases are supported). - - -##Bryan Guner -*(Full-stack software developer)* - -[![Portfolio](https://img.shields.io/badge/-❤_Portfolio-f58?style=flat-square&logo=a&logoColor=white&link=https://bgoonz.github.io/)](https://bgoonz.github.io) -![Resume PDF](https://img.shields.io/badge/-Resume-f00?style=flat-square&logo=adobe-acrobat-reader&logoColor=white) -[![Bryan's email](https://img.shields.io/badge/bryan.guner@gmail.com-f4b400?style=flat-square&logo=gmail&logoColor=black&link=mailto:bryan.guner@gmail.com)](mailto:bryan.guner@gmail.com) -[![Blog](https://img.shields.io/badge/-Blog-21759b?style=flat-square&logo=WordPress&logoColor=white&link=https://web-dev-hub.com/)](https://web-dev-hub.com/) -[![Linkedin](https://img.shields.io/badge/-LinkedIn-0077b5?style=flat-square&logo=Linkedin&logoColor=white&link=https://www.linkedin.com/in/bryan-guner-046199128/)](https://www.linkedin.com/in/bryan-guner-046199128/) -[![AngelList](https://img.shields.io/badge/-AngelList-black?style=flat-square&logo=AngelList&logoColor=white&link=https://angel.co/u/bryan-guner)](https://angel.co/u/bryan-guner) -[![GitHub bgoonz](https://img.shields.io/github/followers/bgoonz?label=follow&style=social)](https://github.com/bgoonz) - -

- -
- -[![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/colored.png)](#-) - - - - - - - - - - - -
javascript-practice/-ALL-JS-Files/ - -### [javascript-practice/-ALL-JS-Files/output.md](javascript-practice/-ALL-JS-Files/output.md) -let str = 'MIICWwIBAAKBgGEdLjFEFbegPZ2AwJWkalksXr7PzWL7wIc7pOFZxXwYPWtQxvANyceCwpkqbPLsfEx7nqxAris2hYOdeN1OTFqvTyNmVuzbUPcXShn6ZoDCB30voHkeu4F3cUw5RQEUDdLscSnv4HMxHam5qgl6vXoumVNHbjyKA5UtAnfjAgMBAAECgYAmjEyvpZTxRJvwjxDi1VaZevFI0Hd4WPH9PAGgqdnH84vGXnAGFj1WikqKYcqKMQW2kdjAsWwH9D9FfrkIcDDHdZ9XuGSGkFzWtOwajWMQl7qNV1hZ288gdpIQQMOTLDgauZY6pw1cV7h4v316qJB8knQGoBNpJCfTYQJBAKV1ctsJq0Zg4QumD2hyODepP3LfLeaQsERLqVAWeuOuTY5mK5gIwsSqvcSVfY7Ze1FWIsApNFRv67azKcJPwsCQQCNlyApZFJEVNY70Er7Uu5NL9t4CYJJC9uVVkoEHEY6d7sVslqa0vP2q0zXx9YedbMBvQjxXIbY0waXUy63FvoBGJAkB3OTJWUjVgzDY1Br5wu2Yu59NjKVKLWzCsu1gaCNBfhVDX7SyIyC9EYKRfUAoQxwsmPWPyQ9QVG4WKcPZJAkBRheAotPCBE2RLHHfvpiStnMhX0UXdVyaJp5tcZ6wYV61ohyBvCOkYhUxBJzeIGrVZcvLZSLeUzXoqRPpxQxAkEAkdCZXF0gHahpZgF5y0wWcqf9ECRT1E4Hv8bk3Mf0Exp2aW34JeI6I7Xqd1NV4I9H7prQ8m3y39lFwWO8PmQ'; -console.log( str.indexOf( 'HEY' ) ); -console.log( 0 ); -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `alternatingCaps` that accepts a sentence string as an argument. The function should -// return the sentence where words alternate between lowercase and uppercase. -let alternatingCaps = sentence => { - let words = sentence.split( ' ' ); - let newWords = []; - for ( let i = 0; i < words.length; i++ ) { - let word = words[ i ]; - if ( i % 2 === 0 ) { - newWords.push( word.toLowerCase() ); - } else { - newWords.push( word.toUpperCase() ); - } - } - return newWords.join( ' ' ); -}; -console.log( alternatingCaps( "take them to school" ) ); // 'take THEM to SCHOOL' -console.log( alternatingCaps( "What did ThEy EAT before?" ) ); // 'what DID they EAT before?' -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `averageOfFour(num1, num2, num3, num4)` that accepts four numbers as arguments. The -// function should return the average of all four numbers. -let averageOfFour = ( num1, num2, num3, num4 ) => { - let sum = num1 + num2 + num3 + num4; - return sum / 4; -}; -console.log( averageOfFour( 10, 4, 12, 3 ) ); // 7.25 -console.log( averageOfFour( -20, 50, 4, 21 ) ); // 13.75 -console.log( averageOfFour( 10, 4, 12, 3 ) ); // 7.25 -console.log( averageOfFour( 5, 5, 3, 7 ) ); // 5 -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `average` that accepts three numbers as arguments. The function should return the -// average of the three numbers. -let average = ( num1, num2, num3 ) => ( num1 + num2 + num3 ) / 3; -console.log( average( 3, 10, 8 ) ); // 7 -console.log( average( 10, 5, 12 ) ); // 9 -console.log( average( 6, 20, 40 ) ); // 22 -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `bleepVowels` that accepts a string as an argument. The function should return -// a new string where all vowels are replaced with `*`s. Vowels are the letters a, e, i, o, u. -let bleepVowels = str => { - let vowels = [ "a", "e", "i", "o", "u" ]; - let bleeped = ""; - for ( let char of str ) { - if ( vowels.includes( char ) ) { - bleeped += "*"; - } else { - bleeped += char; - } - } - return bleeped; -}; -console.log( bleepVowels( "skateboard" ) ); // 'sk*t*b**rd' -console.log( bleepVowels( "slipper" ) ); // 'sl*pp*r' -console.log( bleepVowels( "range" ) ); // 'r*ng*' -console.log( bleepVowels( "brisk morning" ) ); // 'br*sk m*rn*ng' -console.log( false ); // false -console.log( !true ); // false -console.log( !false ); // true -console.log( !!true ); // true -console.log( false && false ); // false -console.log( false && true ); // false -console.log( true && false ); // false -console.log( true && true ); // true -console.log( false || false ); // false -console.log( false || true ); // true -console.log( true || false ); // true -console.log( true || true ); // true -console.log( !false || false ); // true -console.log( false || ( true && true ) ); // true -console.log( false || !( true && true ) ); // false -console.log( !true && ( true ) ); // false -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `caseChange` that accepts a string and a boolean as arguments. The function should -// return the uppercase version of the string if the boolean is true. The function should return the -// lowercase version of the string if the boolean is false. -let caseChange = ( str, shouldUpperCase ) => { - if ( shouldUpperCase ) { - return str.toUpperCase(); - } else { - return str.toLowerCase(); - } -}; -console.log( caseChange( "Super", true ) ); // 'SUPER' -console.log( caseChange( "Super", false ) ); // 'super' -console.log( caseChange( "tAmBourine", true ) ); // 'TAMBOURINE' -console.log( caseChange( "tAmBourine", false ) ); // 'tambourine' -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `censorE` that accepts a string as an argument. The function should return the a new -// version of string where all characters that are 'e's are replaced with '*'s. -let censorE = str => { - let newStr = ''; - for ( let char of str ) { - if ( char === 'e' ) { - newStr += '*'; - } else { - newStr += char; - } - } - return newStr; -}; -console.log( censorE( "speedy" ) ); // 'sp**dy' -console.log( censorE( "pending" ) ); // 'p*nding' -console.log( censorE( "scene" ) ); // 'sc*n*' -console.log( censorE( "heat" ) ); // 'h*at' -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `chooseDivisibles(numbers, target)` that accepts an array of numbers and a -// target number as arguments. The function should return an array containing elements of the original -// array that are divisible by the target. -let chooseDivisibles = ( numbers, target ) => { - let divisibles = []; - for ( let num of numbers ) { - if ( num % target === 0 ) { - divisibles.push( num ); - } - } - return divisibles; -}; -console.log( chooseDivisibles( [ 40, 7, 22, 20, 24 ], 4 ) ); // [40, 20, 24] -console.log( chooseDivisibles( [ 9, 33, 8, 17 ], 3 ) ); // [9, 33] -console.log( chooseDivisibles( [ 4, 25, 1000 ], 10 ) ); // [1000] -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `commonElements` that accepts two arrays as arguments. The function should return -// a new array containing the elements that are found in both of the input arrays. The order of -// the elements in the output array doesn't matter as long as the function returns the correct elements. -let commonElements = ( array1, array2 ) => { - let common = []; - for ( let ele of array1 ) { - if ( array2.includes( ele ) ) { - common.push( ele ); - } - } - return common; -}; -let arr1 = [ "a", "c", "d", "b" ]; -let arr2 = [ "b", "a", "y" ]; -console.log( commonElements( arr1, arr2 ) ); // ['a', 'b'] -let arr3 = [ 4, 7 ]; -let arr4 = [ 32, 7, 1, 4 ]; -console.log( commonElements( arr3, arr4 ) ); // [4, 7] -console.log( true === false ); // false -console.log( false === false ); // true -console.log( false !== true ); // true -console.log( !true === false ); // true -console.log( 2 + 3 === 5 ); // true -console.log( 4 < 0 ); // false -console.log( 10 >= 10 ); // true -console.log( 10.3 >= 10 ); // true -console.log( 100 / 2 === 50 ); // true -console.log( 100 % 2 === 0 ); // true -console.log( 11 % 2 === 0 ); // false -console.log( 7.0 === 7 ); // true -console.log( 13 % 5 > 0 ); // true -console.log( "potato" === "potato" ); // true -console.log( "Tomato" === "tomato" ); // false -console.log( "42" === 42 ); // false -console.log( 5 > 3 && 1 === 0 ); // false -t -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `contains(str1, str2)` that accepts two strings as arguments. The function should -// return a boolean indicating whether or not `str2` is contained within `str1`. The function should -// ignore any differences in capitalization. -let contains = ( str1, str2 ) => { - let lowerStr1 = str1.toLowerCase(); - let lowerStr2 = str2.toLowerCase(); - return lowerStr1.includes( lowerStr2 ); -}; -console.log( contains( "caterpillar", "pill" ) ); // true -console.log( contains( "lion's share", "on" ) ); // true -console.log( contains( "SORRY", "or" ) ); // true -console.log( contains( "tangent", "gem" ) ); // false -console.log( contains( "clock", "ok" ) ); // false -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `countUp(max)` that accepts a max number as an argument. The function should print -// all numbers from 1 up to and including the max. The function doesn't need to return any value. It -// should just print to the terminal. -let countUp = max => { - for ( let i = 1; i <= max; i++ ) { - console.log( i ); - } -}; -countUp( 5 ); -// prints -// 1 -// 2 -// 3 -// 4 -// 5 -countUp( 3 ); -// prints -// 1 -// 2 -// 3 -let phrase = "that's all folks"; -console.log( phrase[ phrase.length ] ); // undefined -console.log( phrase[ phrase.length - 1 ] ); // s -console.log( phrase[ phrase.length - 2 ] ); // k -const i = 9; -const char = phrase[ i ]; -console.log( char ); // l -console.log( phrase.indexOf( char ) ); // 8 -console.log( phrase.slice( 2, 8 ) ); // at's a -console.log( "abcdefg".slice( 1, 3 ) ); // bc -console.log( "abcdefg".slice( 2 ) ); // cdefg -console.log( "abcdefg".slice( 4 ) ); // efg -console.log( "abcdefg".slice( 2, -1 ) ); // cdef -console.log( "abcdefg".slice( 2, -2 ) ); // cde -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function named `divByEither(num1, num2, max)` that accepts three numbers as arguments. -// The function should print out all positive numbers less than max that are divisible by num1 or num2. -// The function doesn't need to return any value. It should just print to the terminal. -let divByEither = ( num1, num2, max ) => { - for ( let i = 1; i < max; i++ ) { - if ( i % num1 === 0 || i % num2 === 0 ) { - console.log( i ); - } - } -}; -divByEither( 4, 3, 16 ); -// prints -// 3 -// 4 -// 6 -// 8 -// 9 -// 12 -// 15 -divByEither( 7, 5, 20 ); -// prints -// 5 -// 7 -// 10 -// 14 -// 15 -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `divisibleRange(min, max, num)` that accepts three numbers as arguments. The -// function should print all numbers between `min` and `max` (exclusive) that are also divisible by -// num. -let divisibleRange = ( min, max, num ) => { - for ( let i = min + 1; i < max; i++ ) { - if ( i % num === 0 ) { - console.log( i ); - } - } -}; -divisibleRange( 17, 40, 9 ); -// prints -// 18 -// 27 -// 36 -divisibleRange( 10, 24, 4 ); -// prints -// 12 -// 16 -// 20 -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `divisible(num1, num2)` that accepts two numbers as arguments. The function should -// return a boolean indicating whether or not `num1` is divisible by `num2`. -let divisible = ( num1, num2 ) => num1 % num2 === 0; -// let divisible = function (num1, num2) { -// if (num1 % num2 === 0) { -// return true; -// } else { -// return false; -// } -// }; -console.log( divisible( 12, 3 ) ); // true -console.log( divisible( 12, 5 ) ); // false -console.log( divisible( 60, 4 ) ); // true -console.log( divisible( 60, 11 ) ); // false -console.log( divisible( 21, 7 ) ); // true -console.log( divisible( 21, 6 ) ); // false -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `divisors` that accepts a number as an argument. The function should return an -// array containing all positive numbers that can divide into the argument. -let divisors = n => { - let numbers = []; - for ( let i = 1; i <= n; i++ ) { - if ( n % i === 0 ) { - numbers.push( i ); - } - } - return numbers; -}; -console.log( divisors( 15 ) ); // [1, 3, 5, 15] -console.log( divisors( 7 ) ); // [1, 7] -console.log( divisors( 24 ) ); // [1, 2, 3, 4, 6, 8, 12, 24] -g -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `endsInLy` that accepts a string as an argument and returns a boolean indicating -// whether or not the string ends in the substring 'ly'. -let endsInLy = str => { - let secondLast = str[ str.length - 2 ]; - let last = str[ str.length - 1 ]; - return secondLast === 'l' && last === 'y'; -}; -// let endsInLy = function (str) { -// return str.endsWith('ly'); -// }; -console.log( endsInLy( "pretty" ) ); // false -console.log( endsInLy( "instant" ) ); // false -console.log( endsInLy( "analytic" ) ); // false -console.log( endsInLy( "timidly" ) ); // true -console.log( endsInLy( "fly" ) ); // true -console.log( endsInLy( "gallantly" ) ); // true -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `endsWithT` that accepts a string as an argument. The function should return a -// boolean indicating whether or not the string ends with the character 't'. -let endsWithT = str => { - let lastChar = str[ str.length - 1 ]; - return lastChar === 't'; -}; -console.log( endsWithT( "smart" ) ); // true -console.log( endsWithT( "racket" ) ); // true -console.log( endsWithT( "taco" ) ); // false -console.log( endsWithT( "boomerang" ) ); // false -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `evens(max)` that accepts a max number as an argument. The function should print -// all positive even numbers that are less than the max. -let evens = max => { - for ( let i = 1; i < max; i++ ) { - if ( i % 2 === 0 ) { - console.log( i ); - } - } -}; -evens( 11 ); -// prints -// 2 -// 4 -// 6 -// 8 -// 10 -evens( 8 ); -// prints -// 2 -// 4 -// 6 -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `filterLongWords` that accepts an array of strings as an argument. The function -// should return a new array containing only the strings that are less than 5 characters long. -let filterLongWords = words => { - let chosenWords = []; - for ( let word of words ) { - if ( word.length < 5 ) { - chosenWords.push( word ); - } - } - return chosenWords; -}; -console.log( filterLongWords( [ "kale", "cat", "retro", "axe", "heirloom" ] ) ); -// ['kale', 'cat', 'axe'] -console.log( filterLongWords( [ "disrupt", "pour", "trade", "pic" ] ) ); -// ['pour', 'pic'] -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function named `fiveMultiplesOf` that accepts a number as an argument. The function should -// print out the first five multiples of the given number. The function doesn't need to return any -// value. It should just print to the terminal. -let fiveMultiplesOf = num => { - for ( let i = 1; i <= 5; i++ ) { - console.log( i * num ); - } -}; -fiveMultiplesOf( 7 ); -// prints -// 7 -// 14 -// 21 -// 28 -// 35 -fiveMultiplesOf( 3 ); -// prints -// 3 -// 6 -// 9 -// 12 -// 15 -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `fizzBuzz` that accepts a max number as an argument. The function should -// print all numbers less than or equal to max that are divisible by either 3 or 5 but not both 3 -// and 5. The function doesn't need to return any value. It should just print to the terminal. -let fizzBuzz = max => { - for ( let i = 1; i <= max; i++ ) { - if ( ( i % 3 === 0 || i % 5 === 0 ) && !( i % 3 === 0 && i % 5 === 0 ) ) { - console.log( i ); - } - } -}; -fizzBuzz( 18 ); -// prints -// 3 -// 5 -// 6 -// 9 -// 10 -// 12 -// 18 -fizzBuzz( 33 ); -// prints -// 3 -// 5 -// 6 -// 9 -// 10 -// 12 -// 18 -// 20 -// 21 -// 24 -// 25 -// 27 -// 33 -let movie = 'Fight Club'; -let views = 4; -console.log( `I watched ${ movie } about ${ views } number of times` ); -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `funnySound` that accepts two strings as arguments. The function should return a -// new string containing the first three characters of both strings concatenated together. -// You can assume that the arguments are both at least three characters long. -let funnySound = ( str1, str2 ) => str1.slice( 0, 3 ) + str2.slice( 0, 3 ); -console.log( funnySound( "tiger", "spoon" ) ); // 'tigspo' -console.log( funnySound( "computer", "phone" ) ); // 'compho' -console.log( funnySound( "skate", "bottle" ) ); // 'skabot' -console.log( funnySound( "frog", "ashtray" ) ); // 'froash' -console.log( 'hello world' ); -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `half` that accepts a number as an argument. The function should return half of the -// number. -let half = n => n / 2; -console.log( half( 8 ) ); // 4 -console.log( half( 15 ) ); // 7.5 -console.log( half( 90 ) ); // 45 -gi -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `inRange(min, max, n)` that accepts three numbers as arguments. The function should -// return a boolean indicating if `n` is between `min` and `max` inclusive. -let inRange = ( min, max, n ) => n >= min && n <= max; -console.log( inRange( 5, 13, 8 ) ); // true -console.log( inRange( 5, 13, 29 ) ); // false -console.log( inRange( 100, 125, 100 ) ); // true -console.log( inRange( 100, 125, 99 ) ); // false -console.log( inRange( 40, 45, 44 ) ); // true -console.log( inRange( 40, 45, 45 ) ); // true -console.log( inRange( 40, 45, 46 ) ); // false -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `isDivBy4` that accepts a number as an argument. The function should return a -// boolean indicating whether or not the number is divisible by 4. -let isDivBy4 = num => { - if ( num % 4 === 0 ) { - return true; - } else { - return false; - } -}; -// let isDivBy4 = function (num) { -// return num % 4 === 0; -// }; -console.log( isDivBy4( 8 ) ); // true -console.log( isDivBy4( 12 ) ); // true -console.log( isDivBy4( 24 ) ); // true -console.log( isDivBy4( 9 ) ); // false -console.log( isDivBy4( 10 ) ); // false -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `isLong` that accepts a string as an argument. The function should return a boolean -// indicating whether or not the string is longer than 5 characters -let isLong = ( { - length -} ) => length > 5; -// let isLong = function (str) { -// if (str.length > 5) { -// return true; -// } else { -// return false; -// } -// }; -console.log( isLong( "pie" ) ); // false -console.log( isLong( "kite" ) ); // false -console.log( isLong( "kitty" ) ); // false -console.log( isLong( "telescope" ) ); // true -console.log( isLong( "thermometer" ) ); // true -console.log( isLong( "restaurant" ) ); // true -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `keepItQuiet` that accepts a string as an argument. The function should return the -// lowercase version of the string with 3 periods added to the end of it. -let keepItQuiet = str => `${ str.toLowerCase() }...`; -console.log( keepItQuiet( "HOORAY" ) ); // 'hooray...' -console.log( keepItQuiet( "Doggo" ) ); // 'doggo...' -console.log( keepItQuiet( "WHAT?!?!" ) ); // 'what?!?!...' -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `larger` that accepts two numbers as arguments. The function should return the -// larger number. -let larger = ( num1, num2 ) => { - if ( num1 > num2 ) { - return num1; - } else { - return num2; - } -}; -console.log( larger( 256, 400 ) ); // 400 -console.log( larger( 31, 4 ) ); // 31 -console.log( larger( -6, 7 ) ); // 7 -console.log( larger( 11.3, 11.2 ) ); // 11.3 -console.log( larger( -10, -3 ) ); // -3 -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `lengthiestWord` that accepts a sentence string as an argument. The function should -// return the longest word of the sentence. If there is a tie, return the word that appears later -// in the sentence. -let lengthiestWord = sentence => { - let words = sentence.split( ' ' ); - let longest = words[ 0 ]; // pretty - for ( let i = 1; i < words.length; i++ ) { - let word = words[ i ]; - if ( word.length >= longest.length ) { - longest = word; - } - } - return longest; -}; -console.log( lengthiestWord( "I am pretty hungry" ) ); // 'hungry' -console.log( lengthiestWord( "we should think outside of the box" ) ); // 'outside' -console.log( lengthiestWord( "down the rabbit hole" ) ); // 'rabbit' -console.log( lengthiestWord( "simmer down" ) ); // 'simmer' -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `longer` that accepts two strings as arguments. The function should return the -// string that is longer. If the strings have the same length, then return the first string. -let longer = ( str1, str2 ) => { - if ( str1.length >= str2.length ) { - return str1; - } else { - return str2; - } -}; -console.log( longer( "drum", "piranha" ) ); // 'piranha' -console.log( longer( "basket", "fork" ) ); // 'basket' -console.log( longer( "flannel", "sustainable" ) ); // 'sustainable' -console.log( longer( "disrupt", "ability" ) ); // 'disrupt' -console.log( longer( "bird", "shoe" ) ); // 'bird' -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `makeAcronym` that accepts a sentence string as an argument. The function should -// return a string containing the first character of each word in the sentence. -let makeAcronym = sentence => { - let words = sentence.split( ' ' ); - let acronym = ''; - for ( let word of words ) { - acronym += word[ 0 ]; - } - return acronym.toUpperCase(); -}; -console.log( makeAcronym( "New York" ) ); // NY -console.log( makeAcronym( "same stuff different day" ) ); // SSDD -console.log( makeAcronym( "Laugh out loud" ) ); // LOL -console.log( makeAcronym( "don't over think stuff" ) ); // DOTS -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `makeMatrix(m, n, value)` that accepts three arguments. The function should return -// a 2-dimensional array of height `m` and width `n` that contains the `value` as every element. -let makeMatrix = ( m, n, value ) => { - let matrix = []; - for ( let i = 0; i < m; i++ ) { - let row = []; - for ( let j = 0; j < n; j++ ) { - row.push( value ); - } - matrix.push( row ); - } - return matrix; -}; -console.log( makeMatrix( 3, 5, null ) ); -// [ -// [ null, null, null, null, null ], -// [ null, null, null, null, null ], -// [ null, null, null, null, null ] -// ] -console.log( makeMatrix( 4, 2, "x" ) ); -// [ -// [ 'x', 'x' ], -// [ 'x', 'x' ], -// [ 'x', 'x' ], -// [ 'x', 'x' ] -// ] -console.log( makeMatrix( 2, 2, 0 ) ); -// [ -// [ 0, 0 ], -// [ 0, 0 ] -// ] -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `maximum` that accepts an array of numbers as an argument. The function should -// return the largest number of the array. If the array is empty, then the function should return null. -let maximum = numbers => { - if ( numbers.length === 0 ) { - return null; - } - let currentMax = numbers[ 0 ]; - for ( let i = 1; i < numbers.length; i++ ) { - if ( numbers[ i ] > currentMax ) { - currentMax = numbers[ i ]; - } - } - return currentMax; -}; -console.log( maximum( [ 5, 6, 3, 7 ] ) ); // 7 -console.log( maximum( [ 17, 15, 19, 11, 2 ] ) ); // 19 -console.log( maximum( [] ) ); // null -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `minToMax(min, max)` that accepts two numbers as arguments. The function should -// print all numbers from min to max inclusive. The function doesn't need to return any value. It -// should just print to the terminal. -let minToMax = ( min, max ) => { - for ( let i = min; i <= max; i++ ) { - console.log( i ); - } -}; -minToMax( 5, 9 ); -// prints -// 5 -// 6 -// 7 -// 8 -// 9 -minToMax( 11, 13 ); -// prints -// 11 -// 12 -// 13 -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function named `noOhs` that accepts a string as an argument. The functions should print the -// characters of the string one by one except the character 'o'. The function doesn't need to return -// any value. It should just print to the terminal. -let noOhs = str => { - for ( let char of str ) { - if ( char !== 'o' ) { - console.log( char ); - } - } -}; -noOhs( "code" ); -// prints -// c -// d -// e -noOhs( "school" ); -// prints -// s -// c -// h -// l -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `numOdds` that accepts an array of numbers as an argument. The function should -// return a number representing the count of odd elements in the array. -function numOdds( numbers ) { - let count = 0; - for ( let i = 0; i < numbers.length; { - if () {} - }( numbers[ i ] % 2 ) === 1 ) { - count += 1; - } -} -return count; -}; -console.log( numOdds( [ 4, 7, 2, 5, 9 ] ) ); // 3 -console.log( numOdds( [ 11, 31, 58, 99, 21, 60 ] ) ); // 4 -console.log( numOdds( [ 100, 40, 4 ] ) ); // 0 -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `numberChange` that accepts a number as an argument. The function should return -// half the number if it is even. The function should return double the number if it is odd. -let numberChange = n => { - if ( n % 2 === 0 ) { - return n / 2; - } else { - return n * 2; - } -}; -console.log( numberChange( 6 ) ); // 3 -console.log( numberChange( 7 ) ); // 14 -console.log( numberChange( 16 ) ); // 8 -console.log( numberChange( 21 ) ); // 42 -console.log( 2 + 3 ); // 5 -console.log( 10 - 15 ); // -5 -console.log( 4 + 1 - 5 ); // 0 -console.log( 4 * 3 ); // 12 -console.log( 7 / 2 ); // 3.5 -console.log( 4 + 2 * 3 ); // 10 -console.log( ( 4 + 2 ) * 3 ); // 18 -console.log( 5 % 2 ); // 1 -console.log( 6 % 2 ); // 0 -console.log( 7 % 2 ); // 1 -console.log( 8 % 2 ); // 0 -console.log( 19 % 8 ); // 3 -console.log( 24 % 8 ); // 0 -console.log( 7 % 4 ); // 3 -console.log( 4 % 7 ); // 4 -console.log( 5 + ( 10 % 5 ) ); // 5 -console.log( ( 5 + 10 ) % 5 ); // 0 -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `numberRange(min, max, step)` that accepts three numbers as arguments, `min`, -// `max`, and `step`. The function should return all numbers between `min` and `max` at `step` intervals. -// `min` and `max` are inclusive. -let numberRange = ( min, max, step ) => { - let range = []; - for ( let i = min; i <= max; i += step ) { - range.push( i ); - } - return range; -}; -console.log( numberRange( 10, 40, 5 ) ); // [10, 15, 20, 25, 30, 35, 40] -console.log( numberRange( 14, 24, 3 ) ); // [14, 17, 20, 23] -console.log( numberRange( 8, 35, 6 ) ); // [8, 14, 20, 26, 32] -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function named `oddSum(max)` that accepts a max number as an argument. The function should -// return the total sum of all odd numbers from 1 to the max, inclusive. -// -// For example, oddSum(10) should return 25 because 1 + 3 + 5 + 7 + 9 = 25 -let oddSum = max => { - let sum = 0; - for ( let i = 1; i <= max; i++ ) { - if ( i % 2 === 1 ) { - sum += i; - } - } - return sum; -}; -console.log( oddSum( 10 ) ); // 25 -console.log( oddSum( 5 ) ); // 9 -let word = "bye"; -console.log( `${ word } felicia` ); // 'bye felicia' -console.log( word ); // 'bye' -let num = 10; -num = num * 2; -console.log( num ); // 20 -let bottlesOfBeer = 99; -let around = bottlesOfBeer - 1; -console.log( around ); // 98 -console.log( bottlesOfBeer ); // 99 -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `oneOrNone` that accepts two booleans as arguments. The function should return true -// if exactly one of the arguments is true. If BOTH arguments are true, then it should return false. -let oneOrNone = ( val1, val2 ) => { - if ( ( val1 || val2 ) && !( val1 && val2 ) ) { - return true; - } else { - return false; - } -}; -console.log( oneOrNone( false, false ) ); // false -console.log( oneOrNone( true, false ) ); // true -console.log( oneOrNone( false, true ) ); // true -console.log( oneOrNone( true, true ) ); // false -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `oneToFour` that prints all whole numbers from one to four, inclusive. The function -// takes in no arguments and doesn't need to return any value. It should just print to the terminal. -let oneToFour = () => { - for ( let i = 1; i <= 4; i++ ) { - console.log( i ); - } -}; -oneToFour(); -// prints -// 1 -// 2 -// 3 -// 4 -i t // snippet 1-0 -let qty = 38; -if ( qty > 30 && qty % 5 === 4 ) { - console.log( "swish" ); -} else { - console.log( "swoosh" ); // prints -} -if ( qty > 0 ) { - console.log( "pos" ); // prints -} -// snippet 1-1 -let a = "celery"; -let b = "SQUASH"; -if ( a === a.toUpperCase() ) { - console.log( "alpha" ); -} -if ( b === b.toUpperCase() ) { - console.log( "beta" ); // prints -} -// snippet 1-2 -let number = 9; -if ( number > 4 ) { - console.log( "ding" ); // prints -} else if ( number % 3 === 0 ) { - console.log( "dong" ); -} -// snippet 1-3 -let z = 12; -if ( z > 10 ) { - console.log( "vroom" ); // prints -} -if ( z % 3 === 0 ) { - console.log( "skrrt" ); // prints -} -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `pairPrint` that accepts an array as an argument. The function should print -// all unique pairs of elements in the array. The function doesn't need to return any value. It -// should just print to the terminal. - -let pairPrint = function ( array ) { - for ( let i = 0; i < array.length; i++ ) { - for ( let j = i + 1; j < array.length; j++ ) { - console.log( array[ i ] + ' - ' + array[ j ] ); - } - } -}; - -pairPrint( [ "artichoke", "broccoli", "carrot", "daikon" ] ); -// prints -// artichoke - broccoli -// artichoke - carrot -// artichoke - daikon -// broccoli - carrot -// broccoli - daikon -// carrot - daikon - -pairPrint( [ "apple", "banana", "clementine" ] ); -// prints -// apple - banana -// apple - clementine -// banana - clementine - -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `parity` that accepts a number as an argument. The function should return the -// string 'even' if the number is even. It should return the string 'odd' if the number is odd. -let parity = function ( num ) { - if ( num % 2 === 0 ) { - return 'even'; - } else { - return 'odd'; - } -}; -console.log( parity( 5 ) ); // 'odd' -console.log( parity( 7 ) ); // 'odd' -console.log( parity( 13 ) ); // 'odd' -console.log( parity( 32 ) ); // 'even' -console.log( parity( 10 ) ); // 'even' -console.log( parity( 602348 ) ); // 'even' -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `print2d` that accepts a two-dimensional array as an argument. The function -// should print all inner elements of the array. - -let print2d = function ( array ) { - for ( let i = 0; i < array.length; i++ ) { - let subarray = array[ i ]; - for ( let j = 0; j < subarray.length; j++ ) { - console.log( subarray[ j ] ); - } - } -}; - - -let array1 = [ - [ "a", "b", "c", "d" ], - [ "e", "f" ], - [ "g", "h", "i" ], -]; -print2d( array1 ); -// prints -// a -// b -// c -// d -// e -// f -// g -// h -// i - -let array2 = [ - [ 9, 3, 4 ], - [ 11 ], - [ 42, 100 ] -]; -print2d( array2 ); -// prints -// 9 -// 3 -// 4 -// 11 -// 42 -// 100 - -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -/// Write a function `printCombinations`that accepts two arrays as arguments. The function should -// print all combinations of the elements generated by taking an element from the first array and -// and an element from the second array. The function doesn't need to return any value. It -// should just print to the terminal. - - -let printCombinations = function ( array1, array2 ) { - for ( let i = 0; i < array1.length; i++ ) { - let ele1 = array1[ i ]; - - for ( let j = 0; j < array2.length; j++ ) { - let ele2 = array2[ j ]; - console.log( ele1, ele2 ); - } - } -}; - -let colors = [ "gray", "cream", "cyan" ]; -let clothes = [ "shirt", "flannel" ]; -printCombinations( colors, clothes ); -// prints -// gray shirt -// gray flannel -// cream shirt -// cream flannel -// cyan shirt -// cyan flannel - -printCombinations( [ "hot", "cold" ], [ "soup", "tea" ] ); -// prints -// hot soup -// hot tea -// cold soup -// cold tea - -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function named `productUpTo(max)` that accepts a max number as an argument. The function -// should return the total product of all whole numbers from 1 to the max, inclusive. A product is a -// number obtained from multiplying numbers together. -// -// For example, productUpTo(4) should return 24 because 1 * 2 * 3 * 4 = 24 -let productUpTo = function ( max ) { - let product = 1; - for ( let i = 1; i <= max; i++ ) { - product *= i; - } - return product; -}; -console.log( productUpTo( 4 ) ); // 24 -console.log( productUpTo( 5 ) ); // 120 -console.log( productUpTo( 7 ) ); // 5040 -let word = "suspension bridge"; -console.log( word[ 4 ] ); // e -console.log( word.length > 5 && word[ 0 ] === "d" ); // false -console.log( word.length > 5 && word[ 0 ] === "s" ); // true -console.log( word.indexOf( "o" ) > -1 ); // true -console.log( word.indexOf( "z" ) > -1 ); // false -let str = "foggy"; -console.log( str[ 2 + 1 ] ); // g -console.log( str[ str.length - 1 ] ); // y -str = " day"; -console.log( str ); // ' day' -console.log( str.length ); // 4 -console.log( str.indexOf( "ogg" ) ); // -1 -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `raisePower(base, exponent)` that accepts two numbers, `base` and `exponent`. The -// function should return `base` raised to the `exponent` power. -// -// For example, raisePower(2, 5) should return 32 because 2 * 2 * 2 * 2 * 2 = 32 -// For example, raisePower(4, 3) should return 64 because 4 * 4 * 4 = 64 -let raisePower = function ( base, exponent ) { - let product = 1; - for ( let i = 1; i <= exponent; i++ ) { - product *= base; - } - return product; -}; -console.log( raisePower( 2, 5 ) ); // 32 -console.log( raisePower( 4, 3 ) ); // 64 -console.log( raisePower( 10, 4 ) ); // 10000 -console.log( raisePower( 7, 2 ) ); // 49 -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `removeCapitals` that accepts a string as an argument. The function should return a -// new version of the string with all capital letters removed. -let removeCapitals = function ( str ) { - let newStr = ''; - for ( let i = 0; i < str.length; { - let char = str[ i ]; - if ( char === char.toLowerCase() ) { - newStr += char; - } - } - return newStr; - }; - console.log( removeCapitals( "fOrEver" ) ); // 'frver' - console.log( removeCapitals( "raiNCoat" ) ); // 'raioat' - console.log( removeCapitals( "cElLAr Door" ) ); // 'clr oor' - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `removeDupes` that accepts an array as an argument. The function should return a - // new array where each element only appears once. - let removeDupes = function ( array ) { - let uniques = []; - for ( let i = 0; i < array.length; { - let ele = array[ i ]; - if ( !uniques.includes( ele ) ) { - uniques.push( ele ); - } - } - return uniques; - }; - console.log( removeDupes( [ "x", "y", "y", "x", "z" ] ) ); // ['x', 'y', 'z'] - console.log( removeDupes( [ false, false, true, false ] ) ); // [false, true] - console.log( removeDupes( [ 42, 5, 7, 42, 7, 3, 7, 7 ] ) ); // [42, 5, 7, 3] - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `removeFirstVowel` that accepts a string as an argument. The function should return - // the string with it's first vowel removed. - let removeFirstVowel = function ( str ) { - let vowels = 'aeiou'; - for ( let i = 0; i < str.length; { - let char = str[ i ]; - if ( vowels.includes( char ) ) { - return str.slice( 0, i ) + str.slice( i + 1 ); - } - } - return str; - }; - console.log( removeFirstVowel( "volcano" ) ); // 'vlcano' - console.log( removeFirstVowel( "celery" ) ); // 'clery' - console.log( removeFirstVowel( "juice" ) ); // 'jice' - console.log( removeFirstVowel( "bridge" ) ); // 'brdge' - console.log( removeFirstVowel( "try" ) ); // 'try' - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `removeShortWords` that accepts a sentence string as an argument. The function - // should return a new sentence where all of the words shorter than 4 characters are removed. - let removeShortWords = function ( sentence ) { - let words = sentence.split( ' ' ); - let chosenWords = []; - for ( let i = 0; i < words.length; { - let word = words[ i ]; - if ( word.length >= 4 ) { - chosenWords.push( word ); - } - } - return chosenWords.join( ' ' ); - }; - console.log( removeShortWords( "knock on the door will you" ) ); // 'knock door will' - console.log( removeShortWords( "a terrible plan" ) ); // 'terrible plan' - console.log( removeShortWords( "run faster that way" ) ); // 'faster that' - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `removeVowels` that accepts a string as an argument. The function should return - // a version of the string where all vowels are removed. - let removeVowels = function ( str ) { - let newStr = ''; - let vowels = 'aeiou'; - for ( let i = 0; i < str.length; { - let char = str[ i ]; - if ( !vowels.includes( char ) ) { - newStr += char; - } - } - return newStr; - }; - console.log( removeVowels( "jello" ) ); // jll - console.log( removeVowels( "sensitivity" ) ); // snstvty - console.log( removeVowels( "cellar door" ) ); // cllr dr - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `reverseArray` that accepts an array as an argument. The function should return a - // array containing the elements of the original array in reverse order. - let reverseArray1 = function ( array ) { - let reversed = []; - for ( let i = array.length - 1; i >= 0; i-- ) { - reversed.push( array[ i ] ); - } - return reversed; - }; - console.log( reverseArray1( [ "zero", "one", "two", "three" ] ) ); // ['three', 'two', 'one', 'zero'] - console.log( reverseArray1( [ 7, 1, 8 ] ) ); // [8, 1, 7] - let reverseArray2 = function ( array ) { - let reversed = []; - for ( let i = 0; i < array.length; { - reversed.unshift( array[ i ] ); - } - return reversed; - }; - console.log( reverseArray2( [ "zero", "one", "two", "three" ] ) ); // ['three', 'two', 'one', 'zero'] - console.log( reverseArray2( [ 7, 1, 8 ] ) ); // [8, 1, 7] - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `reverseIterate` that accepts a string as an argument. The function should print - // the characters of the string one by one, in reverse order. The function doesn't need to return any - // value. It should just print to the terminal. - let reverseIterate = function ( str ) { - for ( let i = str.length - 1; i >= 0; i-- ) { - console.log( str[ i ] ); - } - }; - reverseIterate( "carrot" ); - // prints - // t - // o - // r - // r - // a - // c - reverseIterate( "box" ); - // prints - // x - // o - // b - - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `shortenLongWords` that accepts a sentence string as an argument. The function - // should return the same sentence where words longer than 4 characters have their vowels removed. - let removeVowels = function ( str ) { - let newStr = ''; - let vowels = 'aeiou'; - for ( let i = 0; i < str.length; { - let char = str[ i ]; - if ( !vowels.includes( char ) ) { - newStr += char; - } - } - return newStr; - }; - let shortenLongWords = function ( sentence ) { - let words = sentence.split( ' ' ); - let newWords = []; - for ( let i = 0; i < words.length; { - let word = words[ i ]; - if ( word.length > 4 ) { - let noVowels = removeVowels( word ); - newWords.push( noVowels ); - } else { - // leave it the same - newWords.push( word ); - } - } - return newWords.join( ' ' ); - }; - console.log( shortenLongWords( "they are very noble people" ) ); // 'they are very nbl ppl' - console.log( shortenLongWords( "stick with it" ) ); // 'stck with it' - console.log( shortenLongWords( "ballerina, you must have seen her" ) ); // 'bllrna, you must have seen her - console.log( "promenade" [ 3 ] ); // m - console.log( "tiger" [ 1 ] ); // i - console.log( "wheel".length ); // 5 - console.log( "wheel".length - 1 ); // 4 - console.log( "noMAD".toUpperCase() ); // NOMAD - console.log( "hey programmers" [ 2 ] === "y" ); // true - console.log( "volleyball".length > 20 ); // false - console.log( "treasure".indexOf( "r" ) ); // 1 - console.log( "treasure".indexOf( "e" ) ); // 2 - console.log( "web" [ 5 ] ); // undefined - console.log( "red".indexOf( "x" ) ); // -1 - console.log( "red".indexOf( "R" ) ); // -1 - // snippet 0-1 - let greet = function () { - console.log( "hey" ); - console.log( "programmers" ); - }; - let whistle = function () { - console.log( "doot" ); - }; - console.log( "first" ); - console.log( "second" ); - greet(); - console.log( "third" ); - console.log( "fourth" ); - whistle(); - // first - // second - // hey - // programmers - // third - // fourth - // doot - // snippet 0-2 - let howMany = function () { - return 42; - }; - console.log( howMany ); - console.log( howMany() ); - const theAnswer = howMany(); - console.log( theAnswer ); - let howMuch = function () { - 5; - }; - console.log( howMuch() ); - // [Function: howMany] - // 42 - // 42 - // undefined - // snippet 0-3 - let average = function ( num1, num2 ) { - console.log( "calculating..." ); - return ( num1 + num2 ) / 2; - }; - console.log( average( 5, 10 ) ); - console.log( average( 20, 26 ) ); - console.log( average( 50, 100 ) + 2 ); - let a = 21 + 3; - let b = 20; - let n = average( a, b ); - console.log( average( n, 18 ) ); - // calculating... - // 7.5 - // calculating... - // 23 - // calculating... - // 77 - // calculating... - // calculating... - // 20 - // snippet 0-4 - let exclaim = function ( str ) { - let capitalized = str.toUpperCase(); - return capitalized + "!!"; - }; - let result = exclaim( "potato" ); - console.log( result ); - console.log( result.length ); - console.log( result[ 0 ] ); - console.log( result[ result.length - 1 ] ); - // POTATO!! - // 8 - // P - // ! - // snippet 1 - console.log( "hello" ); - for ( let i = 0; i < 5; i++ ) { - console.log( "code" ); - } - console.log( "goodbye" ); - hello - code - code - code - code - code - goodbye - // snippet 1 - for ( let i = 1; i <= 4; i++ ) { - for ( let j = 1; j <= 3; j++ ) { - console.log( i, j ); - } - } - // 1 1 - // 1 2 - // 1 3 - // 2 1 - // 2 2 - // 2 3 - // 3 1 - // 3 2 - // 3 3 - // 4 1 - // 4 2 - // 4 3 - // snippet 2 - console.log( "hi" ); - for ( let i = 3; i <= 7; i++ ) { - console.log( "program" ); - console.log( i ); - } - console.log( "bye" ); - // hi - // program - // 3 - // program - // 4 - // program - // 5 - // program - // 6 - // program - // 7 - // bye - // snippet 2 - for ( let n = 0; n < 2; n++ ) { - console.log( "n=" + n ); - for ( let m = 0; m < 5; m++ ) { - console.log( " m=" + m ); - } - console.log( "n=" + n ); - } - // n=0 - // m=0 - // m=1 - // m=2 - // m=3 - // m=4 - // n=0 - // n=1 - // m=0 - // m=1 - // m=2 - // m=3 - // m=4 - // n=1 - // snippet 3 - let foo = function () { - for ( let num = 10; num > 0; num -= 2 ) { - console.log( num ); - } - }; - console.log( "begin" ); - foo(); - console.log( "end" ); - foo(); - // begin - // 10 - // 8 - // 6 - // 4 - // 2 - // end - // 10 - // 8 - // 6 - // 4 - // 2 - // snippet 3 - let friends = [ "philip", "abby", "phelipe", "simcha" ]; - for ( let i = 0; i < friends.length; { - for ( let j = 0; j < friends.length; { - console.log( friends[ i ], friends[ j ] ); - } - } - // philip philip - // philip abby - // philip phelipe - // philip simcha - // abby philip - // abby abby - // abby phelipe - // abby simcha - // phelipe philip - // phelipe abby - // phelipe phelipe - // phelipe simcha - // simcha philip - // simcha abby - // simcha phelipe - // simcha simcha - // snippet 4 - let word = "street"; - for ( let i = 0; i < word.length; { - console.log( i ); - console.log( word[ i ] ); - } - // 0 - // s - // 1 - // t - // 2 - // r - // 3 - // e - // 4 - // e - // 5 - // t - // snippet 4 - let locations = [ "flatbush", "williamsburg", "bushwick", "greenpoint" ]; - for ( let i = 0; i < locations.length; { - for ( let j = i + 1; j < locations.length; { - console.log( locations[ i ], locations[ j ] ); - } - } - // flatbush williamsburg - // flatbush bushwick - // flatbush greenpoint - // williamsburg bushwick - // williamsburg greenpoint - // bushwick greenpoint - // snippet 5 - let total = 0; // 10 - for ( let i = 1; i < 5; i++ ) { - total += i; - console.log( total ); - } - console.log( "grand total: " + total ); - // 1 - // 3 - // 6 - // 10 - // grand total: 10 - // snippet 5 - let colors = [ "red", "purple", "orange" ]; - for ( let i = 0; i < colors.length; { - let colorStr = colors[ i ]; - console.log( colorStr ); - for ( let j = 0; j < colorStr.length; { - let char = colorStr[ j ]; - console.log( char ); - } - } - // red - // r - // e - // d - // purple - // p - // u - // r - // p - // l - // e - // orange - // o - // r - // a - // n - // g - // e - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `spam` that accepts a 2D array as an argument. The array contains pairs as elements. - // The first element of every pair is a number and the second element is a word. The function should - // return a string containing the words repeated the specified number of times. See the examples. - let spam = function ( pairs ) { - let words = []; - for ( let i = 0; i < pairs.length; { - let pair = pairs[ i ]; - let word = pair[ 0 ]; - let num = pair[ 1 ]; - for ( let j = 0; j < num; { - words.push( word ); - } - } - return words.join( ' ' ); - }; - let array1 = [ - [ "hi", 3 ], - [ "bye", 2 ], - ]; console.log( spam( array1 ) ); // 'hi hi hi bye bye' - let array2 = [ - [ "cat", 1 ], - [ "dog", 2 ], - [ "bird", 4 ], - ]; console.log( spam( array2 ) ); // 'cat dog dog bird bird bird bird' - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `startsWithR` that accepts a string as an argument and returns a boolean indicating - // whether or not the string starts with 'r' or 'R'. - let startsWithR = function ( str ) { - return str[ 0 ] === 'r' || str[ 0 ] === 'R'; - }; console.log( startsWithR( "roger that" ) ); // true - console.log( startsWithR( "Row, row, row your boat" ) ); // true - console.log( startsWithR( "slip" ) ); // false - console.log( startsWithR( "Taxicab" ) ); // false - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `stayPositive` that accepts an array of numbers as an argument. The function should - // return an array containing only the positive numbers. - let stayPositive = function ( numbers ) { - let positives = []; - for ( let i = 0; i < numbers.length; { - if ( numbers[ i ] > 0 ) { - positives.push( numbers[ i ] ); - } - } - return positives; - }; - console.log( stayPositive( [ 10, -4, 3, 6 ] ) ); // [10, 3, 6] - console.log( stayPositive( [ -5, 11, -40, 30.3, -2 ] ) ); // [11, 30.3] - console.log( stayPositive( [ -11, -30 ] ) ); // [] - console.log( "river" + "town" ); - console.log( "cat" + "dog" ); - console.log( "New" + " York" ); - console.log( "runner's knee" + "!" ); - console.log( "man" + "bear" + "pig" ); - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `stringIterate` that accepts a string as an argument. The function should print out - // each character of the string, one by one. The function doesn't need to return any value. It should - // just print to the terminal. - let stringIterate = function ( string ) { - for ( let i = 0; i < string.length; { - console.log( string[ i ] ); - } - }; - stringIterate( "celery" ); - // prints - // c - // e - // l - // e - // r - // y - stringIterate( "hat" ); - // prints - // h - // a - // t - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function named `stringRepeater(str, num)` that accepts a string and a number as arguments. - // The function should return a new string consisting of the `str` repeated `num` number of times. - let stringRepeater = function ( str, num ) { - let repeatedStr = ''; - for ( let i = 1; i <= num; i++ ) { - repeatedStr += str - } - return repeatedStr; - }; - console.log( stringRepeater( "q", 4 ) ); // 'qqqq' - console.log( stringRepeater( "go", 2 ) ); // 'gogo' - console.log( stringRepeater( "tac", 3 ) ); // 'tactactac' - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `stringSize` that accepts a string as an argument. The function should return the - // string 'small' if the argument is shorter than 5 characters, 'medium' if it is exactly 5 characters, and - // 'large' if it is longer than 5 characters. - let stringSize = function ( str ) { - if ( str.length < 5 ) { - return 'small'; - } else if ( str.length > 5 ) { - return 'large'; - } else { - return 'medium'; - } - }; - console.log( stringSize( "cat" ) ); // 'small' - console.log( stringSize( "bell" ) ); // 'small' - console.log( stringSize( "ready" ) ); // 'medium' - console.log( stringSize( "shirt" ) ); // 'medium' - console.log( stringSize( "shallow" ) ); // 'large' - console.log( stringSize( "intelligence" ) ); // 'large' - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `stringsToLengths` that accepts an array of strings as an argument. The function - // should return a new array containing the lengths of the elements of the original array. - let stringsToLengths = function ( words ) { - let lengths = []; - for ( let i = 0; i < words.length; { - lengths.push( words[ i ].length ); - } - return lengths; - }; - console.log( stringsToLengths( [ "belly", "echo", "irony", "pickled" ] ) ); - // [5, 4, 5, 7] - console.log( stringsToLengths( [ "on", "off", "handmade" ] ) ); - // [2, 3, 8] - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function named `sumUpTo(max)` that accepts a max number as an argument. The function should - // return the total sum of all whole numbers from 1 to the max, inclusive. - // - // For example, sumUpTo(4) should return 10 because 1 + 2 + 3 + 4 = 10. - let sumUpTo = function ( max ) { - let sum = 0; - for ( let i = 1; i <= max; i++ ) { - sum += i - } - return sum; - }; - console.log( sumUpTo( 4 ) ); // 10 - console.log( sumUpTo( 5 ) ); // 15 - console.log( sumUpTo( 2 ) ); // 3 - console.log( 'coffee' ); - let qty = 15 % 4; - console.log( qty ); // 3 - let num = 38 + 3; - num++; - console.log( num + " is a great number" ); // '42 is a great number' - let isNumEven = num % 2 === 0; - console.log( num + " is even? " + isNumEven ); // '42 is even? true' - let isQtyEven = qty % 2 === 0; - console.log( qty + " is even? " + isQtyEven ); // '3 is even? false' - glet longStr = "AIICXAIBAAKBgQCuw0YyucjI9bf7yRhIkyg4Ru6kYU7O6fIn2JoFDzCZNkzDdsuXFGh6BXNvbu8uZUT289ERzYP1QjryMEKWzcbtsioyQApL7AgOZyFc3JJ7wvupHhIj2sqxJNtpAh7HQFG08rYh2Pb3HwOm83rbTomM6LnnjooGcoDeuWkuPqXsRlwIDAQABAoGAeQkbPBR5n9y2QLaEjcDGv7dVpFiMGHMaZZVDX34rZPy1EkZNZqlQU0jopLVvLyLESMh9A7gKhqoyMAbgZPpdb0CvniTJPpKYk24mLBeym8rBMW3XBmKk1xIOcJPGXMxeJW61jxPg6doah0aCIjf8n0Z8t8B81kLFojpECQQDzlCp0Nzka3AVZVPdBuuPg0fzeV8ugpiPEp6wQLjIMDFqYtGoAOEy4JpkmkK7zwsQsHZ8jbOtqIFdRLPrvAkEAruU321Ie1CnYCHX4Q79vLcDeWOUpdzEHp2uzDIfzP1gv7RIktGgSZWKhrnNWdeH4Y0CFb9lu6TQYJwNJvug2QJBANX0m3Uds9P9pLbQlI9WWmAtYqIZrsBElcAjOgAik0uOfawholNiw5B3ADvIYqPkLW4dGk1dO6zxW8ZF83MdMCQHGfhxLuFgsOBSfF7Bj4UX6T9FGhUGSXiqUsd06E2mMRLAjWUUUw82DLwucxMrSsV4z1aN57asC8YuQ9FkCQGirlVCt4ccXeGLCHcCsI8AYQJFRzbMs381M16jEpnaKUGrtdbMW018gWJ0EoD4tS2YZpr1hEbtiOkPJaaTKQ"; - if ( longStr.indexOf( 'coDe' ) > -1 ) { - console.log( 'FOUND' ); - } else { - console.log( 'NOT FOUND' ); - } - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `totalProduct(array)` that accepts a 2D array of numbers. The function should return - // the total product of all numbers in the array. - let totalProduct = function ( array ) { - let product = 1; - for ( let i = 0; i < array.length; { - let subarray = array[ i ]; - for ( let j = 0; j < subarray.length; { - product *= subarray[ j ]; - } - } - return product; - }; - let array1 = [ - [ 3, 5, 2 ], - [ 6, 2 ], - ]; console.log( totalProduct( array1 ) ); // 360 - let array2 = [ - [ 4, 6 ], - [ 2, 3 ], - [ 1, 2 ], - ]; console.log( totalProduct( array2 ) ); // 288 - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `total` that accepts an array of numbers as an argument. The function should return - // the total sum of all elements of the array. - let total = function ( numbers ) { - let sum = 0; - for ( let i = 0; i < numbers.length; { - sum += numbers[ i ]; - } - return sum; - }; - console.log( total( [ 3, 2, 8 ] ) ); // 13 - console.log( total( [ -5, 7, 4, 6 ] ) ); // 12 - console.log( total( [ 7 ] ) ); // 7 - console.log( total( [] ) ); // 0 - let apple; - console.log( apple ); // undefined - apple = 5; - console.log( apple ); // 5 - apple + 1; - console.log( apple ); // 5 - apple += 1; - console.log( apple ); // 6 - let banana = apple; - console.log( banana ); // 6 - banana = banana / 2; - console.log( banana ); // 3 - console.log( apple ); // 6 - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `twoSumPairs(numbers, target)` that accepts an array of numbers and a target number - // as arguments. The function should return a 2D array containing all unique pairs of elements that - // sum to the target. - let twoSumPairs = function ( numbers, target ) { - let pairs = []; - for ( let i = 0; i < numbers.length; { - let num1 = numbers[ i ]; - for ( let j = i + 1; j < numbers.length; { - let num2 = numbers[ j ]; - if ( num1 + num2 === target ) { - let pair = [ num1, num2 ]; - pairs.push( pair ); - } - } - } - return pairs; - }; console.log( twoSumPairs( [ 2, 3, 4, 6, 5 ], 8 ) ); // [ [2, 6], [3, 5] ] - console.log( twoSumPairs( [ 10, 7, 4, 5, 2 ], 12 ) ); // [ [10, 2], [7, 5] ] - console.log( twoSumPairs( [ 3, 9, 8 ], 11 ) ); // [ [3, 8] ] - console.log( twoSumPairs( [ 3, 9, 8 ], 10 ) ); // [ ] - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `twoSum(numbers, target)` that accepts an array of numbers and a target number - // as an argument. The function should return a boolean indicating whether or not there exists a pair - // of distinct elements in the array that sum to the target. - let twoSum = function ( numbers, target ) { - for ( let i = 0; i < numbers.length; { - for ( let j = i + 1; j < numbers.length; { - if ( numbers[ i ] + numbers[ j ] === target ) { - return true; - } - } - } - return false; - }; console.log( twoSum( [ 2, 3, 5, 9 ], 7 ) ); // true - console.log( twoSum( [ 2, 3, 5, 9 ], 4 ) ); // false - console.log( twoSum( [ 6, 3, 4 ], 10 ) ); // true - console.log( twoSum( [ 6, 5, 1 ], 10 ) ); // false - // snippet 2-1 - let nonsense = "blog trust fund tattooed williamsburg poke roof party"; - let hasOk = nonsense.indexOf( "ok" ) > -1; - if ( hasOk ) { - console.log( "yeet" ); // prints - } else if ( nonsense.length > 10 ) { - console.log( "yo" ); - } else { - console.log( "no" ); - } - let hasZoo = nonsense.indexOf( "zoo" ) > -1; - let hasFun = nonsense.indexOf( "fun" ) > -1; - if ( hasZoo && hasOk ) { - console.log( "cool" ); - } else if ( hasOk ) { - console.log( "rad" ); // prints - } else if ( hasFun ) { - console.log( "dope" ); - } else { - console.log( "nope" ); - } - // snippet 2-2 - let q = 25; - if ( q % 3 === 0 && q % 5 === 0 ) { - console.log( "both" ); - } else if ( q % 3 === 0 || q % 5 == 0 ) { - console.log( "either" ); // prints - } else { - console.log( "neither" ); - } - let r = 9; - if ( r % 3 === 0 && r % 5 === 0 ) { - console.log( "both" ); - } else if ( r % 3 === 0 || r % 5 == 0 ) { - console.log( "either" ); // prints - } else { - console.log( "neither" ); - } - let s = 15; - if ( s % 3 === 0 && s % 5 === 0 ) { - console.log( "both" ); // prints - } else if ( s % 3 === 0 || s % 5 == 0 ) { - console.log( "either" ); - } else { - console.log( "neither" ); - } - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `wackyWord` that accepts two strings as arguments. The function should return a new - // string containing the first three characters of the first string concatenated with the last two - // character of the second string. - // You can assume that the first argument has a length of at least three and the second argument has a - // length of at least two. - let wackyWord = function ( str1, str2 ) { - return str1.slice( 0, 3 ) + str2.slice( -2 ); - }; console.log( wackyWord( "very", "kindly" ) ); // 'verly' - console.log( wackyWord( "forever", "sick" ) ); // 'forck' - console.log( wackyWord( "cellar", "door" ) ); // 'celor' - console.log( wackyWord( "bagel", "sweep" ) ); // 'bagep' - console.log( 'alvin' ); console.log( 'z' ); - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `wordCount(sentence, targetWords)` that accepts a sentence string and an array of - // `targetWords`. The function should return a count of the number of words of the sentence that are - // in `targetWords`. - let wordCount = function ( sentence, targetWords ) { - let words = sentence.split( ' ' ); - let count = 0; - for ( let i = 0; i < words.length; { - let word = words[ i ]; - if ( targetWords.includes( word ) ) { - count++; - } - } - return count; - }; - console.log( wordCount( "open the window please", [ "please", "open", "sorry" ] ) ); // 2 - console.log( wordCount( "drive to the cinema", [ "the", "driver" ] ) ); // 1 - console.log( wordCount( "can I have that can", [ "can", "I" ] ) ); // 3 - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `yourAverageFunction` that accepts an array of numbers as an argument. The - // function should return the average of all elements of the array. If the input array is empty, - // then the function should return null. - let yourAverageFunction = function ( nums ) { - if ( nums.length === 0 ) { - return null; - } - let sum = 0; - for ( let i = 0; i < nums.length; { - sum += nums[ i ]; - } - return sum / nums.length; - }; - console.log( yourAverageFunction( [ 5, 2, 7, 24 ] ) ); // 9.5 - console.log( yourAverageFunction( [ 100, 6 ] ) ); // 53 - console.log( yourAverageFunction( [ 31, 32, 40, 12, 33 ] ) ); // 29.6 - console.log( yourAverageFunction( [] ) ); // null - let location = "Brooklyn, " + "NY"; - console.log( location ); // 'Brooklyn, NY' - let quantity = 4 * 5 + 1; - console.log( quantity ); // 21 - g it // snippet 0-1 - if ( true ) { - console.log( "foo" ); // prints - } - if ( false ) { - console.log( "bar" ); - } - // snippet 0-2 - if ( false || false ) { - console.log( "boop" ); - } - if ( true || false ) { - console.log( "beep" ); // prints - } - // snippet 0-3 - let num = 40; - if ( num > 0 ) { - console.log( "zip" ); // prints - } - if ( num % 2 === 0 ) { - console.log( "zoop" ); // prints - } - // snippet 0-4 - let word = "jeep"; - if ( word[ 0 ] === "d" ) { - console.log( "yer" ); - } else { - console.log( "nah" ); // prints - } - // snippet 0-5 - let sentence = "roger that"; - if ( sentence[ sentence.length - 1 ] === "t" ) { - console.log( "ends in t" ); // prints - } else { - console.log( "does not end in t" ); - } - if ( sentence.length <= 4 ) { - console.log( "short" ); - } else { - console.log( "long" ); // prints - } - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `zipper` that accepts two arrays as arguments. The function should return a 2D - // array containing pairs of elements at the same indices. - let zipper = function ( arr1, arr2 ) { - let result = []; - for ( let i = 0; i < arr1.length; { - let el1 = arr1[ i ]; - let el2 = arr2[ i ]; - let pair = [ el1, el2 ]; - result.push( pair ); - } - return result; - }; - let array1 = [ "a", "b", "c", "d" ]; - let array2 = [ -1, -2, -3, -4 ]; - console.log( zipper( array1, array2 ) ); - // [ - // ['a', -1], - // ['b', -2], - // ['c', -3], - // ['d', -4], - // ] - let array3 = [ "whisper", "talk", "shout" ]; - let array4 = [ "quiet", "normal", "loud" ]; - console.log( zipper( array3, array4 ) ); - // [ - // ['whisper', 'quiet'], - // ['talk', 'normal'], - // ['shout', 'loud'], - // ] -let str = 'MIICWwIBAAKBgGEdLjFEFbegPZ2AwJWkalksXr7PzWL7wIc7pOFZxXwYPWtQxvANyceCwpkqbPLsfEx7nqxAris2hYOdeN1OTFqvTyNmVuzbUPcXShn6ZoDCB30voHkeu4F3cUw5RQEUDdLscSnv4HMxHam5qgl6vXoumVNHbjyKA5UtAnfjAgMBAAECgYAmjEyvpZTxRJvwjxDi1VaZevFI0Hd4WPH9PAGgqdnH84vGXnAGFj1WikqKYcqKMQW2kdjAsWwH9D9FfrkIcDDHdZ9XuGSGkFzWtOwajWMQl7qNV1hZ288gdpIQQMOTLDgauZY6pw1cV7h4v316qJB8knQGoBNpJCfTYQJBAKV1ctsJq0Zg4QumD2hyODepP3LfLeaQsERLqVAWeuOuTY5mK5gIwsSqvcSVfY7Ze1FWIsApNFRv67azKcJPwsCQQCNlyApZFJEVNY70Er7Uu5NL9t4CYJJC9uVVkoEHEY6d7sVslqa0vP2q0zXx9YedbMBvQjxXIbY0waXUy63FvoBGJAkB3OTJWUjVgzDY1Br5wu2Yu59NjKVKLWzCsu1gaCNBfhVDX7SyIyC9EYKRfUAoQxwsmPWPyQ9QVG4WKcPZJAkBRheAotPCBE2RLHHfvpiStnMhX0UXdVyaJp5tcZ6wYV61ohyBvCOkYhUxBJzeIGrVZcvLZSLeUzXoqRPpxQxAkEAkdCZXF0gHahpZgF5y0wWcqf9ECRT1E4Hv8bk3Mf0Exp2aW34JeI6I7Xqd1NV4I9H7prQ8m3y39lFwWO8PmQ'; - -console.log( str.indexOf( 'HEY' ) ); -console.log( 0 ); -// Write a function `alternatingCaps` that accepts a sentence string as an argument. The function should -// return the sentence where words alternate between lowercase and uppercase. - -let alternatingCaps = function ( sentence ) { - let words = sentence.split( ' ' ); - let newWords = []; - - for ( let i = 0; i < words.length; i++ ) { - let word = words[ i ]; - if ( i % 2 === 0 ) { - newWords.push( word.toLowerCase() ); - } else { - newWords.push( word.toUpperCase() ); - } - } - - return newWords.join( ' ' ); -}; - -console.log( alternatingCaps( "take them to school" ) ); // 'take THEM to SCHOOL' -console.log( alternatingCaps( "What did ThEy EAT before?" ) ); // 'what DID they EAT before?' -//APPEND-DIR.js -const fs = require( 'fs' ); -let cat = require( 'child_process' ).execSync( 'cat *' ).toString( 'UTF-8' ); - -fs.writeFile( 'output.md', cat, ( err ) => { - if ( err ) throw err; -} ); -git // Write a function `averageOfFour(num1, num2, num3, num4)` that accepts four numbers as arguments. The -// function should return the average of all four numbers. - -let averageOfFour = function ( num1, num2, num3, num4 ) { - let sum = num1 + num2 + num3 + num4; - return sum / 4; -}; - -console.log( averageOfFour( 10, 4, 12, 3 ) ); // 7.25 -console.log( averageOfFour( -20, 50, 4, 21 ) ); // 13.75 -console.log( averageOfFour( 10, 4, 12, 3 ) ); // 7.25 -console.log( averageOfFour( 5, 5, 3, 7 ) ); // 5 -// Write a function `average` that accepts three numbers as arguments. The function should return the -// average of the three numbers. - -let average = function ( num1, num2, num3 ) { - return ( num1 + num2 + num3 ) / 3; -}; - -console.log( average( 3, 10, 8 ) ); // 7 -console.log( average( 10, 5, 12 ) ); // 9 -console.log( average( 6, 20, 40 ) ); // 22 -// Write a function `bleepVowels` that accepts a string as an argument. The function should return -// a new string where all vowels are replaced with `*`s. Vowels are the letters a, e, i, o, u. - -let bleepVowels = function ( str ) { - let vowels = [ "a", "e", "i", "o", "u" ]; - let bleeped = ""; - - for ( let i = 0; i < str.length; i++ ) { - let char = str[ i ]; - - if ( vowels.indexOf( char ) > -1 ) { - bleeped += "*"; - } else { - bleeped += char; - } - } - - return bleeped; -}; - -console.log( bleepVowels( "skateboard" ) ); // 'sk*t*b**rd' -console.log( bleepVowels( "slipper" ) ); // 'sl*pp*r' -console.log( bleepVowels( "range" ) ); // 'r*ng*' -console.log( bleepVowels( "brisk morning" ) ); // 'br*sk m*rn*ng' -console.log( false ); // false -console.log( !true ); // false -console.log( !false ); // true -console.log( !!true ); // true - -console.log( false && false ); // false -console.log( false && true ); // false -console.log( true && false ); // false -console.log( true && true ); // true - -console.log( false || false ); // false -console.log( false || true ); // true -console.log( true || false ); // true -console.log( true || true ); // true - -console.log( !false || false ); // true -console.log( false || ( true && true ) ); // true -console.log( false || !( true && true ) ); // false -console.log( !true && ( true ) ); // false -// Write a function `caseChange` that accepts a string and a boolean as arguments. The function should -// return the uppercase version of the string if the boolean is true. The function should return the -// lowercase version of the string if the boolean is false. - -let caseChange = function ( str, shouldUpperCase ) { - if ( shouldUpperCase ) { - return str.toUpperCase(); - } else { - return str.toLowerCase(); - } -}; - -console.log( caseChange( "Super", true ) ); // 'SUPER' -console.log( caseChange( "Super", false ) ); // 'super' -console.log( caseChange( "tAmBourine", true ) ); // 'TAMBOURINE' -console.log( caseChange( "tAmBourine", false ) ); // 'tambourine' -// Write a function `censorE` that accepts a string as an argument. The function should return the a new -// version of string where all characters that are 'e's are replaced with '*'s. - -let censorE = function ( str ) { - let newStr = ''; - - for ( let i = 0; i < str.length; i++ ) { - let char = str[ i ]; - - if ( char === 'e' ) { - newStr += '*'; - } else { - newStr += char; - } - } - - return newStr; -}; - -console.log( censorE( "speedy" ) ); // 'sp**dy' -console.log( censorE( "pending" ) ); // 'p*nding' -console.log( censorE( "scene" ) ); // 'sc*n*' -console.log( censorE( "heat" ) ); // 'h*at' -// Write a function `chooseDivisibles(numbers, target)` that accepts an array of numbers and a -// target number as arguments. The function should return an array containing elements of the original -// array that are divisible by the target. - -let chooseDivisibles = function ( numbers, target ) { - let divisibles = []; - - for ( let i = 0; i < numbers.length; i++ ) { - let num = numbers[ i ]; - - if ( num % target === 0 ) { - divisibles.push( num ); - } - } - - return divisibles; -}; - -console.log( chooseDivisibles( [ 40, 7, 22, 20, 24 ], 4 ) ); // [40, 20, 24] -console.log( chooseDivisibles( [ 9, 33, 8, 17 ], 3 ) ); // [9, 33] -console.log( chooseDivisibles( [ 4, 25, 1000 ], 10 ) ); // [1000] -// Write a function `commonElements` that accepts two arrays as arguments. The function should return -// a new array containing the elements that are found in both of the input arrays. The order of -// the elements in the output array doesn't matter as long as the function returns the correct elements. - -let commonElements = function ( array1, array2 ) { - let common = []; - - for ( let i = 0; i < array1.length; i++ ) { - let ele = array1[ i ]; - - if ( array2.includes( ele ) ) { - common.push( ele ); - } - } - - return common; -}; - -let arr1 = [ "a", "c", "d", "b" ]; -let arr2 = [ "b", "a", "y" ]; -console.log( commonElements( arr1, arr2 ) ); // ['a', 'b'] - -let arr3 = [ 4, 7 ]; -let arr4 = [ 32, 7, 1, 4 ]; -console.log( commonElements( arr3, arr4 ) ); // [4, 7] -console.log( true === false ); // false -console.log( false === false ); // true -console.log( false !== true ); // true -console.log( !true === false ); // true - -console.log( 2 + 3 === 5 ); // true -console.log( 4 < 0 ); // false -console.log( 10 >= 10 ); // true -console.log( 10.3 >= 10 ); // true - -console.log( 100 / 2 === 50 ); // true -console.log( 100 % 2 === 0 ); // true -console.log( 11 % 2 === 0 ); // false -console.log( 7.0 === 7 ); // true - -console.log( 13 % 5 > 0 ); // true -console.log( "potato" === "potato" ); // true -console.log( "Tomato" === "tomato" ); // false -console.log( "42" === 42 ); // false -console.log( 5 > 3 && 1 === 0 ); // false -t // Write a function `contains(str1, str2)` that accepts two strings as arguments. The function should -// return a boolean indicating whether or not `str2` is contained within `str1`. The function should -// ignore any differences in capitalization. - -let contains = function ( str1, str2 ) { - let lowerStr1 = str1.toLowerCase(); - let lowerStr2 = str2.toLowerCase(); - return lowerStr1.indexOf( lowerStr2 ) > -1; -}; - -console.log( contains( "caterpillar", "pill" ) ); // true -console.log( contains( "lion's share", "on" ) ); // true -console.log( contains( "SORRY", "or" ) ); // true -console.log( contains( "tangent", "gem" ) ); // false -console.log( contains( "clock", "ok" ) ); // false -// Write a function `countUp(max)` that accepts a max number as an argument. The function should print -// all numbers from 1 up to and including the max. The function doesn't need to return any value. It -// should just print to the terminal. - -let countUp = function ( max ) { - for ( let i = 1; i <= max; i++ ) { - console.log( i ); - } -}; - -countUp( 5 ); -// prints -// 1 -// 2 -// 3 -// 4 -// 5 - -countUp( 3 ); -// prints -// 1 -// 2 -// 3 -let phrase = "that's all folks"; -console.log( phrase[ phrase.length ] ); // undefined -console.log( phrase[ phrase.length - 1 ] ); // s -console.log( phrase[ phrase.length - 2 ] ); // k - -const i = 9; -const char = phrase[ i ]; -console.log( char ); // l -console.log( phrase.indexOf( char ) ); // 8 -console.log( phrase.slice( 2, 8 ) ); // at's a - -console.log( "abcdefg".slice( 1, 3 ) ); // bc -console.log( "abcdefg".slice( 2 ) ); // cdefg -console.log( "abcdefg".slice( 4 ) ); // efg - - -console.log( "abcdefg".slice( 2, -1 ) ); // cdef -console.log( "abcdefg".slice( 2, -2 ) ); // cde -// Write a function named `divByEither(num1, num2, max)` that accepts three numbers as arguments. -// The function should print out all positive numbers less than max that are divisible by num1 or num2. -// The function doesn't need to return any value. It should just print to the terminal. - -let divByEither = function ( num1, num2, max ) { - for ( let i = 1; i < max; i++ ) { - if ( i % num1 === 0 || i % num2 === 0 ) { - console.log( i ); - } - } -}; - -divByEither( 4, 3, 16 ); -// prints -// 3 -// 4 -// 6 -// 8 -// 9 -// 12 -// 15 - -divByEither( 7, 5, 20 ); -// prints -// 5 -// 7 -// 10 -// 14 -// 15 -// Write a function `divisibleRange(min, max, num)` that accepts three numbers as arguments. The -// function should print all numbers between `min` and `max` (exclusive) that are also divisible by -// num. - -let divisibleRange = function ( min, max, num ) { - for ( let i = min + 1; i < max; i++ ) { - if ( i % num === 0 ) { - console.log( i ); - } - } -}; - -divisibleRange( 17, 40, 9 ); -// prints -// 18 -// 27 -// 36 - -divisibleRange( 10, 24, 4 ); -// prints -// 12 -// 16 -// 20 -// Write a function `divisible(num1, num2)` that accepts two numbers as arguments. The function should -// return a boolean indicating whether or not `num1` is divisible by `num2`. - -let divisible = function ( num1, num2 ) { - return num1 % num2 === 0; -}; - -// let divisible = function (num1, num2) { -// if (num1 % num2 === 0) { -// return true; -// } else { -// return false; -// } -// }; - -console.log( divisible( 12, 3 ) ); // true -console.log( divisible( 12, 5 ) ); // false -console.log( divisible( 60, 4 ) ); // true -console.log( divisible( 60, 11 ) ); // false -console.log( divisible( 21, 7 ) ); // true -console.log( divisible( 21, 6 ) ); // false -// Write a function `divisors` that accepts a number as an argument. The function should return an -// array containing all positive numbers that can divide into the argument. - -let divisors = function ( n ) { - let numbers = []; - - for ( let i = 1; i <= n; i++ ) { - if ( n % i === 0 ) { - numbers.push( i ); - } - } - - return numbers; -}; - -console.log( divisors( 15 ) ); // [1, 3, 5, 15] -console.log( divisors( 7 ) ); // [1, 7] -console.log( divisors( 24 ) ); // [1, 2, 3, 4, 6, 8, 12, 24] -g // Write a function `endsInLy` that accepts a string as an argument and returns a boolean indicating -// whether or not the string ends in the substring 'ly'. - -let endsInLy = function ( str ) { - let secondLast = str[ str.length - 2 ]; - let last = str[ str.length - 1 ]; - - return secondLast === 'l' && last === 'y'; -}; - -// let endsInLy = function (str) { -// return str.endsWith('ly'); -// }; - -console.log( endsInLy( "pretty" ) ); // false -console.log( endsInLy( "instant" ) ); // false -console.log( endsInLy( "analytic" ) ); // false -console.log( endsInLy( "timidly" ) ); // true -console.log( endsInLy( "fly" ) ); // true -console.log( endsInLy( "gallantly" ) ); // true -// Write a function `endsWithT` that accepts a string as an argument. The function should return a -// boolean indicating whether or not the string ends with the character 't'. - -let endsWithT = function ( str ) { - let lastChar = str[ str.length - 1 ]; - return lastChar === 't'; -}; - - -console.log( endsWithT( "smart" ) ); // true -console.log( endsWithT( "racket" ) ); // true -console.log( endsWithT( "taco" ) ); // false -console.log( endsWithT( "boomerang" ) ); // false -// Write a function `evens(max)` that accepts a max number as an argument. The function should print -// all positive even numbers that are less than the max. - -let evens = function ( max ) { - for ( let i = 1; i < max; i++ ) { - if ( i % 2 === 0 ) { - console.log( i ); - } - } -}; - -evens( 11 ); -// prints -// 2 -// 4 -// 6 -// 8 -// 10 - -evens( 8 ); -// prints -// 2 -// 4 -// 6 -// Write a function `filterLongWords` that accepts an array of strings as an argument. The function -// should return a new array containing only the strings that are less than 5 characters long. - -let filterLongWords = function ( words ) { - let chosenWords = []; - - for ( let i = 0; i < words.length; i++ ) { - let word = words[ i ]; - - if ( word.length < 5 ) { - chosenWords.push( word ); - } - } - - return chosenWords; -}; - -console.log( filterLongWords( [ "kale", "cat", "retro", "axe", "heirloom" ] ) ); -// ['kale', 'cat', 'axe'] - -console.log( filterLongWords( [ "disrupt", "pour", "trade", "pic" ] ) ); -// ['pour', 'pic'] -// Write a function named `fiveMultiplesOf` that accepts a number as an argument. The function should -// print out the first five multiples of the given number. The function doesn't need to return any -// value. It should just print to the terminal. - -let fiveMultiplesOf = function ( num ) { - for ( let i = 1; i <= 5; i++ ) { - console.log( i * num ); - } -}; - -fiveMultiplesOf( 7 ); -// prints -// 7 -// 14 -// 21 -// 28 -// 35 - -fiveMultiplesOf( 3 ); -// prints -// 3 -// 6 -// 9 -// 12 -// 15 -// Write a function `fizzBuzz` that accepts a max number as an argument. The function should -// print all numbers less than or equal to max that are divisible by either 3 or 5 but not both 3 -// and 5. The function doesn't need to return any value. It should just print to the terminal. - -let fizzBuzz = function ( max ) { - for ( let i = 1; i <= max; i++ ) { - if ( ( i % 3 === 0 || i % 5 === 0 ) && !( i % 3 === 0 && i % 5 === 0 ) ) { - console.log( i ); - } - } -}; - -fizzBuzz( 18 ); -// prints -// 3 -// 5 -// 6 -// 9 -// 10 -// 12 -// 18 - -fizzBuzz( 33 ); -// prints -// 3 -// 5 -// 6 -// 9 -// 10 -// 12 -// 18 -// 20 -// 21 -// 24 -// 25 -// 27 -// 33 -let movie = 'Fight Club'; - -let views = 4; - -console.log( 'I watched ' + movie + ' about ' + views + ' number of times' ); -// Write a function `funnySound` that accepts two strings as arguments. The function should return a -// new string containing the first three characters of both strings concatenated together. - -// You can assume that the arguments are both at least three characters long. - -let funnySound = function ( str1, str2 ) { - return str1.slice( 0, 3 ) + str2.slice( 0, 3 ); -}; - -console.log( funnySound( "tiger", "spoon" ) ); // 'tigspo' -console.log( funnySound( "computer", "phone" ) ); // 'compho' -console.log( funnySound( "skate", "bottle" ) ); // 'skabot' -console.log( funnySound( "frog", "ashtray" ) ); // 'froash' -console.log( 'hello world' ); -// Write a function `half` that accepts a number as an argument. The function should return half of the -// number. - -let half = function ( n ) { - return n / 2; -}; - -console.log( half( 8 ) ); // 4 -console.log( half( 15 ) ); // 7.5 -console.log( half( 90 ) ); // 45 -gi // Write a function `inRange(min, max, n)` that accepts three numbers as arguments. The function should -// return a boolean indicating if `n` is between `min` and `max` inclusive. - -let inRange = function ( min, max, n ) { - return n >= min && n <= max; -}; - -console.log( inRange( 5, 13, 8 ) ); // true -console.log( inRange( 5, 13, 29 ) ); // false -console.log( inRange( 100, 125, 100 ) ); // true -console.log( inRange( 100, 125, 99 ) ); // false -console.log( inRange( 40, 45, 44 ) ); // true -console.log( inRange( 40, 45, 45 ) ); // true -console.log( inRange( 40, 45, 46 ) ); // false -// Write a function `isDivBy4` that accepts a number as an argument. The function should return a -// boolean indicating whether or not the number is divisible by 4. - -let isDivBy4 = function ( num ) { - if ( num % 4 === 0 ) { - return true; - } else { - return false; - } -}; - -// let isDivBy4 = function (num) { -// return num % 4 === 0; -// }; - -console.log( isDivBy4( 8 ) ); // true -console.log( isDivBy4( 12 ) ); // true -console.log( isDivBy4( 24 ) ); // true -console.log( isDivBy4( 9 ) ); // false -console.log( isDivBy4( 10 ) ); // false -// Write a function `isLong` that accepts a string as an argument. The function should return a boolean -// indicating whether or not the string is longer than 5 characters - -let isLong = function ( str ) { - return str.length > 5; -}; - -// let isLong = function (str) { -// if (str.length > 5) { -// return true; -// } else { -// return false; -// } -// }; - -console.log( isLong( "pie" ) ); // false -console.log( isLong( "kite" ) ); // false -console.log( isLong( "kitty" ) ); // false -console.log( isLong( "telescope" ) ); // true -console.log( isLong( "thermometer" ) ); // true -console.log( isLong( "restaurant" ) ); // true -// Write a function `keepItQuiet` that accepts a string as an argument. The function should return the -// lowercase version of the string with 3 periods added to the end of it. - -let keepItQuiet = function ( str ) { - return str.toLowerCase() + '...'; -}; - -console.log( keepItQuiet( "HOORAY" ) ); // 'hooray...' -console.log( keepItQuiet( "Doggo" ) ); // 'doggo...' -console.log( keepItQuiet( "WHAT?!?!" ) ); // 'what?!?!...' -// Write a function `larger` that accepts two numbers as arguments. The function should return the -// larger number. - -let larger = function ( num1, num2 ) { - if ( num1 > num2 ) { - return num1; - } else { - return num2; - } -}; - -console.log( larger( 256, 400 ) ); // 400 -console.log( larger( 31, 4 ) ); // 31 -console.log( larger( -6, 7 ) ); // 7 -console.log( larger( 11.3, 11.2 ) ); // 11.3 -console.log( larger( -10, -3 ) ); // -3 -// Write a function `lengthiestWord` that accepts a sentence string as an argument. The function should -// return the longest word of the sentence. If there is a tie, return the word that appears later -// in the sentence. - -let lengthiestWord = function ( sentence ) { - let words = sentence.split( ' ' ); - let longest = words[ 0 ]; // pretty - - for ( let i = 1; i < words.length; i++ ) { - let word = words[ i ]; - if ( word.length >= longest.length ) { - longest = word; - } - } - - return longest; -}; - - -console.log( lengthiestWord( "I am pretty hungry" ) ); // 'hungry' -console.log( lengthiestWord( "we should think outside of the box" ) ); // 'outside' -console.log( lengthiestWord( "down the rabbit hole" ) ); // 'rabbit' -console.log( lengthiestWord( "simmer down" ) ); // 'simmer' -// Write a function `longer` that accepts two strings as arguments. The function should return the -// string that is longer. If the strings have the same length, then return the first string. - -let longer = function ( str1, str2 ) { - if ( str1.length >= str2.length ) { - return str1; - } else { - return str2; - } -}; - -console.log( longer( "drum", "piranha" ) ); // 'piranha' -console.log( longer( "basket", "fork" ) ); // 'basket' -console.log( longer( "flannel", "sustainable" ) ); // 'sustainable' -console.log( longer( "disrupt", "ability" ) ); // 'disrupt' -console.log( longer( "bird", "shoe" ) ); // 'bird' -// Write a function `makeAcronym` that accepts a sentence string as an argument. The function should -// return a string containing the first character of each word in the sentence. - -let makeAcronym = function ( sentence ) { - let words = sentence.split( ' ' ); - let acronym = ''; - - for ( let i = 0; i < words.length; i++ ) { - let word = words[ i ]; - acronym += word[ 0 ]; - } - - return acronym.toUpperCase(); -}; - -console.log( makeAcronym( "New York" ) ); // NY -console.log( makeAcronym( "same stuff different day" ) ); // SSDD -console.log( makeAcronym( "Laugh out loud" ) ); // LOL -console.log( makeAcronym( "don't over think stuff" ) ); // DOTS -// Write a function `makeMatrix(m, n, value)` that accepts three arguments. The function should return -// a 2-dimensional array of height `m` and width `n` that contains the `value` as every element. - -let makeMatrix = function ( m, n, value ) { - let matrix = []; - - for ( let i = 0; i < m; i++ ) { - let row = []; - - for ( let j = 0; j < n; j++ ) { - row.push( value ); - } - - matrix.push( row ); - } - - - return matrix; -}; - -console.log( makeMatrix( 3, 5, null ) ); -// [ -// [ null, null, null, null, null ], -// [ null, null, null, null, null ], -// [ null, null, null, null, null ] -// ] - -console.log( makeMatrix( 4, 2, "x" ) ); -// [ -// [ 'x', 'x' ], -// [ 'x', 'x' ], -// [ 'x', 'x' ], -// [ 'x', 'x' ] -// ] - -console.log( makeMatrix( 2, 2, 0 ) ); -// [ -// [ 0, 0 ], -// [ 0, 0 ] -// ] -// Write a function `maximum` that accepts an array of numbers as an argument. The function should -// return the largest number of the array. If the array is empty, then the function should return null. - -let maximum = function ( numbers ) { - if ( numbers.length === 0 ) { - return null; - } - - let currentMax = numbers[ 0 ]; - for ( let i = 1; i < numbers.length; i++ ) { - if ( numbers[ i ] > currentMax ) { - currentMax = numbers[ i ]; - } - } - - return currentMax; -}; - -console.log( maximum( [ 5, 6, 3, 7 ] ) ); // 7 -console.log( maximum( [ 17, 15, 19, 11, 2 ] ) ); // 19 -console.log( maximum( [] ) ); // null -// Write a function `minToMax(min, max)` that accepts two numbers as arguments. The function should -// print all numbers from min to max inclusive. The function doesn't need to return any value. It -// should just print to the terminal. - - -let minToMax = function ( min, max ) { - for ( let i = min; i <= max; i++ ) { - console.log( i ); - } -}; - -minToMax( 5, 9 ); -// prints -// 5 -// 6 -// 7 -// 8 -// 9 - -minToMax( 11, 13 ); -// prints -// 11 -// 12 -// 13 -// Write a function named `noOhs` that accepts a string as an argument. The functions should print the -// characters of the string one by one except the character 'o'. The function doesn't need to return -// any value. It should just print to the terminal. - -let noOhs = function ( str ) { - for ( let i = 0; i < str.length; i++ ) { - let char = str[ i ]; - if ( char !== 'o' ) { - console.log( char ); - } - } -}; - -noOhs( "code" ); -// prints -// c -// d -// e - -noOhs( "school" ); -// prints -// s -// c -// h -// l -// Write a function `numOdds` that accepts an array of numbers as an argument. The function should -// return a number representing the count of odd elements in the array. - -let numOdds = function ( numbers ) { - let count = 0; - - for ( let i = 0; i < numbers.length; i++ ) { - if ( numbers[ i ] % 2 === 1 ) { - count += 1; - } - } - - return count; -}; - -console.log( numOdds( [ 4, 7, 2, 5, 9 ] ) ); // 3 -console.log( numOdds( [ 11, 31, 58, 99, 21, 60 ] ) ); // 4 -console.log( numOdds( [ 100, 40, 4 ] ) ); // 0 -// Write a function `numberChange` that accepts a number as an argument. The function should return -// half the number if it is even. The function should return double the number if it is odd. - -let numberChange = function ( n ) { - if ( n % 2 === 0 ) { - return n / 2; - } else { - return n * 2; - } -}; - -console.log( numberChange( 6 ) ); // 3 -console.log( numberChange( 7 ) ); // 14 -console.log( numberChange( 16 ) ); // 8 -console.log( numberChange( 21 ) ); // 42 -console.log( 2 + 3 ); // 5 -console.log( 10 - 15 ); // -5 -console.log( 4 + 1 - 5 ); // 0 -console.log( 4 * 3 ); // 12 - -console.log( 7 / 2 ); // 3.5 -console.log( 4 + 2 * 3 ); // 10 -console.log( ( 4 + 2 ) * 3 ); // 18 -console.log( 5 % 2 ); // 1 - -console.log( 6 % 2 ); // 0 -console.log( 7 % 2 ); // 1 -console.log( 8 % 2 ); // 0 -console.log( 19 % 8 ); // 3 - -console.log( 24 % 8 ); // 0 -console.log( 7 % 4 ); // 3 -console.log( 4 % 7 ); // 4 -console.log( 5 + ( 10 % 5 ) ); // 5 -console.log( ( 5 + 10 ) % 5 ); // 0 -// Write a function `numberRange(min, max, step)` that accepts three numbers as arguments, `min`, -// `max`, and `step`. The function should return all numbers between `min` and `max` at `step` intervals. -// `min` and `max` are inclusive. - -let numberRange = function ( min, max, step ) { - let range = []; - - for ( let i = min; i <= max; i += step ) { - range.push( i ); - } - - return range; -}; - -console.log( numberRange( 10, 40, 5 ) ); // [10, 15, 20, 25, 30, 35, 40] -console.log( numberRange( 14, 24, 3 ) ); // [14, 17, 20, 23] -console.log( numberRange( 8, 35, 6 ) ); // [8, 14, 20, 26, 32] -// Write a function named `oddSum(max)` that accepts a max number as an argument. The function should -// return the total sum of all odd numbers from 1 to the max, inclusive. -// -// For example, oddSum(10) should return 25 because 1 + 3 + 5 + 7 + 9 = 25 - -let oddSum = function ( max ) { - let sum = 0; - - for ( let i = 1; i <= max; i++ ) { - if ( i % 2 === 1 ) { - sum += i; - } - } - - return sum; -}; - -console.log( oddSum( 10 ) ); // 25 -console.log( oddSum( 5 ) ); // 9 -let word = "bye"; -console.log( `${word} felicia` ); // 'bye felicia' -console.log( word ); // 'bye' - -let num = 10; -num = num * 2; -console.log( num ); // 20 - -let bottlesOfBeer = 99; -let around = bottlesOfBeer - 1; -console.log( around ); // 98 -console.log( bottlesOfBeer ); // 99 -// Write a function `oneOrNone` that accepts two booleans as arguments. The function should return true -// if exactly one of the arguments is true. If BOTH arguments are true, then it should return false. - -let oneOrNone = function ( val1, val2 ) { - if ( ( val1 || val2 ) && !( val1 && val2 ) ) { - return true; - } else { - return false; - } -}; - -console.log( oneOrNone( false, false ) ); // false -console.log( oneOrNone( true, false ) ); // true -console.log( oneOrNone( false, true ) ); // true -console.log( oneOrNone( true, true ) ); // false -// Write a function `oneToFour` that prints all whole numbers from one to four, inclusive. The function -// takes in no arguments and doesn't need to return any value. It should just print to the terminal. - -let oneToFour = function () { - for ( let i = 1; i <= 4; i++ ) { - console.log( i ); - } -}; - - -oneToFour(); -// prints -// 1 -// 2 -// 3 -// 4 -let word = "bye"; -console.log( word + " felicia" ); // 'bye felicia' -console.log( word ); // 'bye' - -let num = 10; -num = num * 2; -console.log( num ); // 20 - -let bottlesOfBeer = 99; -let around = bottlesOfBeer - 1; -console.log( around ); // 98 -console.log( bottlesOfBeer ); // 99 -// Write a function `pairPrint` that accepts an array as an argument. The function should print -// all unique pairs of elements in the array. The function doesn't need to return any value. It -// should just print to the terminal. - -let pairPrint = function ( array ) { - for ( let i = 0; i < array.length; i++ ) { - for ( let j = i + 1; j < array.length; j++ ) { - console.log( array[ i ] + ' - ' + array[ j ] ); - } - } -}; - -pairPrint( [ "artichoke", "broccoli", "carrot", "daikon" ] ); -// prints -// artichoke - broccoli -// artichoke - carrot -// artichoke - daikon -// broccoli - carrot -// broccoli - daikon -// carrot - daikon - -pairPrint( [ "apple", "banana", "clementine" ] ); -// prints -// apple - banana -// apple - clementine -// banana - clementine -// Write a function `parity` that accepts a number as an argument. The function should return the -// string 'even' if the number is even. It should return the string 'odd' if the number is odd. - -let parity = function ( num ) { - if ( num % 2 === 0 ) { - return 'even'; - } else { - return 'odd'; - } -}; - -console.log( parity( 5 ) ); // 'odd' -console.log( parity( 7 ) ); // 'odd' -console.log( parity( 13 ) ); // 'odd' -console.log( parity( 32 ) ); // 'even' -console.log( parity( 10 ) ); // 'even' -console.log( parity( 602348 ) ); // 'even' -// Write a function `print2d` that accepts a two-dimensional array as an argument. The function -// should print all inner elements of the array. - -let print2d = function ( array ) { - for ( let i = 0; i < array.length; i++ ) { - let subarray = array[ i ]; - for ( let j = 0; j < subarray.length; j++ ) { - console.log( subarray[ j ] ); - } - } -}; - - -let array1 = [ - [ "a", "b", "c", "d" ], - [ "e", "f" ], - [ "g", "h", "i" ], -]; -print2d( array1 ); -// prints -// a -// b -// c -// d -// e -// f -// g -// h -// i - -let array2 = [ - [ 9, 3, 4 ], - [ 11 ], - [ 42, 100 ] -]; -print2d( array2 ); -// prints -// 9 -// 3 -// 4 -// 11 -// 42 -// 100 -// Write a function `printCombinations`that accepts two arrays as arguments. The function should -// print all combinations of the elements generated by taking an element from the first array and -// and an element from the second array. The function doesn't need to return any value. It -// should just print to the terminal. - - -let printCombinations = function ( array1, array2 ) { - for ( let i = 0; i < array1.length; i++ ) { - let ele1 = array1[ i ]; - - for ( let j = 0; j < array2.length; j++ ) { - let ele2 = array2[ j ]; - console.log( ele1, ele2 ); - } - } -}; - -let colors = [ "gray", "cream", "cyan" ]; -let clothes = [ "shirt", "flannel" ]; -printCombinations( colors, clothes ); -// prints -// gray shirt -// gray flannel -// cream shirt -// cream flannel -// cyan shirt -// cyan flannel - -printCombinations( [ "hot", "cold" ], [ "soup", "tea" ] ); -// prints -// hot soup -// hot tea -// cold soup -// cold tea -// Write a function named `productUpTo(max)` that accepts a max number as an argument. The function -// should return the total product of all whole numbers from 1 to the max, inclusive. A product is a -// number obtained from multiplying numbers together. -// -// For example, productUpTo(4) should return 24 because 1 * 2 * 3 * 4 = 24 - -let productUpTo = function ( max ) { - let product = 1; - - for ( let i = 1; i <= max; i++ ) { - product *= i; - } - - return product; -}; - -console.log( productUpTo( 4 ) ); // 24 -console.log( productUpTo( 5 ) ); // 120 -console.log( productUpTo( 7 ) ); // 5040 -let word = "suspension bridge"; -console.log( word[ 4 ] ); // e -console.log( word.length > 5 && word[ 0 ] === "d" ); // false -console.log( word.length > 5 && word[ 0 ] === "s" ); // true -console.log( word.indexOf( "o" ) > -1 ); // true -console.log( word.indexOf( "z" ) > -1 ); // false - -let str = "foggy"; -console.log( str[ 2 + 1 ] ); // g -console.log( str[ str.length - 1 ] ); // y -str = " day"; -console.log( str ); // ' day' -console.log( str.length ); // 4 -console.log( str.indexOf( "ogg" ) ); // -1 -// Write a function `raisePower(base, exponent)` that accepts two numbers, `base` and `exponent`. The -// function should return `base` raised to the `exponent` power. -// -// For example, raisePower(2, 5) should return 32 because 2 * 2 * 2 * 2 * 2 = 32 -// For example, raisePower(4, 3) should return 64 because 4 * 4 * 4 = 64 - -let raisePower = function ( base, exponent ) { - let product = 1; - - for ( let i = 1; i <= exponent; i++ ) { - product *= base; - } - - return product; -}; - -console.log( raisePower( 2, 5 ) ); // 32 -console.log( raisePower( 4, 3 ) ); // 64 -console.log( raisePower( 10, 4 ) ); // 10000 -console.log( raisePower( 7, 2 ) ); // 49 -// Write a function `removeCapitals` that accepts a string as an argument. The function should return a -// new version of the string with all capital letters removed. - -let removeCapitals = function ( str ) { - let newStr = ''; - - for ( let i = 0; i < str.length; i++ ) { - let char = str[ i ]; - if ( char === char.toLowerCase() ) { - newStr += char; - } - } - - return newStr; -}; - -console.log( removeCapitals( "fOrEver" ) ); // 'frver' -console.log( removeCapitals( "raiNCoat" ) ); // 'raioat' -console.log( removeCapitals( "cElLAr Door" ) ); // 'clr oor' -// Write a function `removeDupes` that accepts an array as an argument. The function should return a -// new array where each element only appears once. - -let removeDupes = function ( array ) { - let uniques = []; - - for ( let i = 0; i < array.length; i++ ) { - let ele = array[ i ]; - if ( !uniques.includes( ele ) ) { - uniques.push( ele ); - } - } - - return uniques; -}; - -console.log( removeDupes( [ "x", "y", "y", "x", "z" ] ) ); // ['x', 'y', 'z'] -console.log( removeDupes( [ false, false, true, false ] ) ); // [false, true] -console.log( removeDupes( [ 42, 5, 7, 42, 7, 3, 7, 7 ] ) ); // [42, 5, 7, 3] -// Write a function `removeFirstVowel` that accepts a string as an argument. The function should return -// the string with it's first vowel removed. - -let removeFirstVowel = function ( str ) { - let vowels = 'aeiou'; - - for ( let i = 0; i < str.length; i++ ) { - let char = str[ i ]; - if ( vowels.includes( char ) ) { - return str.slice( 0, i ) + str.slice( i + 1 ); - } - } - - return str; -}; - -console.log( removeFirstVowel( "volcano" ) ); // 'vlcano' -console.log( removeFirstVowel( "celery" ) ); // 'clery' -console.log( removeFirstVowel( "juice" ) ); // 'jice' -console.log( removeFirstVowel( "bridge" ) ); // 'brdge' -console.log( removeFirstVowel( "try" ) ); // 'try' -// Write a function `removeShortWords` that accepts a sentence string as an argument. The function -// should return a new sentence where all of the words shorter than 4 characters are removed. - -let removeShortWords = function ( sentence ) { - let words = sentence.split( ' ' ); - let chosenWords = []; - - for ( let i = 0; i < words.length; i++ ) { - let word = words[ i ]; - - if ( word.length >= 4 ) { - chosenWords.push( word ); - } - } - - return chosenWords.join( ' ' ); -}; - -console.log( removeShortWords( "knock on the door will you" ) ); // 'knock door will' -console.log( removeShortWords( "a terrible plan" ) ); // 'terrible plan' -console.log( removeShortWords( "run faster that way" ) ); // 'faster that' -// Write a function `removeVowels` that accepts a string as an argument. The function should return -// a version of the string where all vowels are removed. - -let removeVowels = function ( str ) { - let newStr = ''; - let vowels = 'aeiou'; - - for ( let i = 0; i < str.length; i++ ) { - let char = str[ i ]; - if ( !vowels.includes( char ) ) { - newStr += char; - } - } - - return newStr; -}; - -console.log( removeVowels( "jello" ) ); // jll -console.log( removeVowels( "sensitivity" ) ); // snstvty -console.log( removeVowels( "cellar door" ) ); // cllr dr -// Write a function `reverseArray` that accepts an array as an argument. The function should return a -// array containing the elements of the original array in reverse order. - -let reverseArray1 = function ( array ) { - let reversed = []; - - for ( let i = array.length - 1; i >= 0; i-- ) { - reversed.push( array[ i ] ); - } - - return reversed; -}; - -console.log( reverseArray1( [ "zero", "one", "two", "three" ] ) ); // ['three', 'two', 'one', 'zero'] -console.log( reverseArray1( [ 7, 1, 8 ] ) ); // [8, 1, 7] - - -let reverseArray2 = function ( array ) { - let reversed = []; - - for ( let i = 0; i < array.length; i++ ) { - reversed.unshift( array[ i ] ); - } - - return reversed; -}; - -console.log( reverseArray2( [ "zero", "one", "two", "three" ] ) ); // ['three', 'two', 'one', 'zero'] -console.log( reverseArray2( [ 7, 1, 8 ] ) ); // [8, 1, 7] -// Write a function `reverseIterate` that accepts a string as an argument. The function should print -// the characters of the string one by one, in reverse order. The function doesn't need to return any -// value. It should just print to the terminal. - -let reverseIterate = function ( str ) { - for ( let i = str.length - 1; i >= 0; i-- ) { - console.log( str[ i ] ); - } -}; - -reverseIterate( "carrot" ); -// prints -// t -// o -// r -// r -// a -// c - -reverseIterate( "box" ); -// prints -// x -// o -// b -// Write a function `shortenLongWords` that accepts a sentence string as an argument. The function -// should return the same sentence where words longer than 4 characters have their vowels removed. - -let removeVowels = function ( str ) { - let newStr = ''; - let vowels = 'aeiou'; - - for ( let i = 0; i < str.length; i++ ) { - let char = str[ i ]; - if ( !vowels.includes( char ) ) { - newStr += char; - } - } - - return newStr; -}; - -let shortenLongWords = function ( sentence ) { - let words = sentence.split( ' ' ); - let newWords = []; - - for ( let i = 0; i < words.length; i++ ) { - let word = words[ i ]; - if ( word.length > 4 ) { - let noVowels = removeVowels( word ); - newWords.push( noVowels ); - } else { - // leave it the same - newWords.push( word ); - } - } - - return newWords.join( ' ' ); -}; - -console.log( shortenLongWords( "they are very noble people" ) ); // 'they are very nbl ppl' -console.log( shortenLongWords( "stick with it" ) ); // 'stck with it' -console.log( shortenLongWords( "ballerina, you must have seen her" ) ); // 'bllrna, you must have seen her -console.log( "promenade" [ 3 ] ); // m -console.log( "tiger" [ 1 ] ); // i -console.log( "wheel".length ); // 5 - -console.log( "wheel".length - 1 ); // 4 -console.log( "noMAD".toUpperCase() ); // NOMAD -console.log( "hey programmers" [ 2 ] === "y" ); // true - -console.log( "volleyball".length > 20 ); // false -console.log( "treasure".indexOf( "r" ) ); // 1 -console.log( "treasure".indexOf( "e" ) ); // 2 -console.log( "web" [ 5 ] ); // undefined -console.log( "red".indexOf( "x" ) ); // -1 -console.log( "red".indexOf( "R" ) ); // -1 -// snippet 0-1 -let greet = function () { - console.log( "hey" ); - console.log( "programmers" ); -}; - -let whistle = function () { - console.log( "doot" ); -}; - -console.log( "first" ); -console.log( "second" ); -greet(); -console.log( "third" ); -console.log( "fourth" ); -whistle(); - - -// first -// second -// hey -// programmers -// third -// fourth -// doot -// snippet 0-2 -let howMany = function () { - return 42; -}; - -console.log( howMany ); -console.log( howMany() ); - -const theAnswer = howMany(); -console.log( theAnswer ); - -let howMuch = function () { - 5; -}; -console.log( howMuch() ); - - -// [Function: howMany] -// 42 -// 42 -// undefined -// snippet 0-3 -let average = function ( num1, num2 ) { - console.log( "calculating..." ); - return ( num1 + num2 ) / 2; -}; - -console.log( average( 5, 10 ) ); -console.log( average( 20, 26 ) ); -console.log( average( 50, 100 ) + 2 ); - -let a = 21 + 3; -let b = 20; -let n = average( a, b ); -console.log( average( n, 18 ) ); - - -// calculating... -// 7.5 -// calculating... -// 23 -// calculating... -// 77 -// calculating... -// calculating... -// 20 -// snippet 0-4 -let exclaim = function ( str ) { - let capitalized = str.toUpperCase(); - return capitalized + "!!"; -}; - -let result = exclaim( "potato" ); -console.log( result ); -console.log( result.length ); -console.log( result[ 0 ] ); -console.log( result[ result.length - 1 ] ); - - -// POTATO!! -// 8 -// P -// ! -// snippet 1 -console.log( "hello" ); - -for ( let i = 0; i < 5; i++ ) { - console.log( "code" ); -} - -console.log( "goodbye" ); - - -hello -code -code -code -code -code -goodbye -// snippet 1 -console.log( "hello" ); - -for ( let i = 0; i < 5; i++ ) { - console.log( "code" ); -} - -console.log( "goodbye" ); - - -hello -code -code -code -code -code -goodbye -// snippet 2 -console.log( "hi" ); - -for ( let i = 3; i <= 7; i++ ) { - console.log( "program" ); - console.log( i ); -} - -console.log( "bye" ); - - -// hi -// program -// 3 -// program -// 4 -// program -// 5 -// program -// 6 -// program -// 7 -// bye -// snippet 2 -console.log( "hi" ); - -for ( let i = 3; i <= 7; i++ ) { - console.log( "program" ); - console.log( i ); -} - -console.log( "bye" ); - - -// hi -// program -// 3 -// program -// 4 -// program -// 5 -// program -// 6 -// program -// 7 -// bye -// snippet 3 -let foo = function () { - for ( let num = 10; num > 0; num -= 2 ) { - console.log( num ); - } -}; - -console.log( "begin" ); -foo(); -console.log( "end" ); -foo(); - - -// begin -// 10 -// 8 -// 6 -// 4 -// 2 -// end -// 10 -// 8 -// 6 -// 4 -// 2 -// snippet 3 -let foo = function () { - for ( let num = 10; num > 0; num -= 2 ) { - console.log( num ); - } -}; - -console.log( "begin" ); -foo(); -console.log( "end" ); -foo(); - - -// begin -// 10 -// 8 -// 6 -// 4 -// 2 -// end -// 10 -// 8 -// 6 -// 4 -// 2 -// snippet 4 -let word = "street"; -for ( let i = 0; i < word.length; i++ ) { - console.log( i ); - console.log( word[ i ] ); -} - - -// 0 -// s -// 1 -// t -// 2 -// r -// 3 -// e -// 4 -// e -// 5 -// t -// snippet 4 -let word = "street"; -for ( let i = 0; i < word.length; i++ ) { - console.log( i ); - console.log( word[ i ] ); -} - - -// 0 -// s -// 1 -// t -// 2 -// r -// 3 -// e -// 4 -// e -// 5 -// t -// snippet 5 -let total = 0; // 10 -for ( let i = 1; i < 5; i++ ) { - total += i; - console.log( total ); -} - -console.log( "grand total: " + total ); - - -// 1 -// 3 -// 6 -// 10 -// grand total: 10 -// snippet 5 -let total = 0; // 10 -for ( let i = 1; i < 5; i++ ) { - total += i; - console.log( total ); -} - -console.log( "grand total: " + total ); - - -// 1 -// 3 -// 6 -// 10 -// grand total: 10 -// Write a function `spam` that accepts a 2D array as an argument. The array contains pairs as elements. -// The first element of every pair is a number and the second element is a word. The function should -// return a string containing the words repeated the specified number of times. See the examples. - -let spam = function ( pairs ) { - let words = []; - - for ( let i = 0; i < pairs.length; i++ ) { - let pair = pairs[ i ]; - let word = pair[ 0 ]; - let num = pair[ 1 ]; - - for ( let j = 0; j < num; j++ ) { - words.push( word ); - } - } - - return words.join( ' ' ); -}; - -let array1 = [ - [ "hi", 3 ], - [ "bye", 2 ], -]; -console.log( spam( array1 ) ); // 'hi hi hi bye bye' - -let array2 = [ - [ "cat", 1 ], - [ "dog", 2 ], - [ "bird", 4 ], -]; -console.log( spam( array2 ) ); // 'cat dog dog bird bird bird bird' -// Write a function `startsWithR` that accepts a string as an argument and returns a boolean indicating -// whether or not the string starts with 'r' or 'R'. - -let startsWithR = function ( str ) { - return str[ 0 ] === 'r' || str[ 0 ] === 'R'; -}; - -console.log( startsWithR( "roger that" ) ); // true -console.log( startsWithR( "Row, row, row your boat" ) ); // true -console.log( startsWithR( "slip" ) ); // false -console.log( startsWithR( "Taxicab" ) ); // false -// Write a function `stayPositive` that accepts an array of numbers as an argument. The function should -// return an array containing only the positive numbers. - -let stayPositive = function ( numbers ) { - let positives = []; - - for ( let i = 0; i < numbers.length; i++ ) { - if ( numbers[ i ] > 0 ) { - positives.push( numbers[ i ] ); - } - } - - return positives; -}; - - -console.log( stayPositive( [ 10, -4, 3, 6 ] ) ); // [10, 3, 6] -console.log( stayPositive( [ -5, 11, -40, 30.3, -2 ] ) ); // [11, 30.3] -console.log( stayPositive( [ -11, -30 ] ) ); // [] -console.log( "river" + "town" ); -console.log( "cat" + "dog" ); -console.log( "New" + " York" ); -console.log( "runner's knee" + "!" ); -console.log( "man" + "bear" + "pig" ); -// Write a function `stringIterate` that accepts a string as an argument. The function should print out -// each character of the string, one by one. The function doesn't need to return any value. It should -// just print to the terminal. - -let stringIterate = function ( string ) { - for ( let i = 0; i < string.length; i++ ) { - console.log( string[ i ] ); - } -}; - -stringIterate( "celery" ); -// prints -// c -// e -// l -// e -// r -// y - -stringIterate( "hat" ); -// prints -// h -// a -// t -// Write a function named `stringRepeater(str, num)` that accepts a string and a number as arguments. -// The function should return a new string consisting of the `str` repeated `num` number of times. - -let stringRepeater = function ( str, num ) { - let repeatedStr = ''; - - for ( let i = 1; i <= num; i++ ) { - repeatedStr += str - } - - return repeatedStr; -}; - -console.log( stringRepeater( "q", 4 ) ); // 'qqqq' -console.log( stringRepeater( "go", 2 ) ); // 'gogo' -console.log( stringRepeater( "tac", 3 ) ); // 'tactactac' -// Write a function `stringSize` that accepts a string as an argument. The function should return the -// string 'small' if the argument is shorter than 5 characters, 'medium' if it is exactly 5 characters, and -// 'large' if it is longer than 5 characters. - -let stringSize = function ( str ) { - if ( str.length < 5 ) { - return 'small'; - } else if ( str.length > 5 ) { - return 'large'; - } else { - return 'medium'; - } -}; - -console.log( stringSize( "cat" ) ); // 'small' -console.log( stringSize( "bell" ) ); // 'small' -console.log( stringSize( "ready" ) ); // 'medium' -console.log( stringSize( "shirt" ) ); // 'medium' -console.log( stringSize( "shallow" ) ); // 'large' -console.log( stringSize( "intelligence" ) ); // 'large' -// Write a function `stringsToLengths` that accepts an array of strings as an argument. The function -// should return a new array containing the lengths of the elements of the original array. - -let stringsToLengths = function ( words ) { - let lengths = []; - - for ( let i = 0; i < words.length; i++ ) { - lengths.push( words[ i ].length ); - } - - return lengths; -}; - -console.log( stringsToLengths( [ "belly", "echo", "irony", "pickled" ] ) ); -// [5, 4, 5, 7] - -console.log( stringsToLengths( [ "on", "off", "handmade" ] ) ); -// [2, 3, 8] -// Write a function named `sumUpTo(max)` that accepts a max number as an argument. The function should -// return the total sum of all whole numbers from 1 to the max, inclusive. -// -// For example, sumUpTo(4) should return 10 because 1 + 2 + 3 + 4 = 10. - -let sumUpTo = function ( max ) { - let sum = 0; - - for ( let i = 1; i <= max; i++ ) { - sum += i - } - - return sum; -}; - -console.log( sumUpTo( 4 ) ); // 10 -console.log( sumUpTo( 5 ) ); // 15 -console.log( sumUpTo( 2 ) ); // 3 -console.log( 'coffee' ); -let qty = 15 % 4; -console.log( qty ); // 3 - -let num = 38 + 3; -num++; -console.log( num + " is a great number" ); // '42 is a great number' - -let isNumEven = num % 2 === 0; -console.log( num + " is even? " + isNumEven ); // '42 is even? true' - -let isQtyEven = qty % 2 === 0; -console.log( qty + " is even? " + isQtyEven ); // '3 is even? false' -let qty = 15 % 4; -console.log( qty ); // 3 - -let num = 38 + 3; -num++; -console.log( num + " is a great number" ); // '42 is a great number' - -let isNumEven = num % 2 === 0; -console.log( num + " is even? " + isNumEven ); // '42 is even? true' - -let isQtyEven = qty % 2 === 0; -console.log( qty + " is even? " + isQtyEven ); // '3 is even? false' -// Write a function `totalProduct(array)` that accepts a 2D array of numbers. The function should return -// the total product of all numbers in the array. - -let totalProduct = function ( array ) { - let product = 1; - - for ( let i = 0; i < array.length; i++ ) { - let subarray = array[ i ]; - - for ( let j = 0; j < subarray.length; j++ ) { - product *= subarray[ j ]; - } - } - - return product; -}; - -let array1 = [ - [ 3, 5, 2 ], - [ 6, 2 ], -]; -console.log( totalProduct( array1 ) ); // 360 - -let array2 = [ - [ 4, 6 ], - [ 2, 3 ], - [ 1, 2 ], -]; -console.log( totalProduct( array2 ) ); // 288 -// Write a function `total` that accepts an array of numbers as an argument. The function should return -// the total sum of all elements of the array. - -let total = function ( numbers ) { - let sum = 0; - for ( let i = 0; i < numbers.length; i++ ) { - sum += numbers[ i ]; - } - return sum; -}; - -console.log( total( [ 3, 2, 8 ] ) ); // 13 -console.log( total( [ -5, 7, 4, 6 ] ) ); // 12 -console.log( total( [ 7 ] ) ); // 7 -console.log( total( [] ) ); // 0 -let apple; -console.log( apple ); // undefined - -apple = 5; -console.log( apple ); // 5 - -apple + 1; -console.log( apple ); // 5 - -apple += 1; -console.log( apple ); // 6 - -let banana = apple; -console.log( banana ); // 6 - -banana = banana / 2; -console.log( banana ); // 3 - -console.log( apple ); // 6 -// Write a function `twoSumPairs(numbers, target)` that accepts an array of numbers and a target number -// as arguments. The function should return a 2D array containing all unique pairs of elements that -// sum to the target. - -let twoSumPairs = function ( numbers, target ) { - let pairs = []; - - for ( let i = 0; i < numbers.length; i++ ) { - let num1 = numbers[ i ]; - - for ( let j = i + 1; j < numbers.length; j++ ) { - let num2 = numbers[ j ]; - - if ( num1 + num2 === target ) { - let pair = [ num1, num2 ]; - pairs.push( pair ); - } - } - } - - return pairs; -}; - -console.log( twoSumPairs( [ 2, 3, 4, 6, 5 ], 8 ) ); // [ [2, 6], [3, 5] ] -console.log( twoSumPairs( [ 10, 7, 4, 5, 2 ], 12 ) ); // [ [10, 2], [7, 5] ] -console.log( twoSumPairs( [ 3, 9, 8 ], 11 ) ); // [ [3, 8] ] -console.log( twoSumPairs( [ 3, 9, 8 ], 10 ) ); // [ ] -// Write a function `twoSum(numbers, target)` that accepts an array of numbers and a target number -// as an argument. The function should return a boolean indicating whether or not there exists a pair -// of distinct elements in the array that sum to the target. - -let twoSum = function ( numbers, target ) { - for ( let i = 0; i < numbers.length; i++ ) { - for ( let j = i + 1; j < numbers.length; j++ ) { - if ( numbers[ i ] + numbers[ j ] === target ) { - return true; - } - } - } - - return false; -}; - -console.log( twoSum( [ 2, 3, 5, 9 ], 7 ) ); // true -console.log( twoSum( [ 2, 3, 5, 9 ], 4 ) ); // false -console.log( twoSum( [ 6, 3, 4 ], 10 ) ); // true -console.log( twoSum( [ 6, 5, 1 ], 10 ) ); // false -let apple; -console.log( apple ); // undefined - -apple = 5; -console.log( apple ); // 5 - -apple + 1; -console.log( apple ); // 5 - -apple += 1; -console.log( apple ); // 6 - -let banana = apple; -console.log( banana ); // 6 - -banana = banana / 2; -console.log( banana ); // 3 - -console.log( apple ); // 6 -// Write a function `wackyWord` that accepts two strings as arguments. The function should return a new -// string containing the first three characters of the first string concatenated with the last two -// character of the second string. - -// You can assume that the first argument has a length of at least three and the second argument has a -// length of at least two. - - -let wackyWord = function ( str1, str2 ) { - return str1.slice( 0, 3 ) + str2.slice( -2 ); -}; - -console.log( wackyWord( "very", "kindly" ) ); // 'verly' -console.log( wackyWord( "forever", "sick" ) ); // 'forck' -console.log( wackyWord( "cellar", "door" ) ); // 'celor' -console.log( wackyWord( "bagel", "sweep" ) ); // 'bagep' -console.log( 'alvin' ); -console.log( 'z' ); -// Write a function `wordCount(sentence, targetWords)` that accepts a sentence string and an array of -// `targetWords`. The function should return a count of the number of words of the sentence that are -// in `targetWords`. - -let wordCount = function ( sentence, targetWords ) { - let words = sentence.split( ' ' ); - let count = 0; - - for ( let i = 0; i < words.length; i++ ) { - let word = words[ i ]; - - if ( targetWords.includes( word ) ) { - count++; - } - } - - return count; -}; - -console.log( wordCount( "open the window please", [ "please", "open", "sorry" ] ) ); // 2 -console.log( wordCount( "drive to the cinema", [ "the", "driver" ] ) ); // 1 -console.log( wordCount( "can I have that can", [ "can", "I" ] ) ); // 3 -// Write a function `yourAverageFunction` that accepts an array of numbers as an argument. The -// function should return the average of all elements of the array. If the input array is empty, -// then the function should return null. - -let yourAverageFunction = function ( nums ) { - if ( nums.length === 0 ) { - return null; - } - - let sum = 0; - for ( let i = 0; i < nums.length; i++ ) { - sum += nums[ i ]; - } - - return sum / nums.length; -}; - -console.log( yourAverageFunction( [ 5, 2, 7, 24 ] ) ); // 9.5 -console.log( yourAverageFunction( [ 100, 6 ] ) ); // 53 -console.log( yourAverageFunction( [ 31, 32, 40, 12, 33 ] ) ); // 29.6 -console.log( yourAverageFunction( [] ) ); // null -let location = "Brooklyn, " + "NY"; -console.log( location ); // 'Brooklyn, NY' - -let quantity = 4 * 5 + 1; -console.log( quantity ); // 21 -let location = "Brooklyn, " + "NY"; -console.log( location ); // 'Brooklyn, NY' - -let quantity = 4 * 5 + 1; -console.log( quantity ); // 21 -// Write a function `zipper` that accepts two arrays as arguments. The function should return a 2D -// array containing pairs of elements at the same indices. - - -let zipper = function ( arr1, arr2 ) { - let result = []; - - for ( let i = 0; i < arr1.length; i++ ) { - let el1 = arr1[ i ]; - let el2 = arr2[ i ]; - let pair = [ el1, el2 ]; - result.push( pair ); - } - - return result; -}; - -let array1 = [ "a", "b", "c", "d" ]; -let array2 = [ -1, -2, -3, -4 ]; -console.log( zipper( array1, array2 ) ); -// [ -// ['a', -1], -// ['b', -2], -// ['c', -3], -// ['d', -4], -// ] - -let array3 = [ "whisper", "talk", "shout" ]; -let array4 = [ "quiet", "normal", "loud" ]; -console.log( zipper( array3, array4 ) ); -// [ -// ['whisper', 'quiet'], -// ['talk', 'normal'], -// ['shout', 'loud'], -// ] - - - - - -
javascript-practice/00_expressions_variables/exercises/A_executing_code_exercise/ - -### [javascript-practice/00_expressions_variables/exercises/A_executing_code_exercise/README.md](javascript-practice/00_expressions_variables/exercises/A_executing_code_exercise/README.md) -# Write, Run, Repeat - -You won't become a strong programmer with "one secret trick" or "however-many expert tips". No -shortcuts. Just write code, run it, do it again. We'll be creating and executing hundreds of -programs in this course. Let's bang out the first four. - -Before you start this exercise, make sure you have watched the lecture first. - -+ [Lecture](https://youtu.be/U-679Jd3fmQ) - -If you get stuck during this exercise, reference this walkthrough. Only watch enough of the -walkthrough to get yourself unstuck, then pause the video and pick up the exercise on your own. - -+ [Walkthrough](https://youtu.be/f7CZUGFdhfg) - -Let's get to work. - --AZ - -## 0. Follow my lead. - -1. If you already have VSCode open, close it. -2. On your computer's Desktop, create a new folder named `my-first-programs`. -3. Open the `my-first-programs` folder in VSCode -4. Use VSCode to create a file named `greeting.js` inside of `my-first-programs`. -5. Inside of `greeting.js`, write the single line of code `console.log('hello world');`. This will - cause the program to print `hello world` when you execute it later. -6. Save the `greeting.js` file using the keyboard shortcut `cmd + s` or `ctrl + s`. -7. Open the terminal and enter the command `node greeting.js` to execute your code. **You should see - `hello world` printed out.** - -## 1. Still following? - -1. Inside the `my-first-programs` folder, create a new file named `whoami.js`. -2. Inside of `whoami.js` use `console.log` to print out your first name. Don't forget to put - quotation marks (`'`) around your name and end the line with a semicolon (`;`). -3. Save `whoami.js` and execute it in your terminal using the `node`. **You should see your name - printed out.** - -## 2. I'll follow you. - -Start from scratch. Close VSCode if you have it open. Use VSCode to write a program named -`thirsty.js` inside of the `my-first-programs` folder. The program should print out your favorite -cold beverage. Execute `thirsty.js` in your terminal. - -## 3. Beginner's luck; show me it again. - -That seems suspicious. Write a program named `age.js` that prints out your age. Run it. - -## Walkthrough - - - - - - - - - -
javascript-practice/00_expressions_variables/exercises/B_expressions_exercise/ - -### [javascript-practice/00_expressions_variables/exercises/B_expressions_exercise/README.md](javascript-practice/00_expressions_variables/exercises/B_expressions_exercise/README.md) -# Express Yourself - -_Expressions_ are the building blocks of programs. We can combine _values_ with _operators_ to -compose an expression. An _expression_ evaluates to some _value_. - -Before you start this exercise, make sure you have watched the lecture first. - -+ [Lecture Part 1](https://youtu.be/NORcxNPVtg4) -+ [Lecture Part 2](https://youtu.be/1y9DCzWYons) - -If you get stuck during this exercise, reference this walkthrough. Only watch enough of the -walkthrough to get yourself unstuck, then pause the video and pick up the exercise on your own. - -+ [Walkthrough](https://youtu.be/oMHa_c21sCw) - -The fundamentals of any skill aren't particularly glamorous. We'll learn the "cool" stuff when you -are ready. Crawl. Walk. Run. - --AZ - -## 0. Hope you didn't forget. - -Create a new folder named `expressions-exercise`. Open it in VSCode. Create four files within this -folder: `string-expressions.js`, `number-expressions.js`, `boolean-expressions.js`, -`comparisons.js`. - -After creating these files, your folder structure should look like this: - -```plaintext -expressions-exercise/ -├── string-expressions.js -├── number-expressions.js -├── boolean-expressions.js -└── comparisons.js -``` - -## 1. Stringing together some expressions. - -Make a mental prediction of what the following expressions will print: - -```javascript -console.log("river" + "town"); -console.log("cat" + "dog"); -console.log("New" + " York"); -console.log("runner's knee" + "!"); -console.log("man" + "bear" + "pig"); -``` - -To check your prediction, write the code into `string-expressions.js` and run it in your terminal -with `node string-expressions.js`. Don't copy and paste. Type everything manually. You should do -this line by line. This means you should type the first expression, run it. Add the second -expression, run it, and so on. Don't try to type all five lines and then run it all at once. You -will find it hard to pinpoint any typos if you do that. - -## 2. Don't enjoy math? Too bad. - -Make predictions for what these number expressions evaluate to. Test your predictions by writing the -code to `number-expressions.js` and running it: - -```js -console.log(2 + 3); -console.log(10 - 15); -console.log(4 + 1 - 5); -console.log(4 * 3); - -console.log(7 / 2); -console.log(4 + 2 * 3); -console.log((4 + 2) * 3); -console.log(5 % 2); - -console.log(6 % 2); -console.log(7 % 2); -console.log(8 % 2); -console.log(19 % 8); - -console.log(24 % 8); -console.log(7 % 4); -console.log(4 % 7); -console.log(5 + (10 % 5)); -console.log((5 + 10) % 5); -``` - -## 3. Shoutout to George Boole. - -Make predictions for what these boolean expressions evaluate to. Test your predictions by writing -the code to `boolean-expressions.js` and running it: - -```js -console.log(false); -console.log(!true); -console.log(!false); -console.log(!!true); - -console.log(false && false); -console.log(false && true); -console.log(true && false); -console.log(true && true); - -console.log(false || false); -console.log(false || true); -console.log(true || false); -console.log(true || true); - -console.log(!false || false); -console.log(false || (true && true)); -console.log(false || !(true && true)); -console.log(!true && (false || true)); -``` - -## 4. Drawing a Comparison. - -Make predictions for what these comparison expressions evaluate to. Test your predictions by writing -the code to `comparisons.js` and running it: - -```js -console.log(true === false); -console.log(false === false); -console.log(false !== true); -console.log(!true === false); - -console.log(2 + 3 === 5); -console.log(4 < 0); -console.log(10 >= 10); -console.log(10.3 >= 10); - -console.log(100 / 2 === 50); -console.log(100 % 2 === 0); -console.log(11 % 2 === 0); -console.log(7.0 === 7); - -console.log(13 % 5 > 0); -console.log("potato" === "potato"); -console.log("Tomato" === "tomato"); -console.log("42" === 42); -console.log(5 > 3 && 1 === 0); -``` - -## Walkthrough - - - - - - - - - -
javascript-practice/00_expressions_variables/exercises/C_variables_exercise/ - -### [javascript-practice/00_expressions_variables/exercises/C_variables_exercise/README.md](javascript-practice/00_expressions_variables/exercises/C_variables_exercise/README.md) -# Very Able - -_Variables_ allow programmers to store values to be used later in their code. The value that a -variable contains can change throughout the runtime of a program. - -Before you start this exercise, make sure you have watched the lecture first. - -+ [Lecture](https://youtu.be/lmXRLpoyPic) - -If you get stuck during this exercise, reference this walkthrough. Only watch enough of the -walkthrough to get yourself unstuck, then pause the video and pick up the exercise on your own. - -+ [Walkthrough](https://youtu.be/T_xE-x0Eyqk) - -Ready? - --AZ - -## 0. Do you speak the language? - -Create a folder named `variables_exercise`. Create a file named `zero.js` inside of it. Predict what -the `console.log`s in the code below will print out: - -```js -let location = "Brooklyn, " + "NY"; -console.log(location); - -let quantity = 4 * 5 + 1; -console.log(quantity); -``` - -Test your predictions by typing the code into the `zero.js` file; don't copy and paste. Run it to -check your guess. - -## 1. What's changed? What hasn't? - -Create a new file named `one.js` inside of the `variables_exercise` folder. Predict what the -`console.log`s in the code below will print out: - -```js -let word = "bye"; -console.log(word + " felicia"); -console.log(word); - -let num = 10; -num = num * 2; -console.log(num); - -let bottlesOfBeer = 99; -let around = bottlesOfBeer - 1; -console.log(around); -console.log(bottlesOfBeer); -``` - -Test your predictions by typing the code into the `one.js` file. Run it. - -## 2. How about this? - -Create a new file named `two.js` inside of the `variables_exercise` folder. Predict what the -`console.log`s in the code below will print out: - -```js -let apple; -console.log(apple); - -apple = 5; -console.log(apple); - -apple + 1; -console.log(apple); - -apple += 1; -console.log(apple); - -let banana = apple; -console.log(banana); - -banana = banana / 2; -console.log(banana); - -console.log(apple); -``` - -Test your predictions by typing the code into the `two.js` file. Run it. - -## 3. Did you forget about modulo? - -Create a new file named `three.js` inside of the `variables_exercise` folder. Predict what the -`console.log`s in the code below will print out: - -```js -let qty = 15 % 4; -console.log(qty); - -let num = 38 + 3; -num++; -console.log(num + " is a great number"); - -let isNumEven = num % 2 === 0; -console.log(num + " is even? " + isNumEven); - -let isQtyEven = qty % 2 === 0; -console.log(qty + " is even? " + isQtyEven); -``` - -## 4. So you can code, but do you have good taste in cinema? - -Create a new file named `four.js` inside of the `variables_exercise` folder. Create two variables: - -- `movie`, assigned to the string title of your favorite movie -- `views`, assigned to the number of times you watched that movie - -When executed, the program should print the message -`I watched about number of times`. - -## Walkthrough - - - - - - - - - -
javascript-practice/00_expressions_variables/exercises/D_string_indexing_and_methods_exercise/ - -### [javascript-practice/00_expressions_variables/exercises/D_string_indexing_and_methods_exercise/README.md](javascript-practice/00_expressions_variables/exercises/D_string_indexing_and_methods_exercise/README.md) -# Intelligent Indexing - -A string consists of one or more characters. An _index_ is a number that corresponds to the position -of a character in a string. The first character of a string has _index 0_, the second character has -_index 1_, and so on. _Indexing_ is a pattern that programmers use often in strings. This pattern -will also appear later in more advanced applications. - -Before you start this exercise, make sure you have watched the lecture first. - -+ [Lecture](https://youtu.be/QoeKfd9MYWA) - -If you get stuck during this exercise, reference this walkthrough. Only watch enough of the -walkthrough to get yourself unstuck, then pause the video and pick up the exercise on your own. - -+ [Walkthrough Part 1](https://youtu.be/lXlNybyHclc) -+ [Walkthrough Part 2](https://youtu.be/4sf1uP9OIDI) - -This is where we begin to unlock the basic programming patterns that you'll always be able to rely -on. Study them closely. - --AZ - -## 0. Small String Snippets. - -Create a new folder named `string-indexing-and-methods`. Create a file named -`small-string-snippets.js` inside. Predict what the following code will print out: - -```js -console.log("promenade"[3]); -console.log("tiger"[1]); -console.log("wheel".length); -console.log("wheel".length - 1); -console.log("noMAD".toUpperCase()); -console.log("hey programmers"[2] === "y"); - -console.log("volleyball".length > 20); -console.log("treasure".indexOf("r")); -console.log("treasure".indexOf("e")); -console.log("web"[5]); -console.log("red".indexOf("x")); -console.log("red".indexOf("R")); -``` - -Verify your predictions by writing the code to the `small-string-snippets.js` file. Don't copy and -paste; type everything out manually. Run the code. - -## 1. Proper Patterns. - -Inside of the `string-indexing-and-methods` folder create another file named `proper-patterns.js`. -Predict what the following code will print out: - -```js -let word = "suspension bridge"; -console.log(word[4]); -console.log(word.length > 5 && word[0] === "d"); -console.log(word.length > 5 && word[0] === "s"); -console.log(word.indexOf("o") > -1); -console.log(word.indexOf("z") > -1); - -let str = "foggy"; -console.log(str[2 + 1]); -console.log(str[str.length - 1]); -str = " day"; -console.log(str); -console.log(str.length); -console.log(str.indexOf("ogg")); -``` - -Type the code. Don't copy and paste. Run it. Check your predictions. - -## 2. Dare to Decipher? - -Inside of the `string-indexing-and-methods` folder create another file named `dare-to-decipher.js`. -Predict what the following code will print out: - -```js -let phrase = "that's all folks"; -console.log(phrase[phrase.length]); -console.log(phrase[phrase.length - 1]); -console.log(phrase[phrase.length - 2]); - -const i = 9; -const char = phrase[i]; -console.log(char); -console.log(phrase.indexOf(char)); -console.log(phrase.slice(2, 8)); - -console.log("abcdefg".slice(1, 3)); -console.log("abcdefg".slice(2)); -console.log("abcdefg".slice(4)); -console.log("abcdefg".slice(2, -1)); -console.log("abcdefg".slice(2, -2)); -``` - -Nice code. Run it. - -## 3. A Tedious Task - -Inside of the `string-indexing-and-methods` folder create another file named `a-tedious-task.js`. -Write the program so that it prints out the index where the substring `HEY` can be found in the text -below. - -```plaintext -MIICWwIBAAKBgGEdLjFEFbegPZ2AwJWkalksXr7PzWL7wIc7pOFZxXwYPWtQxvANyceCwpkqbPLsfEx7nqxAris2hYOdeN1OTFqvTyNmVuzbUPcXShn6ZoDCB30voHkeu4F3cUw5RQEUDdLscSnv4HMxHam5qgl6vXoumVNHbjyKA5UtAnfjAgMBAAECgYAmjEyvpZTxRJvwjxDi1VaZevFI0Hd4WPH9PAGgqdnH84vGXnAGFj1WikqKYcqKMQW2kdjAsWwH9D9FfrkIcDDHdZ9XuGSGkFzWtOwajWMQl7qNV1hZ288gdpIQQMOTLDgauZY6pw1cV7h4v316qJB8knQGoBNpJCfTYQJBAKV1ctsJq0Zg4QumD2hyODepP3LfLeaQsERLqVAWeuOuTY5mK5gIwsSqvcSVfY7Ze1FWIsApNFRv67azKcJPwsCQQCNlyApZFJEVNY70Er7Uu5NL9t4CYJJC9uVVkoEHEY6d7sVslqa0vP2q0zXx9YedbMBvQjxXIbY0waXUy63FvoBGJAkB3OTJWUjVgzDY1Br5wu2Yu59NjKVKLWzCsu1gaCNBfhVDX7SyIyC9EYKRfUAoQxwsmPWPyQ9QVG4WKcPZJAkBRheAotPCBE2RLHHfvpiStnMhX0UXdVyaJp5tcZ6wYV61ohyBvCOkYhUxBJzeIGrVZcvLZSLeUzXoqRPpxQxAkEAkdCZXF0gHahpZgF5y0wWcqf9ECRT1E4Hv8bk3Mf0Exp2aW34JeI6I7Xqd1NV4I9H7prQ8m3y39lFwWO8PmQ -``` - -Fine. You can copy and paste, _this_ time. - -## Walkthrough - - - - - - - - - -
javascript-practice/01_conditionals/exercises/A_conditionals_exercise/ - -### [javascript-practice/01_conditionals/exercises/A_conditionals_exercise/README.md](javascript-practice/01_conditionals/exercises/A_conditionals_exercise/README.md) -# Strength and Conditioning - -A _conditional_ is a construct that allows programmers to execute different code dependent on the -value of a boolean expression. - -Before you start this exercise, make sure you have watched the lecture first. - -+ [Lecture](https://youtu.be/ous6eeG2BaY) - -If you get stuck during this exercise, reference this walkthrough. Only watch enough of the -walkthrough to get yourself unstuck, then pause the video and pick up the exercise on your own. - -+ [Walkthrough Part 1](https://youtu.be/o50tHXYQzFE) -+ [Walkthrough Part 2](https://youtu.be/Ij7V0JfxeUs) - -_If_ you want to learn how to code, _then_ code. - --AZ - -## 0. If you can do this, then move on. - -Create a new folder named `conditional_exercise`. Inside, create a file named `zero.js`. Predict -what each of the code snippets below will print out. After you make a prediction for a snippet, add -the snippet into `zero.js`. Don't copy and paste. Run the code to verify your prediction for that -snippet, then move on to the next snippet. - -```js -// snippet 0-1 -if (true) { - console.log("foo"); -} - -if (false) { - console.log("bar"); -} -``` - -```js -// snippet 0-2 -if (false || false) { - console.log("boop"); -} - -if (true || false) { - console.log("beep"); -} -``` - -```js -// snippet 0-3 -let num = 40; - -if (num > 0) { - console.log("zip"); -} - -if (num % 2 === 0) { - console.log("zoop"); -} -``` - -```js -// snippet 0-4 -let word = "jeep"; - -if (word[0] === "d") { - console.log("yer"); -} else { - console.log("nah"); -} -``` - -```js -// snippet 0-5 -let sentence = "roger that"; - -if (sentence[sentence.length - 1] === "t") { - console.log("ends in t"); -} else { - console.log("does not end in t"); -} - -if (sentence.length <= 4) { - console.log("short"); -} else { - console.log("long"); -} -``` - -## 1. Conditions Do Apply. - -Create a new file named `one.js` inside of the `conditional_exercise` folder. Predict what each of -the snippets below will print out. Type each snippet into the file and run it to test your -prediction. Don't copy and paste. - -```js -// snippet 1-0 -let qty = 38; - -if (qty > 30 && qty % 5 === 4) { - console.log("swish"); -} else { - console.log("swoosh"); -} - -if (qty > 0) { - console.log("pos"); -} -``` - -```js -// snippet 1-1 -let a = "celery"; -let b = "SQUASH"; - -if (a === a.toUpperCase()) { - console.log("alpha"); -} - -if (b === b.toUpperCase()) { - console.log("beta"); -} -``` - -```js -// snippet 1-2 -let number = 9; - -if (number > 4) { - console.log("ding"); -} else if (number % 3 === 0) { - console.log("dong"); -} -``` - -```js -// snippet 1-3 -let z = 12; - -if (z > 10) { - console.log("vroom"); -} - -if (z % 3 === 0) { - console.log("skrrt"); -} -``` - -## 2. Iffy. - -Create a new file named `two.js` inside of the `conditional_exercise` folder. Predict what each of -the snippets below will print out. Type each snippet into the file and run it to test your -prediction. Don't copy and paste. - -```js -// snippet 2-1 -let nonsense = "blog trust fund tattooed williamsburg poke roof party"; -let hasOk = nonsense.indexOf("ok") > -1; - -if (hasOk) { - console.log("yeet"); -} else if (nonsense.length > 10) { - console.log("yo"); -} else { - console.log("no"); -} - -let hasZoo = nonsense.indexOf("zoo") > -1; -let hasFun = nonsense.indexOf("fun") > -1; - -if (hasZoo && hasOk) { - console.log("cool"); -} else if (hasOk) { - console.log("rad"); -} else if (hasFun) { - console.log("dope"); -} else { - console.log("nope"); -} -``` - -```js -// snippet 2-2 - -let q = 25; -if (q % 3 === 0 && q % 5 === 0) { - console.log("both"); -} else if (q % 3 === 0 || q % 5 == 0) { - console.log("either"); -} else { - console.log("neither"); -} - -let r = 9; -if (r % 3 === 0 && r % 5 === 0) { - console.log("both"); -} else if (r % 3 === 0 || r % 5 == 0) { - console.log("either"); -} else { - console.log("neither"); -} - -let s = 15; -if (s % 3 === 0 && s % 5 === 0) { - console.log("both"); -} else if (s % 3 === 0 || s % 5 == 0) { - console.log("either"); -} else { - console.log("neither"); -} -``` - -## 3. Conditional Love. - -Create a new file named `three.js` inside of the `conditional_exercise` folder. The program should -print out `FOUND` if the substring `coDe` exists in the text below. If the `coDe` does not exist in -the text, then the program should print `NOT FOUND`. - -```plaintext -AIICXAIBAAKBgQCuw0YyucjI9bf7yRhIkyg4Ru6kYU7O6fIn2JoFDzCZNkzDdsuXFGh6BXNvbu8uZUT289ERzYP1QjryMEKWzcbtsioyQApL7AgOZyFc3JJ7wvupHhIj2sqxJNtpAh7HQFG08rYh2Pb3HwOm83rbTomM6LnnjooGcoDeuWkuPqXsRlwIDAQABAoGAeQkbPBR5n9y2QLaEjcDGv7dVpFiMGHMaZZVDX34rZPy1EkZNZqlQU0jopLVvLyLESMh9A7gKhqoyMAbgZPpdb0CvniTJPpKYk24mLBeym8rBMW3XBmKk1xIOcJPGXMxeJW61jxPg6doah0aCIjf8n0Z8t8B81kLFojpECQQDzlCp0Nzka3AVZVPdBuuPg0fzeV8ugpiPEp6wQLjIMDFqYtGoAOEy4JpkmkK7zwsQsHZ8jbOtqIFdRLPrvAkEAruU321Ie1CnYCHX4Q79vLcDeWOUpdzEHp2uzDIfzP1gv7RIktGgSZWKhrnNWdeH4Y0CFb9lu6TQYJwNJvug2QJBANX0m3Uds9P9pLbQlI9WWmAtYqIZrsBElcAjOgAik0uOfawholNiw5B3ADvIYqPkLW4dGk1dO6zxW8ZF83MdMCQHGfhxLuFgsOBSfF7Bj4UX6T9FGhUGSXiqUsd06E2mMRLAjWUUUw82DLwucxMrSsV4z1aN57asC8YuQ9FkCQGirlVCt4ccXeGLCHcCsI8AYQJFRzbMs381M16jEpnaKUGrtdbMW018gWJ0EoD4tS2YZpr1hEbtiOkPJaaTKQ -``` - -You may copy and paste. What a time to be alive. - -## Walkthrough - - - - - - - - - -
javascript-practice/02_functions/exercises/A_functions_exercise/ - -### [javascript-practice/02_functions/exercises/A_functions_exercise/README.md](javascript-practice/02_functions/exercises/A_functions_exercise/README.md) -# What's your function? - -_Functions_ are constructs that allow programmers to group multiple statements together into a -single logical unit. Functions may take _arguments_ as input and return some value as output. - -Before you start this exercise, make sure you have watched the lecture first. - -+ [Lecture](https://youtu.be/g7fBqWTdeMw) - -If you get stuck during this exercise, reference this walkthrough. Only watch enough of the -walkthrough to get yourself unstuck, then pause the video and pick up the exercise on your own. - -This is where we bring well defined structure to our code. If so far we've only learned the isolated -"words", "phrases", and "sentences" of programming, we now turn our attention to the "paragraphs". - -+ [Walkthrough Part 1](https://youtu.be/hS-p8ICd7Ek) -+ [Walkthrough Part 2](https://youtu.be/pE9JYGobDQg) - --AZ - -## 0. Practice how to read. - -Before you write functions on your own, let's warm up by interpretting a few. - -Create a new folder named `A_functions_exercise`. Predict what would print when executing each of -the snippets below. Test your prediction by typing the snippet into their own files and executing -the program. Don't copy and paste. - -Write the below code into a file named `snippet-0-1.js`. Make a prediction for what it will print. -Run it. - -```js -// snippet 0-1 -let greet = function () { - console.log("hey"); - console.log("programmers"); -}; - -let whistle = function () { - console.log("doot"); -}; - -console.log("first"); -console.log("second"); -greet(); -console.log("third"); -console.log("fourth"); -whistle(); -``` - -Write the below code into a file named `snippet-0-2.js`. Make a prediction for what it will print. -Run it. - -```js -// snippet 0-2 -let howMany = function () { - return 42; -}; - -console.log(howMany); -console.log(howMany()); - -const theAnswer = howMany(); -console.log(theAnswer); - -let howMuch = function () { - 5; -}; -console.log(howMuch()); -``` - -Write the below code into a file named `snippet-0-3.js`. Make a prediction for what it will print. -Run it. - -```js -// snippet 0-3 -let average = function (num1, num2) { - console.log("calculating..."); - return (num1 + num2) / 2; -}; - -console.log(average(5, 10)); -console.log(average(20, 26)); -console.log(average(50, 100) + 2); - -let a = 21 + 3; -let b = 20; -let n = average(a, b); -console.log(average(n, 18)); -``` - -Write the below code into a file named `snippet-0-4.js`. Make a prediction for what it will print. -Run it. - -```js -// snippet 0-4 -let exclaim = function (str) { - let capitalized = str.toUpperCase(); - return capitalized + "!!"; -}; - -let result = exclaim("potato"); -console.log(result); -console.log(result.length); -console.log(result[0]); -console.log(result[result.length - 1]); -``` - -## 1. Practice how to write. - -In this section of the exercise you'll be prompted to write a function to accomplish a specific -task. Read the description and look at the example output to figure out what should be implemented -within the function. Write each function to a separate file in the `A_functions_exercise` folder and -test your work by running the file. - -### isDivBy4 - -Create an `is-div-by-4.js` file and solve the function below: - -```js -// Write a function `isDivBy4` that accepts a number as an argument. The function should return a -// boolean indicating whether or not the number is divisible by 4. - -console.log(isDivBy4(8)); // true -console.log(isDivBy4(12)); // true -console.log(isDivBy4(24)); // true -console.log(isDivBy4(9)); // false -console.log(isDivBy4(10)); // false -``` - -### keepItQuiet - -Create a `keep-it-quiet.js` file and solve the function below: - -```js -// Write a function `keepItQuiet` that accepts a string as an argument. The function should return the -// lowercase version of the string with 3 periods added to the end of it. - -console.log(keepItQuiet("HOORAY")); // 'hooray...' -console.log(keepItQuiet("Doggo")); // 'doggo...' -console.log(keepItQuiet("WHAT?!?!")); // 'what?!?!...' -``` - -### isLong - -Create an `is-long.js` file and solve the function below: - - -```js -// Write a function `isLong` that accepts a string as an argument. The function should return a boolean -// indicating whether or not the string is longer than 5 characters - -console.log(isLong("pie")); // false -console.log(isLong("kite")); // false -console.log(isLong("kitty")); // false -console.log(isLong("telescope")); // true -console.log(isLong("thermometer")); // true -console.log(isLong("restaurant")); // true -``` - -### half - -Create a `half.js` file and solve the function below: - - -```js -// Write a function `half` that accepts a number as an argument. The function should return half of the -// number. - -console.log(half(8)); // 4 -console.log(half(15)); // 7.5 -console.log(half(90)); // 45 -``` - -### endsWithT - -Create an `endsWithT.js` file and solve the function below: - -```js -// Write a function `endsWithT` that accepts a string as an argument. The function should return a -// boolean indicating whether or not the string ends with the character 't'. - -console.log(endsWithT("smart")); // true -console.log(endsWithT("racket")); // true -console.log(endsWithT("taco")); // false -console.log(endsWithT("boomerang")); // false -``` - -### average - -Create an `average.js` file and solve the function below: - - -```js -// Write a function `average` that accepts three numbers as arguments. The function should return the -// average of the three numbers. - -console.log(average(3, 10, 8)); // 7 -console.log(average(10, 5, 12)); // 9 -console.log(average(6, 20, 40)); // 22 -``` - -## Walkthrough - - - Watch it -in 1.5x speed if you like. - - - - - -
javascript-practice/02_functions/exercises/B_functions_exercise/ - -### [javascript-practice/02_functions/exercises/B_functions_exercise/README.md](javascript-practice/02_functions/exercises/B_functions_exercise/README.md) -# Functional Fitness - -_Functions_ group together statements deliberately with a purpose in mind. They should do one thing -and do it well. - -If you get stuck during this exercise, reference this walkthrough. Only watch enough of the -walkthrough to get yourself unstuck, then pause the video and pick up the exercise on your own. - -+ [Walkthrough](https://youtu.be/YQjR-TSWE-U) - -Programmers write functions. You are a programmer. You write functions. - --AZ - -## Instructions - -Create a new folder named `B_functions_exercise`, this is where you'll save all of your files. Solve -each of the prompts below. Create a new file for each prompt and execute your code to see if it -matches the example output. - -### startsWithR - -Create a `starts-with-r.js` file and solve the function below: - -```js -// Write a function `startsWithR` that accepts a string as an argument and returns a boolean indicating -// whether or not the string starts with 'r' or 'R'. - -console.log(startsWithR("roger that")); // true -console.log(startsWithR("Row, row, row your boat")); // true -console.log(startsWithR("slip")); // false -console.log(startsWithR("Taxicab")); // false -``` - -### parity - -Create a `parity.js` file and solve the function below: - -```js -// Write a function `parity` that accepts a number as an argument. The function should return the -// string 'even' if the number is even. It should return the string 'odd' if the number is odd. - -console.log(parity(5)); // 'odd' -console.log(parity(7)); // 'odd' -console.log(parity(13)); // 'odd' -console.log(parity(32)); // 'even' -console.log(parity(10)); // 'even' -console.log(parity(602348)); // 'even' -``` - -### longer - -Create a `longer.js` file and solve the function below: - -```js -// Write a function `longer` that accepts two strings as arguments. The function should return the -// string that is longer. If the strings have the same length, then return the first string. - -console.log(longer("drum", "piranha")); // 'piranha' -console.log(longer("basket", "fork")); // 'basket' -console.log(longer("flannel", "sustainable")); // 'sustainable' -console.log(longer("disrupt", "ability")); // 'disrupt' -console.log(longer("bird", "shoe")); // 'bird' -``` - -### oneOrNone - -Create a `one-or-none.js` file and solve the function below: - -```js -// Write a function `oneOrNone` that accepts two booleans as arguments. The function should return true -// if exactly one of the arguments is true. If BOTH arguments are true, then it should return false. - -console.log(oneOrNone(false, false)); // false -console.log(oneOrNone(true, false)); // true -console.log(oneOrNone(false, true)); // true -console.log(oneOrNone(true, true)); // false -``` - -### endsInLy - -Create a `ends-in-ly.js` file and solve the function below: - -```js -// Write a function `endsInLy` that accepts a string as an argument and returns a boolean indicating -// whether or not the string ends in the substring 'ly'. - -console.log(endsInLy("pretty")); // false -console.log(endsInLy("instant")); // false -console.log(endsInLy("analytic")); // false -console.log(endsInLy("timidly")); // true -console.log(endsInLy("fly")); // true -console.log(endsInLy("gallantly")); // true -``` - -### funnySound - -Create a `funny-sound.js` file and solve the function below: - -```js -// Write a function `funnySound` that accepts two strings as arguments. The function should return a -// new string containing the first three characters of both strings concatenated together. - -// You can assume that the arguments are both at least three characters long. - -console.log(funnySound("tiger", "spoon")); // 'tigspo' -console.log(funnySound("computer", "phone")); // 'compho' -console.log(funnySound("skate", "bottle")); // 'skabot' -console.log(funnySound("frog", "ashtray")); // 'froash' -``` - -### stringSize - -Create a `string-size.js` file and solve the function below: - -```js -// Write a function `stringSize` that accepts a string as an argument. The function should return the -// string 'small' if the argument is shorter than 5 characters, 'medium' if it is exactly 5 characters, and -// 'large' if it is longer than 5 characters. - -console.log(stringSize("cat")); // 'small' -console.log(stringSize("bell")); // 'small' -console.log(stringSize("ready")); // 'medium' -console.log(stringSize("shirt")); // 'medium' -console.log(stringSize("shallow")); // 'large' -console.log(stringSize("intelligence")); // 'large' -``` - -### wackyWord - -Create a `wacky-word.js` file and solve the function below: - -```js -// Write a function `wackyWord` that accepts two strings as arguments. The function should return a new -// string containing the first three characters of the first string concatenated with the last two -// character of the second string. - -// You can assume that the first argument has a length of at least three and the second argument has a -// length of at least two. - -console.log(wackyWord("very", "kindly")); // 'verly' -console.log(wackyWord("forever", "sick")); // 'forck' -console.log(wackyWord("cellar", "door")); // 'celor' -console.log(wackyWord("bagel", "sweep")); // 'bagep' -``` - -## Walkthrough - - - - - - - - - -
javascript-practice/02_functions/exercises/C_functions_exercise/ - -### [javascript-practice/02_functions/exercises/C_functions_exercise/README.md](javascript-practice/02_functions/exercises/C_functions_exercise/README.md) -# Major Malfunction - -More practice! - -If you get stuck during this exercise, reference this walkthrough. Only watch enough of the -walkthrough to get yourself unstuck, then pause the video and pick up the exercise on your own. - -+ [Walkthrough](https://youtu.be/KCv1ovMB4DU) - -I think the reason why coding has a reputation for being nonintuitive is because beginners don't -spend enough time on the basics. They miss a step early, but instead of filling that gap of -knowledge, they preemptively move on. They'll stumble through more advanced topics until that debt -cannot be ignored. That is why I think it's important to exercise a concept extensively. Write code. -Run it. - --AZ - -## Instructions - -Create a new folder named `C_functions_exercise`, this is where you'll save all of your files. Solve -each of the prompts below. Create a new file for each prompt and execute your code to see if it -matches the example output. - -### divisible - -Create a `divisible.js` file and solve the function below: - -```js -// Write a function `divisible(num1, num2)` that accepts two numbers as arguments. The function should -// return a boolean indicating whether or not `num1` is divisible by `num2`. - -console.log(divisible(12, 3)); // true -console.log(divisible(12, 5)); // false -console.log(divisible(60, 4)); // true -console.log(divisible(60, 11)); // false -console.log(divisible(21, 7)); // true -console.log(divisible(21, 6)); // false -``` - -### caseChanger - -Create a `case-changer.js` file and solve the function below: - -```js -// Write a function `caseChange` that accepts a string and a boolean as arguments. The function should -// return the uppercase version of the string if the boolean is true. The function should return the -// lowercase version of the string if the boolean is false. - -console.log(caseChange("Super", true)); // 'SUPER' -console.log(caseChange("Super", false)); // 'super' -console.log(caseChange("tAmBourine", true)); // 'TAMBOURINE' -console.log(caseChange("tAmBourine", false)); // 'tambourine' -``` - -### inRange - -Create a `in-range.js` file and solve the function below: - -```js -// Write a function `inRange(min, max, n)` that accepts three numbers as arguments. The function should -// return a boolean indicating if `n` is between `min` and `max` inclusive. - -console.log(inRange(5, 13, 8)); // true -console.log(inRange(5, 13, 29)); // false -console.log(inRange(100, 125, 100)); // true -console.log(inRange(100, 125, 99)); // false -console.log(inRange(40, 45, 44)); // true -console.log(inRange(40, 45, 45)); // true -console.log(inRange(40, 45, 46)); // false -``` - -### averageOfFour - -Create an `average-of-four.js` file and solve the function below: - -```js -// Write a function `averageOfFour(num1, num2, num3, num4)` that accepts four numbers as arguments. The -// function should return the average of all four numbers. - -console.log(averageOfFour(10, 4, 12, 3)); // 7.25 -console.log(averageOfFour(-20, 50, 4, 21)); // 13.75 -console.log(averageOfFour(10, 4, 12, 3)); // 7.25 -console.log(averageOfFour(5, 5, 3, 7)); // 5 -``` - -### numberChange - -Create a `number-change.js` file and solve the function below: - -```js -// Write a function `numberChange` that accepts a number as an argument. The function should return -// half the number if it is even. The function should return double the number if it is odd. - -console.log(numberChange(6)); // 3 -console.log(numberChange(7)); // 14 -console.log(numberChange(16)); // 8 -console.log(numberChange(21)); // 42 -``` - -### larger - -Create a `larger.js` file and solve the function below: - -```js -// Write a function `larger` that accepts two numbers as arguments. The function should return the -// larger number. - -console.log(larger(256, 400)); // 400 -console.log(larger(31, 4)); // 31 -console.log(larger(-6, 7)); // 7 -console.log(larger(11.3, 11.2)); // 11.3 -console.log(larger(-10, -3)); // -3 -``` - -### contains - -Create a `contains.js` file and solve the function below: - -```js -// Write a function `contains(str1, str2)` that accepts two strings as arguments. The function should -// return a boolean indicating whether or not `str2` is contained within `str1`. The function should -// ignore any differences in capitalization. - -console.log(contains("caterpillar", "pill")); // true -console.log(contains("lion's share", "on")); // true -console.log(contains("SORRY", "or")); // true -console.log(contains("tangent", "gem")); // false -console.log(contains("clock", "ok")); // false -``` - - -## Walkthrough - - - - - - - - - -
javascript-practice/03_loops/exercises/A_loops_exercise/ - -### [javascript-practice/03_loops/exercises/A_loops_exercise/README.md](javascript-practice/03_loops/exercises/A_loops_exercise/README.md) -# In For a Loop - -_Loops_ are a construct that programmers use control the repeated execution of code. - -Before you start this exercise, make sure you have watched the lecture first. - -+ [Lecture](https://youtu.be/gs4WlW-ZQfg) - -If you get stuck during this exercise, reference this walkthrough. Only watch enough of the -walkthrough to get yourself unstuck, then pause the video and pick up the exercise on your own. - -+ [Walkthrough Part 1](https://youtu.be/D_Vh-Opw-_I) -+ [Walkthrough Part 2](https://youtu.be/rlolQAocQyA) - -I think loops are great because we can type a small amount of code, but instruct the computer to -perform a lot of "work". The programmer is lazy and computer doesn't complain. What a perfect pair. - --AZ - -## 0. Read. Run. Repeat. - -Can you anticipate what these loop snippets will print out? - -Create a new folder named `A_loops_exercise`. Predict what would print when executing each of the -snippets below. Test your prediction by typing the snippet into their own files and executing the -program. Don't copy and paste. - -Write the below code into a file named `snippet-1.js`. Make a prediction for what it will print. Run -it. - -```js -// snippet 1 -console.log("hello"); - -for (let i = 0; i < 5; i++) { - console.log("code"); -} - -console.log("goodbye"); -``` - -Write the below code into a file named `snippet-2.js`. Make a prediction for what it will print. Run -it. - -```js -// snippet 2 -console.log("hi"); - -for (let i = 3; i <= 7; i++) { - console.log("program"); - console.log(i); -} - -console.log("bye"); -``` - -Write the below code into a file named `snippet-3.js`. Make a prediction for what it will print. Run -it. - -```js -// snippet 3 -let foo = function () { - for (let num = 10; num > 0; num -= 2) { - console.log(num); - } -}; - -console.log("begin"); -foo(); -console.log("end"); -foo(); -``` - -Write the below code into a file named `snippet-4.js`. Make a prediction for what it will print. Run -it. - -```js -// snippet 4 -let word = "street"; -for (let i = 0; i < word.length; i++) { - console.log(i); - console.log(word[i]); -} -``` - -Write the below code into a file named `snippet-5.js`. Make a prediction for what it will print. Run -it. - -```js -// snippet 5 -let total = 0; -for (let i = 1; i < 5; i++) { - total += i; - console.log(total); -} - -console.log("grand total: " + total); -``` - -## 1. Stay in the Loop. - -In this section of the exercise you'll be prompted to write a function to accomplish a specific -task. Read the description and look at the example output to figure out what should be implemented -within the function. Write each function to a separate file in the `A_loops_exercise` folder and -test your work by running the file. - -### oneToFour - -Create a `one-to-four.js` file and solve the function below: - -```js -// Write a function `oneToFour` that prints all whole numbers from one to four, inclusive. The function -// takes in no arguments and doesn't need to return any value. It should just print to the terminal. - -oneToFour(); -// prints -// 1 -// 2 -// 3 -// 4 -``` - -### countUp - -Create a `count-up.js` file and solve the function below: - -```js -// Write a function `countUp(max)` that accepts a max number as an argument. The function should print -// all numbers from 1 up to and including the max. The function doesn't need to return any value. It -// should just print to the terminal. - -countUp(5); -// prints -// 1 -// 2 -// 3 -// 4 -// 5 - -countUp(3); -// prints -// 1 -// 2 -// 3 -``` - -### minToMax - -Create a `min-to-max.js` file and solve the function below: - -```js -// Write a function `minToMax(min, max)` that accepts two numbers as arguments. The function should -// print all numbers from min to max inclusive. The function doesn't need to return any value. It -// should just print to the terminal. - -minToMax(5, 9); -// prints -// 5 -// 6 -// 7 -// 8 -// 9 - -minToMax(11, 13); -// prints -// 11 -// 12 -// 13 - -minToMax(20, 11); -``` - -### stringIterate - -Create a `string-iterate.js` file and solve the function below: - -```js -// Write a function `stringIterate` that accepts a string as an argument. The function should print out -// each character of the string, one by one. The function doesn't need to return any value. It should -// just print to the terminal. - -stringIterate("celery"); -// prints -// c -// e -// l -// e -// r -// y - -stringIterate("hat"); -// prints -// h -// a -// t -``` - -### evens - -Create an `evens.js` file and solve the function below: - -```js -// Write a function `evens(max)` that accepts a max number as an argument. The function should print -// all positive even numbers that are less than the max. - -evens(11); -// prints -// 2 -// 4 -// 6 -// 8 -// 10 - -evens(8); -// prints -// 2 -// 4 -// 6 -``` - -## Walkthrough - - - - - - - - - -
javascript-practice/03_loops/exercises/B_loops_exercise/ - -### [javascript-practice/03_loops/exercises/B_loops_exercise/README.md](javascript-practice/03_loops/exercises/B_loops_exercise/README.md) -# Repetition Leads to Perfection - -More practice on `for` loops! - -If you get stuck during this exercise, reference this walkthrough. Only watch enough of the -walkthrough to get yourself unstuck, then pause the video and pick up the exercise on your own. - -+ [Walkthrough](https://youtu.be/7EbhmLAH__o) - -Roses are read, violets are blue, error on line 32. - --AZ - -## Instructions - -Create a new folder named `B_loops`, this is where you'll save all of your files. Solve each of the -prompts below. Create a new file for each prompt and execute your code to see if it matches the -example output. - -### fiveMultiplesOf - -Create a `five-multiples-of.js` file and solve the function below: - - -```js -// Write a function named `fiveMultiplesOf` that accepts a number as an argument. The function should -// print out the first five multiples of the given number. The function doesn't need to return any -// value. It should just print to the terminal. - -fiveMultiplesOf(7); -// prints -// 7 -// 14 -// 21 -// 28 -// 35 - -fiveMultiplesOf(3); -// prints -// 3 -// 6 -// 9 -// 12 -// 15 -``` - -### sumUpTo - -Create a `sum-up-to.js` file and solve the function below: - - -```js -// Write a function named `sumUpTo(max)` that accepts a max number as an argument. The function should -// return the total sum of all whole numbers from 1 to the max, inclusive. -// -// For example, sumUpTo(4) should return 10 because 1 + 2 + 3 + 4 = 10. - -console.log(sumUpTo(4)); // 10 -console.log(sumUpTo(5)); // 15 -console.log(sumUpTo(2)); // 3 -``` - -### noOhs - -Create a `no-ohs.js` file and solve the function below: - - -```js -// Write a function named `noOhs` that accepts a string as an argument. The functions should print the -// characters of the string one by one except the character 'o'. The function doesn't need to return -// any value. It should just print to the terminal. - -noOhs("code"); -// prints -// c -// d -// e - -noOhs("school"); -// prints -// s -// c -// h -// l -``` - -### oddSum - -Create an `odd-sum.js` file and solve the function below: - -```js -// Write a function named `oddSum(max)` that accepts a max number as an argument. The function should -// return the total sum of all odd numbers from 1 to the max, inclusive. -// -// For example, oddSum(10) should return 25 because 1 + 3 + 5 + 7 + 9 = 25 - -console.log(oddSum(10)); // 25 -console.log(oddSum(5)); // 9 -``` - -### stringRepeater - -Create a `string-repeater.js` file and solve the function below: - - -```js -// Write a function named `stringRepeater(str, num)` that accepts a string and a number as arguments. -// The function should return a new string consisting of the `str` repeated `num` number of times. - -console.log(stringRepeater("q", 4)); // 'qqqq' -console.log(stringRepeater("go", 2)); // 'gogo' -console.log(stringRepeater("tac", 3)); // 'tactactac' -``` - -### productUpTo - -Create a `product-up-to.js` file and solve the function below: - - -```js -// Write a function named `productUpTo(max)` that accepts a max number as an argument. The function -// should return the total product of all whole numbers from 1 to the max, inclusive. A product is a -// number obtained from multiplying numbers together. -// -// For example, productUpTo(4) should return 24 because 1 * 2 * 3 * 4 = 24 - -console.log(productUpTo(4)); // 24 -console.log(productUpTo(5)); // 120 -console.log(productUpTo(7)); // 5040 -``` - -### divByEither - -Create a `div-by-either.js` file and solve the function below: - - -```js -// Write a function named `divByEither(num1, num2, max)` that accepts three numbers as arguments. -// The function should print out all positive numbers less than max that are divisible by num1 or num2. -// The function doesn't need to return any value. It should just print to the terminal. - -divByEither(4, 3, 16); -// prints -// 3 -// 4 -// 6 -// 8 -// 9 -// 12 -// 15 - -divByEither(7, 5, 20); -// prints -// 5 -// 7 -// 10 -// 14 -// 15 -``` - -## Walkthrough - - - - - - - - - -
javascript-practice/03_loops/exercises/C_loops_exercise/ - -### [javascript-practice/03_loops/exercises/C_loops_exercise/README.md](javascript-practice/03_loops/exercises/C_loops_exercise/README.md) -# Like a Broken Record - -If you get stuck during this exercise, reference this walkthrough. Only watch enough of the -walkthrough to get yourself unstuck, then pause the video and pick up the exercise on your own. - -+ [Lecture](https://youtu.be/3uEzx16zwIM) - -You are getting good at solving problems using loops. Let's up the difficulty. - --AZ - -## Instructions - -Create a new folder named `C_loops`, this is where you'll save all of your files. Solve each of the -prompts below. Create a new file for each prompt and execute your code to see if it matches the -example output. - -### divisibleRange - -Create a `divisible-range.js` file and solve the function below: - -```js -// Write a function `divisibleRange(min, max, num)` that accepts three numbers as arguments. The -// function should print all numbers between `min` and `max` (exclusive) that are also divisible by -// num. - -divisibleRange(17, 40, 9); -// prints -// 18 -// 27 -// 36 - -divisibleRange(10, 24, 4); -// prints -// 12 -// 16 -// 20 -``` - -### reverseIterate - -Create a `reverse-iterate.js` file and solve the function below: - -```js -// Write a function `reverseIterate` that accepts a string as an argument. The function should print -// the characters of the string one by one, in reverse order. The function doesn't need to return any -// value. It should just print to the terminal. - -reverseIterate("carrot"); -// prints -// t -// o -// r -// r -// a -// c - -reverseIterate("box"); -// prints -// x -// o -// b -``` - -### removeCapitals - -Create a `remove-capitals.js` file and solve the function below: - -```js -// Write a function `removeCapitals` that accepts a string as an argument. The function should return a -// new version of the string with all capital letters removed. - -console.log(removeCapitals("fOrEver")); // 'frver' -console.log(removeCapitals("raiNCoat")); // 'raioat' -console.log(removeCapitals("cElLAr Door")); // 'clr oor' -``` - -### raisePower - -Create a `raise-power.js` file and solve the function below: - -```js -// Write a function `raisePower(base, exponent)` that accepts two numbers, `base` and `exponent`. The -// function should return `base` raised to the `exponent` power. -// -// For example, raisePower(2, 5) should return 32 because 2 * 2 * 2 * 2 * 2 = 32 -// For example, raisePower(4, 3) should return 64 because 4 * 4 * 4 = 64 - -console.log(raisePower(2, 5)); // 32 -console.log(raisePower(4, 3)); // 64 -console.log(raisePower(10, 4)); // 10000 -console.log(raisePower(7, 2)); // 49 -``` - -### censorE - -Create a `censor-e.js` file and solve the function below: - -```js -// Write a function `censorE` that accepts a string as an argument. The function should return the a new -// version of string where all characters that are 'e's are replaced with '*'s. - -console.log(censorE("speedy")); // 'sp**dy' -console.log(censorE("pending")); // 'p*nding' -console.log(censorE("scene")); // 'sc*n*' -console.log(censorE("heat")); // 'h*at' -``` - -### fizzBuzz - -Create a `fizz-buzz.js` file and solve the function below: - -```js -// Write a function `fizzBuzz` that accepts a max number as an argument. The function should -// print all numbers less than or equal to max that are divisible by either 3 or 5 but not both 3 -// and 5. The function doesn't need to return any value. It should just print to the terminal. - -fizzBuzz(18); -// prints -// 3 -// 5 -// 6 -// 9 -// 10 -// 12 -// 18 - -fizzBuzz(33); -// prints -// 3 -// 5 -// 6 -// 9 -// 10 -// 12 -// 18 -// 20 -// 21 -// 24 -// 25 -// 27 -// 33 -``` - -## Walkthrough - - - - - - - - - -
javascript-practice/04_arrays/exercises/A_arrays_exercise/ - -### [javascript-practice/04_arrays/exercises/A_arrays_exercise/README.md](javascript-practice/04_arrays/exercises/A_arrays_exercise/README.md) -# All Programmers Need a Raise - -_Arrays_ are a construct that programmers use to store related values in a single variable. An -_array_ contains one or more _elements_. - -Before you start this exercise, make sure you have watched the lecture first. - -+ [Lecture](https://youtu.be/ekVhX_HfbBE) - -If you get stuck during this exercise, reference this walkthrough. Only watch enough of the -walkthrough to get yourself unstuck, then pause the video and pick up the exercise on your own. - -+ [Walkthrough](https://youtu.be/mibav-eq9EY) - -New programmers often ask why the first index is 0 and not 1. Let's go half on it. 0.5? - --AZ - -## Instructions - -Create a new folder named `A_arrays`, this is where you'll save all of your files. Solve each of the -prompts below. Create a new file for each prompt and execute your code to see if it matches the -example output. - -### total - -Create a `total.js` file and solve the function below: - -```js -// Write a function `total` that accepts an array of numbers as an argument. The function should return -// the total sum of all elements of the array. - -console.log(total([3, 2, 8])); // 13 -console.log(total([-5, 7, 4, 6])); // 12 -console.log(total([7])); // 7 -console.log(total([])); // 0 -``` - -### stayPositive - -Create a `stay-positive.js` file and solve the function below: - -```js -// Write a function `stayPositive` that accepts an array of numbers as an argument. The function should -// return an array containing only the positive numbers. - -console.log(stayPositive([10, -4, 3, 6])); // [10, 3, 6] -console.log(stayPositive([-5, 11, -40, 30.3, -2])); // [11, 30.3] -console.log(stayPositive([-11, -30])); // [] -``` - -### bleepVowels - -Create a `bleep-vowels.js` file and solve the function below: - -```js -// Write a function `bleepVowels` that accepts a string as an argument. The function should return -// a new string where all vowels are replaced with `*`s. Vowels are the letters a, e, i, o, u. - -console.log(bleepVowels("skateboard")); // 'sk*t*b**rd' -console.log(bleepVowels("slipper")); // 'sl*pp*r' -console.log(bleepVowels("range")); // 'r*ng*' -console.log(bleepVowels("brisk morning")); // 'br*sk m*rn*ng' -``` - -### filterLongWords - -Create a `filter-long-words.js` file and solve the function below: - -```js -// Write a function `filterLongWords` that accepts an array of strings as an argument. The function -// should return a new array containing only the strings that are less than 5 characters long. - -console.log(filterLongWords(["kale", "cat", "retro", "axe", "heirloom"])); -// ['kale', 'cat', 'axe'] - -console.log(filterLongWords(["disrupt", "pour", "trade", "pic"])); -// ['pour', 'pic'] -``` - -### numOdds - -Create a `num-odds.js` file and solve the function below: - -```js -// Write a function `numOdds` that accepts an array of numbers as an argument. The function should -// return a number representing the count of odd elements in the array. - -console.log(numOdds([4, 7, 2, 5, 9])); // 3 -console.log(numOdds([11, 31, 58, 99, 21, 60])); // 4 -console.log(numOdds([100, 40, 4])); // 0 -``` - -### stringsToLengths - -Create a `strings-to-lengths.js` file and solve the function below: - -```js -// Write a function `stringsToLengths` that accepts an array of strings as an argument. The function -// should return a new array containing the lengths of the elements of the original array. - -console.log(stringsToLengths(["belly", "echo", "irony", "pickled"])); -// [5, 4, 5, 7] - -console.log(stringsToLengths(["on", "off", "handmade"])); -// [2, 3, 8] -``` - -### divisors - -Create a `divisors.js` file and solve the function below: - -```js -// Write a function `divisors` that accepts a number as an argument. The function should return an -// array containing all positive numbers that can divide into the argument. - -console.log(divisors(15)); // [1, 3, 5, 15] -console.log(divisors(7)); // [1, 7] -console.log(divisors(24)); // [1, 2, 3, 4, 6, 8, 12, 24] -``` - -## Walkthrough - - - - - - - - - -
javascript-practice/04_arrays/exercises/B_arrays_exercise/ - -### [javascript-practice/04_arrays/exercises/B_arrays_exercise/README.md](javascript-practice/04_arrays/exercises/B_arrays_exercise/README.md) -# Arrays for Days - -More array practice! - -Before you start this exercise, make sure you have watched the lecture first. - -+ [Lecture](https://youtu.be/M4OpbSGGnjw) - -If you get stuck during this exercise, reference this walkthrough. Only watch enough of the -walkthrough to get yourself unstuck, then pause the video and pick up the exercise on your own. - -+ [Walkthrough](https://youtu.be/l6dwZkBfi08) - -You may have noticed we added a few new patterns and techniques to our toolbox. The only way to get -familiar with your tools is to use them. Write code. Run it. - --AZ - -## Instructions - -Create a new folder named `B_arrays`, this is where you'll save all of your files. Solve each of the -prompts below. Create a new file for each prompt and execute your code to see if it matches the -example output. - -### makeAcronym - -Create a `make-acronym.js` file and solve the function below: - -```js -// Write a function `makeAcronym` that accepts a sentence string as an argument. The function should -// return a string containing the first character of each word in the sentence. - -console.log(makeAcronym("New York")); // NY -console.log(makeAcronym("same stuff different day")); // SSDD -console.log(makeAcronym("Laugh out loud")); // LOL -console.log(makeAcronym("don't over think stuff")); // DOTS -``` - -### reverseArray - -Create a `reverse-array.js` file and solve the function below: - -```js -// Write a function `reverseArray` that accepts an array as an argument. The function should return a -// array containing the elements of the original array in reverse order. - -console.log(reverseArray(["zero", "one", "two", "three"])); // ['three', 'two', 'one', 'zero'] -console.log(reverseArray([7, 1, 8])); // [8, 1, 7] -``` - -### yourAverageFunction - -Create a `your-average-function.js` file and solve the function below: - -```js -// Write a function `yourAverageFunction` that accepts an array of numbers as an argument. The -// function should return the average of all elements of the array. If the input array is empty, -// then the function should return null. - -console.log(yourAverageFunction([5, 2, 7, 24])); // 9.5 -console.log(yourAverageFunction([100, 6])); // 53 -console.log(yourAverageFunction([31, 32, 40, 12, 33])); // 29.6 -console.log(yourAverageFunction([])); // null -``` - -### chooseDivisibles - -Create a `choose-divisibles.js` file and solve the function below: - -```js -// Write a function `chooseDivisibles(numbers, target)` that accepts an array of numbers and a -// target number as arguments. The function should return an array containing elements of the original -// array that are divisible by the target. - -console.log(chooseDivisibles([40, 7, 22, 20, 24], 4)); // [40, 20, 24] -console.log(chooseDivisibles([9, 33, 8, 17], 3)); // [9, 33] -console.log(chooseDivisibles([4, 25, 1000], 10)); // [1000] -``` - -### maximum - -Create a `maximum.js` file and solve the function below: - -```js -// Write a function `maximum` that accepts an array of numbers as an argument. The function should -// return the largest number of the array. If the array is empty, then the function should return null. - -console.log(maximum([5, 6, 3, 7])); // 7 -console.log(maximum([17, 15, 19, 11, 2])); // 19 -console.log(maximum([])); // null -``` - -### wordCount - -Create a `word-count.js` file and solve the function below: - -```js -// Write a function `wordCount(sentence, targetWords)` that accepts a sentence string and an array of -// `targetWords`. The function should return a count of the number of words of the sentence that are -// in `targetWords`. - -console.log(wordCount("open the window please", ["please", "open", "sorry"])); // 2 -console.log(wordCount("drive to the cinema", ["the", "driver"])); // 1 -console.log(wordCount("can I have that can", ["can", "I"])); // 3 -``` - -## Walkthrough - - - - - - - - - -
javascript-practice/04_arrays/exercises/C_arrays_exercise/ - -### [javascript-practice/04_arrays/exercises/C_arrays_exercise/README.md](javascript-practice/04_arrays/exercises/C_arrays_exercise/README.md) -# Array Buffet - -Let's do one more array exercise before we hit the next topic. - -If you get stuck during this exercise, reference this walkthrough. Only watch enough of the -walkthrough to get yourself unstuck, then pause the video and pick up the exercise on your own. - -+ [Walkthrough](https://youtu.be/Whk1gGafY78) - -Remember that time at the beginning of the course where you couldn't read or write any code? Look at -you now, smarty pants. - --AZ - -## Instructions - -Create a new folder named `C_arrays`, this is where you'll save all of your files. Solve each of the -prompts below. Create a new file for each prompt and execute your code to see if it matches the -example output. - -### lengthiestWord - -Create a `lengthiest-word.js` file and solve the function below: - -```js -// Write a function `lengthiestWord` that accepts a sentence string as an argument. The function should -// return the longest word of the sentence. If there is a tie, return the word that appears later -// in the sentence. - -console.log(lengthiestWord("I am pretty hungry")); // 'hungry' -console.log(lengthiestWord("we should think outside of the box")); // 'outside' -console.log(lengthiestWord("down the rabbit hole")); // 'rabbit' -console.log(lengthiestWord("simmer down")); // 'simmer' -``` - -### alternatingCaps - -Create an `alternating-caps.js` file and solve the function below: - -```js -// Write a function `alternatingCaps` that accepts a sentence string as an argument. The function should -// return the sentence where words alternate between lowercase and uppercase. - -console.log(alternatingCaps("take them to school")); // 'take THEM to SCHOOL' -console.log(alternatingCaps("What did ThEy EAT before?")); // 'what DID they EAT before?' -``` - -### numberRange - -Create a `number-range.js` file and solve the function below: - -```js -// Write a function `numberRange(min, max, step)` that accepts three numbers as arguments, `min`, -// `max`, and `step`. The function should return all numbers between `min` and `max` at `step` intervals. -// `min` and `max` are inclusive. - -console.log(numberRange(10, 40, 5)); // [10, 15, 20, 25, 30, 35, 40] -console.log(numberRange(14, 24, 3)); // [14, 17, 20, 23] -console.log(numberRange(8, 35, 6)); // [8, 14, 20, 26, 32] -``` - -### removeShortWords - -Create a `remove-short-words.js` file and solve the function below: - -```js -// Write a function `removeShortWords` that accepts a sentence string as an argument. The function -// should return a new sentence where all of the words shorter than 4 characters are removed. - -console.log(removeShortWords("knock on the door will you")); // 'knock door will' -console.log(removeShortWords("a terrible plan")); // 'terrible plan' -console.log(removeShortWords("run faster that way")); // 'faster that' -``` - -### commonElements - -Create a `common-elements.js` file and solve the function below: - -```js -// Write a function `commonElements` that accepts two arrays as arguments. The function should return -// a new array containing the elements that are found in both of the input arrays. The order of -// the elements in the output array doesn't matter as long as the function returns the correct elements. - -let arr1 = ["a", "c", "d", "b"]; -let arr2 = ["b", "a", "y"]; -console.log(commonElements(arr1, arr2)); // ['a', 'b'] - -let arr3 = [4, 7]; -let arr4 = [32, 7, 1, 4]; -console.log(commonElements(arr3, arr4)); // [4, 7] -``` - -## Walkthrough - - - - - - - - - -
javascript-practice/05_nesting/exercises/A_nested_loops_exercise/ - -### [javascript-practice/05_nesting/exercises/A_nested_loops_exercise/README.md](javascript-practice/05_nesting/exercises/A_nested_loops_exercise/README.md) -# Loop the Loop - -_Nested Loops_ are when we write a loop within the body of another loop. The pattern can be useful -to generate "pairs" of things. - -Before you start this exercise, make sure you have watched the lecture first. - -+ [Lecture](https://youtu.be/68VmjvtOGGI) - -If you get stuck during this exercise, reference this walkthrough. Only watch enough of the -walkthrough to get yourself unstuck, then pause the video and pick up the exercise on your own. - -+ [Walkthrough](https://youtu.be/seiovGIFokM) - -If you are comfortable with single loops, then you'll find nested loops pretty intuitive. Good thing -we practiced single loops a ton already. - --AZ - -## 0. Reading Nested Loops. - -Create a new folder named `A_nested_loops`, this is where you'll save all of your files. Predict -what would print when executing each of the snippets below. Test your prediction by typing the -snippet into their own files and executing the program. Don't copy and paste. - -Write the below code into a file named `snippet-1.js`. Make a prediction for what it will print. Run -it. - -```js -// snippet 1 -for (let i = 1; i <= 4; i++) { - for (let j = 1; j <= 3; j++) { - console.log(i, j); - } -} -``` - -Write the below code into a file named `snippet-2.js`. Make a prediction for what it will print. Run -it. - -```js -// snippet 2 -for (let n = 0; n < 2; n++) { - console.log("n=" + n); - for (let m = 0; m < 5; m++) { - console.log(" m=" + m); - } - console.log("n=" + n); -} -``` - -Write the below code into a file named `snippet-3.js`. Make a prediction for what it will print. Run -it. - -```js -// snippet 3 -let friends = ["philip", "abby", "phelipe", "simcha"]; - -for (let i = 0; i < friends.length; i++) { - for (let j = 0; j < friends.length; j++) { - console.log(friends[i], friends[j]); - } -} -``` - -Write the below code into a file named `snippet-4.js`. Make a prediction for what it will print. Run -it. - -```js -// snippet 4 -let locations = ["flatbush", "williamsburg", "bushwick", "greenpoint"]; - -for (let i = 0; i < locations.length; i++) { - for (let j = i + 1; j < locations.length; j++) { - console.log(locations[i], locations[j]); - } -} -``` - -Write the below code into a file named `snippet-5.js`. Make a prediction for what it will print. Run -it. - -```js -// snippet 5 -let colors = ["red", "purple", "orange"]; - -for (let i = 0; i < colors.length; i++) { - let colorStr = colors[i]; - console.log(colorStr); - - for (let j = 0; j < colorStr.length; j++) { - let char = colorStr[j]; - console.log(char); - } -} -``` - -## 1. Writing Nested Loops. - -In this section of the exercise you'll be prompted to write a function to accomplish a specific -task. Read the description and look at the example output to figure out what should be implemented -within the function. Write each function to a separate file in the `A_nested_loops_exercise` folder -and test your work by running the file. - -### pairPrint - -Create a `pair-print.js` file and solve the function below: - -```js -// Write a function `pairPrint` that accepts an array as an argument. The function should print -// all unique pairs of elements in the array. The function doesn't need to return any value. It -// should just print to the terminal. - -pairPrint(["artichoke", "broccoli", "carrot", "daikon"]); -// prints -// artichoke - broccoli -// artichoke - carrot -// artichoke - daikon -// broccoli - carrot -// broccoli - daikon -// carrot - daikon - -pairPrint(["apple", "banana", "clementine"]); -// prints -// apple - banana -// apple - clementine -// banana - clementine -``` - -### printCombinations - -Create a `print-combinations.js` file and solve the function below: - -```js -// Write a function `printCombinations`that accepts two arrays as arguments. The function should -// print all combinations of the elements generated by taking an element from the first array and -// and an element from the second array. The function doesn't need to return any value. It -// should just print to the terminal. - -let colors = ["gray", "cream", "cyan"]; -let clothes = ["shirt", "flannel"]; -printCombinations(colors, clothes); -// prints -// gray shirt -// gray flannel -// cream shirt -// cream flannel -// cyan shirt -// cyan flannel - -printCombinations(["hot", "cold"], ["soup", "tea"]); -// prints -// hot soup -// hot tea -// cold soup -// cold tea -``` - -### twoSum - -Create a `two-sum.js` file and solve the function below: - -```js -// Write a function `twoSum(numbers, target)` that accepts an array of numbers and a target number -// as an argument. The function should return a boolean indicating whether or not there exists a pair -// of distinct elements in the array that sum to the target. - -console.log(twoSum([2, 3, 5, 9], 7)); // true -console.log(twoSum([2, 3, 5, 9], 4)); // false -console.log(twoSum([6, 3, 4], 10)); // true -console.log(twoSum([6, 5, 1], 10)); // false -``` - -## Walkthrough - - - - - - - - - -
javascript-practice/05_nesting/exercises/B_two_dimensional_arrays_exercise/ - -### [javascript-practice/05_nesting/exercises/B_two_dimensional_arrays_exercise/README.md](javascript-practice/05_nesting/exercises/B_two_dimensional_arrays_exercise/README.md) -# Adding a New Dimension - -A _two-dimensional array_ is an array that contains other arrays as elements. Programmers use -multidimensional arrays when dealing with data that has many layers. It is also useful to represent -a grid space. - -Before you start this exercise, make sure you have watched the lecture first. - -+ [Lecture](https://youtu.be/CDpJ4PIWAlE) - -If you get stuck during this exercise, reference this walkthrough. Only watch enough of the -walkthrough to get yourself unstuck, then pause the video and pick up the exercise on your own. - -+ [Walkthrough](https://youtu.be/ajSXu2D2gzg) - -Loops in loops? Arrays in arrays? What's next, functions in functions? - --AZ - -## Instructions - -Create a new folder named `B_two_dimensional_arrays_exercise`, this is where you'll save all of your -files. Solve each of the prompts below. Create a new file for each prompt and execute your code to -see if it matches the example output. - -Heads up. Not all of the problems below require 2D arrays. It's up to you to figure out what is the -right tool for the job. - -### print2d - -Create a `print-2d.js` file and solve the function below: - -```js -// Write a function `print2d` that accepts a two-dimensional array as an argument. The function -// should print all inner elements of the array. - -let array1 = [ - ["a", "b", "c", "d"], - ["e", "f"], - ["g", "h", "i"], -]; -print2d(array1); -// prints -// a -// b -// c -// d -// e -// f -// g -// h -// i - -let array2 = [[9, 3, 4], [11], [42, 100]]; -print2d(array2); -// prints -// 9 -// 3 -// 4 -// 11 -// 42 -// 100 -``` - -### makeMatrix - -Create a `make-matrix.js` file and solve the function below: - -```js -// Write a function `makeMatrix(m, n, value)` that accepts three arguments. The function should return -// a 2-dimensional array of height `m` and width `n` that contains the `value` as every element. - -console.log(makeMatrix(3, 5, null)); -// [ -// [ null, null, null, null, null ], -// [ null, null, null, null, null ], -// [ null, null, null, null, null ] -// ] - -console.log(makeMatrix(4, 2, "x")); -// [ -// [ 'x', 'x' ], -// [ 'x', 'x' ], -// [ 'x', 'x' ], -// [ 'x', 'x' ] -// ] - -console.log(makeMatrix(2, 2, 0)); -// [ -// [ 0, 0 ], -// [ 0, 0 ] -// ] -``` - -### totalProduct - -Create a `total-product.js` file and solve the function below: - -```js -// Write a function `totalProduct(array)` that accepts a 2D array of numbers. The function should return -// the total product of all numbers in the array. - -let array1 = [ - [3, 5, 2], - [6, 2], -]; -console.log(totalProduct(array1)); // 360 - -let array2 = [ - [4, 6], - [2, 3], - [1, 2], -]; -console.log(totalProduct(array2)); // 288 -``` - -### twoSumPairs - -Create a `two-sum-pairs.js` file and solve the function below: - -```js -// Write a function `twoSumPairs(numbers, target)` that accepts an array of numbers and a target number -// as arguments. The function should return a 2D array containing all unique pairs of elements that -// sum to the target. - -console.log(twoSumPairs([2, 3, 4, 6, 5], 8)); // [ [2, 6], [3, 5] ] -console.log(twoSumPairs([10, 7, 4, 5, 2], 12)); // [ [10, 2], [7, 5] ] -console.log(twoSumPairs([3, 9, 8], 11)); // [ [3, 8] ] -console.log(twoSumPairs([3, 9, 8], 10)); // [ ] -``` - -### zipper - -Create a `zipper.js` file and solve the function below: - -```js -// Write a function `zipper` that accepts two arrays as arguments. The function should return a 2D -// array containing pairs of elements at the same indices. You can assume that the arrays have the -// same length. - -let array1 = ["a", "b", "c", "d"]; -let array2 = [-1, -2, -3, -4]; -console.log(zipper(array1, array2)); -// [ -// ['a', -1], -// ['b', -2], -// ['c', -3], -// ['d', -4], -// ] - -let array3 = ["whisper", "talk", "shout"]; -let array4 = ["quiet", "normal", "loud"]; -console.log(zipper(array3, array4)); -// [ -// ['whisper', 'quiet'], -// ['talk', 'normal'], -// ['shout', 'loud'], -// ] -``` - -## Walkthrough - - - - - - - - - -
javascript-practice/05_nesting/exercises/C_more_problems_exercise/ - -### [javascript-practice/05_nesting/exercises/C_more_problems_exercise/README.md](javascript-practice/05_nesting/exercises/C_more_problems_exercise/README.md) -# Problems Make Perfect - -More problems `===` more practice. - -If you get stuck during this exercise, reference this walkthrough. Only watch enough of the -walkthrough to get yourself unstuck, then pause the video and pick up the exercise on your own. - -I'll keep writing problems if you keep coding. Deal? - --AZ - -## Instructions - -Create a new folder named `C_more_problems`, this is where you'll save all of your files. Solve each -of the prompts below. Create a new file for each prompt and execute your code to see if it matches -the example output. - -This problem set tests a few different concepts. Any concepts we've covered are fair game. Some of -the following problems are tough, but they only require knowledge of concepts we've already covered. -Give them a shot. - -### removeDupes - -Create a `remove-dupes.js` file and solve the function below: - -```js -// Write a function `removeDupes` that accepts an array as an argument. The function should return a -// new array where each element only appears once. - -console.log(removeDupes(["x", "y", "y", "x", "z"])); // ['x', 'y', 'z'] -console.log(removeDupes([false, false, true, false])); // [false, true] -console.log(removeDupes([42, 5, 7, 42, 7, 3, 7, 7])); // [42, 5, 7, 3] -``` - -### removeVowels - -Create a `remove-vowels.js` file and solve the function below: - -```js -// Write a function `removeVowels` that accepts a string as an argument. The function should return -// a version of the string where all vowels are removed. - -console.log(removeVowels("jello")); // jll -console.log(removeVowels("sensitivity")); // snstvty -console.log(removeVowels("cellar door")); // cllr dr -``` - -### spam - -Create a `spam.js` file and solve the function below: - -```js -// Write a function `spam` that accepts a 2D array as an argument. The array contains pairs as elements. -// The first element of every pair is a number and the second element is a word. The function should -// return a string containing the words repeated the specified number of times. See the examples. - -let array1 = [ - ["hi", 3], - ["bye", 2], -]; -console.log(spam(array1)); // 'hi hi hi bye bye' - -let array2 = [ - ["cat", 1], - ["dog", 2], - ["bird", 4], -]; -console.log(spam(array2)); // 'cat dog dog bird bird bird bird' -``` - -### removeFirstVowel - -Create a `remove-first-vowel.js` file and solve the function below: - -```js -// Write a function `removeFirstVowel` that accepts a string as an argument. The function should return -// the string with it's first vowel removed. - -console.log(removeFirstVowel("volcano")); // 'vlcano' -console.log(removeFirstVowel("celery")); // 'clery' -console.log(removeFirstVowel("juice")); // 'jice' -``` - -### shortenLongWords - -Create a `shorten-long-words.js` file and solve the function below: - -```js -// Write a function `shortenLongWords` that accepts a sentence string as an argument. The function -// should return the same sentence where words longer than 4 characters have their vowels removed. - -console.log(shortenLongWords("they are very noble people")); // 'they are very nbl ppl' -console.log(shortenLongWords("stick with it")); // 'stck with it' -console.log(shortenLongWords("ballerina, you must have seen her")); // 'bllrna, you must have seen her' -``` - - - - - -
javascript-practice/06_decomposition_pattern/A_decomposing_problems_exercise/ - -### [javascript-practice/06_decomposition_pattern/A_decomposing_problems_exercise/README.md](javascript-practice/06_decomposition_pattern/A_decomposing_problems_exercise/README.md) -# Dividing and Conquering - -_Decomposition_ is a pattern that programmers use to take a complex problem and break it down into -smaller sub-problems that can be managed better individually. - -Before you start this exercise, make sure you have watched the lecture first. - -If you get stuck during this exercise, reference this walkthrough. Only watch enough of the -walkthrough to get yourself unstuck, then pause the video and pick up the exercise on your own. - -This is might be my favorite topic. I think it's very high leverage because it is relatively easy to -implement but greatly increases the elegance of your code. Prefer to solve complex problems with -simple solutions. - --AZ - -## 0. Composition - -Create a new folder named `A_decomposing_problems_exercise`, this is where you'll save all of your -files. Predict what would print when executing each of the snippets below. Test your prediction by -typing the snippet into their own files and executing the program. Don't copy and paste. - -Write the below code into a file named `snippet-1.js`. Make a prediction for what it will print. Run -it. - -```js -// snippet 1 - -let flim = function () { - console.log("leak"); - flam(); - console.log("geek"); -}; - -let flam = function () { - console.log("beak"); - console.log("sneak"); -}; - -flim(); -``` - -Write the below code into a file named `snippet-2.js`. Make a prediction for what it will print. Run -it. - -```js -let alice = function (n) { - for (let i = 0; i <= n; i++) { - bob(i); - } -}; - -let bob = function (n) { - if (n % 2 === 0) { - console.log("good"); - } else { - console.log("bad"); - } -}; - -alice(4); -``` - -Write the below code into a file named `snippet-3.js`. Make a prediction for what it will print. Run -it. - -```js -// snippet 3 - -let foo = function () { - for (let i = 0; i < 5; i++) { - console.log("i = " + i); - bar(); - } -}; - -let bar = function () { - for (let j = 0; j < 5; j++) { - console.log(" j = " + j); - } -}; - -foo(); -``` - -## 1. Decomposition - -In this section of the exercise you'll be prompted to write a function to accomplish a specific -task. Read the description and look at the example output to figure out what should be implemented -within the function. Write each function to a separate file in the `A_decomposing_problems_exercise` -folder and test your work by running the file. - -Some (but not all) of the problems below should be decomposed with a helper function. - -### doubleVowel - -Create a `double-vowel.js` file and solve the function below: - -```js -// Write a function `doubleVowel` that accepts a string as an argument. The function should return -// the string where every occurrence of a vowel in the original string is repeated twice consecutively. -// Vowels are the letters a, e, i, o, u. - -console.log(doubleVowel("runner")); // 'ruunneer' -console.log(doubleVowel("stoplight")); // 'stoopliight' -console.log(doubleVowel("gardener")); // 'gaardeeneer' -``` - -### funnyPhrase - -Create a `funny-phrase.js` file and solve the function below: - -```js -// Write a function `funnyPhrase` that accepts a sentence string as an argument. The function should -// return the sentence where every other word has its vowels repeated twice consecutively. -// Vowels are the letters a, e, i, o, u. - -console.log(funnyPhrase("she dreamed of being a runner")); // 'she dreeaameed of beeiing a ruunneer' -console.log(funnyPhrase("park near the stoplight")); // 'park neeaar the stoopliight' -console.log(funnyPhrase("we need many gardeners")); // 'we neeeed many gaardeeneers' -``` - -### isPrime - -Create an `is-prime.js` file and solve the function below: - -```js -// Write a function `isPrime` that accepts a number as an argument. The function should return a -// boolean indicating whether or not the given number is prime. A prime number is a number that is -// only divisible by 1 and itself. The smallest prime number is 1. -// -// For example, 11 is a prime because it is only divisible by 1 and 11. -// For example, 8 is not a prime because it is divisible by 1, 2, 4, and 8 - -console.log(isPrime(11)); // true -console.log(isPrime(8)); // false -console.log(isPrime(7)); // true -console.log(isPrime(21)); // false -console.log(isPrime(2)); // true -console.log(isPrime(15)); // false -console.log(isPrime(1)); // false -``` - -### pickPrimes - -Create a `pick-primes.js` file and solve the function below: - -```js -// Write a function `pickPrimes` that accepts an array of numbers as an argument. The function should -// return an array containing only the prime numbers. A prime number is a number that is -// only divisible by 1 and itself. The smallest prime number is 1. - -console.log(pickPrimes([12, 3, 7, 18, 11])); // [3, 7, 11] -console.log(pickPrimes([17, 23, 9, 42])); // [17, 23] -console.log(pickPrimes([4, 2048, 100, 55])); // [] -``` - -## Walkthrough - - - - - - - - - -
javascript-practice/06_decomposition_pattern/B_decomposing_problems_exercise/ - -### [javascript-practice/06_decomposition_pattern/B_decomposing_problems_exercise/README.md](javascript-practice/06_decomposition_pattern/B_decomposing_problems_exercise/README.md) -# Predisposed to Decompose - -More practice on decomposing! - -If you get stuck during this exercise, reference this walkthrough. Only watch enough of the -walkthrough to get yourself unstuck, then pause the video and pick up the exercise on your own. - -Write code. Run it. - --AZ - -## Instructions - -Create a new folder named `B_decomposing_problems_exercise`, this is where you'll save all of your -files. Solve each of the prompts below. Create a new file for each prompt and execute your code to -see if it matches the example output. - -Some (but not all) of the problems below should be decomposed with a helper function. - -### removeLastVowel - -Create a `remove-last-vowel.js` file and solve the function below: - -```js -// Write a function `removeLastVowel` that accepts a string as argument. The function should return -// the string with its last vowel removed. Vowels are the letters a, e, i, o, u - -console.log(removeLastVowel("speaker")); // 'speakr' -console.log(removeLastVowel("trading")); // 'tradng' -console.log(removeLastVowel("thunder")); // 'thundr' -console.log(removeLastVowel("myth")); // 'myth' -``` - -### pickPrefix - -Create a `pick-prefix.js` file and solve the function below: - -```js -// Write a function `pickPrefix(strings, prefix)` that accepts an array of strings and a prefix string -// as an argument. The function should return the an array of words that begin with the prefix. - -console.log(pickPrefix(['connect', 'company', 'concert', 'cram'], 'con')); -// ['connect', 'concert'] - -console.log(pickPrefix(['miner', 'mistake', 'misspeak', 'moose', 'mission'], 'mis')); -// [''mistake', 'misspeak', 'mission'] -``` - -### trendyText - -Create a `trendy-text.js` file and solve the function below: - -```js -// Write a function `trendyText` that accepts a sentence string as an argument. The function should -// return the sentence where the last vowel of every word is removed. - -console.log(trendyText("the concert will be epic")); // 'th concrt wll be epc' -console.log(trendyText("breakfast food is wonderful")); // 'breakfst fod s wonderfl' -console.log(trendyText("the weather will improve hopefully")); // 'th weathr wll improv hopeflly' -``` - -### mostLetterWord - -Create a `most-letter-word` file and solve the function below: - -```js -// Write a function `mostLetterWord` that accepts a sentence string and a character as arguments. -// The function should return the word of the sentence that contains the character the most number -// of times. You can assume that the sentence contains at least one word. If there is a tie, return -// the word that appears earlier in the sentence. - -console.log(mostLetterWord('she received an award for excellence in science', 'e')); // 'excellence' -console.log(mostLetterWord('she received an award for excellence in science', 'a')); // 'award' -console.log(mostLetterWord('I hope sophomore year comes soon', 'o')); // 'sophomore' -console.log(mostLetterWord('I hope sophomore year comes soon', 's')); // 'sophomore' -``` - -## Walkthrough - - - - - - - - - -
javascript-practice/06_decomposition_pattern/C_decomposing_problems_exercise/ - -### [javascript-practice/06_decomposition_pattern/C_decomposing_problems_exercise/README.md](javascript-practice/06_decomposition_pattern/C_decomposing_problems_exercise/README.md) -# Building It Up By Breaking It Down - -Three reasons why you'll improve as a programmer. You won't believe number 3! - -If you get stuck during this exercise, reference this walkthrough. Only watch enough of the -walkthrough to get yourself unstuck, then pause the video and pick up the exercise on your own. - -I'm going to make you practice so much that you wish you had never subscribed. - --AZ - -## Instructions - -Create a new folder named `C_decomposing_problems_exercise`, this is where you'll save all of your -files. Solve each of the prompts below. Create a new file for each prompt and execute your code to -see if it matches the example output. - -### lalaLanguage - -Create a `lala-language.js` file and solve the function below: - -```js -// Write a function `lalaLanguage` that accepts a sentence string as an argument. The function should -// return a new sentence where words longer that 3 characters are modified. Modified words should have -// each vowel followed by 'l' and the same vowel repeated again. See the examples. - -console.log(lalaLanguage('this is pretty strange')); // 'thilis is preletty stralangele' -console.log(lalaLanguage('can you speak our language')); // 'can you spelealak our lalangulualagele' -``` - -### pickPerfectSquares - -Create a `pick-perfect-squares.js` file and solve the function below: - -```js -// Write a function `pickPerfectSquares` that accepts an array of numbers as an argument. The function -// should return an array containing only the elements that are perfect squares. A perfect square -// is a number that can result from multiplying some number by itself. -// -// For example, 4 is a perfect square because 2 * 2 = 4 -// For example, 81 is a perfect square because 9 * 9 = 81 - -console.log(pickPerfectSquares([6, 4, 81, 21, 36])); // [4, 81, 36] -console.log(pickPerfectSquares([100, 24, 144])); // [100, 144] -console.log(pickPerfectSquares([30, 25])); // [25] -``` - -### censorSentence - -Create a `censor-sentence.js` file and solve the function below: - -```js -// Write a function `censorSentence(sentence, targetWords)` that accepts a sentence string and an array -// of target words as arguments. The function should return a new sentence where any target words -// have all of their characters replaced with '*'s. - -console.log(censorSentence('where the heck is my celery', ['heck', 'celery'])); -// 'where the **** is my ******' - -console.log(censorSentence('why you little sweetheart', ['sweetheart', 'salad'])); -// 'why you little **********' -``` - -## Walkthrough - - - - - - - - - -
javascript-practice/07_objects/A_objects_exercise/ - -### [javascript-practice/07_objects/A_objects_exercise/README.md](javascript-practice/07_objects/A_objects_exercise/README.md) -# An Objective Perspective - -_Objects_ are a construct programmers use to represent entities and the properties they possess. -Whereas arrays use numbers to index their values, _objects_ use strings to index their values. These -strings are referred to as _keys_. - -Before you start this exercise, make sure you have watched the lecture first. - -If you get stuck during this exercise, reference this walkthrough. Only watch enough of the -walkthrough to get yourself unstuck, then pause the video and pick up the exercise on your own. - -As you grow into a web developer, you'll be dealing with objects a **ton**. I also like teaching -objects because I get to use obscure references in my examples. - --AZ - -## 0. Objects In Mirror Are Closer Then They Appear. - -Create a new folder named `A_objects_exercise`, this is where you'll save all of your files. Predict -what would print when executing each of the snippets below. Test your prediction by typing the -snippet into their own files and executing the program. Don't copy and paste. - -Write the below code into a file named `snippet-1.js`. Make a prediction for what it will print. Run -it. - -```js -// snippet 1 -let movie = { - title: "Fight Club", - year: 1999, - genre: ["drama", "thriller"], - starring: ["Brad Pitt", "Edward Norton"], -}; - -console.log(movie.year); -console.log(movie["title"]); -console.log(movie.genre); -console.log(movie.genre[0]); -console.log(movie.genre[1]); - -console.log(movie.duration); -console.log(movie["starring"][1]); -console.log(movie.starring.length); -``` - -Write the below code into a file named `snippet-2.js`. Make a prediction for what it will print. Run - -```js -// snippet 2 -let restaurant = { - name: "Bob's Burgers", - location: "123 Ocean Avenue", - owners: ["Bob Belcher", "Linda Belcher"], - established: 2011, - menu: ["burgers", "fries", "shakes"], -}; - -console.log("owners" in restaurant); -console.log("employees" in restaurant); - -let someKey = "menu"; -console.log(someKey in restaurant); - -console.log(restaurant.menu); -console.log(restaurant["menu"]); -console.log(restaurant[someKey]); -console.log(restaurant.someKey); - -console.log(restaurant.menu.includes("fries")); -``` - -Write the below code into a file named `snippet-3.js`. Make a prediction for what it will print. Run -it. - -```js -// snippet 3 -let dog = { - name: "Manny", - age: 5, - breed: "pug", - color: "fawn", - favoriteFoods: ["bacon"], -}; - -console.log(dog.age); -console.log(dog.breed); -console.log(dog.favoriteFoods); - -dog.age++; -dog.breed = dog.breed.toUpperCase(); -dog.favoriteFoods.push("sausage"); - -console.log(dog.age); -console.log(dog.breed); -console.log(dog.favoriteFoods); - -for (let property in dog) { - console.log(property + " is " + dog[property]); -} -``` - -Write the below code into a file named `snippet-4.js`. Make a prediction for what it will print. Run -it. - -```js -// snippet 4 -let recipe = { - name: "Old Fashioned Pancakes", - difficulty: "easy", - tasty: true, - ingredients: ["eggs", "milk", "butter", "flour", "sugar"], -}; - -console.log(recipe.name); -console.log(recipe["name"]); -console.log(recipe.ingredients.length); -console.log(recipe.calories); - -let someVariable = "difficulty"; -console.log(recipe[someVariable]); -console.log(recipe.someVariable); - -for (let i = 0; i < recipe.ingredients.length; i++) { - console.log(recipe.ingredients[i]); -} -``` - -## 1. I Object, Your Honor. - -In this section of the exercise you'll be prompted to write a function to accomplish a specific -task. Read the description and look at the example output to figure out what should be implemented -within the function. Write each function to a separate file in the `A_objects_exercise` folder and -test your work by running the file. - -### emailParse - -Create a `email-parse.js` file and solve the function below: - -```js -// Create a function `emailParse` that accepts an email address string as an argument. The function -// should return an object containing `username` and `domain` as keys. See the examples. -// You can assume that the argument will be a valid email address. - -console.log(emailParse("coolcoder42@goodmail.com")); -// { username: 'coolcoder42', domain: 'goodmail.com' } - -console.log(emailParse("az@woohoomail.com")); -// { username: 'az', domain: 'woohoomail.com' } - -console.log(emailParse("1337pr0graMmer@coldmail.edu")); -// { username: '1337pr0graMmer', domain: 'coldmail.edu' } -``` - -### keyPair - -Create a `key-pair.js` file and solve the function below: - -```js -// Write a function `keyPair(obj1, obj2, key)` that accepts two objects and a key string as arguments. -// The function should return an array containing the values of the given key in `obj1` and `obj2`. -// See the examples. - -let cat1 = { name: "jinkee", breed: "calico" }; -let cat2 = { name: "garfield", breed: "red tabby" }; -console.log(keyPair(cat1, cat2, "breed")); // [ 'calico', 'red tabby' ] -console.log(keyPair(cat1, cat2, "name")); // [ 'jinkee', 'garfield ] - -let sport1 = { name: "volleyball", team: true }; -let sport2 = { name: "golf", team: false }; -console.log(keyPair(sport1, sport2, "team")); // [ true, false ] -``` - -### elementQuantities - -Create a `element-quantities.js` file and solve the function below: - -```js -// Create a function `elementQuantities` that accepts an object as an argument. The object contains -// elements as keys and quantities as values. The function should return an array containing the elements -// appearing with the correct quantities. See the examples. - -let quantities1 = { cat: 3, bird: 1, dog: 2 }; -console.log(elementQuantities(quantities1)); // ['cat', 'cat', 'cat', 'bird, 'dog', 'dog'] - -let quantities2 = { blue: 3, brown: 1 }; -console.log(elementQuantities(quantities2)); // ['blue', 'blue', 'blue', 'brown'] -``` - -### maxObjectValue - -Create a `max-object-value.js` file and solve the function below: - -```js -// Write a function `maxObjectValue` that accepts an object as an argument. Write a function that -// returns an array containing the key, value pair for the largest value within the object. You can -// assume that all values are numbers and there are no ties. - -console.log(maxObjectValue({ a: 5, b: 2, c: 6, d: 7, e: 4 })); // ['d', 7] -console.log(maxObjectValue({ lychee: 11, rambutan: 13, papaya: 9 })); // ['rambutan', 13] -``` - -## Walkthrough - - - - - - - - - -
javascript-practice/07_objects/B_objects_exercise/ - -### [javascript-practice/07_objects/B_objects_exercise/README.md](javascript-practice/07_objects/B_objects_exercise/README.md) -# Object Obsession - -More practice on JavaScript objects! - -Before you start this exercise, make sure you have watched the lecture first. - -If you get stuck during this exercise, reference this walkthrough. Only watch enough of the -walkthrough to get yourself unstuck, then pause the video and pick up the exercise on your own. - -Keep practicing. Hopefully you are practicing everyday. Consistency beats intensity given a long -enough timeline. If want to become proficient quickly, then practice intensely and consistently. - --AZ - -## Instructions - -Create a new folder named `B_objects_exercise`, this is where you'll save all of your files. Solve -each of the prompts below. Create a new file for each prompt and execute your code to see if it -matches the example output. - -### characterCount - -Create a `character-count.js` file and solve the function below: - -```js -// Write a function `characterCount` that accepts a string as an argument. The function should return -// an object containing the count of characters in the string. - -console.log(characterCount("evening")); // { e: 2, v: 1, n: 2, i: 1 , g: 1 } -console.log(characterCount("mississippi")); // { m: 1, i: 4, s: 4, p: 2 } -console.log(characterCount("chili")); // { c: 1, h: 1, i: 2, l: 1 } -``` - -### letterMap - -Create a `letter-map.js` file and solve the function below: - -```js -// Write a function `letterMap` that accepts a string and an object as arguments. The function should -// return a version of the string where characters that appear as keys in object are replaced with -// their corresponding values. - -console.log(letterMap("symbolic", { y: "i", o: "a", c: "k" })); // 'simbalik' -console.log(letterMap("colossal", { o: "x", s: "p" })); // 'cxlxppal' -console.log(letterMap("miniscule", { u: "t", i: "f", e: "q" })); // 'mfnfsctlq' -``` - -### mostCommonLetter - -Create a `most-common-letter.js` file and solve the function below: - -```js -// Write a function `mostCommonLetter` that accepts a string as an argument. The function should return -// the character that appears most frequently in the string. You can assume that there are no ties. - -console.log(mostCommonLetter("building")); // 'i' -console.log(mostCommonLetter("shoestring")); // 's' -console.log(mostCommonLetter("preparedness")); // 'e' -``` - -### wordReplace - -Create a `word-replace.js` file and solve the function below: - -```js -// Write a function `wordReplace` that accepts a sentence string and an object as arguments. The -// function should return a new sentence where words that are keys of the object are replaced with -// their corresponding values. - -console.log(wordReplace("I never take naps during the day", { never: "always", day: "weekend" })); -// 'I always take naps during the weekend' - -console.log(wordReplace("the park is closed", { closed: "open", the: "a" })); -// 'a park is open' - -console.log(wordReplace("I do what I want", { I: "we", cat: "dog" })); -// 'we do what we want' -``` - -### getAverageAge - -Create a `get-average-age.js` file and solve the function below: - -```js -// Write a function `getAverageAge` function that accepts an array of objects representing people. -// The function should return the average age of the people. - -let peeps = [ - { name: "Lovelace", age: 36, born: "London, UK" }, - { name: "Kleene", age: 85, born: "Connecticut, US" }, - { name: "Turing", age: 41, born: "London, UK" }, - { name: "Hopper", age: 85, born: "New York, US" }, -]; -console.log(getAverageAge(peeps)); // 61.75 - -let people = [ - { name: "Orwell", age: 46, born: "Bihar, India" }, - { name: "Bradbury", age: 91, born: "California, US" }, - { name: "Huxley", age: 69, born: "California, US" }, -]; -console.log(getAverageAge(people)); // 86.66 -``` - -## Walkthrough - - - - - - - - - -
javascript-practice/07_objects/C_objects_exercise/ - -### [javascript-practice/07_objects/C_objects_exercise/README.md](javascript-practice/07_objects/C_objects_exercise/README.md) -# Obnoxious Objects - -Still more exercises on JavaScript objects! - -Before you start this exercise, make sure you have watched the lecture first. - -If you get stuck during this exercise, reference this walkthrough. Only watch enough of the -walkthrough to get yourself unstuck, then pause the video and pick up the exercise on your own. - -Practice, practice, practice, practice. - --AZ - -## Instructions - -Create a new folder named `C_objects_exercise`, this is where you'll save all of your files. Solve -each of the prompts below. Create a new file for each prompt and execute your code to see if it -matches the example output. - -### greatestPopulation - -Create a `greatest-population.js` file and solve the function below: - -```js -// Write a function `greatestPopulation` that accepts an array of country objects as an argument. -// The function should return the name of the country that has the largest population. -// You can assume that the array contains at least one country. - -let countries1 = [ - { name: "Cameroon", population: 27744989, gdp: 38.68 }, - { name: "Belarus", population: 9477918, gdp: 59.66 }, - { name: "Indonesia", population: 267026366, gdp: 1042 }, - { name: "Guyana", population: 750204, gdp: 3.88 }, -]; - -console.log(greatestPopulation(countries1)); // 'Indonesia' - -let countries1 = [ - { name: "New Zealand", population: 4925477, gdp: 204.9 }, - { name: "Mozambique", population: 30098197, gdp: 14.72 }, - { name: "Greenland", population: 57616, gdp: 2.71 }, - { name: "Kazakhstan", population: 19091949, gdp: 179.3 }, - { name: "Burma", population: 56590071, gdp: 71.21 }, -]; - -console.log(greatestPopulation(countries2)); // 'Burma' -``` - -### pluck - -Create a `pluck.js` file and solve the function below: - -```js -// Write a function `pluck` that accepts an object and an array of strings as an argument. The function -// should return a new object containing the keys of the original object that are found in the array. - -console.log(pluck({name: 'Fido', color: 'Brown', breed: 'German Shepherd'}, ['name', 'breed'])); -// { name: 'Fido', breed: 'German Shepherd' } - -console.log(pluck({ make: 'Tesla', mpg: 93 , model: 'Model X', color: 'white' }, ['make', 'model'])); -// { make: 'Tesla', model: 'Model X' } -``` - -### objectAdd - -Create a `object-add.js` file and solve the function below: - -```js -// Write a function `objectAdd` that accepts two objects as arguments. The function should return -// a new object containing the same keys as the object arguments. If a key is found in both -// objects, its corresponding value should be the sum of the values in the object arguments. If a key -// is only found in one of the objects, then it's corresponding value should be the same as that one -// object. - -let obj1 = { x: 3, y: 10}; -let obj2 = { y: 2, x: 1}; -console.log(objectAdd(obj1, obj2)); // { x: 4, y: 12 } - -let obj3 = { a: 3, b: 2, c: -1}; -let obj4 = { b: 5, c: 1, e: 4}; -console.log(objectAdd(obj3, obj4)); // { a: 3, b: 7, c: 0, e: 4 } -``` - -### secretCipher - -Create a `secret-cipher.js` file and solve the function below: - -```js -// Write a function `secretCipher` that accepts a string and an object as arguments. The function -// should return a new string where characters of the original string are replaced with their -// corresponding values in the object. If a character of the string does not exist as a key of the -// object, then it should be replaced with a question mark (?). - -console.log(secretCipher("jello", { j: "r", l: "s", e: "i" })); // 'riss?' -console.log(secretCipher("lantern", { e: "o", l: "p", n: "m", r: "j" })); // 'p?m?ojm' -``` - -## Walkthrough - - - - - - - - - -
javascript-practice/08_higher_order_functions/A_native_callback_methods_exercise/ - -### [javascript-practice/08_higher_order_functions/A_native_callback_methods_exercise/README.md](javascript-practice/08_higher_order_functions/A_native_callback_methods_exercise/README.md) -# Native Callback Methods Exercise - -There are a handful of useful array methods utilizing callbacks that are built into JavaScript. The -`forEach`, `map`, `filter`, `every`, and `some` methods can implement common patterns -quickly. These methods can greatly clean up our code if we master their usage. - -In my experience teaching, students are somewhat resistant to learning this new topic because they -can "solve" these same problems utilizing just the basics that they are already comfortable with. -You _could_ forgo these methods in favor of manually implementing the target behavior with a -nothing-fancy loop, however these methods will become very useful if you have the patience to learn -them. They are also a fairly common topic in software engineering job interviews. There is much -discomfort that comes with learning something new. Practice until it's comfortable. - --AZ - -### 0. Interpret. - -Create a new folder named `A_native_callback_methods_exercise`, this is where you'll save all of -your files. Predict what would print when executing each of the snippets below. Test your prediction -by typing the snippet into their own files and executing the program. Don't copy and paste. - -Write the below code into a file named `snippet-1.js`. Make a prediction for what it will print. Run -it. - -```js -// snippet-1 -let foo = function (s) { - return s.slice(1).toUpperCase(); -}; - -let arr = ['mashy', 'brando', 'thanasi']; -let res = arr.map(foo); -console.log(res); -``` - -```js -// snippet-2 -let friends = ['nader', 'matty', 'jennifer', 'lora']; - -let chosen = friends[0]; - -friends.forEach(function (friend) { - if (friend.length > chosen.length) { - chosen = friend; - } -}); - -console.log(chosen); -``` - -```js -// snippet-3 -let isEven = function (n) { - return n % 2 === 0; -}; - -let isOdd = function (n) { - return !isEven(n); -}; - -let nums1 = [42, 3, 8, 9]; -console.log(nums1.filter(isEven)); -console.log(nums1.map(isOdd)); -``` - -```js -// snippet-4 -let doggos = [ - { name: 'bella', type: 'canine', age: 4, breed: 'yorkshire terrier' }, - { name: 'manny', type: 'canine', age: 2, breed: 'pug' }, - { name: 'yoshi', type: 'canine', age: 3, breed: 'german shepherd' }, - { name: 'blossom', type: 'canine', age: 3, breed: 'german shepherd' } -]; - -let result1 = doggos.every(function (ele) { - return ele.type === 'canine'; -}); - -console.log(result1); - -let result2 = doggos.every(function (ele) { - return ele.breed === 'german shepherd'; -}); - -console.log(result2); - -let result3 = doggos.some(function (ele) { - return ele.breed === 'german shepherd'; -}); - -console.log(result3); - -let isOld = function (person) { - return person.age > 5; -}; - -let result4 = doggos.some(isOld); - -console.log(result4); -``` - -### 1. Solve. - -Solve each of the prompts below. Create a new file for each prompt and execute your code to see if it -matches the example output. - -### forEachSum - -Create a `for-each-sum.js` file and solve the function below: - -```js -// Write a function `forEachSum` that accepts an array of numbers as an argument and returns the total -// sum of all numbers. -// Your function must utilize the native Array#forEach method. - -console.log(forEachSum([10, 3, 5])); // 18 -console.log(forEachSum([-6, 7, 9, 4])); // 14 -console.log(forEachSum([])); // 0 -``` - -### pickAdults - -Create a `pick-adults.js` file and solve the function below: - -```js -// Write a function `pickAdults` that accepts an array of person objects and returns the objects that -// have an age of at least 18. -// Your function must utilize the native Array#filter method. - -let people = [ - { name: 'alice', age: 22 }, - { name: 'bob', age: 37 }, - { name: 'pam', age: 16 }, - { name: 'jim', age: 18 } -]; -console.log(pickAdults(people)); -// [ { name: 'alice', age: 22 }, { name: 'bob', age: 37 }, { name: 'jim', age: 18 } ] - -let people2 = [ - { name: 'betty', age: 23 }, - { name: 'ben', age: 15 }, - { name: 'yansi', age: 21 } -]; -console.log(pickAdults(people2)); -// [ { name: 'betty', age: 23 }, { name: 'yansi', age: 21 } ] -``` - -### wordMap - -Create a `word-map.js` file and solve the function below: - -```js -// Write a function `wordMap` that accepts a sentence string and an object as arguments. The function -// should return a new sentence where words that exist as keys in the object are replaced with their -// corresponding values. -// Your function must utilize the native Array#map method. - -console.log(wordMap('open the pod bay doors', {pod: 'ship', open: 'close'})); -// 'close the ship bay doors' - -console.log(wordMap('breakfast food is good', {breakfast: 'brunch', good: 'great'})); -// 'brunch food is great' -``` - -### commonElements - -Create a `common-elements.js` file and solve the function below: - -```js -// Write a function `commonElements` that accepts two arrays as arguments. The function should -// return a new array containing the elements that are found in both input arrays. -// Your function must utilize the native Array#filter method. - -console.log(commonElements(['a', 'b', 'c'], ['c', 'a'])); // ['a', 'c'] -console.log(commonElements(['cat', 'dog', 'mouse', 'fish'], ['dog', 'rat'])); // ['dog'] -console.log(commonElements(['skip', 'jump'], ['swim', 'hop'])); // [] -``` - - -### getInitials - -Create a `get-initials.js` file and solve the function below: - -```js -// Write a function `getInitials` that accepts an array of students as an argument. The function should -// return an array containing the initials of each student. -// Your function must utilize the native Array#map method. - -let students1 = [ - { first: 'ada', last: 'yonath', subject: 'chemistry' }, - { first: 'nelly', last: 'sachs', subject: 'literature' }, - { first: 'rosalyn', last: 'yallow', subject: 'medicine' } -]; -console.log(getInitials(students1)); // ['AY', 'NS', 'RY'] - - -let students2 = [ - { first: 'margaret', last: 'knight' }, - { first: 'ellen', last: 'ochoa' }, -]; -console.log(getInitials(students2)); // ['MK', 'EO'] -``` - -## Walkthrough - - - - - - - - - -
javascript-practice/08_higher_order_functions/B_native_callback_methods_exercise/ - -### [javascript-practice/08_higher_order_functions/B_native_callback_methods_exercise/README.md](javascript-practice/08_higher_order_functions/B_native_callback_methods_exercise/README.md) -```js -// snippet-5 - -let nums = [3, 7, 2, 9]; - -let res1 = nums.reduce(function (a, b) { - return a + b; -}); - -console.log(res1); - - -let res2 = nums.reduce(function (a, b) { - return a + b; -}, -10); - -console.log(res2); - -let res3 = nums.reduce(function (a, b) { - if (b < a) { - return b; - } else { - return a; - } -}); - -console.log(res3); -``` - - - - - -
javascript-practice/simple-side-bar/ - -### [javascript-practice/simple-side-bar/README.md](javascript-practice/simple-side-bar/README.md) -# [Simple Sidebar](https://github.com/bgoonz/bootstrap-sidebar-template) - -[Simple Sidebar](https://github.com/bgoonz/bootstrap-sidebar-template) is an off canvas sidebar navigation template -## Preview - -[![Simple Sidebar Preview](https://assets.startbootstrap.com/img/screenshots/templates/simple-sidebar.png)](https://startbootstrap.github.io/startbootstrap-simple-sidebar/) - -**[View Live Preview](https://startbootstrap.github.io/startbootstrap-simple-sidebar/)** - -## Status - - - -## Download and Installation - -To begin using this template, choose one of the following options to get started: - -* [Download the latest release on Start Bootstrap](https://github.com/bgoonz/bootstrap-sidebar-template) -* Install via npm: `npm i startbootstrap-simple-sidebar` -* Clone the repo: `git clone https://github.com/StartBootstrap/startbootstrap-simple-sidebar.git` -* [Fork, Clone, or Download on GitHub](https://github.com/StartBootstrap/startbootstrap-simple-sidebar) - -## Usage - -### Basic Usage - -After downloading, simply edit the HTML and CSS files included with the template in your favorite text editor to make changes. These are the only files you need to worry about, you can ignore everything else! To preview the changes you make to the code, you can open the `index.html` file in your web browser. - -### Advanced Usage - -After installation, run `npm install` and then run `npm start` which will open up a preview of the template in your default browser, watch for changes to core template files, and live reload the browser when changes are saved. You can view the `gulpfile.js` to see which tasks are included with the dev environment. - -You must have npm and Gulp installed globally on your machine in order to use these features. - -## Bugs and Issues - -Have a bug or an issue with this template? [Open a new issue](https://github.com/StartBootstrap/startbootstrap-simple-sidebar/issues) here on GitHub or leave a comment on the [template overview page at Start Bootstrap](https://github.com/bgoonz/bootstrap-sidebar-template). - -## About - -Start Bootstrap is an open source library of free Bootstrap templates and themes. All of the free templates and themes on Start Bootstrap are released under the MIT license, which means you can use them for any purpose, even for commercial projects. - -* -* - -Start Bootstrap was created by and is maintained by **[David Miller](https://davidmiller.io/)**. - -* -* -* - -Start Bootstrap is based on the [Bootstrap](https://getbootstrap.com/) framework created by [Mark Otto](https://twitter.com/mdo) and [Jacob Thorton](https://twitter.com/fat). - -## Copyright and License - -Copyright 2013-2020 Start Bootstrap LLC. Code released under the [MIT](https://github.com/StartBootstrap/startbootstrap-simple-sidebar/blob/gh-pages/LICENSE) license. - - - - - -
readme/ - -### [readme/README.md](readme/README.md) -# Prep-Work - ## [deployment](https://60637489113cfe1345c7fcf9--jolly-shannon-bbcd09.netlify.app/) -## [Backup-Deployment:](https://bgoonz-c1f6696402.drafts.github.io/lambda-prep/) 0.\) Links: @@ -19014,7 +30,7 @@ Copyright 2013-2020 Start Bootstrap LLC. Code released under the [MIT](https://g 3.\) Pre-Course Work -[![Edit epic-hawking-rdij1](https://codesandbox.io/static/img/play-codesandbox.svg)](https://codesandbox.io/s/epic-hawking-rdij1?autoresize=1&expanddevtools=1&fontsize=10&hidenavigation=1&theme=dark) + ``` . @@ -19028,296 +44,296 @@ Copyright 2013-2020 Start Bootstrap LLC. Code released under the [MIT](https://g ├── directory.html ├── index.html ├── javascript-practice -│   ├── 00_expressions_variables -│   │   ├── exercises -│   │   │   ├── A_executing_code_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   ├── B_expressions_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   ├── C_variables_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   ├── D_string_indexing_and_methods_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   -│   │   ├── -│   │   └── solutions -│   │   ├── A_executing_code_solution -│   │   │   ├── age.js -│   │   │   ├── greeting.js -│   │   │   ├── -│   │   │   ├── thirsty.js -│   │   │   └── whoami.js -│   │   ├── B_expressions_solution -│   │   │   ├── boolean-expressions.js -│   │   │   ├── comparisons.js -│   │   │   ├── number-expressions.js -│   │   │   ├── -│   │   │   └── string-expressions.js -│   │   ├── C_variables_solution -│   │   │   ├── four.js -│   │   │   ├── one.js -│   │   │   ├── -│   │   │   ├── three.js -│   │   │   ├── two.js -│   │   │   └── zero.js -│   │   ├── D_string_indexing_and_methods_solution -│   │   │   ├── a-tedious-task.js -│   │   │   ├── dare-to-decipher.js -│   │   │   ├── proper-patterns.js -│   │   │   ├── -│   │   │   └── small-string-snippets.js -│   │   -│   ├── 01_conditionals -│   │   ├── exercises -│   │   │   ├── A_conditionals_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   -│   │   ├── -│   │   └── solutions -│   │   ├── A_conditionals_solution -│   │   │   ├── one.js -│   │   │   ├── -│   │   │   ├── three.js -│   │   │   ├── two.js -│   │   │   └── zero.js -│   │   -│   ├── 02_functions -│   │   ├── exercises -│   │   │   ├── A_functions_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   ├── B_functions_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   ├── C_functions_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   -│   │   ├── -│   │   └── solutions -│   │   ├── A_functions_solution -│   │   │   ├── average.js -│   │   │   ├── ends-with-t.js -│   │   │   ├── half.js -│   │   │   ├── is-div-by-4.js -│   │   │   ├── is-long.js -│   │   │   ├── keep-it-quiet.js -│   │   │   ├── -│   │   │   ├── snippet-0-1.js -│   │   │   ├── snippet-0-2.js -│   │   │   ├── snippet-0-3.js -│   │   │   └── snippet-0-4.js -│   │   ├── B_functions_solution -│   │   │   ├── ends-in-ly.js -│   │   │   ├── funny-sound.js -│   │   │   ├── longer.js -│   │   │   ├── one-or-none.js -│   │   │   ├── parity.js -│   │   │   ├── -│   │   │   ├── starts-with-r.js -│   │   │   ├── string-size.js -│   │   │   └── wacky-word.js -│   │   ├── C_functions_solution -│   │   │   ├── average-of-four.js -│   │   │   ├── case-changer.js -│   │   │   ├── contains.js -│   │   │   ├── divisible.js -│   │   │   ├── in-range.js -│   │   │   ├── larger.js -│   │   │   ├── number-change.js -│   │   │   -│   │   -│   ├── 03_loops -│   │   ├── exercises -│   │   │   ├── A_loops_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   ├── B_loops_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   ├── C_loops_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   -│   │   ├── -│   │   └── solutions -│   │   ├── A_loops_solution -│   │   │   ├── count-up.js -│   │   │   ├── evens.js -│   │   │   ├── min-to-max.js -│   │   │   ├── one-to-four.js -│   │   │   ├── -│   │   │   ├── snippet-1.js -│   │   │   ├── snippet-2.js -│   │   │   ├── snippet-3.js -│   │   │   ├── snippet-4.js -│   │   │   ├── snippet-5.js -│   │   │   └── string-iterate.js -│   │   ├── B_loops_solution -│   │   │   ├── div-by-either.js -│   │   │   ├── five-multiples-of.js -│   │   │   ├── no-ohs.js -│   │   │   ├── odd-sum.js -│   │   │   ├── product-up-to.js -│   │   │   ├── -│   │   │   ├── string-repeater.js -│   │   │   └── sum-up-to.js -│   │   ├── C_loops_solution -│   │   │   ├── censor-e.js -│   │   │   ├── divisible-range.js -│   │   │   ├── fizz-buzz.js -│   │   │   ├── raise-power.js -│   │   │   ├── remove-capitals.js -│   │   │   ├── reverse-iterate.js -│   │   │   -│   │   -│   ├── 04_arrays -│   │   ├── exercises -│   │   │   ├── A_arrays_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   ├── B_arrays_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   ├── C_arrays_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   -│   │   ├── -│   │   └── solutions -│   │   ├── A_arrays_solution -│   │   │   ├── bleep-vowels.js -│   │   │   ├── divisors.js -│   │   │   ├── filter-long-words.js -│   │   │   ├── num-odds.js -│   │   │   ├── -│   │   │   ├── stay-positive.js -│   │   │   ├── strings-to-lengths.js -│   │   │   └── total.js -│   │   ├── B_arrays_solution -│   │   │   ├── choose-divisibles.js -│   │   │   ├── make-acronym.js -│   │   │   ├── maximum.js -│   │   │   ├── reverse-array.js -│   │   │   ├── -│   │   │   ├── word-count.js -│   │   │   └── your-average-function.js -│   │   ├── C_arrays_solution -│   │   │   ├── alternating-caps.js -│   │   │   ├── common-elements.js -│   │   │   ├── lengthiest-word.js -│   │   │   ├── number-range.js -│   │   │   ├── remove-short-words.js -│   │   │   -│   │   -│   ├── 05_nesting -│   │   ├── exercises -│   │   │   ├── A_nested_loops_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   ├── B_two_dimensional_arrays_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   ├── C_more_problems_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   -│   │   ├── -│   │   └── solutions -│   │   ├── A_nested_loops_solution -│   │   │   ├── pair-print.js -│   │   │   ├── print-combinations.js -│   │   │   ├── -│   │   │   ├── snippet-1.js -│   │   │   ├── snippet-2.js -│   │   │   ├── snippet-3.js -│   │   │   ├── snippet-4.js -│   │   │   ├── snippet-5.js -│   │   │   └── two-sum.js -│   │   ├── B_two_dimensional_arrays_solution -│   │   │   ├── make-matrix.js -│   │   │   ├── print-2d.js -│   │   │   ├── -│   │   │   ├── total-product.js -│   │   │   ├── two-sum-pairs.js -│   │   │   └── zipper.js -│   │   ├── C_more_problems_solution -│   │   │   ├── remove-dupes.js -│   │   │   ├── remove-first-vowel.js -│   │   │   ├── remove-vowels.js -│   │   │   ├── -│   │   │   ├── shorten-long-words.js -│   │   │   └── spam.js -│   │   -│   ├── 06_decomposition_pattern -│   │   ├── A_decomposing_problems_exercise -│   │   │   ├── README.html -│   │   │   ├── README.md -│   │   │   -│   │   ├── B_decomposing_problems_exercise -│   │   │   ├── README.html -│   │   │   ├── README.md -│   │   │   -│   │   ├── C_decomposing_problems_exercise -│   │   │   ├── README.html -│   │   │   ├── README.md -│   │   │   -│   │   -│   ├── 07_objects -│   │   ├── A_objects_exercise -│   │   │   ├── README.html -│   │   │   ├── README.md -│   │   │   -│   │   ├── B_objects_exercise -│   │   │   ├── README.html -│   │   │   ├── README.md -│   │   │   -│   │   ├── C_objects_exercise -│   │   │   ├── README.html -│   │   │   ├── README.md -│   │   │   -│   │   -│   ├── 08_higher_order_functions -│   │   ├── A_native_callback_methods_exercise -│   │   │   ├── README.html -│   │   │   ├── README.md -│   │   │   -│   │   ├── B_native_callback_methods_exercise -│   │   │   ├── README.html -│   │   │   ├── README.md -│   │   │   -│   │   -│   +│ ├── 00_expressions_variables +│ │ ├── exercises +│ │ │ ├── A_executing_code_exercise +│ │ │ │ ├── README.html +│ │ │ │ ├── README.md +│ │ │ │ +│ │ │ ├── B_expressions_exercise +│ │ │ │ ├── README.html +│ │ │ │ ├── README.md +│ │ │ │ +│ │ │ ├── C_variables_exercise +│ │ │ │ ├── README.html +│ │ │ │ ├── README.md +│ │ │ │ +│ │ │ ├── D_string_indexing_and_methods_exercise +│ │ │ │ ├── README.html +│ │ │ │ ├── README.md +│ │ │ │ +│ │ │ +│ │ ├── +│ │ └── solutions +│ │ ├── A_executing_code_solution +│ │ │ ├── age.js +│ │ │ ├── greeting.js +│ │ │ ├── +│ │ │ ├── thirsty.js +│ │ │ └── whoami.js +│ │ ├── B_expressions_solution +│ │ │ ├── boolean-expressions.js +│ │ │ ├── comparisons.js +│ │ │ ├── number-expressions.js +│ │ │ ├── +│ │ │ └── string-expressions.js +│ │ ├── C_variables_solution +│ │ │ ├── four.js +│ │ │ ├── one.js +│ │ │ ├── +│ │ │ ├── three.js +│ │ │ ├── two.js +│ │ │ └── zero.js +│ │ ├── D_string_indexing_and_methods_solution +│ │ │ ├── a-tedious-task.js +│ │ │ ├── dare-to-decipher.js +│ │ │ ├── proper-patterns.js +│ │ │ ├── +│ │ │ └── small-string-snippets.js +│ │ +│ ├── 01_conditionals +│ │ ├── exercises +│ │ │ ├── A_conditionals_exercise +│ │ │ │ ├── README.html +│ │ │ │ ├── README.md +│ │ │ │ +│ │ │ +│ │ ├── +│ │ └── solutions +│ │ ├── A_conditionals_solution +│ │ │ ├── one.js +│ │ │ ├── +│ │ │ ├── three.js +│ │ │ ├── two.js +│ │ │ └── zero.js +│ │ +│ ├── 02_functions +│ │ ├── exercises +│ │ │ ├── A_functions_exercise +│ │ │ │ ├── README.html +│ │ │ │ ├── README.md +│ │ │ │ +│ │ │ ├── B_functions_exercise +│ │ │ │ ├── README.html +│ │ │ │ ├── README.md +│ │ │ │ +│ │ │ ├── C_functions_exercise +│ │ │ │ ├── README.html +│ │ │ │ ├── README.md +│ │ │ │ +│ │ │ +│ │ ├── +│ │ └── solutions +│ │ ├── A_functions_solution +│ │ │ ├── average.js +│ │ │ ├── ends-with-t.js +│ │ │ ├── half.js +│ │ │ ├── is-div-by-4.js +│ │ │ ├── is-long.js +│ │ │ ├── keep-it-quiet.js +│ │ │ ├── +│ │ │ ├── snippet-0-1.js +│ │ │ ├── snippet-0-2.js +│ │ │ ├── snippet-0-3.js +│ │ │ └── snippet-0-4.js +│ │ ├── B_functions_solution +│ │ │ ├── ends-in-ly.js +│ │ │ ├── funny-sound.js +│ │ │ ├── longer.js +│ │ │ ├── one-or-none.js +│ │ │ ├── parity.js +│ │ │ ├── +│ │ │ ├── starts-with-r.js +│ │ │ ├── string-size.js +│ │ │ └── wacky-word.js +│ │ ├── C_functions_solution +│ │ │ ├── average-of-four.js +│ │ │ ├── case-changer.js +│ │ │ ├── contains.js +│ │ │ ├── divisible.js +│ │ │ ├── in-range.js +│ │ │ ├── larger.js +│ │ │ ├── number-change.js +│ │ │ +│ │ +│ ├── 03_loops +│ │ ├── exercises +│ │ │ ├── A_loops_exercise +│ │ │ │ ├── README.html +│ │ │ │ ├── README.md +│ │ │ │ +│ │ │ ├── B_loops_exercise +│ │ │ │ ├── README.html +│ │ │ │ ├── README.md +│ │ │ │ +│ │ │ ├── C_loops_exercise +│ │ │ │ ├── README.html +│ │ │ │ ├── README.md +│ │ │ │ +│ │ │ +│ │ ├── +│ │ └── solutions +│ │ ├── A_loops_solution +│ │ │ ├── count-up.js +│ │ │ ├── evens.js +│ │ │ ├── min-to-max.js +│ │ │ ├── one-to-four.js +│ │ │ ├── +│ │ │ ├── snippet-1.js +│ │ │ ├── snippet-2.js +│ │ │ ├── snippet-3.js +│ │ │ ├── snippet-4.js +│ │ │ ├── snippet-5.js +│ │ │ └── string-iterate.js +│ │ ├── B_loops_solution +│ │ │ ├── div-by-either.js +│ │ │ ├── five-multiples-of.js +│ │ │ ├── no-ohs.js +│ │ │ ├── odd-sum.js +│ │ │ ├── product-up-to.js +│ │ │ ├── +│ │ │ ├── string-repeater.js +│ │ │ └── sum-up-to.js +│ │ ├── C_loops_solution +│ │ │ ├── censor-e.js +│ │ │ ├── divisible-range.js +│ │ │ ├── fizz-buzz.js +│ │ │ ├── raise-power.js +│ │ │ ├── remove-capitals.js +│ │ │ ├── reverse-iterate.js +│ │ │ +│ │ +│ ├── 04_arrays +│ │ ├── exercises +│ │ │ ├── A_arrays_exercise +│ │ │ │ ├── README.html +│ │ │ │ ├── README.md +│ │ │ │ +│ │ │ ├── B_arrays_exercise +│ │ │ │ ├── README.html +│ │ │ │ ├── README.md +│ │ │ │ +│ │ │ ├── C_arrays_exercise +│ │ │ │ ├── README.html +│ │ │ │ ├── README.md +│ │ │ │ +│ │ │ +│ │ ├── +│ │ └── solutions +│ │ ├── A_arrays_solution +│ │ │ ├── bleep-vowels.js +│ │ │ ├── divisors.js +│ │ │ ├── filter-long-words.js +│ │ │ ├── num-odds.js +│ │ │ ├── +│ │ │ ├── stay-positive.js +│ │ │ ├── strings-to-lengths.js +│ │ │ └── total.js +│ │ ├── B_arrays_solution +│ │ │ ├── choose-divisibles.js +│ │ │ ├── make-acronym.js +│ │ │ ├── maximum.js +│ │ │ ├── reverse-array.js +│ │ │ ├── +│ │ │ ├── word-count.js +│ │ │ └── your-average-function.js +│ │ ├── C_arrays_solution +│ │ │ ├── alternating-caps.js +│ │ │ ├── common-elements.js +│ │ │ ├── lengthiest-word.js +│ │ │ ├── number-range.js +│ │ │ ├── remove-short-words.js +│ │ │ +│ │ +│ ├── 05_nesting +│ │ ├── exercises +│ │ │ ├── A_nested_loops_exercise +│ │ │ │ ├── README.html +│ │ │ │ ├── README.md +│ │ │ │ +│ │ │ ├── B_two_dimensional_arrays_exercise +│ │ │ │ ├── README.html +│ │ │ │ ├── README.md +│ │ │ │ +│ │ │ ├── C_more_problems_exercise +│ │ │ │ ├── README.html +│ │ │ │ ├── README.md +│ │ │ │ +│ │ │ +│ │ ├── +│ │ └── solutions +│ │ ├── A_nested_loops_solution +│ │ │ ├── pair-print.js +│ │ │ ├── print-combinations.js +│ │ │ ├── +│ │ │ ├── snippet-1.js +│ │ │ ├── snippet-2.js +│ │ │ ├── snippet-3.js +│ │ │ ├── snippet-4.js +│ │ │ ├── snippet-5.js +│ │ │ └── two-sum.js +│ │ ├── B_two_dimensional_arrays_solution +│ │ │ ├── make-matrix.js +│ │ │ ├── print-2d.js +│ │ │ ├── +│ │ │ ├── total-product.js +│ │ │ ├── two-sum-pairs.js +│ │ │ └── zipper.js +│ │ ├── C_more_problems_solution +│ │ │ ├── remove-dupes.js +│ │ │ ├── remove-first-vowel.js +│ │ │ ├── remove-vowels.js +│ │ │ ├── +│ │ │ ├── shorten-long-words.js +│ │ │ └── spam.js +│ │ +│ ├── 06_decomposition_pattern +│ │ ├── A_decomposing_problems_exercise +│ │ │ ├── README.html +│ │ │ ├── README.md +│ │ │ +│ │ ├── B_decomposing_problems_exercise +│ │ │ ├── README.html +│ │ │ ├── README.md +│ │ │ +│ │ ├── C_decomposing_problems_exercise +│ │ │ ├── README.html +│ │ │ ├── README.md +│ │ │ +│ │ +│ ├── 07_objects +│ │ ├── A_objects_exercise +│ │ │ ├── README.html +│ │ │ ├── README.md +│ │ │ +│ │ ├── B_objects_exercise +│ │ │ ├── README.html +│ │ │ ├── README.md +│ │ │ +│ │ ├── C_objects_exercise +│ │ │ ├── README.html +│ │ │ ├── README.md +│ │ │ +│ │ +│ ├── 08_higher_order_functions +│ │ ├── A_native_callback_methods_exercise +│ │ │ ├── README.html +│ │ │ ├── README.md +│ │ │ +│ │ ├── B_native_callback_methods_exercise +│ │ │ ├── README.html +│ │ │ ├── README.md +│ │ │ +│ │ +│ ├── js.js ├── one-of-every-tag.html ├── readme -│   ├── README.html -│   ├── README_files -│   │   ├── katex.min.css -│   │   -│   +│ ├── README.html +│ ├── README_files +│ │ ├── katex.min.css +│ │ +│ ├── resources.html ├── resources.md ├── script.js @@ -19581,7 +597,7 @@ easy to follow. "Simplicity is prerequisite for reliability." — Edsger W. Dijkstra -## Remember +## What you've learned - `console.log` can be used to print to the screen - using `//` at the front of a line will turn it into a comment; comments are @@ -19683,7 +699,7 @@ console.log(4 + 12 % 5); // => 6 console.log((4 + 12) % 5); // => 1 ``` -## Remember +## What you've learned - The **Number** type is used to represent integer and decimal values - The operators `+`, `-`, `/`, `*` perform the normal math operations of @@ -19835,7 +851,7 @@ console.log("hello" + "world"); // => 'helloworld' console.log("goodbye" + " " + "moon"); // => 'goodbye moon' ``` -## Remember +## What you've learned - a **String** is a data type that contains multiple characters enclosed in quotation marks @@ -19938,7 +954,7 @@ In other words, to correctly distribute `!` across parentheses, we must also fli We call this property **De Morgan's Law**. Shout out to Augustus De Morgan of Great Britain. -## Remember +## What you've learned * `!`, `&&`, `||` are the boolean operators that we can use to establish logic in our code * De Morgan's Law should be used to distribute `!` against parentheses @@ -20022,7 +1038,7 @@ Whoa! Surprised by these results? It can be hard to predict how `==` behaves, so we will avoid using it in this course and as a best practice. Stick to using `===` because it respects data types. -## Remember +## What you've learned - `>`, `<`, `>=`,`<=`, `===`, and `!==` can be used to compare values - we prefer to use `===` to check for equality because it takes the type into @@ -20164,7 +1180,7 @@ console.log(undefined + 3); // NaN console.log("fish" * 2); // NaN ``` -## Remember +## What you've learned - variables are declared with `let` and will contain the value `undefined` by default @@ -21246,7 +2262,7 @@ together. To concatenate arrays, we can use the aptly named `.concat` method: console.log([1, 2, 3].concat([4, 5, 6])); // => [1, 2, 3, 4, 5, 6] ``` -## Remember +## What you've learned - An **Array** is a data type that contains a list of in order values surrounded in square brackets `[]`. @@ -21396,7 +2412,7 @@ store and use as we please. > assignment is complete, it would be silly to refer to `myFunc` as an > `anonymous function` because an _anonymous function_ has no name. -## Remember +## What you've learned - functions can be stored in variables; just like any other values in JavaScript! @@ -21496,7 +2512,7 @@ useful in your future projects. Imagine how'd you represent a "grid": - sudoku (9x9 grid) - excel (a sheet is an arbitrarily sized 2D array) -## Remember +## What you've learned - an array can contain arrays as elements, we call this a 2D arrays - to iterate through a 2D array, used nested loops @@ -21599,7 +2615,7 @@ the assignment evaluates first, we are simply taking the new number of `50` and reassigning it to the `myNum` variable. This reassignment of a variable name is not a mutation of the original number. -## Remember +## What you've learned - data types that can be changed are mutable, those that cannot be changed are immutable @@ -21691,7 +2707,7 @@ Bam. What a versatile method! Always feel free to reference the [documentation][mdn-splice] for the method when you are struggling to remember its usage: -## Remember +## What you've learned - Array#splice has two required arguments - the target index @@ -21785,7 +2801,7 @@ This means that the `split` will cut the string wherever there is an 'I', leaving a gap where the 'I's were. Then, the `join` will fill those gaps with 'we's. -## Remember +## What you've learned - we can use `String#split` and `Array#join` to convert between strings and arrays @@ -21908,7 +2924,7 @@ function reverseTheSentence(sentence) { } ``` -## Remember +## What you've seen This article has shown you two ways to determine if a value is a kind of type: @@ -22154,7 +3170,7 @@ function whatIsThis() { } ``` -## Remember +## What you've learned There is a special value in JavaScript represented as `null` which means "no value" or "unknown value". It is the only value of the Null data type. You can @@ -22437,8 +3453,3 @@ have has the functionality that you desire by adding code like if (value !== undefined) {} if (value !== null) {} ``` - - - - - diff --git a/README_RAW.md b/README_RAW.md deleted file mode 100644 index 9e480da..0000000 --- a/README_RAW.md +++ /dev/null @@ -1,3456 +0,0 @@ -# Prep-Work - -## [deployment](https://60637489113cfe1345c7fcf9--jolly-shannon-bbcd09.netlify.app/) - -## [Backup-Deployment:](https://bgoonz-c1f6696402.drafts.github.io/lambda-prep/) - -0.\) Links: - -| Name | Hyperlink | -| :-------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| OKTA | [https://lambdaschoolsso.okta.com/login/login.htm?fromURI=%2Fapp%2FUserHome](https://lambdaschoolsso.okta.com/login/login.htm?fromURI=%2Fapp%2FUserHome) | -| Calendar | [https://calendar.google.com/calendar/u/0/embed?src=c\_2q0kvam9h9k5i6t40qp5n18dh8@group.calendar.google.com](https://calendar.google.com/calendar/u/0/embed?src=c_2q0kvam9h9k5i6t40qp5n18dh8@group.calendar.google.com) | -| Slack | [https://app.slack.com/client/T4JUEB3ME/G01QG65CN75](https://app.slack.com/client/T4JUEB3ME/G01QG65CN75) | -| | | -| | | -| | | -| | | -| | | -| Prep Work | [https://apply.lambdaschool.com/courses/web/](https://apply.lambdaschool.com/courses/web/) | - - - - - -1.\) Platforms we need while attending class: - - - -2.\) Web Development Software: - - - -3.\) Pre-Course Work -[![Edit epic-hawking-rdij1](https://codesandbox.io/static/img/play-codesandbox.svg)](https://codesandbox.io/s/epic-hawking-rdij1?autoresize=1&expanddevtools=1&fontsize=10&hidenavigation=1&theme=dark) - -``` -. -├── README.html -├── README.md -├── SUMMARY.html -├── SUMMARY.md -├── codeswing.json -├── comparison.png -├── demo.html -├── directory.html -├── index.html -├── javascript-practice -│   ├── 00_expressions_variables -│   │   ├── exercises -│   │   │   ├── A_executing_code_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   ├── B_expressions_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   ├── C_variables_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   ├── D_string_indexing_and_methods_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   -│   │   ├── -│   │   └── solutions -│   │   ├── A_executing_code_solution -│   │   │   ├── age.js -│   │   │   ├── greeting.js -│   │   │   ├── -│   │   │   ├── thirsty.js -│   │   │   └── whoami.js -│   │   ├── B_expressions_solution -│   │   │   ├── boolean-expressions.js -│   │   │   ├── comparisons.js -│   │   │   ├── number-expressions.js -│   │   │   ├── -│   │   │   └── string-expressions.js -│   │   ├── C_variables_solution -│   │   │   ├── four.js -│   │   │   ├── one.js -│   │   │   ├── -│   │   │   ├── three.js -│   │   │   ├── two.js -│   │   │   └── zero.js -│   │   ├── D_string_indexing_and_methods_solution -│   │   │   ├── a-tedious-task.js -│   │   │   ├── dare-to-decipher.js -│   │   │   ├── proper-patterns.js -│   │   │   ├── -│   │   │   └── small-string-snippets.js -│   │   -│   ├── 01_conditionals -│   │   ├── exercises -│   │   │   ├── A_conditionals_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   -│   │   ├── -│   │   └── solutions -│   │   ├── A_conditionals_solution -│   │   │   ├── one.js -│   │   │   ├── -│   │   │   ├── three.js -│   │   │   ├── two.js -│   │   │   └── zero.js -│   │   -│   ├── 02_functions -│   │   ├── exercises -│   │   │   ├── A_functions_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   ├── B_functions_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   ├── C_functions_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   -│   │   ├── -│   │   └── solutions -│   │   ├── A_functions_solution -│   │   │   ├── average.js -│   │   │   ├── ends-with-t.js -│   │   │   ├── half.js -│   │   │   ├── is-div-by-4.js -│   │   │   ├── is-long.js -│   │   │   ├── keep-it-quiet.js -│   │   │   ├── -│   │   │   ├── snippet-0-1.js -│   │   │   ├── snippet-0-2.js -│   │   │   ├── snippet-0-3.js -│   │   │   └── snippet-0-4.js -│   │   ├── B_functions_solution -│   │   │   ├── ends-in-ly.js -│   │   │   ├── funny-sound.js -│   │   │   ├── longer.js -│   │   │   ├── one-or-none.js -│   │   │   ├── parity.js -│   │   │   ├── -│   │   │   ├── starts-with-r.js -│   │   │   ├── string-size.js -│   │   │   └── wacky-word.js -│   │   ├── C_functions_solution -│   │   │   ├── average-of-four.js -│   │   │   ├── case-changer.js -│   │   │   ├── contains.js -│   │   │   ├── divisible.js -│   │   │   ├── in-range.js -│   │   │   ├── larger.js -│   │   │   ├── number-change.js -│   │   │   -│   │   -│   ├── 03_loops -│   │   ├── exercises -│   │   │   ├── A_loops_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   ├── B_loops_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   ├── C_loops_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   -│   │   ├── -│   │   └── solutions -│   │   ├── A_loops_solution -│   │   │   ├── count-up.js -│   │   │   ├── evens.js -│   │   │   ├── min-to-max.js -│   │   │   ├── one-to-four.js -│   │   │   ├── -│   │   │   ├── snippet-1.js -│   │   │   ├── snippet-2.js -│   │   │   ├── snippet-3.js -│   │   │   ├── snippet-4.js -│   │   │   ├── snippet-5.js -│   │   │   └── string-iterate.js -│   │   ├── B_loops_solution -│   │   │   ├── div-by-either.js -│   │   │   ├── five-multiples-of.js -│   │   │   ├── no-ohs.js -│   │   │   ├── odd-sum.js -│   │   │   ├── product-up-to.js -│   │   │   ├── -│   │   │   ├── string-repeater.js -│   │   │   └── sum-up-to.js -│   │   ├── C_loops_solution -│   │   │   ├── censor-e.js -│   │   │   ├── divisible-range.js -│   │   │   ├── fizz-buzz.js -│   │   │   ├── raise-power.js -│   │   │   ├── remove-capitals.js -│   │   │   ├── reverse-iterate.js -│   │   │   -│   │   -│   ├── 04_arrays -│   │   ├── exercises -│   │   │   ├── A_arrays_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   ├── B_arrays_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   ├── C_arrays_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   -│   │   ├── -│   │   └── solutions -│   │   ├── A_arrays_solution -│   │   │   ├── bleep-vowels.js -│   │   │   ├── divisors.js -│   │   │   ├── filter-long-words.js -│   │   │   ├── num-odds.js -│   │   │   ├── -│   │   │   ├── stay-positive.js -│   │   │   ├── strings-to-lengths.js -│   │   │   └── total.js -│   │   ├── B_arrays_solution -│   │   │   ├── choose-divisibles.js -│   │   │   ├── make-acronym.js -│   │   │   ├── maximum.js -│   │   │   ├── reverse-array.js -│   │   │   ├── -│   │   │   ├── word-count.js -│   │   │   └── your-average-function.js -│   │   ├── C_arrays_solution -│   │   │   ├── alternating-caps.js -│   │   │   ├── common-elements.js -│   │   │   ├── lengthiest-word.js -│   │   │   ├── number-range.js -│   │   │   ├── remove-short-words.js -│   │   │   -│   │   -│   ├── 05_nesting -│   │   ├── exercises -│   │   │   ├── A_nested_loops_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   ├── B_two_dimensional_arrays_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   ├── C_more_problems_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   -│   │   ├── -│   │   └── solutions -│   │   ├── A_nested_loops_solution -│   │   │   ├── pair-print.js -│   │   │   ├── print-combinations.js -│   │   │   ├── -│   │   │   ├── snippet-1.js -│   │   │   ├── snippet-2.js -│   │   │   ├── snippet-3.js -│   │   │   ├── snippet-4.js -│   │   │   ├── snippet-5.js -│   │   │   └── two-sum.js -│   │   ├── B_two_dimensional_arrays_solution -│   │   │   ├── make-matrix.js -│   │   │   ├── print-2d.js -│   │   │   ├── -│   │   │   ├── total-product.js -│   │   │   ├── two-sum-pairs.js -│   │   │   └── zipper.js -│   │   ├── C_more_problems_solution -│   │   │   ├── remove-dupes.js -│   │   │   ├── remove-first-vowel.js -│   │   │   ├── remove-vowels.js -│   │   │   ├── -│   │   │   ├── shorten-long-words.js -│   │   │   └── spam.js -│   │   -│   ├── 06_decomposition_pattern -│   │   ├── A_decomposing_problems_exercise -│   │   │   ├── README.html -│   │   │   ├── README.md -│   │   │   -│   │   ├── B_decomposing_problems_exercise -│   │   │   ├── README.html -│   │   │   ├── README.md -│   │   │   -│   │   ├── C_decomposing_problems_exercise -│   │   │   ├── README.html -│   │   │   ├── README.md -│   │   │   -│   │   -│   ├── 07_objects -│   │   ├── A_objects_exercise -│   │   │   ├── README.html -│   │   │   ├── README.md -│   │   │   -│   │   ├── B_objects_exercise -│   │   │   ├── README.html -│   │   │   ├── README.md -│   │   │   -│   │   ├── C_objects_exercise -│   │   │   ├── README.html -│   │   │   ├── README.md -│   │   │   -│   │   -│   ├── 08_higher_order_functions -│   │   ├── A_native_callback_methods_exercise -│   │   │   ├── README.html -│   │   │   ├── README.md -│   │   │   -│   │   ├── B_native_callback_methods_exercise -│   │   │   ├── README.html -│   │   │   ├── README.md -│   │   │   -│   │   -│   -├── js.js -├── one-of-every-tag.html -├── readme -│   ├── README.html -│   ├── README_files -│   │   ├── katex.min.css -│   │   -│   -├── resources.html -├── resources.md -├── script.js -├── style.css -└── tree.md - -66 directories, 241 files - - - - - -``` -# WEEK 1
*Introduction to JavaScript (Part 1)* {ignore=true} -________________________________________________________________________________ - - - -[**Expression Learning Objectives**](#expression-learning-objectives) -[**Intro to Functions Learning Objectives**](#intro-to-functions-learning-objectives) -- [Hello World](#hello-world) - - [Getting visual feedback in your programs](#getting-visual-feedback-in-your-programs) - - [Code comments](#code-comments) -- [The Number Type](#the-number-type) - - [All the numbers](#all-the-numbers) - - [The basic arithmetic operators](#the-basic-arithmetic-operators) -- [The String Type](#the-string-type) - - [Writing a valid string](#writing-a-valid-string) - - [Calculating length](#calculating-length) - - [Indexing a string](#indexing-a-string) - - [Concatenation](#concatenation) -- [The Boolean Type](#the-boolean-type) - - [Logical Operators](#logical-operators) - - [De Morgan's Law](#de-morgans-law) -- [Comparison Operators](#comparison-operators) - - [The relative comparators](#the-relative-comparators) - - [=== vs ==](#vs) -- [Basic Variables](#basic-variables) - - [Initializing a variable](#initializing-a-variable) - - [Manipulating variables](#manipulating-variables) - - [NaN](#nan) -- [Introduction to Functions](#introduction-to-functions) - - [Writing Functions](#writing-functions) - - [Invoking or "calling" a function](#invoking-or-calling-a-function) - - [Returning a value](#returning-a-value) - - [The importance of naming](#the-importance-of-naming) -- [Parameters and Arguments](#parameters-and-arguments) - - [The difference between Parameters and Arguments](#the-difference-between-parameters-and-arguments) - -[**Control Flow and Array Learning Objectives**](#control-flow-and-array-learning-objectives) -- [Control Flow - Conditional Statements](#control-flow-conditional-statements) - - [A Quick Word on Syntax](#a-quick-word-on-syntax) - - [Writing Conditional Statements](#writing-conditional-statements) -- [Mutually Exclusive Conditions](#mutually-exclusive-conditions) - - [When to use if statements](#when-to-use-if-statements) -- [Control Flow - Looping](#control-flow-looping) - - [Looping](#looping) - - [Translating From One Loop to Another](#translating-from-one-loop-to-another) -- [The Array Type](#the-array-type) - - [Using arrays](#using-arrays) - - [Indexing arrays](#indexing-arrays) - - [Working with arrays](#working-with-arrays) - - [Concatenation with arrays](#concatenation-with-arrays) - -[**Intermediate Functions Learning Objectives**](#intermediate-functions-learning-objectives) -- [Function Expressions](#function-expressions) - - [Functions as first-class objects](#functions-as-first-class-objects) -- [Two-Dimensional Arrays (2D Arrays)](#two-dimensional-arrays-2d-arrays) - - [Multidimensional Arrays](#multidimensional-arrays) - - [Iterating through 2D Arrays](#iterating-through-2d-arrays) - - [When is a 2D array practical?](#when-is-a-2d-array-practical) -- [Mutability in JavaScript](#mutability-in-javascript) - - [What is mutability?](#what-is-mutability) - - [Mutable or immutable, that is the question](#mutable-or-immutable-that-is-the-question) - - [The mutability misconception](#the-mutability-misconception) -- [Array Splice](#array-splice) - - [Notation](#notation) - - [What can Array#splice do?](#what-can-arraysplice-do) -- [String#split and Array#join](#stringsplit-and-arrayjoin) - - [String#split](#stringsplit) - - [Array#join](#arrayjoin) - - [A clever combination](#a-clever-combination) -- [Determining Types](#determining-types) - - [The typeof operator](#the-typeof-operator) - - [How to tell if a value is an array](#how-to-tell-if-a-value-is-an-array) - - [Practical use in "real" code](#practical-use-in-real-code) -- [The Null Type (And Undefined)](#the-null-type-and-undefined) - - [A type with only one value](#a-type-with-only-one-value) - - [The meaning of null](#the-meaning-of-null) - - [The absence of a value](#the-absence-of-a-value) - - [An unknown value](#an-unknown-value) - - [Checking if a value is null](#checking-if-a-value-is-null) - - [Oh, and there's that undefined value, too](#oh-and-theres-that-undefined-value-too) - - [What happens when...](#what-happens-when) -- [Catch Me If You Can](#catch-me-if-you-can) - - [Structured exception handling](#structured-exception-handling) - - [Try and catch](#try-and-catch) - - [How can I make my own errors?](#how-can-i-make-my-own-errors) - - [What else is there?](#what-else-is-there) - - [How do I best use this?](#how-do-i-best-use-this) - - -________________________________________________________________________________ -# WEEK-01 DAY-1
*Function Introduction* {ignore=true} -________________________________________________________________________________ -# Expression Learning Objectives - -Below is a complete list of the terminal learning objectives for this lesson. -When you complete this lesson, you should be able to perform each of the -following objectives. These objectives capture how you may be evaluated on the -assessment for this lesson. - -1. Given a working REPL interface, write and execute a statement that will print - "hello world" using console.log -2. Identify that strings are a list of characters defined by using double or - single quotes -3. Given an arithmetic expression using +, -, \*, /, %, compute its value -4. Given an expression, predict if its value is NaN -5. Construct the truth tables for &&, ||, ! -6. Given an expression consisting of >, >=, ===, <, <=, compute it's value -7. Apply De Morgan's law to a boolean expression -8. Given an expression that utilizes operator precedence, compute its value -9. Given an expression, use the grouping operator to change it's evaluation -10. Given expressions using == and ===, compute their values -11. Given a code snippet using postfix ++, postfix --, +=, -=, /=, \*=, predict - the value of labeled lines -12. Create and assign a variable using `let` to a string, integer, and a - boolean. Read its value and print to the console.l learning objectives for this lesson. -When you complete this lesson, you should be able to perform each of the -following objectives. These objectives capture how you may be evaluated on the -assessment for this lesson. - -1. Given a working REPL interface, write and execute a statement that will print - "hello world" using console.log -2. Identify that strings are a list of characters defined by using double or - single quotes -3. Given an arithmetic expression using +, -, \*, /, %, compute its value -4. Given an expression, predict if its value is NaN -5. Construct the truth tables for &&, ||, ! -6. Given an expression consisting of >, >=, ===, <, <=, compute it's value -7. Apply De Morgan's law to a boolean expression -8. Given an expression that utilizes operator precedence, compute its value -9. Given an expression, use the grouping operator to change it's evaluation -10. Given expressions using == and ===, compute their values -11. Given a code snippet using postfix ++, postfix --, +=, -=, /=, \*=, predict - the value of labeled lines -12. Create and assign a variable using `let` to a string, integer, and a - boolean. Read its value and print to the console. - -________________________________________________________________________________ -# Intro to Functions Learning Objectives - -Below is a complete list of the terminal learning objectives for this lesson. -When you complete this lesson, you should be able to perform each of the -following objectives. These objectives capture how you may be evaluated on the -assessment for this lesson. - -1. Define a function using function declaration -2. Define a function that calculates the average of two numbers, call it, - pass in arguments, and print it's return value -3. Identify the difference between parameters vs argument terminal learning objectives for this lesson. -When you complete this lesson, you should be able to perform each of the -following objectives. These objectives capture how you may be evaluated on the -assessment for this lesson. - -1. Define a function using function declaration -2. Define a function that calculates the average of two numbers, call it, - pass in arguments, and print it's return value -3. Identify the difference between parameters vs arguments -________________________________________________________________________________ -# Hello World - -Hey Programmer! Welcome to the JavaScript module. In the next few sections, -we'll be learning the fundamentals of the JavaScript programming language. If -it's your first time programming, don't worry; we designed this course -especially for you. We'll have you executing your first lines of code in no -time! - -When you finish this article, you should be able to: - -- use the `console.log` command to print out messages -- use double slashes (`//`) to write code comments - -## Getting visual feedback in your programs - -The first command we'll learn in JavaScript is `console.log`. This command is -used to _print_ something onto the screen. As we write our first lines of code, -we'll be using `console.log` frequently as a way to visually see the output of -our programs. Let's write our first program: - -```javascript -console.log("hello world"); -console.log("how are you?"); -``` - -Executing the program above would print out the following: - -```plaintext -hello world -how are you? -``` - -Nothing too ground breaking here, but pay close attention to the exact way we -wrote the program. In particular, notice how we lay out the periods, -parentheses, and quotation marks. We'll also terminate lines with semicolons -(;). - -> Depending on how you structure your code, sometimes you'll be able to omit -> semicolons at the end of lines. For now, you'll want to include them -> just as we do. - -### Syntax - -We refer to the exact arrangement of the symbols, characters, and keywords as -**syntax**. These details matter - your computer will only be able to -"understand" proper JavaScript syntax. A programming language is similar to a -spoken language. A spoken language like English has grammar rules that we should -follow in order to be understood by fellow speakers. In the same way, a -programming language like JavaScript has syntax rules that we ought to follow! - -As you write your first lines of code in this new language, you may make many -syntax errors. Don't get frustrated! This is normal - all new programmers go -through this phase. Every time we recognize an error in our code, we have an -opportunity to reinforce your understanding of correct syntax. Adopt a growth -mindset and learn from your mistakes. - -Additionally, one of the best things about programming is that we can get such -immediate feedback from our creations. There is no penalty for making a mistake -when programming. Write some code, run the code, read the errors, fix the -errors, rinse and repeat! - -## Code comments - -Occasionally we'll want to leave **comments** or notes in our code. Commented -lines will be ignored by our computer. This means that we can use comments to -write plain english or temporarily avoid execution of some JavaScript lines. The -proper _syntax_ for writing a comment is to begin the line with double forward -slashes (`//`): - -```javascript -// let's write another program!!! -console.log("hello world"); - -// console.log("how are you?"); - -console.log("goodbye moon"); -``` - -The program above would only print: - -```plaintext -hello world -goodbye moon -``` - -Comments are useful when annotating pieces of code to offer an explanation of -how the code works. We'll want to strive to write straightforward code that is -self-explanatory when possible, but we can also use comments to add additional -clarity. The real art of programming is to write code so elegantly that it is -easy to follow. - -"Simplicity is prerequisite for reliability." — Edsger W. Dijkstra - -## Remember - -- `console.log` can be used to print to the screen -- using `//` at the front of a line will turn it into a comment; comments are - ignored by JavaScript - -________________________________________________________________________________ -# The Number Type - -The **Number** data type in JavaScript does exactly what you expect! It is used -to represent any numerical values, this includes integers and decimal numbers. -As one of our first data types, we'll be interested in what operations we can -use with numbers. - -When you finish this article, you should be able to: - -- predict the evaluation of arithmetic expressions -- explain the order of operations for JavaScript's arithmetic operators -- use the grouping operator, `()`, to manipulate the order of operations in an - expression - -## All the numbers - -JavaScript's **Number** encompasses numerical values. All of the following values are of number type: - -```javascript -42; --5; -3.14159; -7.0; -``` - -## The basic arithmetic operators - -For any given data type, we're interested in what operations we can perform with -that type. We use the word _operator_ to refer to the symbol that performs a -particular _operation_. For example, the `+` operator performs the addition -operation. Here are the common arithmetic operators in JS: - -- `+` (addition) -- `-` (subtraction) -- `*` (multiplication) -- `/` (division) -- `%` (modulo) - -With number values and arithmetic operators in hand, we can evaluate our first -expressions: - -```javascript -console.log(2 + 3); // => 5 -console.log(42 - 42); // => 0 -console.log(-4 * 1.5); // => -6 -console.log(25 / 8); // => 3.125 -``` - -Nothing too groundbreaking about the results above. An expression consists of -values and operators. JavaScript will evaluate an expression into a single -value. - -We can write more complex expressions using multiple operators. However, we'll -want to be aware of the general math order of operations. That is, we perform -multiplication-division operations first and then addition-subtraction -operations. To force a specific order of operation, we can use the grouping -operator, `( )`, around a part of the expression: - -```javascript -console.log(5 * 3 + 2); // => 17 -console.log(2 + 3 * 5); // => 17 -console.log((2 + 3) * 5); // => 25 -``` - -### The modulo operation - -All of the math operators listed above are the simple operations you use -everyday, except for maybe modulo `%`. **Modulo gives us the remainder that -results from a division.** For example, `10 % 3` is 1 because when we divide 10 -by 3, we are left with a remainder of 1. We can read `10 % 3` as "ten modulo -three" or "ten mod three." - -```javascript -console.log(10 % 3); // => 1 -console.log(14 % 5); // => 4 -console.log(20 % 17); // => 3 -console.log(18 % 6); // => 0 -console.log(7 % 9); // => 7 -``` - -Modulo is a very useful operation in the realm of computers. We can use it to -check the divisibility of numbers, whether numbers are even, whether they are -prime, and much, much more. Don't take this seemingly simple operation from -granted! We'll provide a ton of practice using these modulo patterns as we move through the course. - -In the order of operations, modulo has the the same precedence as -multiplication-division. So our complete order of math operations in JS is -parentheses, multiplication-division-modulo, addition-subtraction. - -```javascript -// modulo has precedence over addition -console.log(4 + 12 % 5); // => 6 -console.log((4 + 12) % 5); // => 1 -``` - -## Remember - -- The **Number** type is used to represent integer and decimal values -- The operators `+`, `-`, `/`, `*` perform the normal math operations of - addition, subtraction, division, multiplication respectively -- `a % b` returns the remainder when we divide `a` by `b`; we call this - operation modulo -- JavaScript follows the usual mathematical order of operations and we can use - the `()` to force precedence - -________________________________________________________________________________ -# The String Type - -This article is about one of JavaScript's primitive data types, **String**. -Strings are what we'll use to represent textual data. This means that strings -are useful in representing things like messages, names, poems, and so on. A -string is a sequence of characters. - -When you finish this article, you should be able to: - -- Write strings using correct syntax -- Use `.length` to obtain a count of the numbers of characters that comprise a - string -- Index a string to refer to a single character -- Concatenate strings together - -## Writing a valid string - -Strings are always wrapped by a pair of single quotation marks (`'`) or by a -pair of double quotation marks (`"`). Between the enclosing quotation marks, we -can put any characters! Here are a six examples of strings: - -```javascript -"potato"; -"New York"; -"azablan@.io"; -"Follow the yellow brick road, please!"; -"365 days a year"; -""; -``` - -Above, notice that we are free to mix in **any** characters into a string. This -includes spaces, numerics, punctuation, and other symbols. The sixth string -above is the empty string; it contains zero characters! - -You are probably wondering why we are allowed to use either single or double -quotes when denoting a string - why is this useful? Maybe we want a string that -_contains_ quotation marks: - -```javascript -// valid strings -'Shakespeare wrote, "To be or not to be"'; -"That's a great string"; -``` - -```javascript -// invalid string -'That's a bad string' -``` - -If we want to use a single quote as a character of a string, we simply need to -enclose the string in double quotes, and vice versa. - -## Calculating length - -Since a single string can contain any number of characters, we may find it -useful to count the number of characters in a string using `.length`: - -```javascript -console.log("ramen".length); // => 5 -console.log("go home!".length); // => 8 -console.log("".length); // => 0 -``` - -## Indexing a string - -Strings consist of multiple characters. These characters are numbered by -**indices** starting at 0. So in the string `'bootcamp'`, `'b'` is at index 0, -`'o'` is at index 1, `'o'` is at index 2, `'t'` is at index 3, and so on. We can -look at particular characters of a string by using `[]` and specifying an index: - -```javascript -console.log("bootcamp"[0]); // => 'b' -console.log("bootcamp"[1]); // => 'o' -console.log("bootcamp"[2]); // => 'o' -console.log("bootcamp"[3]); // => 't' -console.log("bootcamp"[7]); // => 'p' -console.log("bootcamp"[10]); // => undefined -console.log("bootcamp"[-3]); // => undefined -``` - -In general, when we index a string using the expression `string[i]`, we get back -the **single character** at position `i`. Looking at the last two examples -above, if we use an invalid index with a string, the value returned is -`undefined`. This makes since because there is no character at the given -position! It's also worth mentioning that an index should always be a number. - -### The classic "off by one" error - -Bear in mind that indices begin at 0 and not 1! Forgetting this nuance can lead -to incorrect code for both new and experienced programmers alike. Let's hone in -on an important distinction: the index of the last character of a string is -always one less than it's length. - -```javascript -console.log("cat".length); // => 3 -console.log("cat"[3]); // => undefined -console.log("cat"[2]); // => 't' -``` - -In other words, although the `length` of `'cat'` is 3, the index of the last -character (`'t'`) is 2. - -### Using indexOf - -We can also calculate the index of a given character within a string by using -`indexOf`: - -```javascript -console.log("bagel".indexOf("b")); // => 0 -console.log("bagel".indexOf("a")); // => 1 -console.log("bagel".indexOf("l")); // => 4 -console.log("bagel".indexOf("z")); // => -1 -``` - -If we attempt to search for a character that is **not** present in a string, -`indexOf` will return -1. This makes sense because we know that -1 is not a -valid string index. The smallest index possible is 0! - -If we search for a character that appears more than once in a string, -`indexOf` will return the index of the first occurance of that character. - -We can also use `indexOf` to search for a substring of characters. Under this -circumstance, `indexOf` will return the index where the substring begins in the -main string: - -```javascript -console.log("door hinge".indexOf("oor")); // => 1 -console.log("door hinge".indexOf("hi")); // => 5 -console.log("door hinge".indexOf("hint")); // => -1 -``` - -## Concatenation - -Concatenation is just a fancy word for joining strings together into a single -string. To concatenate strings, we use the `+` operator: - -```javascript -console.log("hello" + "world"); // => 'helloworld' -console.log("goodbye" + " " + "moon"); // => 'goodbye moon' -``` - -## Remember - -- a **String** is a data type that contains multiple characters enclosed in - quotation marks -- `string.length` returns the number of characters in the `string` -- each character of a string is associated with a number index; the first - character of a string is at index 0 -- we can use `string.indexOf(char)` to obtain the index of `char` within - `string`; if `char` is not found, then -1 is returned -- we can use `+` to concatenate multiple strings, combining them into a single - string - -________________________________________________________________________________ -# The Boolean Type - -The **Boolean** data type is perhaps the simplest type since there are only two -possible values, `true` and `false`. However, we'll find booleans very useful -because they will act as components of later concepts. As programmers, we'll use -booleans to describe the validity of statements. In an abstract sense, _"Today -is Monday"_ and _"one plus one equals ten"_ are examples of statements with -boolean values. That is, they are either `true` or `false`. - -When you finish this article, you should be able to: - -- predict the evaluation of expressions that use the boolean operations of `!`, - `||`, and `&&` -- explain DeMorgan's law - -## Logical Operators - -In the long run, we'll be using booleans to establish logic in our code. For -this reason, the _boolean operators_ can also be referred to as the _logical -operators_. There are only three such operators: - -- `!` (not) -- `&&` (and) -- `||` (or) - -### Logical NOT - -The not (`!`) operator will reverse a boolean value: - -```javascript -console.log(!true); // => false -console.log(!false); // => true -console.log(!!false); // => false -``` - -It's worth mentioning that `!` is a unary operator. This means that the not -operation is applied to a single value. This is in contrast to a binary operator -such as multiplication, which is applied between two values. It does not make -sense to `!` two values together. - -### Logical AND - -The and (`&&`) operator will take two boolean values and will only evaluate to -`true` when both input values are `true`. Otherwise, it will return `false`: - -```javascript -console.log(false && false); // => false -console.log(false && true); // => false -console.log(true && false); // => false -console.log(true && true); // => true -``` - -### Logical OR - -The or (`||`) operator will take two boolean values and will only evaluate to -`false` when both input values are `false`. Otherwise, it will return `true`: - -```javascript -console.log(false || false); // => false -console.log(false || true); // => true -console.log(true || false); // => true -console.log(true || true); // => true -``` - -### Logical order of operations - -We can write boolean expressions that consist of multiple logical operations, but we should be aware of the order of operations. JavaScript will evaluate `!` then `&&` then `||`. - -```javascript -console.log(true || true && false); // => true -console.log(false && !(false || true)); // => false -``` - -In general, `A || B && C` is equivalent to `A || (B && C)` where `A`, `B`, `C` are booleans. - -## De Morgan's Law - -A common mistake in boolean logic is to incorrectly distribute `!` across parentheses. Say we had boolean values of `A`, `B`. Here is something to remember: - -* `!(A || B)` is equivalent to `!A && !B` -* `!(A && B)` is equivalent to `!A || !B` - - -In other words, to correctly distribute `!` across parentheses, we must also flip the operation within parentheses. Beware that: - -* `!(A || B)` is not equivalent to `!A || !B` -* `!(A && B)` is not equivalent to `!A && !B` - -We call this property **De Morgan's Law**. Shout out to Augustus De Morgan of Great Britain. - -## Remember - -* `!`, `&&`, `||` are the boolean operators that we can use to establish logic in our code -* De Morgan's Law should be used to distribute `!` against parentheses - -These are just the basics of the type. We'll be seeing more booleans in the upcoming section, so stay tuned for that! - -________________________________________________________________________________ -# Comparison Operators - -In our previous introduction to the boolean data type, we described booleans as -way to represent the validity of an expression. We'll continue this conversation -by exploring **comparison** operators. As you learn about these operators, bear -in mind that all comparisons will result in a boolean, `true` or `false`. - -When you finish this article, you should be able to: - -- Predict the result of expressions that utilize the operators `>`, `<`, `>=` - `<=`, `===`, and `!==` -- Explain the difference between the equality operators `==` and `===` - -## The relative comparators - -- `>` (greater than) -- `<` (less than) -- `>=` (greater than or equal to) -- `<=` (less than or equal to) -- `===` (equal to) -- `!==` (not equal to) - -Using these operators is pretty straightforward. Here are a few examples: - -```javascript -console.log(10 > 5); // => true -console.log(10 < 5); // => false -console.log(1 < 7); // => true -console.log(7 <= 7); // => true -console.log(5 === 6); // => false -console.log(5 !== 6); // => true -console.log("a" !== "A"); // => true -console.log(false === false); // => true -``` - -Notice that a comparison expression always evaluate to a boolean value (`true` -or `false`). Comparison operators like `===` are a useful to compare strings, -booleans, etc. not just numbers. - -**Did you know?** `'a' < 'b'` is valid JS code? When you relatively compare -strings using `>` or `<` you will be comparing them lexicographically. -Lexicographically is fancy shmancy talk for "dictionary" order! A "lesser" -string is one that would appear earlier in the dictionary: - -```javascript -console.log("a" < "b"); // => true -console.log("apple" < "abacus"); // => false -console.log("app" < "apple"); // => true -console.log("zoo" > "mississippi"); // => true -``` - -**Gotcha** capitilized letters are considered lexicographically less than -lower case letters. i.e "A" < "z" // => true. - - -## === vs == - -In JavaScript there are two equality operators triple-equals (`===`) and -double-equals (`==`). The operators differ in how they compare across differing -types. Triple-equals performs the _strict equality_, meaning it will only return -`true` if the types are the same. Double-equals performs the _loose equality_, -meaning it can return `true` even if the values are of different type. -Double-equals may _coerce_ a value into another type for the comparison, and -this behavior is hard to predict: - -```javascript -console.log(5 === "5"); // false -console.log(5 == "5"); // true -console.log(0 === false); // false -console.log(0 == false); //true -``` - -Whoa! Surprised by these results? It can be hard to predict how `==` behaves, so -we will avoid using it in this course and as a best practice. Stick to using -`===` because it respects data types. - -## Remember - -- `>`, `<`, `>=`,`<=`, `===`, and `!==` can be used to compare values -- we prefer to use `===` to check for equality because it takes the type into - account. - -________________________________________________________________________________ -# Basic Variables - -Variables are used to store information to be referenced and manipulated in a -computer program. They also provide a way of labeling data with a descriptive -name, so our programs can be understood more clearly by programmers. It is -helpful to think of variables as containers that hold information. Their sole -purpose is to label and store data in computer memory. This data can then be -used and even changed throughout the lifetime of your program. - -When you finish this reading, you should be able to: - -- declare variables using the `let` keyword -- assign values to variables using the assignment operator (`=`) -- use the shortcuts `+=`, `-=`, `++`, `--` to reassign variables -- identify `undefined` as the default value for unassigned variables - -## Initializing a variable - -To initialize a variable in JavaScript we'll need two new pieces of syntax: -`let` and `=`. We can give the variable any name that we wish and assign it a -value. Once we initialize a variable, the variable will evaluate to the value -assigned: - -```javascript -let bootcamp = ""; -console.log(bootcamp); // '' - -let birthYear = 2012; -console.log(birthYear); // 2012 -``` - -**Did you know?** JavaScript variables names can contain any alphanumeric -characters, underscore (\_), or dollar sign (\$). However, they _cannot_ begin -with a number. - -Above are examples of how you'll create variables most of the time, so we'll -grow very familiar with the syntax. As a best practice, we should name our -variables in a way that is descriptive and concise. - -The variable initializations above really consist of two steps: _declaration_ -with `let` and _assignment_ with `=`. Let's break these two steps down. - -### Declaring a variable - -In JavaScript, in order to use a variable, we must _declare_ it. Variable -**declaration** is the act of introducing the variable to the environment. - -To declare a variable, use the `let` keyword, followed by a space and then the -name of the variable. - -```javascript -let bootcamp; -console.log(bootcamp); // undefined -``` - -Once a variable is declared, it will contain `undefined` as it's value. -`undefined` is a common default value in JavaScript, we'll see it come up in a -few different places. You can think of `undefined` as showing that the variable -is empty. - -### Assigning a variable - -Once a variable has been declared, we can assign it a value using single-equals -`=` : - -```javascript -let bootcamp; -console.log(bootcamp); // undefined -bootcamp = ""; -console.log(bootcamp); // '' -``` - -## Manipulating variables - -To change the value of a variable, we need to reassign it to a new value with -`=` : - -```javascript -let num = 42; -console.log(num + 8); // => 50 -console.log(num); // => 42 - -num = num + 10; -console.log(num); // => 52 -``` - -In the code above, `num + 8` will evaluate to `50`, but it will not change the `num` -variable to `50`. If we want to change the `num` variable, we must reassign to -it. - -### Assignment Shorthand - -Changing the value of a number variable is something fairly common in the -programming world. Luckily there is some shorthand operators we can use: - -```javascript -let number = 0; -number += 10; // equivalent to number = number + 10 -number -= 2; // equivalent to number = number - 2 -number /= 4; // equivalent to number = number / 4 -number *= 7; // equivalent to number = number * 7 -console.log(number); // 14 -``` - -We also have other shorthand to add or subtract exactly 1 from a variable, the -increment (`++`) and decrement (`--`) operators: - -```javascript -let year = 3004; -year++; -console.log(year); // 3005 -year--; -console.log(year); // 3004 -``` - -## NaN - -Now that we have the ability to perform arithmetic with variables, let's take a -look at a common programming mistake, getting a result of `NaN` (not a number): - -```javascript -let num; -console.log(num + 3); // NaN -``` - -The above code gives `NaN` because the unassigned `num` variable contains -`undefined`; adding `3` to `undefined` results in `NaN`. In general, any -nonsensical arithmetic will result in `NaN`. Math operations involving -`undefined` is perhaps the most common mistake: - -```javascript -console.log(undefined + 3); // NaN -console.log("fish" * 2); // NaN -``` - -## Remember - -- variables are declared with `let` and will contain the value `undefined` by - default -- we can use single-equals `=` to assign variables -- changing a variable requires a reassignment, for which there are many - shortcuts for (`+=`, `-=`, etc.) - -________________________________________________________________________________ -# Introduction to Functions - -We hope you are ready - because you are on the brink of one of the most fun -parts of writing JavaScript: writing **functions**. A function is a procedure of -code that will run when called. We only "write" a function once (**function -declaration**), but we can "use" it as many times as we please (**function -calls**). Functions are the fundamental building blocks of JavaScript and -mastering them is a big step on the road to JavaScript mastery. - -When you finish this reading, you should be able to: - -1. Describe what a function in JavaScript is. -2. Demonstrate how to invoke a function. -3. Write a function using function declaration. -4. Use the `return` keyword to return a value from a function. - -## Writing Functions - -A function is a set procedure of code that will run when called. Functions -really start to make sense when put in the perspective of solving problems. So -for example say you want to find the average of two given numbers. Meaning we -want to take two numbers, add them together then divide by 2: - -```js -> (5 + 5) / 2 -5 - -> (15 + 3) / 2 -9 - -> (7 + 2) / 2 -4.5 -``` - -Writing out the same code again and again gets tedious fast. What you can do -instead is write a new _function_. - -### Function Declaration - -A _function definition_ consists of the function keyword, followed by three -things: - -1. The **name** of the function. -2. A list of _parameters_ to the function, enclosed in parentheses, `()`. -3. The code to be run when this function is run, enclosed in curly - brackets,`{ }`. - -So for our above example of averaging two numbers we could write a function that -would do that for us! We would write something like the following: - -```js -// 1. average is the name of the function -// 2. number1 & number2 are the parameters being passed in -function average(number1, number2) { - // 3. this is the code run every time this function is used - return (number1 + number2) / 2; -} -``` - -First thing to notice for the above `average` function is that we didn't use any -_real_ numbers. You always want to write functions to accept as wide a range of -data as possible. Utilizing the incoming _parameters_ to a function is one of -the keys to making functions flexible. - -In the case of the `average` function, we want to use it to calculate the -average of any two numbers. `number1` and `number2` are the _parameters_ for the -`average` function. In other words, the `average` function expects to be given -two numbers, `number1` and `number2`. We'll be talking a lot more about -parameters later - but for now know that when you define a function with -parameters you are declaring those parameters as usable variables within that -function. - -The beauty of a function is that if we define it in a clever way, it will work -on a whole slew of data! For example, we want `average` to work on any two -numbers, whether or not they are whole numbers, decimal, negative, etc. - -## Invoking or "calling" a function - -Now that we've written a function how do we actually use it? Once defined a -function can be invoked or "called" as many times as we please. - -### Order of code - -Let's step away from `average` for a bit to see how a simple function call -works. Say we run JavaScript code that looks like this: - -```js -console.log("First!"); - -console.log("Second!"); -``` - -Running this code will return exactly as we expect. We will see `First!` printed -out, followed by `Second!`. In other words, JavaScript will evaluate your code -left-to-right and top-to-bottom. Very intuitive! It's exactly how you are -reading these notes right now. - -However, when JavaScript sees a function definition, JavaScript will **not** -evaluate the code inside of the definition. It will only "remember" the code so -we can execute it later. The code below only prints `First!` followed by -`Fourth!`: - -```js -console.log("First!"); - -function callMe() { - console.log("Second!"); - console.log("Third!"); -} - -console.log("Fourth"); - -// when run this code is ran it will print out: -// "First!" -// "Fourth" -``` - -To actually get the code within `callMe` to evaluate, we must _call_ it by using -`callMe()`. The code below will now print out in order: - -```js -function callMe() { - console.log("Second!"); - console.log("Third!"); -} - -console.log("First!"); -// we call the function by adding ending parenthesis -callMe(); -console.log("Fourth!"); - -// when run this code is ran it will print out: -// "First!" -// "Second!" -// "Third!" -// "Fourth" -``` - -Let's say JavaScript is running the file above. Here are the steps it would -take, starting from the tippy top of the code: - -1. JS sees a definition for `callMe`. It will remember this definition in case - we call the function later. It will **not** evaluate the code inside the - function yet. -2. JS prints out `First!` -3. JS sees that we are calling `callMe()`. At this point it will look at the - prior `callMe` definition and run the code inside. It is as if we are - "jumping" to inside the function definition. This means it will print - `Second!` followed by `Third!` -4. JS sees there is no more code to be run inside of `callMe`, so it "jumps" - back to where we originally called `callMe()` -5. JS will continue evaluating in order and print `Fourth!` - -### An average example - -So a declared function is "saved for later use", and will be executed later, -when it is called, also known as being **invoked**. So thinking back to our -average function we can declare the function and then _invoke_ it. - -When we specify what data to use for a function call, we refer to that process -**passing arguments to the function**. - -```js -// this is a function definition -function average(number1, number2) { - return (number1 + number2) / 2; -} - -// this is a function call with the arguments being 15 & 3 -> average(15, 3) -9 - -// this is a function call with the arguments being 5 & 5 -> average(10, 5) -7.5 -``` - -When we call the function `average(15, 3)`, we run the code inside the -_definition_ for `average`. That is, we plug in the parameters with real numbers -(`number1` becomes `10` and `number2` becomes 16). Think of `number1` and -`number2` as _variables_ that contain the values we pass in when we called the -function. Then we proceed by running the code inside the function. The parameter -names `number1` and `number2` used through the body of the function and behave -like variables. - -## Returning a value - -Now that we know how functions are declared and invoked let's talk about the -inside of the function. We'll start with a statement: _Every function in -JavaScript returns `undefined` unless otherwise specified._ - -Now what does that mean? We'll start with a simple example: - -```js -function sayNumber(number) { - console.log(number); -} - -> sayNumber(1); // prints 1 -1 -undefined -``` - -So what happened there? Let's do a quick step by step: - -1. We declared the `sayNumber` function -2. `sayNumber` was called handing in the argument of 1 -3. The `number` parameter is printed to the console -4. Then the function ends without encountering a `return` statement. Since - nothing was specifically returned then the function returned the default - value for a function which is `undefined`. - -Now let's change our above example to use the keyword `return` to return a -value: - -```js -function sayNumber(number) { - console.log(number); - return true; -} - -> sayNumber(1); -1 // sayNumber still prints 1 -true // but now sayNumber returns as true -``` - -Let's go back to our previous `average` function and talk about the `return` we -used there: - -```js -function average(number1, number2) { - return (number1 + number2) / 2; -} - -// the function call for average(10, 16) will return 13 -// so the result variable will be set to 13 -let result = average(10, 16); - -// if we want to check what a function returns we can do this: -console.log(result); // prints `13` - -// we could alternatively do this: -console.log(average(10, 16)); -``` - -When we _call_ a function, we jump to the function definition and run the code -inside. When we hit a `return` statement, we immediately **exit** the function, -jump back to where we _called_ the function, and evaluate the function call to -the value it _returned_. - -**Every function call evaluates to it's return value!** In other words, the -expression `average(10, 16)` evaluates to `13` just like how the expression -`1 + 1` evaluates to `2`. - -Another important rule of the return statement is that it stops function -execution immediately. This means that any code after a `return` will not be -executed! - -```js -function average(number1, number2) { - let sum = number1 + number2; - return sum; - // anything under the first return will not be executed - console.log("this will not run") - return false; -} - - // when the first return is encountered the entire function will return a value -> average(2, 7); -9 -``` - -So the three things to remember about return statements is: - -1. Every function call evaluates to it's return value. -2. Every function in JavaScript returns `undefined` unless a `return` is - specified -3. Once a `return` statement is encountered the function will immediately stop - and return the value, ignoring any code below the `return` statement. - -## The importance of naming - -A quick but very important side note about good naming. Take this to heart right -now: **Good names are important**. Do yourself, and every other programmer -reading your code, a favor by always using significant function and variable -names. - -For example, `x` is a very non-descriptive name for a variable or function. As -we tackle more complicated problems and our code grows to be more complex, we -are likely to forget what badly named variables originally stood for and what -their purpose was. Non-descriptive names make our code error-prone. **Great code -reads like English and almost explains itself.** As programmers, our goal is to -write code that is not only "correct", but also elegant, readable, and -maintainable! Hold yourself to this high standard. - -As far as syntax goes in JavaScript we always name our functions and variables -`camelCase` for multiple words. (Ex: `tipCalculator`, `currentNumber`, -`puppyPartyFinder`). Other languages use other conventions so it's best to pick -up the standard for your chosen language and stick with it. - -## Review - -By writing a function we can reuse code over and over again to solve similar -problems with different input data (arguments). This will make your life easier -and allow you to start working on more complex problems. - -This reading covered: - -- How to define and invoke a function in JavaScript. -- How to use the `return` keyword to return a value from a function. -- Writing readable JavaScript code by using significant names and following - `camelCase` conventions for multiple word variables and functions - -________________________________________________________________________________ -# Parameters and Arguments - -When talking about functions one of the first things we mentioned was the word -_parameters_. In this reading we will be covering what exactly a parameter is - -as well as the differentiation between _parameters_ and _arguments_. - -When you finish this reading, you should be able to: - -1. Identify the difference between parameters and arguments. -2. Write a function that utilizes declared parameters. -3. Invoking a function with passed in arguments. - -## The difference between Parameters and Arguments - -Let's start off by talking about the difference between _arguments_ and -_parameters_ and how to identify which is which. - -1. **Parameters** are comma separated variables specified as part of a - function's declaration. -2. **Arguments** are values passed to the function when it is invoked. - -So by defining _parameters_ when we declare our function we are effectively -setting accessible variables within the function: - -```js -function add(firstParameter, secondParameter) { - console.log(firstParameter + secondParameter); -} - -// the add function declares two parameters -> add(1, 2); //=> 3 -``` - -In the above example we declared our parameters when we declared our function. -Now _arguments_ work slightly differently - when the function is invoked we are -passing in _arguments_. So in the above example when we invoked `add(1, 2)` the -`(1,2)` were the _arguments_ being passed in. So when a function is invoked the -value of the declared parameters is assigned to the passed in _arguments_. - -You can think of it _parameters_ and _arguments_ like a recipe. A recipe is a -list of ingredients (_parameters_) and list of steps (the code to be run). When -someone cooks the recipe (_invokes_ the function) they add the ingredients they -actually have(_arguments_). The result of cooking the recipe is the delicious -`return` value! - -### Extra arguments - -In JavaScript a function will not throw an error if the number of _arguments_ -passed during a function invocation is different than the number of parameters -listed during function declaration. This is very important to know! - -Let's use the above function to demonstrate: - -```js -function add(firstParameter, secondParameter) { - console.log(firstParameter + secondParameter); -} - -// this will ignore the 17 & 14 -// the first two arguments passed in will be assigned to the first two parameters -> add(1, 2, 17, 14); //=> 3 -``` - -Notice in the above example we passed in 4 arguments (1, 2, 17, 14) to `add`. -Since the function was only looking for two parameters that is all it uses. - -### Not enough arguments - -Now what happens if we pass in less arguments then needed? - -```js -function add(firstParameter, secondParameter) { - console.log(firstParameter + secondParameter); -} - -> add(5); //=> NaN -``` - -Whoa what happened there? Let's do a play-by-play: - -1. `firstParameter` was set to equal the first passed in argument which in the - above case is 5. -2. Since there is no second argument then `secondParameter` is declared as a - variable but is set to the default value of `undefined`. -3. The function then tries to add 5 to `undefined` which is definitely not a - number! So we get `NaN` (which means `Not A Number`) printed to the console. - -As you write more functions you'll grow very comfortable using both arguments -and parameters to accomplish your function's goal. - -## Review - -- Parameters are variables defined as a part of a function's declaration. -- Arguments are values passed to the function when it is invoked. -- JavaScript functions can intake a different number of arguments than the - number of parameters listed during function declaration. - -________________________________________________________________________________ -# WEEK-01 DAY-2
*Control Flow* {ignore=true} -________________________________________________________________________________ -# Control Flow and Array Learning Objectives - -Below is a complete list of the terminal learning objectives for this lesson. -When you complete this lesson, you should be able to perform each of the -following objectives. These objectives capture how you may be evaluated on the -assessment for this lesson. - -1. Define a function that accepts a sentence string and two words as args. The - function should return a boolean indicating if the sentence includes either - word. -2. Identify a pair of mutually exclusive conditions -3. Given a for loop, translate it into a while loop, and vice-versa -4. Write a function that iterates through a provided string argument -5. Given a description of pig latin, write a function that takes in a string - argument and utilizes String#slice to translate the string into pig latin. -6. Write a function that takes in an array of words and a string as arguments - and returns a boolean indicating whether the string is located inside of the - array. The function must use Array#indexOf. -7. Define that an array literal is an ordered list of values defined by using - bracket and individual values are read by indexing. -8. Prevent code that can throw an exception from causing the program to crash. the terminal learning objectives for this lesson. -When you complete this lesson, you should be able to perform each of the -following objectives. These objectives capture how you may be evaluated on the -assessment for this lesson. - -1. Define a function that accepts a sentence string and two words as args. The - function should return a boolean indicating if the sentence includes either - word. -2. Identify a pair of mutually exclusive conditions -3. Given a for loop, translate it into a while loop, and vice-versa -4. Write a function that iterates through a provided string argument -5. Given a description of pig latin, write a function that takes in a string - argument and utilizes String#slice to translate the string into pig latin. -6. Write a function that takes in an array of words and a string as arguments - and returns a boolean indicating whether the string is located inside of the - array. The function must use Array#indexOf. -7. Define that an array literal is an ordered list of values defined by using - bracket and individual values are read by indexing. -8. Prevent code that can throw an exception from causing the program to crash. - -________________________________________________________________________________ -# Control Flow - Conditional Statements - -So far the code you've written has been pretty direct in it's intent. You can -define functions and variables but, so far the functions you've created haven't -been able to do that much for you _yet_. It's time to start writing functions -that can do things _conditionally_ by utilizing _control flow_. - -In simple terms - **control flow** is the order in which instructions are -executed within a program. One modifies control flow using _control structures_, -expressions that alter the control flow based on given parameters. The control -structures within JavaScript allow the program flow to change within a unit of -code or a function. - -This reading will be covering one of the two main _control structures_ you -will use time and time again - _Conditional statements_. _Conditional -statements_ are used to perform different actions based on different conditions. - -When you finish this reading, you should be able to: - -- Write `if`, `else if`, `if...else` conditional statements. -- Know that conditional statements can have only one `if` and one `else` - statement. -- Identify that conditional statements can be nested. - -## A Quick Word on Syntax - -Before we get started we'll quickly go over the terms we'll be using to -represent syntax. - -1. `[ ]` are square **brackets** -2. `{ }` are curly **braces** -3. `( )` are **parentheses** - -## Writing Conditional Statements - -Conditional Statements are the second fundamental _control structure_ for -writing JavaScript and are pretty straight forward. The simplest conditional -statement is the `if` statement. An `if` statement has two parts, the _test -expression_ (the code that immediately follows the `if` which goes in -parentheses), and the _then expression_ (this code belongs in braces after the -`if` expression). The _then_ expression will only run when the `if` expression -is truthy. - -Here is an example of a simple `if` statement: - -```js -// this is the test expression -if (3 === 3) { - // this is the then expression - // this code will run if the above statement is true - console.log("this is a three!"); -} -``` - -The `if` statement above allows you to specify what should happen if your -particular expression evaluates to true. You can chain additional _test -expressions_ onto this `if` statement by using a `else if` statement. - -The syntax for `else if` is very similar as an `if` statement: - -```js -function mathFun() { - let x = 2 + 3; - - if (x === 3) { - console.log("we have a 3"); - } else if (x === 4) { - // this code will run if the above statement is true - console.log("we have a 4"); - } else if (x === 5) { - // this code will run if the above statement is true - console.log("we have a 5"); - } -}; - -mathFun(); // => "we have a 5" -``` - -The `else if` and `if` statements do not, however, provide the option to specify -something else that should happen in the event that all of the above expressions -evaluate to be `falsey`. The `if...else` statement reads just like English. The -JS interpreter will execute the `else` statement if all the above conditions -given are `falsey`. See below for an example: - -```js -function mathFun() { - let x = 19; - if (x === 3) { - console.log("we have a 3"); - } else if (x === 4) { - console.log("we have a 4"); - } else { - console.log("I will return if everything above me is falsey!"); - } -}; - -mathFun(); // => "I will return if everything above me is falsey!" -``` - -You can chain an arbitrary number of `else if` statements but there can only be -one `if` statement and one optional `else` statement. The `if` introduces the control -structure and the `else` acts as a fail safe to catch everything that didn't -meet the above conditions. - -Only one _then expression_ is ever executed in an `if`, `if...else`, or -`if...else` statement. If one of the _test expressions_ is truthy, then the -result of its _then expression_ is the result of the **entire** conditional -statement: - -```js -let x = 3; -if (x === 3) { - console.log("this will run"); -} else { - console.log("this will not run"); -} -``` - -Additionally, you can nest conditional statements within each other but it will -get hard to read pretty quickly and is discouraged: - -```js -function mathFun(x) { - if (x === "math") { - if (x === "math" && x[0] === "m") { - if (x[1] === "a") { - console.log("this got confusing fast"); - } else { - console.log("that is not math!"); - } - } else { - console.log("that is for sure not math!"); - } - } else { - console.log("I will return if everything above me is false!"); - } -}; - -mathFun("math"); // => "this got confusing fast" -``` - -## Review - -- Conditional statements allow us to control what actions should be taken based - on a boolean (truthy or falsey) expression -- In a chain of _then expressions_ (`if...else if...else`), only one of the - _then expressions_ will be executed. -- Conditional statements can have only one `if` and one `else` statement. -- Conditional statements can be nested. - -________________________________________________________________________________ -# Mutually Exclusive Conditions - -You have now learned how to write conditional statements. Now we'll talk a -little bit more about how to write them using best practices. - -When you finish this reading, you should be able to: - -- Identify a pair of mutually exclusive conditions. - -## When to use if statements - -Say you are given the challenge to write a function that that will call another -function named `bigNumber` if the given argument is **greater** than 100 or call -a function named `smallNumber` if it the given argument is smaller. You could -write a function to do that which would look like this: - -```js -function numberSeparator(number) { - if (number < 100) { - // number is smaller than 100 so we invoke smallNumber - smallNumber(); - } - if (number === 100) { - // number is equal to 100 so we invoke smallNumber - smallNumber(); - } - if (number > 100) { - // number is larger than 100 so we invoke bigNumber - bigNumber(); - } -} -``` - -As you can probably tell the above function uses a lot of code to do a simple -task. To be clear the function above would work for our aim - but it repeats -itself. There is an age old principal for writing good code named **DRY** or -**Don't repeat yourself**. As good programmers we always want our code to be -clear, concise, and efficient. - -A general rule of thumb is that if you are working with a condition that is -**mutually exclusive**, meaning if one condition is true the other condition -must be false, then you should use an `if/else` statement. You can also think of -**mutually exclusivity** like a coin flip - it can be either heads or tails but -not both. - -Going back to the original problem at hand we can see it makes intuitive sense -with the way the challenge is phrased: If the number is larger than 100 then -we'll call `bigNumber`, otherwise we invoke is `smallNumber`. - -So let's rewrite the above function to read a little more clearly: - -```js -function numberSeparator(number) { - if (number > 100) { - bigNumber(); - } else { - smallNumber(); - } -} - -// this also works -function numberSeparator(number) { - if (number <= 100) { - smallNumber(); - } else { - bigNumber(); - } -} -``` - -Look at how much clearer that is! Writing good code is an art - devote yourself -to becoming an artist! - -## Review - -- How to identify a pair of mutually exclusive conditions. -- DRY - don't repeat yourself! - -________________________________________________________________________________ -# Control Flow - Looping - -A quick reminder before we start - **control flow** is the order in which -instructions are executed within a program. One modifies control flow using -_control structures_, expressions that alter the control flow based on given -parameters. This reading will be covering the second of the main _control -structures_ you will use time and time again - _loops_. - -When you finish this reading, you should be able to: - -1. Know how to write a `while` loop and a `for` loop. - - Know how to convert a `for` loop into a `while` loop -2. Know that index variables conventionally start at zero. -3. Explain what an _iteration_ is. - -## Looping - -Imagine you are at a friend's house and your friend has six dogs. Someone left -the back gate open and all the dogs go out in the yard and get super muddy. Now -your friend wants to clean their dogs but they only have one bathtub! You can't -wash all the dogs at once. So the only option is to give the dogs a bath one at -a time until they are all clean. When you start 0 dogs are clean and 6 dogs are -dirty. - -_While_ there are still dirty dogs you still have a job to do. That is your -**condition** - you will stop giving baths once all 6 dogs are clean. So after -one bath you you have 1 clean dog and 5 dirty dogs. You've -_incremented_(increased by one) your number of clean dogs. After each bath you -check your **condition** again until you have 6 clean dogs so you know you can -stop! - -What we've described above is the idea of looping - setting a condition, -executing an action, doing something to make sure our condition will be met -eventually, and rechecking our condition before executing our next action. - -Loops are a fundamental _control structure_ for writing JavaScript. -Loops will repeatedly execute a section of code while a condition is true. Loops -are simple to write and incredibly powerful! There are many variations of loop -but we will be covering the two most fundamental loops now - **while** loops and -**for** loops. - -### While Loops - -One of the simplest loops in `JavaScript` is the `while` loop. As with all -loops, the `while` loop will execute a block of code as long as a specified -condition is true. The while loop starts with the keyword `while` then states a -condition in parentheses. The code in the following braces will be run until the -above condition is met. - -```js -while (condition) { - // code block to be executed -} -``` - -In the following example, the code in the loop will run, over and over again, as -long as a variable (`index`) is less than 10: - -```js -let index = 0; - -// this is the condition that will be checked every time this loop is run -while (index < 10) { - console.log("The number is " + index); - // this is common shorthand for index = index + 1 - index++; -} -``` - -The most important thing to remember when writing any loop is to always be -working towards your condition. In the example above if we did not increment the -`index` variable by 1 each time the loop ran then we would be stuck with what we -call an **infinite loop**: - -```js -let index = 0; - -// this is an infinite loop because our condition will never be met -while (index < 10) { - console.log("The number is " + index); - // if we do not increase the index then our condition is never met - // Meaning this will run forever! -} -``` - -The above code will run until whatever interpreter you are using crashes. - -### Important Loop Knowledge - -A quick word before we learn about the next loop. - -The _index_ is the traditional word for the variable that keeps track of how -many times the loop has been run. Don't write loops with indices starting at -one; you'll confuse other programmers and yourself. Indices have started at zero -for a long time, and for good reason. It's much easier to use loops that start -with an index of zero because Array and String indices also start at zero. - -```js -let array = [0, 1, 2]; -let index = 0; - -while (index < array.length) { - console.log( - "Both the index and the current array position are " + array[index] - ); - index++; -} -``` - -In the above code we will do one loop for each digit in the Array above. We call -each of those loops an "iteration". An iteration is the act of repeating a -procedure, hence looping is an **iterative** technique. Each repetition itself -is also called an "iteration." So you can use loops to _iterate_ through Arrays -and Strings. - -### For Loops - -A `for` loop can be broken down into three sections: - -1. The _initial expression_ which will be run once at the beginning of the loop. -2. The _condition_ which is checked every time the loop is run. If this - condition is true the loop will run again. If this condition is false the - loop will end. -3. The _loopEnd expression_ which will be run at the end of the loop before - checking the _condition_ again. - -```js -for (;;) -``` - -The `for` loop is usually used with an integer counter: - -```js -for (let index = 0; index < 10; index += 1) { - // the code inside this block will run 10 times -} -``` - -While the _loopEnd expression_ is normally used to increase a variable by one -per loop iteration, it can contain any statement, such as one that decreasing -the counter, or increasing it by 2. - -You can use the `for` loop to iterate through all kinds of things. Check out the -example below for how to iterate through a String: - -```js -let testString = "testing"; - -// we can use the testString's length as our condition! -// Since we know the testString's index starts at 0 -// and our index starts at 0 we can access each letter: -for (let index = 0; index < testString.length; index += 1) { - let letter = testString[index]; - console.log(letter); -} -``` - -These are the most basic types of loops. If all else fails, you can always fall -back on these two loops. All the other loop forms are just more convenient forms -of these basic loop styles. - -## Translating From One Loop to Another - -So far we have covered both `while` and `for` loops. Once you understand the -concept of looping it's easy to translate one loop to another: - -```js -// these two do the exact same thing! -function forLoopDoubler (array) { - // it is convention to shorten index to just i in most cases - for (let i = 0; i < array.length; i++) { - array[i] = array[i] * 2; - } - return array; -}; - -function forLoopDoubler (array) { - let i = 0; - while (i < array.length) { - array[i] = array[i] * 2; - i++; - } - return array; -}; - -forLoopDoubler([1, 2, 3]); // => [2,4,6] -whileLoopDoubler([1, 2, 3]); //=> [2,4,6] -``` - -## Review - -- We can use a `for` or `while` loop to repeat a block of code repeatedly. -- While the loop condition is true, we will execute another iteration of the - loop. -- When the loop condition is false, we will exit the loop. - -________________________________________________________________________________ -# The Array Type - -This reading will be about one of JavaScript's global objects, the **Array** -type. JavaScript arrays are used to store multiple values all within a single -structure, much like a creating a list. Arrays can hold strings, integers and -even other arrays! Arrays are incredibly useful for holding a bunch of different -information all in one place. - -When you finish this reading, you should be able to: - -- Write arrays using correct syntax -- Identify that an array is an ordered list of values defined by using brackets -- Use `.length` to obtain a count of the numbers of elements that comprise an - array -- Index an array to refer to a single value -- Concatenate multiple arrays together - -## Using arrays - -While coding you will find that you often find yourself needing to refer to a -bunch of data at once. For instance, what if you wanted to refer to the entire -English alphabet. Sure, you could create a bunch variables for each letter in -the alphabet: - -```js -let a = "a"; -let b = "b"; -let c = "c"; -let d = "d"; -// and so on for way too long... -``` - -However this becomes cumbersome and unmanageable quickly. An Array is a data -structure that solves this problem. Arrays are always wrapped in square -brackets, `[]`, and store their comma separated values in sequential order. -Arrays in JavaScript are also very flexible: we can put elements into an array, -replace elements in an array, and remove elements from the array. - -So going back to our first example of containing the alphabet: - -```js -let alphabet = [ - "a", "b", "c", "d", "e", "f", - "g", "h", "i", "j", "k", "l", - "m", "n", "o", "p", "q", "r", - "s", "t", "u", "v", "w", "x", - "y", "z" -]; -``` - -## Indexing arrays - -### Calculating the length of an array - -Since an array can container any number of values you will find it useful to -count the number of values available to you using `.length`: - -```js -console.log([4, 7, 9].length); // => 3 -console.log([1, 2].length); // => 2 -console.log([].length); // => 0 -``` - -### Properly indexing an array - -Arrays consist of multiple values all stored in sequential order. These value -are numbered by **indices** starting at 0 (just like indexing a string!). So -given the below example: - -```js -let numbersAndLetters = ["b", "z", 17, "cat"]; -``` - -In the above `numbersAndLetters` array if we access `numbersAndLetters` at the -index of 0 we get back the value of "b". If we access `numbersAndLetters` at the -index of 1 we get "z", at the index of 3 we get 17, etc. We can specify which -value we'd like to access in an array by using square brackets,`[]`, and -specifying an index: - -```js -console.log(numbersAndLetters[0]); // => "b" -console.log(numbersAndLetters[1]); // => "z" -console.log(numbersAndLetters[2]); // => 17 -console.log(numbersAndLetters[3]); // => "cat" -``` - -Notice that even though the index at `numbersAndLetters[3]` has the value of a -string with multiple characters ("cat") we return the _entire value_ listed at -that index. - -**Reminder:** Arrays **always** start at the index of 0, not 1. This is the -convention in programming. Additionally, indices should always be a number. - -We can access a value in an array directly by providing an index for the value -we'd like to access in that array (`array[index]`). See below for an example: - -```js -console.log(["a", "b", "c"][0]); // => "a" -console.log(["a", "b", "c"][1]); // => "b" -console.log(["a", "b", "c"][2]); // => "c" -console.log(["a", "b", "c"][3]); // => `undefined` -``` - -As we see in the code above, if we try to access an element at an index that is -not inside the array, we get back `undefined`. This makes sense because there is -no value at that given position! - -### The classic "off by one" error - -Arrays are similar to strings in that both of their indices start at 0 instead -of 1. Forgetting this fact can lead to some pretty confusing situations. Let's -focus on an important distinction: the index of the last value of an array is -always one less than its length. - -```javascript -console.log([4, 7, 9].length); // => 3 -console.log([4, 7, 9][3]); // => undefined -console.log([4, 7, 9][2]); // => 9 -``` - -In other words, although the `length` of `[4, 7, 9]` is 3, the index of the last -value (`9`) is 2. A good rule of thumb of accessing the last index of an array -is to find the length and then subtract one: - -```js -let testArray = [4, 7, 9]; -let finalIndex = testArray.length - 1; // => (3 - 1) = 2 -console.log(testArray[finalIndex]); // => 9 -``` - -## Working with arrays - -### Containing data in arrays - -By packaging groups of related data into a single array, we gain the added -benefit of being able to refer to that data as a single collection. Arrays don't -have to just hold single characters- they are capable of holding entire strings, -numbers, and even other arrays! - -```js -let wackyArray = [2, 17, "apple", "cat", ["apple"]]; - -console.log(wackyArray[0]); // => 2 -console.log(wackyArray[1]); // => 17 -console.log(wackyArray[3]); // => "cat" -console.log(wackyArray[4]); // => ["apple"] -``` - -Just think of all the possibilities of what you can store in a single array! -However, just because you can _doesn't_ mean you should. In practice we will -almost always be storing similar kinds of data, that are coming from a common -source (i.e. items in a shopping list, ID numbers, tasks on a todo list). - -### Using indexOf with arrays - -We can also calculate the index of a given value within an array by using -`indexOf`: - -```javascript -console.log([1, 3, 5, "apple", "jet"].indexOf(3)); // => 1 -console.log([1, 3, 5, "apple", "jet"].indexOf(5)); // => 2 -console.log([1, 3, 5, "apple", "jet"].indexOf("jet")); // => 4 - -// this won't be found in the array -console.log([1, 3, 5, "apple", "jet"].indexOf("potato")); // => -1 -``` - -If we attempt to search for a value that is **not** present in an array, -`indexOf` will return -1. This makes sense because we know that -1 is not a -valid array index. The smallest index possible is 0! - -## Concatenation with arrays - -As a reminder, concatenation is just a fancy word for joining things together -into a single collection. Now, this is where arrays will differ from strings. -The `+` operator only exists for numbers and strings. If you try to use the `+` -on an array it will try to help you out by _converting your arrays into -strings_. - -```js -console.log([1, 2, 3] + [4, 5, 6]); // => 1,2,34,5,6 -``` - -JavaScript was just trying to help! However that is probably not what you meant -to do. Good thing JavaScript has a seperate method for putting two array -together. To concatenate arrays, we can use the aptly named `.concat` method: - -```javascript -console.log([1, 2, 3].concat([4, 5, 6])); // => [1, 2, 3, 4, 5, 6] -``` - -## Remember - -- An **Array** is a data type that contains a list of in order values surrounded - in square brackets `[]`. -- `array.length` returns the number of values in the `array`. -- Each value of an array is associated with a number index; the first value of - an array is at the index of 0. -- We can use `array.indexOf(value)` to obtain the index of `value` within - `array`; if `value` is not found, then -1 is returned. -- We can use `.concat` to concatenate multiple arrays, combining them into a - single array. - -________________________________________________________________________________ -# WEEK-01 DAY-3
*Intermediate Functions* {ignore=true} -________________________________________________________________________________ -# Intermediate Functions Learning Objectives - -Below is a complete list of the terminal learning objectives across all -"Intermediate Function" lessons. When you complete these lessons, you should be -able to perform each of the following objectives. These objectives capture how -you may be evaluated on the assessment for these lessons. - -1. Identify that strings are immutable and arrays are mutable -2. Define a function using both function declaration and function expression - syntax -3. Utilize Array#push, #pop, #shift, #unshift to mutate an array -4. List the arguments that can be used with Array#splice -5. Write a function that sums up elements of an array, given an array of numbers - as an argument -6. Utilize Array#forEach, #map, #filter, #reduce in a function -7. Define a function that takes in an array of numbers and returns a new array - containing only the primes -8. Define a function that takes in a 2D array of numbers and returns the total - sum of all elements in the array -9. Define a function that takes in an array of elements and returns a 2d array - where the subarrays represent unique pairs of elements -10. Define a function that takes in an array of numbers as an argument and - returns the smallest value in the array; if the array is empty return null the terminal learning objectives across all -"Intermediate Function" lessons. When you complete these lessons, you should be -able to perform each of the following objectives. These objectives capture how -you may be evaluated on the assessment for these lessons. - -1. Identify that strings are immutable and arrays are mutable -2. Define a function using both function declaration and function expression - syntax -3. Utilize Array#push, #pop, #shift, #unshift to mutate an array -4. List the arguments that can be used with Array#splice -5. Write a function that sums up elements of an array, given an array of numbers - as an argument -6. Utilize Array#forEach, #map, #filter, #reduce in a function -7. Define a function that takes in an array of numbers and returns a new array - containing only the primes -8. Define a function that takes in a 2D array of numbers and returns the total - sum of all elements in the array -9. Define a function that takes in an array of elements and returns a 2d array - where the subarrays represent unique pairs of elements -10. Define a function that takes in an array of numbers as an argument and - returns the smallest value in the array; if the array is empty return null - -________________________________________________________________________________ -# Function Expressions - -You may have noticed that we've been writing many functions so far in the -course! We will continue to do so since functions are the building blocks of the -eventual applications that we will build. That being said, let's begin to -broaden the way we think about functions. In particular, we'll want think of -functions as expressions that we can store in variables - just like our classic -data types of number, string, boolean, array, and object! - -When you finish this article, you should be able to: - -- identify functions as first-class objects in JavaScript -- define a function using function expression syntax - -## Functions as first-class objects - -JavaScript is well known for being a programming language that treats functions -as "first-class objects". This fancy talk means that you can treat a function as -a "normal" value by storing it in a variable. We'll leverage this key concept in -very clever ways later in the course. For now, let's begin with a simple example -that shows the "first-class object" nature of functions: - -```javascript -let calculateAverage = function(a, b) { - return (a + b) / 2; -}; - -console.log(calculateAverage(10, 20)); // 15 -``` - -In the code snippet above, we define the `calculateAverage` by assigning a -variable to contain the function's definition. By doing this, the variable's -name is effectively the function's name. So to call the function, we simply -refer to the variable name. Note that we do not write the function's name after -the `function` keyword, where we normally would. We will refer to this new way -of defining functions as _function expression syntax_ and the classic way of -defining functions as _function declaration syntax_. In general, we can define -functions using either syntax: - -```javascript -// function declaration syntax -function myFunctionName(arg1, arg2) {} - -// function expression syntax -let myFunctionName = function(arg1, arg2) {}; -``` - -In the coming sections, we'll highlight moments when we'll prefer one syntax -over the other. For now, get acquainted with the new syntax as it is something -you'll be seeing a lot of as a programmer! - -### A peek under the hood - -Perhaps you're finding it tough to understand what it means for a variable to -contain a function - it is indeed a very abstract idea for new programmers. -Let's draw a comparison. We know that when we assign an expression to variable, -the expression first evaluates to a single value, which we then store in the -variable name: - -```javascript -let myNum = 4 + 4; -console.log(myNum); // prints 8 -console.log(myNum * 3); // prints 24 -``` - -In the same way we can treat a function definition as an expression that -evaluates! - -```javascript -let myFunc = function() { - console.log("I'm a function"); -}; - -console.log(myFunc); // prints [Function: myFunc] -myFunc(); // prints "I'm a function" -``` - -Looking at the snippet immediately above, you'll notice that when we print the -`myFunc` variable directly, without calling the function with parentheses, -JavaScript simply says the variable contains a function named myFunc -(`[Function: myFunc]`). You can truly imagine a function as a value that we can -store and use as we please. - -> The term _anonymous function_ may also be used to describe a function -> expression before it is assigned to any variable. Following the example above, -> we'll use the word _anonymous function_ to describe the function expression -> _before_ the assignment to the `myFunc` variable is complete. Once the -> assignment is complete, it would be silly to refer to `myFunc` as an -> `anonymous function` because an _anonymous function_ has no name. - -## Remember - -- functions can be stored in variables; just like any other values in - JavaScript! - -________________________________________________________________________________ -# Two-Dimensional Arrays (2D Arrays) - -Time to broaden our understanding of arrays! We've already explore the -fundamentals of arrays. Mainly, we can store any type of data we please as -elements of an array and even mix types together. However, what happens if we -store an array as an element of an array? - -When you finish this article, you should be able to: - -- index into the inner elements of a 2D array -- use nested loops to iterate through a 2D array - -## Multidimensional Arrays - -When we store arrays as elements of other arrays, we refer to those structures -as multidimensional arrays. If the "depth" of the nested arrays is at exactly 2 (an -outer array containing inner arrays), then we'll refer to it as a -two-dimensional array: - -```javascript -let twoDimensional = [["a", "b", "c"], ["d", "e"], ["f", "g", "h"]]; - -console.log(twoDimensional[1]); // [ 'd', 'e' ] -console.log(twoDimensional[1][0]); // 'd' - -let subArr = twoDimensional[1]; -console.log(subArr[0]); // 'd' -``` - -Note that indexing the outer `twoDimensional` array will return an element like -usual, it's just that element happens to be another array. To gain access to the -innermost elements, we simply need to apply another set of indexing brackets! - -If we style our 2D arrays nicely so that each subarray is on a new line, we can -interpret the double indices as `[row][column]`: - -```javascript -let twoDimensional = [ - ["a", "b", "c"], - ["d", "e"], - ["f", "g", "h"]]; - -// get the element in the 0th row, 2nd col: -console.log(twoDimensional[0][2]); // 'c' -``` - -## Iterating through 2D Arrays - -Since a 2D array is just an array of arrays. We'll need to use a loop within a -loop to iterate through a 2D array: - -```javascript -let array = [["a", "b", "c"], ["d", "e"], ["f", "g", "h"]]; - -for (let i = 0; i < array.length; i++) { - let subArray = array[i]; - console.log(subArray); - - for (let j = 0; j < subArray.length; j++) { - console.log(subArray[j]); - } -} -``` - -In the nested loops above, the `i` index refers to the current "row" and the `j` -index refers to the current "column". It's worth noting that since the inner -subArrays have different length, we'll want to specifically reference the length -of that subarray in our inner loop condition `j < subArray.length`. The code -above will print: - -```plaintext -[ 'a', 'b', 'c' ] -a -b -c -[ 'd', 'e' ] -d -e -[ 'f', 'g', 'h' ] -f -g -h -``` - -## When is a 2D array practical? - -As a preview of things to come let's briefly mention when you'll find a 2D array -useful in your future projects. Imagine how'd you represent a "grid": - -- tic-tac-toe (3x3 grid) -- chess (8x8 grid) -- sudoku (9x9 grid) -- excel (a sheet is an arbitrarily sized 2D array) - -## Remember - -- an array can contain arrays as elements, we call this a 2D arrays -- to iterate through a 2D array, used nested loops - -________________________________________________________________________________ -# Mutability in JavaScript - -So far in the course we've explored a handful of methods that manipulate data. -We'll be growing our arsenal of methods further overtime, so we'll want to gain -awareness for **exactly** how we should expect these methods to manipulate the -data we give them. To this end, let's analyze which methods will modify existing -data and which methods do not. We refer to this concept as **mutability**. - -When you finish this article, you should be able to: - -- Explain what "mutability" is -- Correctly label JavaScript data types as immutable or mutable - -## What is mutability? - -At its face value, _mutability_ is a simple concept. You may be familiar with -the word _mutation_, which refers to a alteration (usually in DNA). Something -that is _mutable_ can be changed, while something that is _immutable_ is -unchanging and permanent. To illustrate this concept, we'll begin with strings -and arrays. We've spent some time with these two data types and by now we -recognize that the two types share many similarities. Both have indices, -`length`, and even share common methods like `slice`. However, they differ -greatly in their mutability: - -```javascript -let myArr = ["b", "e", "a", "m"]; -myArr[0] = "s"; -console.log(myArr); // 'seam' - -let myStr = "beam"; -myStr[0] = "s"; -console.log(myStr); // 'beam' -``` - -Above we have shown that we can assign a new element to an index of an array, -but we cannot assign a new character to an index of a string. In other words, -arrays are _mutable_, but strings are _immutable_. - -An implication of this discovery is that there are _some_ array methods that -will modify an existing array but _zero_ methods that will modify an existing -string. Methods that manipulate string data typically return a _new_ string and -never modify an existing one. A prime example is `toUpperCase`: - -```javascript -let word = "piñata"; -let newWord = word.toUpperCase(); -console.log(word); // 'piñata' -console.log(newWord); // 'PIÑATA' -``` - -Above, notice that the `toUpperCase` method returns a capitalized version of the -string, but does not change the original string. It's also worth noting that not -every array method will mutate. For example, the `slice` method does not mutate -for both strings and arrays. As we learn about methods in the future, we'll be -certain to note what mutates and what does not. - -## Mutable or immutable, that is the question - -Now that we have a grasp of _mutability_, let's take inventory and identify -JavaScript's data types as mutable or immutable. - -**Mutable** - -- array -- object (we'll learn these soon) - -**Immutable** - -- number -- string -- boolean - -A quick way to remember the above list is to identify that the composite types -(the types that can contain multiple values) of array and object are mutable. -The remaining "simpler" types of number, string, and boolean are immutable. - -## The mutability misconception - -Maybe you are having a tough time believing what we have just claimed. We don't -blame you, you've probably heard the saying that change is the only constant in -the universe. Let's debunk a common argument to turn you into a believer. The -skeptical programmer may use this as an argument to show that numbers are -mutable: - -```javascript -let myNum = 42; -myNum += 8; -console.log(myNum); // 50 -``` - -Because the `myNum` variable now contains `50` where it once contained `42`, it -may seem we have mutated the number, but this is not truly the case. Recall that -`myNum += 8` is shorthand for `myNum = myNum + 8`. Since the right hand side of -the assignment evaluates first, we are simply taking the new number of `50` and -reassigning it to the `myNum` variable. This reassignment of a variable name is -not a mutation of the original number. - -## Remember - -- data types that can be changed are mutable, those that cannot be changed are - immutable -- arrays and objects are mutable -- numbers, strings, and booleans are immutable - -________________________________________________________________________________ -# Array Splice - -Time to a learn yet another array method! The [Array#splice][mdn-splice] method -deserves its own reading because of how versatile it is. Feel free to use this -article as a quick reference; let's jump right in. - -When you finish reading this article, you should be able to: - -- list all possible arguments that can be used with the `Array#splice` method - -## Notation - -For clarity in this article and moving forward in the course, we'll be notating -methods with `#` to clarify how they should be called. For example, -`Array#splice` refers to the method that should be called on an array, -`arr.splice()` where `arr` is some array variable. Likewise `String#toUpperCase` -refers to the method that should be called on a string, `str.toUpperCase()` -where `str` is some string variable. We'll opt to refer to methods using this -notation because some methods can be called on multiple data types, such as -`Array#slice` and `String#slice`. - -## What can Array#splice do? - -Before we explore the nitty-gritty details of the `Array#splice` method, the -first thing to be aware of is that the method will **mutate** the array that it -is called on. That is, `Array#splice` will modify the existing array and _not_ -return a new array. - -### Using splice to remove - -The usage of the `Array#splice` method is easy to mix up because it can be used -to remove or insert elements into an array. That's right - it can perform -"opposite" operations, even at the same time! For now, we'll begin by _only_ -removing elements from an array: - -```javascript -let colors = ["red", "yellow", "blue", "green", "orange", "brown", "gray"]; -let returnVal = colors.splice(2, 3); -console.log(colors); // [ 'red', 'yellow', 'brown', 'gray' ] -console.log(returnVal); // [ 'blue', 'green', 'orange' ] -``` - -The first two arguments for splice correspond to 1) the target index and 2) how -many elements to remove. The call `colors.splice(2, 3)`, will remove the next -three elements beginning at index 2. This means that the elements at indices 2, -3, and 4 are removed. - -Note that splice returns an array containing the elements that were removed and -also has the effect of removing the elements from the _original_ array, mutating -it in-place. - -### Using splice to insert - -To use the splice method to insert new elements into an array, we can pass in -any number of additional arguments representing the values to insert: - -```javascript -let colors = ["red", "yellow", "blue"]; -let returnVal = colors.splice(1, 0, "RebeccaPurple", "CornflowerBlue"); -console.log(colors); // [ 'red', 'RebeccaPurple', 'CornflowerBlue', 'yellow', 'blue' ] -console.log(returnVal); // [] -``` - -The method call `colors.splice(1, 0, 'RebeccaPurple', 'CornflowerBlue')` -translates to "target index 1, remove the next 0 elements, then insert -`'RebeccaPurple'` and `'CornflowerBlue'`." - -### Using splice like a pro - -Naturally, we can combine these two functionalities! Say we wanted to target -index 2, remove the next 3 elements, then insert `'Gainsboro'`, `'Ivory'`, and -`'Khaki'`: - -```javascript -let colors = ["red", "yellow", "blue", "green", "black", "beige"]; -let removed = colors.splice(2, 3, "Gainsboro", "Ivory", "Khaki"); -console.log(colors); // [ 'red', 'yellow', 'Gainsboro', 'Ivory', 'Khaki', 'beige' ] -console.log(removed); // [ 'blue', 'green', 'black' ] -``` - -Bam. What a versatile method! Always feel free to reference the -[documentation][mdn-splice] for the method when you are struggling to remember -its usage: - -## Remember - -- Array#splice has two required arguments - - the target index - - the number of elements to remove beginning at that target index -- Array#splice can also take in any number of values to be inserted at the - target index - -[mdn-splice]: - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice - -________________________________________________________________________________ -# String#split and Array#join - -We've seen previously that strings and arrays share many similar properties. For -example, strings and arrays both have a `length` and can have multiple indices. -Because of this, you may find it useful to "convert" between the two types. - -When you finish this article, you should be able to: - -- use the `String#split` method to turn a string into an array -- use the `Array#join` method to turn an array into a string - -## String#split - -The [String#split][string-split-mdn] method is called on a string and accepts a -"separator" string as an argument. The method will return an array where the -elements are the resulting substrings when we cut at the "separators": - -```javascript -let sentence = "follow the yellow brick road"; -let words = sentence.split(" "); -console.log(words); // [ 'follow', 'the', 'yellow', 'brick', 'road' ] -console.log(sentence); // 'follow the yellow brick road' -``` - -Note that the original string is _not mutated_, rather a new array is returned. -A common pattern is to split a sentence string on a space (' '), but you can -split on any separator as you see fit: - -```javascript -let sentence = "follow the yellow brick road"; -console.log(sentence.split(" ")); // [ 'follow', 'the', 'yellow', 'brick', 'road' ] -console.log(sentence.split("the")); // [ 'follow ', ' yellow brick road' ] -console.log(sentence.split("o")); // [ 'f', 'll', 'w the yell', 'w brick r', 'ad' ] -``` - -A pattern you may find useful is that when you split on a separator string, it -is guaranteed that that separator will not be in the resulting array, -effectively removing it. See the example of `sentence.split('the')` above. This -may come in handy, so keep it in mind! - -## Array#join - -The [Array#join][array-join-mdn] method is called on an array and accepts a -"separator" string as an argument. The method will return a string where -elements of the array are concatenated together with the "separator" between -each element: - -```javascript -let words = ["run", "around", "the", "block"]; -let sentence = words.join(" "); -console.log(sentence); // 'run around the block' -console.log(words); // [ 'run', 'around', 'the', 'block' ] - -console.log(words.join("_")); // 'run_around_the_block' -console.log(words.join("HI")); // 'runHIaroundHItheHIblock' -``` - -`Array#join` does not mutate the original array, instead it will return a new -string. - -## A clever combination - -It's pretty evident that `String#split` and `Array#join` are "opposite" methods. -That is: - -- we use split to turn a string into a array -- we use join to turn an array into a string - -By combining these two methods we can accomplish some cool behavior: - -```javascript -let str = "I don't know what I want to eat"; -let newStr = str.split("I").join("we"); -console.log(newStr); // 'we don't know what we want to eat' -``` - -Whoa! We were able to replace every substring "I" with the substring "we". We -know that the line `str.split('I').join('we')` evaluates from left to right. -This means that the `split` will cut the string wherever there is an 'I', -leaving a gap where the 'I's were. Then, the `join` will fill those gaps with -'we's. - -## Remember - -- we can use `String#split` and `Array#join` to convert between strings and - arrays -- both methods do not mutate their input - -[string-split-mdn]: - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split -[array-join-mdn]: - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/join - -________________________________________________________________________________ -# WEEK-01 DAY-5
*Control Flow* {ignore=true} -________________________________________________________________________________ -# Determining Types - -Sometimes you want to know the type of value store in a variable so that you can -safely do things with it. If your function expects an array in its parameter but -gets a number, you can't call the `map` method on that! - -In this article you will learn how to figure out if a value in a variable is - -* A string -* A number -* A function -* An array - -## The typeof operator - -Not all operators in JavaScript require two arguments like the `+` operator for -addition, the `=` for assignment, and the `%` operator for modulo division. -Those are all called _binary_ operators because they take two (bi-) operands, -or things that are operated on. - -JavaScript kindly gives you the operator `typeof` which acts on a single value. -Operators that take only one operand are called _unary_ operators because "u -only give them one value!" (That's a joke. "uni-" or "una-" is one.) - -Here are some examples of what you'd expect to see with the `typeof` operator. - -```js -let s = 'This is a string'; -console.log(typeof s); // 'string' - -let n = 6.28; -console.log(typeof n); // 'number' - -let sum = function (a, b) { - return a + b; -} -console.log(typeof sum); // 'function' -``` - -Note that the value returned from the `typeof` operator is a String data type. -So, if you want to check if a value is a number, you could do this. - -```js -if (typeof n === 'number') { - // It is a number. Do some maths! -} else { - console.log('I really wanted a number. :-('); -} -``` - -## How to tell if a value is an array - -Unfortunately, due to a _really old bug_ in the way that JavaScript works, a bug -that no one can fix because people wrote code that relies on the bug for -decades, you cannot use the `typeof` operator to figure out if something is an -array. - -```js -let a = [1, 2, 3]; -console.log(typeof a); // 'object' -``` - -Gee, JavaScript. That's not helpful. Thanks. - -Luckily, it only took 12 years for JavaScript to include a way to test if a -value is an array. To do so, you use the `Array.isArray` method like this. - -```js -let a = [1, 2, 3]; -Array.isArray(a); // true - -let n = 6.28; -Array.isArray(n); // false - -let f = function () {} -Array.isArray(f); // false -``` - -## Practical use in "real" code - -Oddly enough, you won't see a lot of code in real-world applications testing if -a value is one type or another. A lot of JavaScript functions just _assume_ that -they will get arguments of the right kind because the parameter names imply what -kind of value to pass in. For example, the following function has a parameter -named `sentence`. - -```js -function reverseTheSentence(sentence) { - // ... code here ... -} -``` - -Most developers will know that the function probably wants `sentence` to be a -string value. They just won't pass in an array or number or ... well, anything -other than a string. Because that's just not polite. They'd expect any other -kind of value to cause the `reverseTheSentence` to malfunction. Only when you -know that people that don't respect your code will use it should you add in some -kind of check like this. - -```js -function reverseTheSentence(sentence) { - if (typeof sentence !== 'string') { - // Tell the developer they are using - // the function wrong. - } - // ... code here ... -} -``` - -## Remember - -This article has shown you two ways to determine if a value is a kind of type: - -* the `typeof` operator to use to test if a value is a number, a string, or - a function; and, -* the `Array.isArray` method to check if a value is an array. - -Use them as much (or as little) as you need! - -________________________________________________________________________________ -# The Null Type (And Undefined) - -You've met numbers and string, Booleans and arrays. There's another type often -used in JavaScript: the Null type. And, it's a special type. - -In this article, you will learn about the Null type, its value, and how to work -with it in JavaScript. - -## A type with only one value - -You have seen that the String type can have an "infinite" number of values -(within the limits of your computer memory). For example, the String type -represents _any_ of the following values. - -```js -// Examples of values with the String type -'hello, world' -"this is a string" -`Where is my pudding?` -'' -'A really long string.........................................................' -``` - -The Number type also has this aspect. Any number that you can reasonable express -in JavaScript has the Number type. - -```js -// Examples of values with the Number type --100 -99 -6.28 -Infinity -``` - -You also know about the Boolean type. It can have only two values. - -```js -// The only two values of Boolean type -true -false -``` - -There are not _more_ Boolean values. You can't dream up more. There are only -two, those two. - -The Null type has one and exactly one value. - -```js -// The only value that has the Null type -null -``` - -It's just that word: `null`. No quotation marks. No other fancy things. Just -`null`. - -## The meaning of null - -This is a harder subject to tackle because it's a _philosophical_ subject. Many -people ask, "What does the value of `null` mean in a program?" There are a -couple of answers that programmers give to this. None of them are wrong. None of -them are right. They just are. In the presence of `null`, the code you write -determines which of the following meanings `null` has. - -* The value `null` means _the absence of a value_ or _no value_ -* The value `null` means _an unknown value_ -* The value `null` is a nuisance and I hate it and wish it were never invented - -During your software programming career, you will likely have all three of those -opinions, sometimes at the same time. Let's take a look at some examples to try -to figure this out. - -## The absence of a value - -Let's say you wrote a function that splits a string into words, reverses them, -and puts them back together in reverse order. You can do that with the methods - -* `String#split` [link][split]; -* `Array#reverse` [link][reverse]; and, -* `Array#join` [link][join]. - -That function could look like this. - -```js -function reverseTheSentence(sentence) { - let parts = sentence.split(' '); - parts.reverse(); - return parts.join(' '); -} -``` - -That's great! It works! But, what happens if someone doesn't care about what -your function and just decides to pass in something that's not a string? It -would make sense that reversing something that is not a string should lead to no -value, the absence of a value, because the input to the function doesn't make -sense. In that case, you can just return a `null` because there is _no value_ -that the function can return that would make sense. - -```js -function reverseTheSentence(sentence) { - if (typeof sentence !== 'string') { - return null; - } - let parts = sentence.split(' '); - parts.reverse(); - return parts.join(' '); -} -``` - -## An unknown value - -There are a lot of programmers that will argue that `null` cannot be an unknown -value. "The value is known!" they'll exclaim. "The value is 'null'! It's known! -It's 'null'! Stop saying it's not known!" - -There are programmers that vehemently disagree with that. - -![shrug](images/woman-shrugging_1f937-200d-2640-fe0f.png) - -## Checking if a value is null - -If you had hoped that you could use the `typeof` operator to check if a value is -`null`, then you're out of luck. - -```js -// Useless code. -console.log(typeof null); // 'object' -``` - -Silly JavaScript. Instead of using the `typeof` operator, you can just _compare_ -the value to `null` because there is only one value of the Null data type and -it's always `null`. Take a look at the following code and figure out what you -think it will produce. - -```js -let a = []; -let x = null; - -if (a === null) { - console.log('a is null'); -} else if (x === null) { - console.log('x is null'); -} -``` - -## Oh, and there's that undefined value, too - -Just like the `null` value that is the only value of the Null data type, there -is `undefined` which is the only value of the Undefined data type. - -If you're asking yourself, "Wait, if 'null' is no value or the absence of a -value, then what the heck does 'undefined' mean?", well you're not the only one. - -Have a look at this code. - -```js -let value; - -value = 6.28; -console.log(value); -``` - -You probably will not be surprised to see that it will print out "6.28" because -that's the value of `value`. But, what if you did this? What does that new -`console.log` print? - -```js -let value; -console.log(value); // <- what does this print? - -value = 6.28; -console.log(value); -``` - -If you guessed that it prints "undefined", you're right! When you declare a -variable, it's very first value is `undefined`. Most of the time, though, you'll -just immediately set it to a value. - -```js -let value = 6.28; -``` - -So, an uninitialized variable has the value `undefined` which is the only value -of the Undefined data type. To test for it, you can use the `typeof` operator -_or_ the strict equality operator. Using the strict equality operator is the -more common way to do that, now. - -```js -// Test if a value is undefined -if (value === undefined) { - // do a thing -} - -// You can also do it this way, but -// it is considered passé. -if (typeof value === 'undefined') { - // do a thing -} -``` - -## What happens when... - -Interestingly enough, all functions actually _do_ return values. Have a look at -this function. What value does it return? (Not a trick question.) - -```js -function returnsTrue() { - return true; -} -``` - -Yes, it returns the value `true`. But, what about this function? - -```js -function returnsWhat() { - return; -} -``` - -There's a `return` statement there but it does not specify a value. If there is -not value specified, what do you think this function returns? Try putting the -function definition above and the code below into a code runner and seeing what -happens. - -```js -console.log(returnsWhat()); -``` - -One you figure that out, try the same experiment but with this function. What -do you think it returns. It doesn't even have a `return` statement in it! - -```js -function whatIsThis() { -} -``` - -## Remember - -There is a special value in JavaScript represented as `null` which means "no -value" or "unknown value". It is the only value of the Null data type. You can -check that a value is `null` by using the strict equality operator `x === null`. - -The value `undefined` is used by JavaScript for variables that have not been -assigned a value. Also, functions that do not return an explicit value return -the value `undefined`. You can test if a value is `undefined` by using the -strict equality operator `x === undefined`. - -[reverse]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reverse -[split]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/split -[join]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/join - -________________________________________________________________________________ -# Catch Me If You Can - -Sometimes bad things happen to good programs. Some person may enter some badly -formatted information. Another computer may try to attack your program by -sending it wonky data. A network could go down. A file can become corrupt. When -this happens, your running software will have some errors. This article is about -how you can recover from those errors with "structured exception handling". - -In this article you'll learn the answers to: - -* What _is_ structured exception handling? -* How can I do that in JavaScript? -* How can I make my own errors? -* What else can I do with it? -* Shouldn't I just always do this? - -## Structured exception handling - -Oddly enough, there are very few error-handling mechanisms in use, today, in all -programming languages. There are really only three ways that programming -language provide structured exception handling. - -* **Error or error code reporting** as found in languages like C and Go -* **Continuable exceptions** as found in Common Lisp -* **Stack unwinding** which is found in almost every modern programming - language including JavaScript and Python - -In the stack-unwinding paradigm, which is the one you'll use in JavaScript, when -an error occurs, the JavaScript interpreter (the thing running your JavaScript -code) looks for some kind of handler for that error. It has a very specific way -of searching for those handlers. The way JavaScript searches for the handlers is -very similar to the way it happens in Python, C++, Java, C#, and a lot of other -languages. Once you learn it, here, you will be able to handle errors when -writing code in all of those languages. - -## Try and catch - -Say you have some code that may have an error. For example: - -```js -function sumArray(array) { - let sum = 0; - for (let i = 0; i < array.length; i += 1) { - sum += array[i]; - } - return sum; -} -``` - -If someone calls the above function with the code `sumArray(null)`, then they -will get the error because the `for` loop is trying to get the `length` property -of the `array` parameter which is `null`. - -``` -TypeError: Cannot read property 'length' of null -``` - -To prevent this from ruining your program, you wrap code that may have an error -in a **try block**. Now, you've seen other blocks already: `if` blocks, `for` -blocks, `function` blocks. Basically, if there are curly braces around some -lines of code, that's a **code block** of some kind. A _try block_ is just some -curly braces with the `try` keyword. - -```js -// THIS IS AN INCOMPLETE BLOCK OF CODE -function sumArray(array) { - let sum = 0; - - // The try block wraps the for loop. If some - // error occurs, the try block will give you - // a chance to react to it so that the program - // doesn't terminate. - try { - for (let i = 0; i < array.length; i += 1) { - sum += array[i]; - } - } // needs something more here - - return sum; -} -``` - -The `try` block tells JavaScript that it needs to watch the code inside the -curly braces for an error. Now, you have to tell JavaScript what to do when -there _is_ an error. You do that in the `catch` block that should immediately -follow the `try` block. The `catch` block accepts a single parameter that -(usually) contains an object that describes the error that occurred. In the -case of the `sumArray` method, if an error occurs, you could return the value -`undefined` rather than letting an error terminate your program. You could also -log the error to the "error" output. - -```js -function sumArray(array) { - let sum = 0; - - try { - for (let i = 0; i < array.length; i += 1) { - sum += array[i]; - } - } catch (e) { - console.log(e); - return null; - } - - return sum; -} - -sumArray(null); -``` - -Just to state it, again: the _catch block_ runs when an error occurs in the _try -block_. If no error occurs in the _try block_, the _catch block_ **does not -run**. - -That `(e)` after the word `catch` is a variable that contains any error that was -thrown and caught by this `try-catch` block. It doesn't have to be named `e`. - -```js -function sumArray(array) { - let sum = 0; - - try { - for (let i = 0; i < array.length; i += 1) { - sum += array[i]; - } - } catch (pancakes) { - console.log(pancakes); - return null; - } - - return sum; -} - -sumArray(null); -``` - -Here is the same code but, instead of a variable named "e", there is a variable -named "pancakes". Now, if an error is thrown, the variable "pancakes" will -contain it. By long-standing tradition, the variables used with the catch block -are normally "e", "err", or "error". - -```js -// CODE SNIPPET, WILL NOT RUN -} catch (e) { -``` - -```js -// CODE SNIPPET, WILL NOT RUN -} catch (err) { -``` - -```js -// CODE SNIPPET, WILL NOT RUN -} catch (error) { -``` - -Now, when you run the code `sumArray(null)`, you should see something like the -following, if you run it in the online code editor. - -``` -TypeError: Cannot read property 'length' of null - at sumArray (/tmp/file.js:5:31) - at Object. (/tmp/file.js:16:1) - at Module._compile (internal/modules/cjs/loader.js:1158:30) - at Object.Module._extensions..js (internal/modules/cjs/loader.js:1178:10) - at Module.load (internal/modules/cjs/loader.js:1002:32) - at Function.Module._load (internal/modules/cjs/loader.js:901:14) - at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:74:12) - at internal/main/run_main_module.js:18:47 -``` - -In that code sample, after the `sumArray(null)` call, the lines that begins -`TypeError` is the error that occurred. The next 10 lines are what is known as a -**stack trace**. You'll end up seeing these a lot, most likely, as you continue -your career in software programming. This is the first line in understanding -errors in your code. The _stack trace_ shows on the first line where the error -occurred: `sumArray (/tmp/file.js:5:31)` means that it occurred in the -`sumArray` method on line 5 of the content, at character 31. If you open up one -of the coding problems, paste that code block in, and run it, you'll see similar -output in the output block. - -The last line `undefined` is the return value of the `sumArray(null)` invocation -that now happens when an error occurs. - -That is how the so-called **try-catch block** works. - -## How can I make my own errors? - -To create your own errors with structured exception handling, you first need to -create an error object with the message that describes the error. Then, you need -to "throw" the error. That code would look like either of these two lines, the -only difference being the `new` keyword. They both work exactly the same. - -```js -throw Error('this happened because I wanted it to'); -throw new Error('this happened because I wanted it to'); -``` - -## What else is there? - -Turns out that you can have one more block on the _try-catch block_. It is the -**finally block**. The _finally block_ runs whether or not an error occurs. It -_always_ runs. - -```js -function sumArray(array) { - let sum = 0; - - try { - for (let i = 0; i < array.length; i += 1) { - sum += array[i]; - } - } catch (e) { - console.log(e); - return null; - } finally { - console.log('you will always see this.'); - } - - return sum; -} -``` - -## How do I best use this? - -At this point, you may be asking yourself, "Self, since errors can occur -everywhere, shouldn't I just wrap _all_ of my code in these _try-catch blocks_?" - -No. No, you shouldn't. - -Every **try-catch block** introduces another slow-down in your code. If you're -writing code that you want to run as fast as possible, then you write as few -_try-catch blocks_ as possible. Also, it makes the code pretty cluttered with -all of the indentation and curly braces. When at all possible, you should write -**defensive code** which checks for bad values before errors get thrown in your -code. Rather than using a _try-catch block_ in the `sumArray` function, you -could defend against bad values of the `array` parameter like so. - -```js -function sumArray(array) { - if (array === null) { - return null; - } - - let sum = 0; - for (let i = 0; i < array.length; i += 1) { - sum += array[i]; - } - return sum; -} -``` - -## Review - -The _try-catch-finally block_ is a mechanism to handle errors in your code. You -should _not_ wrap all of your code in these blocks because it can seriously -degrade the performance of your application. Instead, only wrap those portions -of the code that you want to guard against throwing exceptions. - -A better choice, in JavaScript and all programming languages, is to be -defensive about your programming and choose to check that the value that you -have has the functionality that you desire by adding code like - -```js -if (value !== undefined) {} -if (value !== null) {} -``` diff --git a/SECURITY.md b/SECURITY.md deleted file mode 100644 index 034e848..0000000 --- a/SECURITY.md +++ /dev/null @@ -1,21 +0,0 @@ -# Security Policy - -## Supported Versions - -Use this section to tell people about which versions of your project are -currently being supported with security updates. - -| Version | Supported | -| ------- | ------------------ | -| 5.1.x | :white_check_mark: | -| 5.0.x | :x: | -| 4.0.x | :white_check_mark: | -| < 4.0 | :x: | - -## Reporting a Vulnerability - -Use this section to tell people how to report a vulnerability. - -Tell them where to go, how often they can expect to get an update on a -reported vulnerability, what to expect if the vulnerability is accepted or -declined, etc. diff --git a/SUMMARY.html b/SUMMARY.html deleted file mode 100644 index 8bcaaae..0000000 --- a/SUMMARY.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - Document - - - - - - -
- - - - -
HOME -
- - - -

Table of contents

- - - - diff --git a/SUMMARY.md b/SUMMARY.md deleted file mode 100644 index d7cf987..0000000 --- a/SUMMARY.md +++ /dev/null @@ -1,5 +0,0 @@ -# Table of contents - -* [Prep-Work](README.md) -* [Resources](resources.md) - diff --git a/_Resources/directory.html b/_Resources/directory.html deleted file mode 100644 index 7c6d70e..0000000 --- a/_Resources/directory.html +++ /dev/null @@ -1,25 +0,0 @@ - - - -C:/NEW_BOOTCAMP/Lambda/CIRRICULUMN/prep/_Resources - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/_Resources/left.html b/_Resources/left.html deleted file mode 100644 index 04af645..0000000 --- a/_Resources/left.html +++ /dev/null @@ -1,649 +0,0 @@ - - - - - - /NEW_BOOTCAMP/Lambda/CIRRICULUMN/prep/_Resources - - - Stable - - - - - - - - - - - - - - - - - - - - - - -
Folders
<RETURN TO - NAVIGATION>
node_modules
simple-side-bar
-
- - - - - diff --git a/_Resources/node_modules/.package-lock.json b/_Resources/node_modules/.package-lock.json deleted file mode 100644 index ab88c62..0000000 --- a/_Resources/node_modules/.package-lock.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "_Resources", - "lockfileVersion": 2, - "requires": true, - "packages": { - "node_modules/jquery": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", - "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" - }, - "node_modules/loadashes6": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/loadashes6/-/loadashes6-1.0.0.tgz", - "integrity": "sha512-2UeX69yCIy8rVsPZHnjnaNTvQ8Mh5pMim2SZP3KiZJO/ECmfFuJwF4epHEFOYbZdOmj74bWIxm1H3kCNBsGdSw==" - }, - "node_modules/mout": { - "version": "2.0.0-alpha.1", - "resolved": "https://registry.npmjs.org/mout/-/mout-2.0.0-alpha.1.tgz", - "integrity": "sha512-hwFkg6PGoUiSfOo52Mb/zPNe/HidCnHrz1HlRqyULc8FfzMz6gefuOKlIys/opDKTpqlkz+M+Mg/1NCJpGN81g==" - }, - "node_modules/web-dev-utils": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/web-dev-utils/-/web-dev-utils-1.0.4.tgz", - "integrity": "sha512-VlXEuq6+fsI247gSWR0006Uce3L64niEhIOC6Ll5Qo9LnzH0R13qqkEL1dTBL/kzytD0cMWLTcO71CUF5sYHyQ==", - "dependencies": { - "jquery": "^3.6.0", - "loadashes6": "^1.0.0", - "mout": "^2.0.0-alpha.1" - } - } - } -} diff --git a/_Resources/node_modules/jquery/AUTHORS.txt b/_Resources/node_modules/jquery/AUTHORS.txt deleted file mode 100644 index 0d44990..0000000 --- a/_Resources/node_modules/jquery/AUTHORS.txt +++ /dev/null @@ -1,331 +0,0 @@ -John Resig -Gilles van den Hoven -Michael Geary -Stefan Petre -Yehuda Katz -Corey Jewett -Klaus Hartl -Franck Marcia -Jörn Zaefferer -Paul Bakaus -Brandon Aaron -Mike Alsup -Dave Methvin -Ed Engelhardt -Sean Catchpole -Paul Mclanahan -David Serduke -Richard D. Worth -Scott González -Ariel Flesler -Jon Evans -TJ Holowaychuk -Michael Bensoussan -Robert Katić -Louis-Rémi Babé -Earle Castledine -Damian Janowski -Rich Dougherty -Kim Dalsgaard -Andrea Giammarchi -Mark Gibson -Karl Swedberg -Justin Meyer -Ben Alman -James Padolsey -David Petersen -Batiste Bieler -Alexander Farkas -Rick Waldron -Filipe Fortes -Neeraj Singh -Paul Irish -Iraê Carvalho -Matt Curry -Michael Monteleone -Noah Sloan -Tom Viner -Douglas Neiner -Adam J. Sontag -Dave Reed -Ralph Whitbeck -Carl Fürstenberg -Jacob Wright -J. Ryan Stinnett -unknown -temp01 -Heungsub Lee -Colin Snover -Ryan W Tenney -Pinhook -Ron Otten -Jephte Clain -Anton Matzneller -Alex Sexton -Dan Heberden -Henri Wiechers -Russell Holbrook -Julian Aubourg -Gianni Alessandro Chiappetta -Scott Jehl -James Burke -Jonas Pfenniger -Xavi Ramirez -Jared Grippe -Sylvester Keil -Brandon Sterne -Mathias Bynens -Timmy Willison <4timmywil@gmail.com> -Corey Frang -Digitalxero -Anton Kovalyov -David Murdoch -Josh Varner -Charles McNulty -Jordan Boesch -Jess Thrysoee -Michael Murray -Lee Carpenter -Alexis Abril -Rob Morgan -John Firebaugh -Sam Bisbee -Gilmore Davidson -Brian Brennan -Xavier Montillet -Daniel Pihlstrom -Sahab Yazdani -avaly -Scott Hughes -Mike Sherov -Greg Hazel -Schalk Neethling -Denis Knauf -Timo Tijhof -Steen Nielsen -Anton Ryzhov -Shi Chuan -Berker Peksag -Toby Brain -Matt Mueller -Justin -Daniel Herman -Oleg Gaidarenko -Richard Gibson -Rafaël Blais Masson -cmc3cn <59194618@qq.com> -Joe Presbrey -Sindre Sorhus -Arne de Bree -Vladislav Zarakovsky -Andrew E Monat -Oskari -Joao Henrique de Andrade Bruni -tsinha -Matt Farmer -Trey Hunner -Jason Moon -Jeffery To -Kris Borchers -Vladimir Zhuravlev -Jacob Thornton -Chad Killingsworth -Nowres Rafid -David Benjamin -Uri Gilad -Chris Faulkner -Elijah Manor -Daniel Chatfield -Nikita Govorov -Wesley Walser -Mike Pennisi -Markus Staab -Dave Riddle -Callum Macrae -Benjamin Truyman -James Huston -Erick Ruiz de Chávez -David Bonner -Akintayo Akinwunmi -MORGAN -Ismail Khair -Carl Danley -Mike Petrovich -Greg Lavallee -Daniel Gálvez -Sai Lung Wong -Tom H Fuertes -Roland Eckl -Jay Merrifield -Allen J Schmidt Jr -Jonathan Sampson -Marcel Greter -Matthias Jäggli -David Fox -Yiming He -Devin Cooper -Paul Ramos -Rod Vagg -Bennett Sorbo -Sebastian Burkhard -Zachary Adam Kaplan -nanto_vi -nanto -Danil Somsikov -Ryunosuke SATO -Jean Boussier -Adam Coulombe -Andrew Plummer -Mark Raddatz -Isaac Z. Schlueter -Karl Sieburg -Pascal Borreli -Nguyen Phuc Lam -Dmitry Gusev -Michał Gołębiowski-Owczarek -Li Xudong -Steven Benner -Tom H Fuertes -Renato Oliveira dos Santos -ros3cin -Jason Bedard -Kyle Robinson Young -Chris Talkington -Eddie Monge -Terry Jones -Jason Merino -Jeremy Dunck -Chris Price -Guy Bedford -Amey Sakhadeo -Mike Sidorov -Anthony Ryan -Dominik D. Geyer -George Kats -Lihan Li -Ronny Springer -Chris Antaki -Marian Sollmann -njhamann -Ilya Kantor -David Hong -John Paul -Jakob Stoeck -Christopher Jones -Forbes Lindesay -S. Andrew Sheppard -Leonardo Balter -Roman Reiß -Benjy Cui -Rodrigo Rosenfeld Rosas -John Hoven -Philip Jägenstedt -Christian Kosmowski -Liang Peng -TJ VanToll -Senya Pugach -Aurelio De Rosa -Nazar Mokrynskyi -Amit Merchant -Jason Bedard -Arthur Verschaeve -Dan Hart -Bin Xin -David Corbacho -Veaceslav Grimalschi -Daniel Husar -Frederic Hemberger -Ben Toews -Aditya Raghavan -Victor Homyakov -Shivaji Varma -Nicolas HENRY -Anne-Gaelle Colom -George Mauer -Leonardo Braga -Stephen Edgar -Thomas Tortorini -Winston Howes -Jon Hester -Alexander O'Mara -Bastian Buchholz -Arthur Stolyar -Calvin Metcalf -Mu Haibao -Richard McDaniel -Chris Rebert -Gabriel Schulhof -Gilad Peleg -Martin Naumann -Marek Lewandowski -Bruno Pérel -Reed Loden -Daniel Nill -Yongwoo Jeon -Sean Henderson -Richard Kraaijenhagen -Connor Atherton -Gary Ye -Christian Grete -Liza Ramo -Julian Alexander Murillo -Joelle Fleurantin -Jae Sung Park -Jun Sun -Josh Soref -Henry Wong -Jon Dufresne -Martijn W. van der Lee -Devin Wilson -Steve Mao -Zack Hall -Bernhard M. Wiedemann -Todor Prikumov -Jha Naman -William Robinet -Alexander Lisianoi -Vitaliy Terziev -Joe Trumbull -Alexander K -Damian Senn -Ralin Chimev -Felipe Sateler -Christophe Tafani-Dereeper -Manoj Kumar -David Broder-Rodgers -Alex Louden -Alex Padilla -南漂一卒 -karan-96 -Boom Lee -Andreas Solleder -CDAGaming -Pierre Spring -Shashanka Nataraj -Erik Lax -Matan Kotler-Berkowitz <205matan@gmail.com> -Jordan Beland -Henry Zhu -Saptak Sengupta -Nilton Cesar -basil.belokon -tmybr11 -Luis Emilio Velasco Sanchez -Ed S -Bert Zhang -Andrei Fangli -Marja Hölttä -abnud1 -buddh4 -Pat O'Callaghan -Ahmed.S.ElAfifi -Wonseop Kim -Christian Oliff -Christian Wenz -Sean Robinson -Jonathan -Pierre Grimaud -Beatriz Rezener -Natalia Sroka <37873210+natipo@users.noreply.github.com> -Wonhyoung Park -Dallas Fraser diff --git a/_Resources/node_modules/jquery/LICENSE.txt b/_Resources/node_modules/jquery/LICENSE.txt deleted file mode 100644 index f642c3f..0000000 --- a/_Resources/node_modules/jquery/LICENSE.txt +++ /dev/null @@ -1,20 +0,0 @@ -Copyright OpenJS Foundation and other contributors, https://openjsf.org/ - -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. diff --git a/_Resources/node_modules/jquery/README.md b/_Resources/node_modules/jquery/README.md deleted file mode 100644 index 60982f7..0000000 --- a/_Resources/node_modules/jquery/README.md +++ /dev/null @@ -1,62 +0,0 @@ -# jQuery - -> jQuery is a fast, small, and feature-rich JavaScript library. - -For information on how to get started and how to use jQuery, please see [jQuery's documentation](https://api.jquery.com/). -For source files and issues, please visit the [jQuery repo](https://github.com/jquery/jquery). - -If upgrading, please see the [blog post for 3.6.0](https://blog.jquery.com/2021/03/02/jquery-3-6-0-released/). This includes notable differences from the previous version and a more readable changelog. - -## Including jQuery - -Below are some of the most common ways to include jQuery. - -### Browser - -#### Script tag - -```html - -``` - -#### Babel - -[Babel](https://babeljs.io/) is a next generation JavaScript compiler. One of the features is the ability to use ES6/ES2015 modules now, even though browsers do not yet support this feature natively. - -```js -import $ from "jquery"; -``` - -#### Browserify/Webpack - -There are several ways to use [Browserify](http://browserify.org/) and [Webpack](https://webpack.github.io/). For more information on using these tools, please refer to the corresponding project's documentation. In the script, including jQuery will usually look like this... - -```js -var $ = require( "jquery" ); -``` - -#### AMD (Asynchronous Module Definition) - -AMD is a module format built for the browser. For more information, we recommend [require.js' documentation](https://requirejs.org/docs/whyamd.html). - -```js -define( [ "jquery" ], function( $ ) { - -} ); -``` - -### Node - -To include jQuery in [Node](https://nodejs.org/), first install with npm. - -```sh -npm install jquery -``` - -For jQuery to work in Node, a window with a document is required. Since no such window exists natively in Node, one can be mocked by tools such as [jsdom](https://github.com/jsdom/jsdom). This can be useful for testing purposes. - -```js -const { JSDOM } = require( "jsdom" ); -const { window } = new JSDOM( "" ); -const $ = require( "jquery" )( window ); -``` diff --git a/_Resources/node_modules/jquery/bower.json b/_Resources/node_modules/jquery/bower.json deleted file mode 100644 index 95798d5..0000000 --- a/_Resources/node_modules/jquery/bower.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "jquery", - "main": "dist/jquery.js", - "license": "MIT", - "ignore": [ - "package.json" - ], - "keywords": [ - "jquery", - "javascript", - "browser", - "library" - ] -} \ No newline at end of file diff --git a/_Resources/node_modules/jquery/dist/jquery.js b/_Resources/node_modules/jquery/dist/jquery.js deleted file mode 100644 index 7cc0019..0000000 --- a/_Resources/node_modules/jquery/dist/jquery.js +++ /dev/null @@ -1,10984 +0,0 @@ -/*! - * jQuery JavaScript Library v3.6.0 - * https://jquery.com/ - * - * Includes Sizzle.js - * https://sizzlejs.com/ - * - * Copyright OpenJS Foundation and other contributors - * Released under the MIT license - * https://jquery.org/license - * - * Date: 2021-03-02T17:08Z - */ -( function ( global, factory ) { - - "use strict"; - - if ( typeof module === "object" && typeof module.exports === "object" ) { - - // For CommonJS and CommonJS-like environments where a proper `window` - // is present, execute the factory and get jQuery. - // For environments that do not have a `window` with a `document` - // (such as Node.js), expose a factory as module.exports. - // This accentuates the need for the creation of a real `window`. - // e.g. var jQuery = require("jquery")(window); - // See ticket #14549 for more info. - module.exports = global.document ? - factory( global, true ) : - function ( w ) { - if ( !w.document ) { - throw new Error( "jQuery requires a window with a document" ); - } - return factory( w ); - }; - } else { - factory( global ); - } - - // Pass this if window is not defined yet -} )( typeof window !== "undefined" ? window : this, function ( window, noGlobal ) { - - // Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 - // throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode - // arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common - // enough that all such attempts are guarded in a try block. - "use strict"; - - var arr = []; - - var getProto = Object.getPrototypeOf; - - var slice = arr.slice; - - var flat = arr.flat ? function ( array ) { - return arr.flat.call( array ); - } : function ( array ) { - return arr.concat.apply( [], array ); - }; - - - var push = arr.push; - - var indexOf = arr.indexOf; - - var class2type = {}; - - var toString = class2type.toString; - - var hasOwn = class2type.hasOwnProperty; - - var fnToString = hasOwn.toString; - - var ObjectFunctionString = fnToString.call( Object ); - - var support = {}; - - var isFunction = function isFunction( obj ) { - - // Support: Chrome <=57, Firefox <=52 - // In some browsers, typeof returns "function" for HTML elements - // (i.e., `typeof document.createElement( "object" ) === "function"`). - // We don't want to classify *any* DOM node as a function. - // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5 - // Plus for old WebKit, typeof returns "function" for HTML collections - // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756) - return typeof obj === "function" && typeof obj.nodeType !== "number" && - typeof obj.item !== "function"; - }; - - - var isWindow = function isWindow( obj ) { - return obj != null && obj === obj.window; - }; - - - var document = window.document; - - - - var preservedScriptAttributes = { - type: true, - src: true, - nonce: true, - noModule: true - }; - - function DOMEval( code, node, doc ) { - doc = doc || document; - - var i, val, - script = doc.createElement( "script" ); - - script.text = code; - if ( node ) { - for ( i in preservedScriptAttributes ) { - - // Support: Firefox 64+, Edge 18+ - // Some browsers don't support the "nonce" property on scripts. - // On the other hand, just using `getAttribute` is not enough as - // the `nonce` attribute is reset to an empty string whenever it - // becomes browsing-context connected. - // See https://github.com/whatwg/html/issues/2369 - // See https://html.spec.whatwg.org/#nonce-attributes - // The `node.getAttribute` check was added for the sake of - // `jQuery.globalEval` so that it can fake a nonce-containing node - // via an object. - val = node[ i ] || node.getAttribute && node.getAttribute( i ); - if ( val ) { - script.setAttribute( i, val ); - } - } - } - doc.head.appendChild( script ).parentNode.removeChild( script ); - } - - - function toType( obj ) { - if ( obj == null ) { - return obj + ""; - } - - // Support: Android <=2.3 only (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call( obj ) ] || "object" : - typeof obj; - } - /* global Symbol */ - // Defining this global in .eslintrc.json would create a danger of using the global - // unguarded in another place, it seems safer to define global only for this module - - - - var - version = "3.6.0", - - // Define a local copy of jQuery - jQuery = function ( selector, context ) { - - // The jQuery object is actually just the init constructor 'enhanced' - // Need init if jQuery is called (just allow error to be thrown if not included) - return new jQuery.fn.init( selector, context ); - }; - - jQuery.fn = jQuery.prototype = { - - // The current version of jQuery being used - jquery: version, - - constructor: jQuery, - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function () { - return slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function ( num ) { - - // Return all the elements in a clean array - if ( num == null ) { - return slice.call( this ); - } - - // Return just the one element from the set - return num < 0 ? this[ num + this.length ] : this[ num ]; - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function ( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - each: function ( callback ) { - return jQuery.each( this, callback ); - }, - - map: function ( callback ) { - return this.pushStack( jQuery.map( this, function ( elem, i ) { - return callback.call( elem, i, elem ); - } ) ); - }, - - slice: function () { - return this.pushStack( slice.apply( this, arguments ) ); - }, - - first: function () { - return this.eq( 0 ); - }, - - last: function () { - return this.eq( -1 ); - }, - - even: function () { - return this.pushStack( jQuery.grep( this, function ( _elem, i ) { - return ( i + 1 ) % 2; - } ) ); - }, - - odd: function () { - return this.pushStack( jQuery.grep( this, function ( _elem, i ) { - return i % 2; - } ) ); - }, - - eq: function ( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); - }, - - end: function () { - return this.prevObject || this.constructor(); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: arr.sort, - splice: arr.splice - }; - - jQuery.extend = jQuery.fn.extend = function () { - var options, name, src, copy, copyIsArray, clone, - target = arguments[ 0 ] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - - // Skip the boolean and the target - target = arguments[ i ] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !isFunction( target ) ) { - target = {}; - } - - // Extend jQuery itself if only one argument is passed - if ( i === length ) { - target = this; - i--; - } - - for ( ; i < length; i++ ) { - - // Only deal with non-null/undefined values - if ( ( options = arguments[ i ] ) != null ) { - - // Extend the base object - for ( name in options ) { - copy = options[ name ]; - - // Prevent Object.prototype pollution - // Prevent never-ending loop - if ( name === "__proto__" || target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject( copy ) || - ( copyIsArray = Array.isArray( copy ) ) ) ) { - src = target[ name ]; - - // Ensure proper type for the source value - if ( copyIsArray && !Array.isArray( src ) ) { - clone = []; - } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { - clone = {}; - } else { - clone = src; - } - copyIsArray = false; - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; - }; - - jQuery.extend( { - - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), - - // Assume jQuery is ready without the ready module - isReady: true, - - error: function ( msg ) { - throw new Error( msg ); - }, - - noop: function () {}, - - isPlainObject: function ( obj ) { - var proto, Ctor; - - // Detect obvious negatives - // Use toString instead of jQuery.type to catch host objects - if ( !obj || toString.call( obj ) !== "[object Object]" ) { - return false; - } - - proto = getProto( obj ); - - // Objects with no prototype (e.g., `Object.create( null )`) are plain - if ( !proto ) { - return true; - } - - // Objects with prototype are plain iff they were constructed by a global Object function - Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; - return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; - }, - - isEmptyObject: function ( obj ) { - var name; - - for ( name in obj ) { - return false; - } - return true; - }, - - // Evaluates a script in a provided context; falls back to the global one - // if not specified. - globalEval: function ( code, options, doc ) { - DOMEval( code, { - nonce: options && options.nonce - }, doc ); - }, - - each: function ( obj, callback ) { - var length, i = 0; - - if ( isArrayLike( obj ) ) { - length = obj.length; - for ( ; i < length; i++ ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } else { - for ( i in obj ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } - - return obj; - }, - - // results is for internal usage only - makeArray: function ( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArrayLike( Object( arr ) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? [ arr ] : arr - ); - } else { - push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function ( elem, arr, i ) { - return arr == null ? -1 : indexOf.call( arr, elem, i ); - }, - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - merge: function ( first, second ) { - var len = +second.length, - j = 0, - i = first.length; - - for ( ; j < len; j++ ) { - first[ i++ ] = second[ j ]; - } - - first.length = i; - - return first; - }, - - grep: function ( elems, callback, invert ) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - callbackInverse = !callback( elems[ i ], i ); - if ( callbackInverse !== callbackExpect ) { - matches.push( elems[ i ] ); - } - } - - return matches; - }, - - // arg is for internal usage only - map: function ( elems, callback, arg ) { - var length, value, - i = 0, - ret = []; - - // Go through the array, translating each of the items to their new values - if ( isArrayLike( elems ) ) { - length = elems.length; - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - } - - // Flatten any nested arrays - return flat( ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support - } ); - - if ( typeof Symbol === "function" ) { - jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; - } - - // Populate the class2type map - jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), - function ( _i, name ) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); - } ); - - function isArrayLike( obj ) { - - // Support: real iOS 8.2 only (not reproducible in simulator) - // `in` check used to prevent JIT error (gh-2145) - // hasOwn isn't used here due to false negatives - // regarding Nodelist length in IE - var length = !!obj && "length" in obj && obj.length, - type = toType( obj ); - - if ( isFunction( obj ) || isWindow( obj ) ) { - return false; - } - - return type === "array" || length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj; - } - var Sizzle = - /*! - * Sizzle CSS Selector Engine v2.3.6 - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://js.foundation/ - * - * Date: 2021-02-16 - */ - ( function ( window ) { - var i, - support, - Expr, - getText, - isXML, - tokenize, - compile, - select, - outermostContext, - sortInput, - hasDuplicate, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + 1 * new Date(), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - nonnativeSelectorCache = createCache(), - sortOrder = function ( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - // Instance methods - hasOwn = ( {} ).hasOwnProperty, - arr = [], - pop = arr.pop, - pushNative = arr.push, - push = arr.push, - slice = arr.slice, - - // Use a stripped-down indexOf as it's faster than native - // https://jsperf.com/thor-indexof-vs-for/5 - indexOf = function ( list, elem ) { - var i = 0, - len = list.length; - for ( ; i < len; i++ ) { - if ( list[ i ] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + - "ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - - // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram - identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + - "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", - - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + - - // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + - - // "Attribute values must be CSS identifiers [capture 5] - // or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + - whitespace + "*\\]", - - pseudos = ":(" + identifier + ")(?:\\((" + - - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + - - // 2. simple (capture 6) - "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + - - // 3. anything else (capture 2) - ".*" + - ")\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rwhitespace = new RegExp( whitespace + "+", "g" ), - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + - whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + - "*" ), - rdescend = new RegExp( whitespace + "|>" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + identifier + ")" ), - "CLASS": new RegExp( "^\\.(" + identifier + ")" ), - "TAG": new RegExp( "^(" + identifier + "|[*])" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + - whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + - whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + - "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + - "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rhtml = /HTML$/i, - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - - // CSS escapes - // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), - funescape = function ( escape, nonHex ) { - var high = "0x" + escape.slice( 1 ) - 0x10000; - - return nonHex ? - - // Strip the backslash prefix from a non-hex escape sequence - nonHex : - - // Replace a hexadecimal escape sequence with the encoded Unicode code point - // Support: IE <=11+ - // For values outside the Basic Multilingual Plane (BMP), manually construct a - // surrogate pair - high < 0 ? - String.fromCharCode( high + 0x10000 ) : - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // CSS string/identifier serialization - // https://drafts.csswg.org/cssom/#common-serializing-idioms - rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, - fcssescape = function ( ch, asCodePoint ) { - if ( asCodePoint ) { - - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if ( ch === "\0" ) { - return "\uFFFD"; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice( 0, -1 ) + "\\" + - ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; - } - - // Other potentially-special ASCII characters get backslash-escaped - return "\\" + ch; - }, - - // Used for iframes - // See setDocument() - // Removing the function wrapper causes a "Permission Denied" - // error in IE - unloadHandler = function () { - setDocument(); - }, - - inDisabledFieldset = addCombinator( - function ( elem ) { - return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; - }, { - dir: "parentNode", - next: "legend" - } - ); - - // Optimize for push.apply( _, NodeList ) - try { - push.apply( - ( arr = slice.call( preferredDoc.childNodes ) ), - preferredDoc.childNodes - ); - - // Support: Android<4.0 - // Detect silently failing push.apply - // eslint-disable-next-line no-unused-expressions - arr[ preferredDoc.childNodes.length ].nodeType; - } catch ( e ) { - push = { - apply: arr.length ? - - // Leverage slice if possible - function ( target, els ) { - pushNative.apply( target, slice.call( els ) ); - } : - - // Support: IE<9 - // Otherwise append directly - function ( target, els ) { - var j = target.length, - i = 0; - - // Can't trust NodeList.length - while ( ( target[ j++ ] = els[ i++ ] ) ) {} - target.length = j - 1; - } - }; - } - - function Sizzle( selector, context, results, seed ) { - var m, i, elem, nid, match, groups, newSelector, - newContext = context && context.ownerDocument, - - // nodeType defaults to 9, since context defaults to document - nodeType = context ? context.nodeType : 9; - - results = results || []; - - // Return early from calls with invalid selector or context - if ( typeof selector !== "string" || !selector || - nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { - - return results; - } - - // Try to shortcut find operations (as opposed to filters) in HTML documents - if ( !seed ) { - setDocument( context ); - context = context || document; - - if ( documentIsHTML ) { - - // If the selector is sufficiently simple, try using a "get*By*" DOM method - // (excepting DocumentFragment context, where the methods don't exist) - if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { - - // ID selector - if ( ( m = match[ 1 ] ) ) { - - // Document context - if ( nodeType === 9 ) { - if ( ( elem = context.getElementById( m ) ) ) { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - - // Element context - } else { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( newContext && ( elem = newContext.getElementById( m ) ) && - contains( context, elem ) && - elem.id === m ) { - - results.push( elem ); - return results; - } - } - - // Type selector - } else if ( match[ 2 ] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Class selector - } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && - context.getElementsByClassName ) { - - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // Take advantage of querySelectorAll - if ( support.qsa && - !nonnativeSelectorCache[ selector + " " ] && - ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && - - // Support: IE 8 only - // Exclude object elements - ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { - - newSelector = selector; - newContext = context; - - // qSA considers elements outside a scoping root when evaluating child or - // descendant combinators, which is not what we want. - // In such cases, we work around the behavior by prefixing every selector in the - // list with an ID selector referencing the scope context. - // The technique has to be used as well when a leading combinator is used - // as such selectors are not recognized by querySelectorAll. - // Thanks to Andrew Dupont for this technique. - if ( nodeType === 1 && - ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { - - // Expand context for sibling selectors - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || - context; - - // We can use :scope instead of the ID hack if the browser - // supports it & if we're not changing the context. - if ( newContext !== context || !support.scope ) { - - // Capture the context ID, setting it first if necessary - if ( ( nid = context.getAttribute( "id" ) ) ) { - nid = nid.replace( rcssescape, fcssescape ); - } else { - context.setAttribute( "id", ( nid = expando ) ); - } - } - - // Prefix every selector in the list - groups = tokenize( selector ); - i = groups.length; - while ( i-- ) { - groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + - toSelector( groups[ i ] ); - } - newSelector = groups.join( "," ); - } - - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch ( qsaError ) { - nonnativeSelectorCache( selector, true ); - } finally { - if ( nid === expando ) { - context.removeAttribute( "id" ); - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); - } - - /** - * Create key-value caches of limited size - * @returns {function(string, object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ - function createCache() { - var keys = []; - - function cache( key, value ) { - - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key + " " ) > Expr.cacheLength ) { - - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return ( cache[ key + " " ] = value ); - } - return cache; - } - - /** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ - function markFunction( fn ) { - fn[ expando ] = true; - return fn; - } - - /** - * Support testing using an element - * @param {Function} fn Passed the created element and returns a boolean result - */ - function assert( fn ) { - var el = document.createElement( "fieldset" ); - - try { - return !!fn( el ); - } catch ( e ) { - return false; - } finally { - - // Remove from its parent by default - if ( el.parentNode ) { - el.parentNode.removeChild( el ); - } - - // release memory in IE - el = null; - } - } - - /** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ - function addHandle( attrs, handler ) { - var arr = attrs.split( "|" ), - i = arr.length; - - while ( i-- ) { - Expr.attrHandle[ arr[ i ] ] = handler; - } - } - - /** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ - function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - a.sourceIndex - b.sourceIndex; - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( ( cur = cur.nextSibling ) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; - } - - /** - * Returns a function to use in pseudos for input types - * @param {String} type - */ - function createInputPseudo( type ) { - return function ( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; - } - - /** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ - function createButtonPseudo( type ) { - return function ( elem ) { - var name = elem.nodeName.toLowerCase(); - return ( name === "input" || name === "button" ) && elem.type === type; - }; - } - - /** - * Returns a function to use in pseudos for :enabled/:disabled - * @param {Boolean} disabled true for :disabled; false for :enabled - */ - function createDisabledPseudo( disabled ) { - - // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable - return function ( elem ) { - - // Only certain elements can match :enabled or :disabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled - if ( "form" in elem ) { - - // Check for inherited disabledness on relevant non-disabled elements: - // * listed form-associated elements in a disabled fieldset - // https://html.spec.whatwg.org/multipage/forms.html#category-listed - // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled - // * option elements in a disabled optgroup - // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled - // All such elements have a "form" property. - if ( elem.parentNode && elem.disabled === false ) { - - // Option elements defer to a parent optgroup if present - if ( "label" in elem ) { - if ( "label" in elem.parentNode ) { - return elem.parentNode.disabled === disabled; - } else { - return elem.disabled === disabled; - } - } - - // Support: IE 6 - 11 - // Use the isDisabled shortcut property to check for disabled fieldset ancestors - return elem.isDisabled === disabled || - - // Where there is no isDisabled, check manually - /* jshint -W018 */ - elem.isDisabled !== !disabled && - inDisabledFieldset( elem ) === disabled; - } - - return elem.disabled === disabled; - - // Try to winnow out elements that can't be disabled before trusting the disabled property. - // Some victims get caught in our net (label, legend, menu, track), but it shouldn't - // even exist on them, let alone have a boolean value. - } else if ( "label" in elem ) { - return elem.disabled === disabled; - } - - // Remaining elements are neither :enabled nor :disabled - return false; - }; - } - - /** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ - function createPositionalPseudo( fn ) { - return markFunction( function ( argument ) { - argument = +argument; - return markFunction( function ( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ ( j = matchIndexes[ i ] ) ] ) { - seed[ j ] = !( matches[ j ] = seed[ j ] ); - } - } - } ); - } ); - } - - /** - * Checks a node for validity as a Sizzle context - * @param {Element|Object=} context - * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value - */ - function testContext( context ) { - return context && typeof context.getElementsByTagName !== "undefined" && context; - } - - // Expose support vars for convenience - support = Sizzle.support = {}; - - /** - * Detects XML nodes - * @param {Element|Object} elem An element or a document - * @returns {Boolean} True iff elem is a non-HTML XML node - */ - isXML = Sizzle.isXML = function ( elem ) { - var namespace = elem && elem.namespaceURI, - docElem = elem && ( elem.ownerDocument || elem ).documentElement; - - // Support: IE <=8 - // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes - // https://bugs.jquery.com/ticket/4833 - return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); - }; - - /** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ - setDocument = Sizzle.setDocument = function ( node ) { - var hasCompare, subWindow, - doc = node ? node.ownerDocument || node : preferredDoc; - - // Return early if doc is invalid or already selected - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Update global variables - document = doc; - docElem = document.documentElement; - documentIsHTML = !isXML( document ); - - // Support: IE 9 - 11+, Edge 12 - 18+ - // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( preferredDoc != document && - ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { - - // Support: IE 11, Edge - if ( subWindow.addEventListener ) { - subWindow.addEventListener( "unload", unloadHandler, false ); - - // Support: IE 9 - 10 only - } else if ( subWindow.attachEvent ) { - subWindow.attachEvent( "onunload", unloadHandler ); - } - } - - // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, - // Safari 4 - 5 only, Opera <=11.6 - 12.x only - // IE/Edge & older browsers don't support the :scope pseudo-class. - // Support: Safari 6.0 only - // Safari 6.0 supports :scope but it's an alias of :root there. - support.scope = assert( function ( el ) { - docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); - return typeof el.querySelectorAll !== "undefined" && - !el.querySelectorAll( ":scope fieldset div" ).length; - } ); - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties - // (excepting IE8 booleans) - support.attributes = assert( function ( el ) { - el.className = "i"; - return !el.getAttribute( "className" ); - } ); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert( function ( el ) { - el.appendChild( document.createComment( "" ) ); - return !el.getElementsByTagName( "*" ).length; - } ); - - // Support: IE<9 - support.getElementsByClassName = rnative.test( document.getElementsByClassName ); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programmatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert( function ( el ) { - docElem.appendChild( el ).id = expando; - return !document.getElementsByName || !document.getElementsByName( expando ).length; - } ); - - // ID filter and find - if ( support.getById ) { - Expr.filter[ "ID" ] = function ( id ) { - var attrId = id.replace( runescape, funescape ); - return function ( elem ) { - return elem.getAttribute( "id" ) === attrId; - }; - }; - Expr.find[ "ID" ] = function ( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var elem = context.getElementById( id ); - return elem ? [ elem ] : []; - } - }; - } else { - Expr.filter[ "ID" ] = function ( id ) { - var attrId = id.replace( runescape, funescape ); - return function ( elem ) { - var node = typeof elem.getAttributeNode !== "undefined" && - elem.getAttributeNode( "id" ); - return node && node.value === attrId; - }; - }; - - // Support: IE 6 - 7 only - // getElementById is not reliable as a find shortcut - Expr.find[ "ID" ] = function ( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var node, i, elems, - elem = context.getElementById( id ); - - if ( elem ) { - - // Verify the id attribute - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - - // Fall back on getElementsByName - elems = context.getElementsByName( id ); - i = 0; - while ( ( elem = elems[ i++ ] ) ) { - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - } - } - - return []; - } - }; - } - - // Tag - Expr.find[ "TAG" ] = support.getElementsByTagName ? - function ( tag, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( tag ); - - // DocumentFragment nodes don't have gEBTN - } else if ( support.qsa ) { - return context.querySelectorAll( tag ); - } - } : - - function ( tag, context ) { - var elem, - tmp = [], - i = 0, - - // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find[ "CLASS" ] = support.getElementsByClassName && function ( className, context ) { - if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See https://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { - - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert( function ( el ) { - - var input; - - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // https://bugs.jquery.com/ticket/12359 - docElem.appendChild( el ).innerHTML = "" + - ""; - - // Support: IE8, Opera 11-12.16 - // Nothing should be selected when empty strings follow ^= or $= or *= - // The test attribute must be unknown in Opera but "safe" for WinRT - // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !el.querySelectorAll( "[selected]" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ - if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { - rbuggyQSA.push( "~=" ); - } - - // Support: IE 11+, Edge 15 - 18+ - // IE 11/Edge don't find elements on a `[name='']` query in some cases. - // Adding a temporary attribute to the document before the selection works - // around the issue. - // Interestingly, IE 10 & older don't seem to have the issue. - input = document.createElement( "input" ); - input.setAttribute( "name", "" ); - el.appendChild( input ); - if ( !el.querySelectorAll( "[name='']" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + - whitespace + "*(?:''|\"\")" ); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !el.querySelectorAll( ":checked" ).length ) { - rbuggyQSA.push( ":checked" ); - } - - // Support: Safari 8+, iOS 8+ - // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibling-combinator selector` fails - if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { - rbuggyQSA.push( ".#.+[+~]" ); - } - - // Support: Firefox <=3.6 - 5 only - // Old Firefox doesn't throw on a badly-escaped identifier. - el.querySelectorAll( "\\\f" ); - rbuggyQSA.push( "[\\r\\n\\f]" ); - } ); - - assert( function ( el ) { - el.innerHTML = "" + - ""; - - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - var input = document.createElement( "input" ); - input.setAttribute( "type", "hidden" ); - el.appendChild( input ).setAttribute( "name", "D" ); - - // Support: IE8 - // Enforce case-sensitivity of name attribute - if ( el.querySelectorAll( "[name=d]" ).length ) { - rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: IE9-11+ - // IE's :disabled selector does not pick up the children of disabled fieldsets - docElem.appendChild( el ).disabled = true; - if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: Opera 10 - 11 only - // Opera 10-11 does not throw on post-comma invalid pseudos - el.querySelectorAll( "*,:x" ); - rbuggyQSA.push( ",.*:" ); - } ); - } - - if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || - docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector ) ) ) ) { - - assert( function ( el ) { - - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( el, "*" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( el, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - } ); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); - - /* Contains - ---------------------------------------------------------------------- */ - hasCompare = rnative.test( docElem.compareDocumentPosition ); - - // Element contains another - // Purposefully self-exclusive - // As in, an element does not contain itself - contains = hasCompare || rnative.test( docElem.contains ) ? - function ( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - ) ); - } : - function ( a, b ) { - if ( b ) { - while ( ( b = b.parentNode ) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = hasCompare ? - function ( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - // Sort on method existence if only one input has compareDocumentPosition - var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if ( compare ) { - return compare; - } - - // Calculate position if both inputs belong to the same document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? - a.compareDocumentPosition( b ) : - - // Otherwise we know they are disconnected - 1; - - // Disconnected nodes - if ( compare & 1 || - ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { - - // Choose the first element that is related to our preferred document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( a == document || a.ownerDocument == preferredDoc && - contains( preferredDoc, a ) ) { - return -1; - } - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( b == document || b.ownerDocument == preferredDoc && - contains( preferredDoc, b ) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } : - function ( a, b ) { - - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Parentless nodes are either documents or disconnected - if ( !aup || !bup ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - return a == document ? -1 : - b == document ? 1 : - /* eslint-enable eqeqeq */ - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( ( cur = cur.parentNode ) ) { - ap.unshift( cur ); - } - cur = b; - while ( ( cur = cur.parentNode ) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[ i ] === bp[ i ] ) { - i++; - } - - return i ? - - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[ i ], bp[ i ] ) : - - // Otherwise nodes in our document sort first - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - ap[ i ] == preferredDoc ? -1 : - bp[ i ] == preferredDoc ? 1 : - /* eslint-enable eqeqeq */ - 0; - }; - - return document; - }; - - Sizzle.matches = function ( expr, elements ) { - return Sizzle( expr, null, null, elements ); - }; - - Sizzle.matchesSelector = function ( elem, expr ) { - setDocument( elem ); - - if ( support.matchesSelector && documentIsHTML && - !nonnativeSelectorCache[ expr + " " ] && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch ( e ) { - nonnativeSelectorCache( expr, true ); - } - } - - return Sizzle( expr, document, null, [ elem ] ).length > 0; - }; - - Sizzle.contains = function ( context, elem ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( context.ownerDocument || context ) != document ) { - setDocument( context ); - } - return contains( context, elem ); - }; - - Sizzle.attr = function ( elem, name ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( elem.ownerDocument || elem ) != document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val !== undefined ? - val : - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; - }; - - Sizzle.escape = function ( sel ) { - return ( sel + "" ).replace( rcssescape, fcssescape ); - }; - - Sizzle.error = function ( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); - }; - - /** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ - Sizzle.uniqueSort = function ( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; - }; - - /** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ - getText = Sizzle.getText = function ( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - - // If no nodeType, this is expected to be an array - while ( ( node = elem[ i++ ] ) ) { - - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - - // Use textContent for elements - // innerText usage removed for consistency of new lines (jQuery #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - - // Do not include comment or processing instruction nodes - - return ret; - }; - - Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { - dir: "parentNode", - first: true - }, - " ": { - dir: "parentNode" - }, - "+": { - dir: "previousSibling", - first: true - }, - "~": { - dir: "previousSibling" - } - }, - - preFilter: { - "ATTR": function ( match ) { - match[ 1 ] = match[ 1 ].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[ 3 ] = ( match[ 3 ] || match[ 4 ] || - match[ 5 ] || "" ).replace( runescape, funescape ); - - if ( match[ 2 ] === "~=" ) { - match[ 3 ] = " " + match[ 3 ] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function ( match ) { - - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[ 1 ] = match[ 1 ].toLowerCase(); - - if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { - - // nth-* requires argument - if ( !match[ 3 ] ) { - Sizzle.error( match[ 0 ] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[ 4 ] = +( match[ 4 ] ? - match[ 5 ] + ( match[ 6 ] || 1 ) : - 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); - match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); - - // other types prohibit arguments - } else if ( match[ 3 ] ) { - Sizzle.error( match[ 0 ] ); - } - - return match; - }, - - "PSEUDO": function ( match ) { - var excess, - unquoted = !match[ 6 ] && match[ 2 ]; - - if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[ 3 ] ) { - match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - - // Get excess from tokenize (recursively) - ( excess = tokenize( unquoted, true ) ) && - - // advance to the next closing parenthesis - ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { - - // excess is a negative index - match[ 0 ] = match[ 0 ].slice( 0, excess ); - match[ 2 ] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - "TAG": function ( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function () { - return true; - } : - function ( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function ( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - ( pattern = new RegExp( "(^|" + whitespace + - ")" + className + "(" + whitespace + "|$)" ) ) && classCache( - className, - function ( elem ) { - return pattern.test( - typeof elem.className === "string" && elem.className || - typeof elem.getAttribute !== "undefined" && - elem.getAttribute( "class" ) || - "" - ); - } ); - }, - - "ATTR": function ( name, operator, check ) { - return function ( elem ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - /* eslint-disable max-len */ - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - /* eslint-enable max-len */ - - }; - }, - - "CHILD": function ( type, what, _argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function ( elem ) { - return !!elem.parentNode; - } : - - function ( elem, _context, xml ) { - var cache, uniqueCache, outerCache, node, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType, - diff = false; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( ( node = node[ dir ] ) ) { - if ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) { - - return false; - } - } - - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - - // Seek `elem` from a previously-cached index - - // ...in a gzip-friendly way - node = parent; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex && cache[ 2 ]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( ( node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - } else { - - // Use previously-cached element index if available - if ( useCache ) { - - // ...in a gzip-friendly way - node = elem; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex; - } - - // xml :nth-child(...) - // or :nth-last-child(...) or :nth(-last)?-of-type(...) - if ( diff === false ) { - - // Use the same loop as above to seek `elem` from the start - while ( ( node = ++nodeIndex && node && node[ dir ] || - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - if ( ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) && - ++diff ) { - - // Cache the index of each encountered element - if ( useCache ) { - outerCache = node[ expando ] || - ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - uniqueCache[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - "PSEUDO": function ( pseudo, argument ) { - - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction( function ( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf( seed, matched[ i ] ); - seed[ idx ] = !( matches[ idx ] = matched[ i ] ); - } - } ) : - function ( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - - // Potentially complex pseudos - "not": markFunction( function ( selector ) { - - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); - - return matcher[ expando ] ? - markFunction( function ( seed, matches, _context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( ( elem = unmatched[ i ] ) ) { - seed[ i ] = !( matches[ i ] = elem ); - } - } - } ) : - function ( elem, _context, xml ) { - input[ 0 ] = elem; - matcher( input, null, xml, results ); - - // Don't keep the element (issue #299) - input[ 0 ] = null; - return !results.pop(); - }; - } ), - - "has": markFunction( function ( selector ) { - return function ( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - } ), - - "contains": markFunction( function ( text ) { - text = text.replace( runescape, funescape ); - return function ( elem ) { - return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; - }; - } ), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function ( lang ) { - - // lang value must be a valid identifier - if ( !ridentifier.test( lang || "" ) ) { - Sizzle.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function ( elem ) { - var elemLang; - do { - if ( ( elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); - return false; - }; - } ), - - // Miscellaneous - "target": function ( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - "root": function ( elem ) { - return elem === docElem; - }, - - "focus": function ( elem ) { - return elem === document.activeElement && - ( !document.hasFocus || document.hasFocus() ) && - !!( elem.type || elem.href || ~elem.tabIndex ); - }, - - // Boolean properties - "enabled": createDisabledPseudo( false ), - "disabled": createDisabledPseudo( true ), - - "checked": function ( elem ) { - - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return ( nodeName === "input" && !!elem.checked ) || - ( nodeName === "option" && !!elem.selected ); - }, - - "selected": function ( elem ) { - - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - // eslint-disable-next-line no-unused-expressions - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function ( elem ) { - - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), - // but not by others (comment: 8; processing instruction: 7; etc.) - // nodeType < 6 works because attributes (2) do not appear as children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeType < 6 ) { - return false; - } - } - return true; - }, - - "parent": function ( elem ) { - return !Expr.pseudos[ "empty" ]( elem ); - }, - - // Element/input types - "header": function ( elem ) { - return rheader.test( elem.nodeName ); - }, - - "input": function ( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "button": function ( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function ( elem ) { - var attr; - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - - // Support: IE<8 - // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" - ( ( attr = elem.getAttribute( "type" ) ) == null || - attr.toLowerCase() === "text" ); - }, - - // Position-in-collection - "first": createPositionalPseudo( function () { - return [ 0 ]; - } ), - - "last": createPositionalPseudo( function ( _matchIndexes, length ) { - return [ length - 1 ]; - } ), - - "eq": createPositionalPseudo( function ( _matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - } ), - - "even": createPositionalPseudo( function ( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "odd": createPositionalPseudo( function ( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "lt": createPositionalPseudo( function ( matchIndexes, length, argument ) { - var i = argument < 0 ? - argument + length : - argument > length ? - length : - argument; - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "gt": createPositionalPseudo( function ( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ) - } - }; - - Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; - - // Add button/input type pseudos - for ( i in { - radio: true, - checkbox: true, - file: true, - password: true, - image: true - } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); - } - for ( i in { - submit: true, - reset: true - } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); - } - - // Easy API for creating new setFilters - function setFilters() {} - setFilters.prototype = Expr.filters = Expr.pseudos; - Expr.setFilters = new setFilters(); - - tokenize = Sizzle.tokenize = function ( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || ( match = rcomma.exec( soFar ) ) ) { - if ( match ) { - - // Don't consume trailing commas as valid - soFar = soFar.slice( match[ 0 ].length ) || soFar; - } - groups.push( ( tokens = [] ) ); - } - - matched = false; - - // Combinators - if ( ( match = rcombinators.exec( soFar ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - - // Cast descendant combinators to space - type: match[ 0 ].replace( rtrim, " " ) - } ); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || - ( match = preFilters[ type ]( match ) ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - type: type, - matches: match - } ); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); - }; - - function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[ i ].value; - } - return selector; - } - - function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - skip = combinator.next, - key = skip || dir, - checkNonElements = base && key === "parentNode", - doneName = done++; - - return combinator.first ? - - // Check against closest ancestor/preceding element - function ( elem, context, xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - return false; - } : - - // Check against all ancestor/preceding elements - function ( elem, context, xml ) { - var oldCache, uniqueCache, outerCache, - newCache = [ dirruns, doneName ]; - - // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching - if ( xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || ( elem[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ elem.uniqueID ] || - ( outerCache[ elem.uniqueID ] = {} ); - - if ( skip && skip === elem.nodeName.toLowerCase() ) { - elem = elem[ dir ] || elem; - } else if ( ( oldCache = uniqueCache[ key ] ) && - oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { - - // Assign to newCache so results back-propagate to previous elements - return ( newCache[ 2 ] = oldCache[ 2 ] ); - } else { - - // Reuse newcache so results back-propagate to previous elements - uniqueCache[ key ] = newCache; - - // A match means we're done; a fail means we have to keep checking - if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { - return true; - } - } - } - } - } - return false; - }; - } - - function elementMatcher( matchers ) { - return matchers.length > 1 ? - function ( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[ i ]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[ 0 ]; - } - - function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[ i ], results ); - } - return results; - } - - function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( ( elem = unmatched[ i ] ) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; - } - - function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction( function ( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( - selector || "*", - context.nodeType ? [ context ] : context, - [] - ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( ( elem = temp[ i ] ) ) { - matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) ) { - - // Restore matcherIn since elem is not yet a final match - temp.push( ( matcherIn[ i ] = elem ) ); - } - } - postFinder( null, ( matcherOut = [] ), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) && - ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { - - seed[ temp ] = !( results[ temp ] = elem ); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - } ); - } - - function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[ 0 ].type ], - implicitRelative = leadingRelative || Expr.relative[ " " ], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function ( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function ( elem ) { - return indexOf( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function ( elem, context, xml ) { - var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - ( checkContext = context ).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - - // Avoid hanging onto element (issue #299) - checkContext = null; - return ret; - } ]; - - for ( ; i < len; i++ ) { - if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { - matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; - } else { - matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[ j ].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens - .slice( 0, i - 1 ) - .concat( { - value: tokens[ i - 2 ].type === " " ? "*" : "" - } ) - ).replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); - } - - function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - var bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function ( seed, context, xml, results, outermost ) { - var elem, j, matcher, - matchedCount = 0, - i = "0", - unmatched = seed && [], - setMatched = [], - contextBackup = outermostContext, - - // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), - - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), - len = elems.length; - - if ( outermost ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - outermostContext = context == document || context || outermost; - } - - // Add elements passing elementMatchers directly to results - // Support: IE<9, Safari - // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id - for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( !context && elem.ownerDocument != document ) { - setDocument( elem ); - xml = !documentIsHTML; - } - while ( ( matcher = elementMatchers[ j++ ] ) ) { - if ( matcher( elem, context || document, xml ) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - - // They will have gone through all possible matchers - if ( ( elem = !matcher && elem ) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // `i` is now the count of elements visited above, and adding it to `matchedCount` - // makes the latter nonnegative. - matchedCount += i; - - // Apply set filters to unmatched elements - // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` - // equals `i`), unless we didn't visit _any_ elements in the above loop because we have - // no element matchers and no seed. - // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that - // case, which will result in a "00" `matchedCount` that differs from `i` but is also - // numerically zero. - if ( bySet && i !== matchedCount ) { - j = 0; - while ( ( matcher = setMatchers[ j++ ] ) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !( unmatched[ i ] || setMatched[ i ] ) ) { - setMatched[ i ] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; - } - - compile = Sizzle.compile = function ( selector, match /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - - // Generate a function of recursive functions that can be used to check each element - if ( !match ) { - match = tokenize( selector ); - } - i = match.length; - while ( i-- ) { - cached = matcherFromTokens( match[ i ] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( - selector, - matcherFromGroupMatchers( elementMatchers, setMatchers ) - ); - - // Save selector and tokenization - cached.selector = selector; - } - return cached; - }; - - /** - * A low-level selection function that works with Sizzle's compiled - * selector functions - * @param {String|Function} selector A selector or a pre-compiled - * selector function built with Sizzle.compile - * @param {Element} context - * @param {Array} [results] - * @param {Array} [seed] A set of elements to match against - */ - select = Sizzle.select = function ( selector, context, results, seed ) { - var i, tokens, token, type, find, - compiled = typeof selector === "function" && selector, - match = !seed && tokenize( ( selector = compiled.selector || selector ) ); - - results = results || []; - - // Try to minimize operations if there is only one selector in the list and no seed - // (the latter of which guarantees us context) - if ( match.length === 1 ) { - - // Reduce context if the leading compound selector is an ID - tokens = match[ 0 ] = match[ 0 ].slice( 0 ); - if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && - context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { - - context = ( Expr.find[ "ID" ]( token.matches[ 0 ] - .replace( runescape, funescape ), context ) || [] )[ 0 ]; - if ( !context ) { - return results; - - // Precompiled matchers will still verify ancestry, so step up a level - } else if ( compiled ) { - context = context.parentNode; - } - - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[ i ]; - - // Abort if we hit a combinator - if ( Expr.relative[ ( type = token.type ) ] ) { - break; - } - if ( ( find = Expr.find[ type ] ) ) { - - // Search, expanding context for leading sibling combinators - if ( ( seed = find( - token.matches[ 0 ].replace( runescape, funescape ), - rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || - context - ) ) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - - // Compile and execute a filtering function if one is not provided - // Provide `match` to avoid retokenization if we modified the selector above - ( compiled || compile( selector, match ) )( - seed, - context, - !documentIsHTML, - results, - !context || rsibling.test( selector ) && testContext( context.parentNode ) || context - ); - return results; - }; - - // One-time assignments - - // Sort stability - support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; - - // Support: Chrome 14-35+ - // Always assume duplicates if they aren't passed to the comparison function - support.detectDuplicates = !!hasDuplicate; - - // Initialize against the default document - setDocument(); - - // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) - // Detached nodes confoundingly follow *each other* - support.sortDetached = assert( function ( el ) { - - // Should return 1, but returns 4 (following) - return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; - } ); - - // Support: IE<8 - // Prevent attribute/property "interpolation" - // https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx - if ( !assert( function ( el ) { - el.innerHTML = ""; - return el.firstChild.getAttribute( "href" ) === "#"; - } ) ) { - addHandle( "type|href|height|width", function ( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - } ); - } - - // Support: IE<9 - // Use defaultValue in place of getAttribute("value") - if ( !support.attributes || !assert( function ( el ) { - el.innerHTML = ""; - el.firstChild.setAttribute( "value", "" ); - return el.firstChild.getAttribute( "value" ) === ""; - } ) ) { - addHandle( "value", function ( elem, _name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - } ); - } - - // Support: IE<9 - // Use getAttributeNode to fetch booleans when getAttribute lies - if ( !assert( function ( el ) { - return el.getAttribute( "disabled" ) == null; - } ) ) { - addHandle( booleans, function ( elem, name, isXML ) { - var val; - if ( !isXML ) { - return elem[ name ] === true ? name.toLowerCase() : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; - } - } ); - } - - return Sizzle; - - } )( window ); - - - - jQuery.find = Sizzle; - jQuery.expr = Sizzle.selectors; - - // Deprecated - jQuery.expr[ ":" ] = jQuery.expr.pseudos; - jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; - jQuery.text = Sizzle.getText; - jQuery.isXMLDoc = Sizzle.isXML; - jQuery.contains = Sizzle.contains; - jQuery.escapeSelector = Sizzle.escape; - - - - - var dir = function ( elem, dir, until ) { - var matched = [], - truncate = until !== undefined; - - while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { - if ( elem.nodeType === 1 ) { - if ( truncate && jQuery( elem ).is( until ) ) { - break; - } - matched.push( elem ); - } - } - return matched; - }; - - - var siblings = function ( n, elem ) { - var matched = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - matched.push( n ); - } - } - - return matched; - }; - - - var rneedsContext = jQuery.expr.match.needsContext; - - - - function nodeName( elem, name ) { - - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - - } - var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); - - - - // Implement the identical functionality for filter and not - function winnow( elements, qualifier, not ) { - if ( isFunction( qualifier ) ) { - return jQuery.grep( elements, function ( elem, i ) { - return !!qualifier.call( elem, i, elem ) !== not; - } ); - } - - // Single element - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function ( elem ) { - return ( elem === qualifier ) !== not; - } ); - } - - // Arraylike of elements (jQuery, arguments, Array) - if ( typeof qualifier !== "string" ) { - return jQuery.grep( elements, function ( elem ) { - return ( indexOf.call( qualifier, elem ) > -1 ) !== not; - } ); - } - - // Filtered directly for both simple and complex selectors - return jQuery.filter( qualifier, elements, not ); - } - - jQuery.filter = function ( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - if ( elems.length === 1 && elem.nodeType === 1 ) { - return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; - } - - return jQuery.find.matches( expr, jQuery.grep( elems, function ( elem ) { - return elem.nodeType === 1; - } ) ); - }; - - jQuery.fn.extend( { - find: function ( selector ) { - var i, ret, - len = this.length, - self = this; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter( function () { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - } ) ); - } - - ret = this.pushStack( [] ); - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - return len > 1 ? jQuery.uniqueSort( ret ) : ret; - }, - filter: function ( selector ) { - return this.pushStack( winnow( this, selector || [], false ) ); - }, - not: function ( selector ) { - return this.pushStack( winnow( this, selector || [], true ) ); - }, - is: function ( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - } - } ); - - - // Initialize a jQuery object - - - // A central reference to the root jQuery(document) - var rootjQuery, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - // Shortcut simple #id case for speed - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, - - init = jQuery.fn.init = function ( selector, context, root ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Method init() accepts an alternate rootjQuery - // so migrate can support jQuery.sub (gh-2101) - root = root || rootjQuery; - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector[ 0 ] === "<" && - selector[ selector.length - 1 ] === ">" && - selector.length >= 3 ) { - - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && ( match[ 1 ] || !context ) ) { - - // HANDLE: $(html) -> $(array) - if ( match[ 1 ] ) { - context = context instanceof jQuery ? context[ 0 ] : context; - - // Option to run scripts is true for back-compat - // Intentionally let the error be thrown if parseHTML is not present - jQuery.merge( this, jQuery.parseHTML( - match[ 1 ], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - - // Properties of context are called as methods if possible - if ( isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[ 2 ] ); - - if ( elem ) { - - // Inject the element directly into the jQuery object - this[ 0 ] = elem; - this.length = 1; - } - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || root ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this[ 0 ] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( isFunction( selector ) ) { - return root.ready !== undefined ? - root.ready( selector ) : - - // Execute immediately if ready is not present - selector( jQuery ); - } - - return jQuery.makeArray( selector, this ); - }; - - // Give the init function the jQuery prototype for later instantiation - init.prototype = jQuery.fn; - - // Initialize central reference - rootjQuery = jQuery( document ); - - - var rparentsprev = /^(?:parents|prev(?:Until|All))/, - - // Methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - - jQuery.fn.extend( { - has: function ( target ) { - var targets = jQuery( target, this ), - l = targets.length; - - return this.filter( function () { - var i = 0; - for ( ; i < l; i++ ) { - if ( jQuery.contains( this, targets[ i ] ) ) { - return true; - } - } - } ); - }, - - closest: function ( selectors, context ) { - var cur, - i = 0, - l = this.length, - matched = [], - targets = typeof selectors !== "string" && jQuery( selectors ); - - // Positional selectors never match, since there's no _selection_ context - if ( !rneedsContext.test( selectors ) ) { - for ( ; i < l; i++ ) { - for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { - - // Always skip document fragments - if ( cur.nodeType < 11 && ( targets ? - targets.index( cur ) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector( cur, selectors ) ) ) { - - matched.push( cur ); - break; - } - } - } - } - - return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); - }, - - // Determine the position of an element within the set - index: function ( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; - } - - // Index in selector - if ( typeof elem === "string" ) { - return indexOf.call( jQuery( elem ), this[ 0 ] ); - } - - // Locate the position of the desired element - return indexOf.call( this, - - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[ 0 ] : elem - ); - }, - - add: function ( selector, context ) { - return this.pushStack( - jQuery.uniqueSort( - jQuery.merge( this.get(), jQuery( selector, context ) ) - ) - ); - }, - - addBack: function ( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter( selector ) - ); - } - } ); - - function sibling( cur, dir ) { - while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} - return cur; - } - - jQuery.each( { - parent: function ( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function ( elem ) { - return dir( elem, "parentNode" ); - }, - parentsUntil: function ( elem, _i, until ) { - return dir( elem, "parentNode", until ); - }, - next: function ( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function ( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function ( elem ) { - return dir( elem, "nextSibling" ); - }, - prevAll: function ( elem ) { - return dir( elem, "previousSibling" ); - }, - nextUntil: function ( elem, _i, until ) { - return dir( elem, "nextSibling", until ); - }, - prevUntil: function ( elem, _i, until ) { - return dir( elem, "previousSibling", until ); - }, - siblings: function ( elem ) { - return siblings( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function ( elem ) { - return siblings( elem.firstChild ); - }, - contents: function ( elem ) { - if ( elem.contentDocument != null && - - // Support: IE 11+ - // elements with no `data` attribute has an object - // `contentDocument` with a `null` prototype. - getProto( elem.contentDocument ) ) { - - return elem.contentDocument; - } - - // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only - // Treat the template element as a regular one in browsers that - // don't support it. - if ( nodeName( elem, "template" ) ) { - elem = elem.content || elem; - } - - return jQuery.merge( [], elem.childNodes ); - } - }, function ( name, fn ) { - jQuery.fn[ name ] = function ( until, selector ) { - var matched = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - matched = jQuery.filter( selector, matched ); - } - - if ( this.length > 1 ) { - - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - jQuery.uniqueSort( matched ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - matched.reverse(); - } - } - - return this.pushStack( matched ); - }; - } ); - var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); - - - - // Convert String-formatted options into Object-formatted ones - function createOptions( options ) { - var object = {}; - jQuery.each( options.match( rnothtmlwhite ) || [], function ( _, flag ) { - object[ flag ] = true; - } ); - return object; - } - - /* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ - jQuery.Callbacks = function ( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - createOptions( options ) : - jQuery.extend( {}, options ); - - var // Flag to know if list is currently firing - firing, - - // Last fire value for non-forgettable lists - memory, - - // Flag to know if list was already fired - fired, - - // Flag to prevent firing - locked, - - // Actual callback list - list = [], - - // Queue of execution data for repeatable lists - queue = [], - - // Index of currently firing callback (modified by add/remove as needed) - firingIndex = -1, - - // Fire callbacks - fire = function () { - - // Enforce single-firing - locked = locked || options.once; - - // Execute callbacks for all pending executions, - // respecting firingIndex overrides and runtime changes - fired = firing = true; - for ( ; queue.length; firingIndex = -1 ) { - memory = queue.shift(); - while ( ++firingIndex < list.length ) { - - // Run callback and check for early termination - if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && - options.stopOnFalse ) { - - // Jump to end and forget the data so .add doesn't re-fire - firingIndex = list.length; - memory = false; - } - } - } - - // Forget the data if we're done with it - if ( !options.memory ) { - memory = false; - } - - firing = false; - - // Clean up if we're done firing for good - if ( locked ) { - - // Keep an empty list if we have data for future add calls - if ( memory ) { - list = []; - - // Otherwise, this object is spent - } else { - list = ""; - } - } - }, - - // Actual Callbacks object - self = { - - // Add a callback or a collection of callbacks to the list - add: function () { - if ( list ) { - - // If we have memory from a past run, we should fire after adding - if ( memory && !firing ) { - firingIndex = list.length - 1; - queue.push( memory ); - } - - ( function add( args ) { - jQuery.each( args, function ( _, arg ) { - if ( isFunction( arg ) ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && toType( arg ) !== "string" ) { - - // Inspect recursively - add( arg ); - } - } ); - } )( arguments ); - - if ( memory && !firing ) { - fire(); - } - } - return this; - }, - - // Remove a callback from the list - remove: function () { - jQuery.each( arguments, function ( _, arg ) { - var index; - while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - - // Handle firing indexes - if ( index <= firingIndex ) { - firingIndex--; - } - } - } ); - return this; - }, - - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function ( fn ) { - return fn ? - jQuery.inArray( fn, list ) > -1 : - list.length > 0; - }, - - // Remove all callbacks from the list - empty: function () { - if ( list ) { - list = []; - } - return this; - }, - - // Disable .fire and .add - // Abort any current/pending executions - // Clear all callbacks and values - disable: function () { - locked = queue = []; - list = memory = ""; - return this; - }, - disabled: function () { - return !list; - }, - - // Disable .fire - // Also disable .add unless we have memory (since it would have no effect) - // Abort any pending executions - lock: function () { - locked = queue = []; - if ( !memory && !firing ) { - list = memory = ""; - } - return this; - }, - locked: function () { - return !!locked; - }, - - // Call all callbacks with the given context and arguments - fireWith: function ( context, args ) { - if ( !locked ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - queue.push( args ); - if ( !firing ) { - fire(); - } - } - return this; - }, - - // Call all the callbacks with the given arguments - fire: function () { - self.fireWith( this, arguments ); - return this; - }, - - // To know if the callbacks have already been called at least once - fired: function () { - return !!fired; - } - }; - - return self; - }; - - - function Identity( v ) { - return v; - } - - function Thrower( ex ) { - throw ex; - } - - function adoptValue( value, resolve, reject, noValue ) { - var method; - - try { - - // Check for promise aspect first to privilege synchronous behavior - if ( value && isFunction( ( method = value.promise ) ) ) { - method.call( value ).done( resolve ).fail( reject ); - - // Other thenables - } else if ( value && isFunction( ( method = value.then ) ) ) { - method.call( value, resolve, reject ); - - // Other non-thenables - } else { - - // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: - // * false: [ value ].slice( 0 ) => resolve( value ) - // * true: [ value ].slice( 1 ) => resolve() - resolve.apply( undefined, [ value ].slice( noValue ) ); - } - - // For Promises/A+, convert exceptions into rejections - // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in - // Deferred#then to conditionally suppress rejection. - } catch ( value ) { - - // Support: Android 4.0 only - // Strict mode functions invoked without .call/.apply get global-object context - reject.apply( undefined, [ value ] ); - } - } - - jQuery.extend( { - - Deferred: function ( func ) { - var tuples = [ - - // action, add listener, callbacks, - // ... .then handlers, argument index, [final state] - [ "notify", "progress", jQuery.Callbacks( "memory" ), - jQuery.Callbacks( "memory" ), 2 - ], - [ "resolve", "done", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 0, "resolved" - ], - [ "reject", "fail", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 1, "rejected" - ] - ], - state = "pending", - promise = { - state: function () { - return state; - }, - always: function () { - deferred.done( arguments ).fail( arguments ); - return this; - }, - "catch": function ( fn ) { - return promise.then( null, fn ); - }, - - // Keep pipe for back-compat - pipe: function ( /* fnDone, fnFail, fnProgress */) { - var fns = arguments; - - return jQuery.Deferred( function ( newDefer ) { - jQuery.each( tuples, function ( _i, tuple ) { - - // Map tuples (progress, done, fail) to arguments (done, fail, progress) - var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; - - // deferred.progress(function() { bind to newDefer or newDefer.notify }) - // deferred.done(function() { bind to newDefer or newDefer.resolve }) - // deferred.fail(function() { bind to newDefer or newDefer.reject }) - deferred[ tuple[ 1 ] ]( function () { - var returned = fn && fn.apply( this, arguments ); - if ( returned && isFunction( returned.promise ) ) { - returned.promise() - .progress( newDefer.notify ) - .done( newDefer.resolve ) - .fail( newDefer.reject ); - } else { - newDefer[ tuple[ 0 ] + "With" ]( - this, - fn ? [ returned ] : arguments - ); - } - } ); - } ); - fns = null; - } ).promise(); - }, - then: function ( onFulfilled, onRejected, onProgress ) { - var maxDepth = 0; - - function resolve( depth, deferred, handler, special ) { - return function () { - var that = this, - args = arguments, - mightThrow = function () { - var returned, then; - - // Support: Promises/A+ section 2.3.3.3.3 - // https://promisesaplus.com/#point-59 - // Ignore double-resolution attempts - if ( depth < maxDepth ) { - return; - } - - returned = handler.apply( that, args ); - - // Support: Promises/A+ section 2.3.1 - // https://promisesaplus.com/#point-48 - if ( returned === deferred.promise() ) { - throw new TypeError( "Thenable self-resolution" ); - } - - // Support: Promises/A+ sections 2.3.3.1, 3.5 - // https://promisesaplus.com/#point-54 - // https://promisesaplus.com/#point-75 - // Retrieve `then` only once - then = returned && - - // Support: Promises/A+ section 2.3.4 - // https://promisesaplus.com/#point-64 - // Only check objects and functions for thenability - ( typeof returned === "object" || - typeof returned === "function" ) && - returned.then; - - // Handle a returned thenable - if ( isFunction( then ) ) { - - // Special processors (notify) just wait for resolution - if ( special ) { - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ) - ); - - // Normal processors (resolve) also hook into progress - } else { - - // ...and disregard older resolution values - maxDepth++; - - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ), - resolve( maxDepth, deferred, Identity, - deferred.notifyWith ) - ); - } - - // Handle all other returned values - } else { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Identity ) { - that = undefined; - args = [ returned ]; - } - - // Process the value(s) - // Default process is resolve - ( special || deferred.resolveWith )( that, args ); - } - }, - - // Only normal processors (resolve) catch and reject exceptions - process = special ? - mightThrow : - function () { - try { - mightThrow(); - } catch ( e ) { - - if ( jQuery.Deferred.exceptionHook ) { - jQuery.Deferred.exceptionHook( e, - process.stackTrace ); - } - - // Support: Promises/A+ section 2.3.3.3.4.1 - // https://promisesaplus.com/#point-61 - // Ignore post-resolution exceptions - if ( depth + 1 >= maxDepth ) { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Thrower ) { - that = undefined; - args = [ e ]; - } - - deferred.rejectWith( that, args ); - } - } - }; - - // Support: Promises/A+ section 2.3.3.3.1 - // https://promisesaplus.com/#point-57 - // Re-resolve promises immediately to dodge false rejection from - // subsequent errors - if ( depth ) { - process(); - } else { - - // Call an optional hook to record the stack, in case of exception - // since it's otherwise lost when execution goes async - if ( jQuery.Deferred.getStackHook ) { - process.stackTrace = jQuery.Deferred.getStackHook(); - } - window.setTimeout( process ); - } - }; - } - - return jQuery.Deferred( function ( newDefer ) { - - // progress_handlers.add( ... ) - tuples[ 0 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onProgress ) ? - onProgress : - Identity, - newDefer.notifyWith - ) - ); - - // fulfilled_handlers.add( ... ) - tuples[ 1 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onFulfilled ) ? - onFulfilled : - Identity - ) - ); - - // rejected_handlers.add( ... ) - tuples[ 2 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onRejected ) ? - onRejected : - Thrower - ) - ); - } ).promise(); - }, - - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function ( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Add list-specific methods - jQuery.each( tuples, function ( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 5 ]; - - // promise.progress = list.add - // promise.done = list.add - // promise.fail = list.add - promise[ tuple[ 1 ] ] = list.add; - - // Handle state - if ( stateString ) { - list.add( - function () { - - // state = "resolved" (i.e., fulfilled) - // state = "rejected" - state = stateString; - }, - - // rejected_callbacks.disable - // fulfilled_callbacks.disable - tuples[ 3 - i ][ 2 ].disable, - - // rejected_handlers.disable - // fulfilled_handlers.disable - tuples[ 3 - i ][ 3 ].disable, - - // progress_callbacks.lock - tuples[ 0 ][ 2 ].lock, - - // progress_handlers.lock - tuples[ 0 ][ 3 ].lock - ); - } - - // progress_handlers.fire - // fulfilled_handlers.fire - // rejected_handlers.fire - list.add( tuple[ 3 ].fire ); - - // deferred.notify = function() { deferred.notifyWith(...) } - // deferred.resolve = function() { deferred.resolveWith(...) } - // deferred.reject = function() { deferred.rejectWith(...) } - deferred[ tuple[ 0 ] ] = function () { - deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); - return this; - }; - - // deferred.notifyWith = list.fireWith - // deferred.resolveWith = list.fireWith - // deferred.rejectWith = list.fireWith - deferred[ tuple[ 0 ] + "With" ] = list.fireWith; - } ); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function ( singleValue ) { - var - - // count of uncompleted subordinates - remaining = arguments.length, - - // count of unprocessed arguments - i = remaining, - - // subordinate fulfillment data - resolveContexts = Array( i ), - resolveValues = slice.call( arguments ), - - // the primary Deferred - primary = jQuery.Deferred(), - - // subordinate callback factory - updateFunc = function ( i ) { - return function ( value ) { - resolveContexts[ i ] = this; - resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; - if ( !( --remaining ) ) { - primary.resolveWith( resolveContexts, resolveValues ); - } - }; - }; - - // Single- and empty arguments are adopted like Promise.resolve - if ( remaining <= 1 ) { - adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject, - !remaining ); - - // Use .then() to unwrap secondary thenables (cf. gh-3000) - if ( primary.state() === "pending" || - isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { - - return primary.then(); - } - } - - // Multiple arguments are aggregated like Promise.all array elements - while ( i-- ) { - adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject ); - } - - return primary.promise(); - } - } ); - - - // These usually indicate a programmer mistake during development, - // warn about them ASAP rather than swallowing them by default. - var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; - - jQuery.Deferred.exceptionHook = function ( error, stack ) { - - // Support: IE 8 - 9 only - // Console exists when dev tools are open, which can happen at any time - if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { - window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); - } - }; - - - - - jQuery.readyException = function ( error ) { - window.setTimeout( function () { - throw error; - } ); - }; - - - - - // The deferred used on DOM ready - var readyList = jQuery.Deferred(); - - jQuery.fn.ready = function ( fn ) { - - readyList - .then( fn ) - - // Wrap jQuery.readyException in a function so that the lookup - // happens at the time of error handling instead of callback - // registration. - .catch( function ( error ) { - jQuery.readyException( error ); - } ); - - return this; - }; - - jQuery.extend( { - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Handle when the DOM is ready - ready: function ( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - } - } ); - - jQuery.ready.then = readyList.then; - - // The ready event handler and self cleanup method - function completed() { - document.removeEventListener( "DOMContentLoaded", completed ); - window.removeEventListener( "load", completed ); - jQuery.ready(); - } - - // Catch cases where $(document).ready() is called - // after the browser event has already occurred. - // Support: IE <=9 - 10 only - // Older IE sometimes signals "interactive" too soon - if ( document.readyState === "complete" || - ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { - - // Handle it asynchronously to allow scripts the opportunity to delay ready - window.setTimeout( jQuery.ready ); - - } else { - - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed ); - } - - - - - // Multifunctional method to get and set values of a collection - // The value/s can optionally be executed if it's a function - var access = function ( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - len = elems.length, - bulk = key == null; - - // Sets many values - if ( toType( key ) === "object" ) { - chainable = true; - for ( i in key ) { - access( elems, fn, i, key[ i ], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function ( elem, _key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < len; i++ ) { - fn( - elems[ i ], key, raw ? - value : - value.call( elems[ i ], i, fn( elems[ i ], key ) ) - ); - } - } - } - - if ( chainable ) { - return elems; - } - - // Gets - if ( bulk ) { - return fn.call( elems ); - } - - return len ? fn( elems[ 0 ], key ) : emptyGet; - }; - - - // Matches dashed string for camelizing - var rmsPrefix = /^-ms-/, - rdashAlpha = /-([a-z])/g; - - // Used by camelCase as callback to replace() - function fcamelCase( _all, letter ) { - return letter.toUpperCase(); - } - - // Convert dashed to camelCase; used by the css and data modules - // Support: IE <=9 - 11, Edge 12 - 15 - // Microsoft forgot to hump their vendor prefix (#9572) - function camelCase( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); - } - var acceptData = function ( owner ) { - - // Accepts only: - // - Node - // - Node.ELEMENT_NODE - // - Node.DOCUMENT_NODE - // - Object - // - Any - return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); - }; - - - - - function Data() { - this.expando = jQuery.expando + Data.uid++; - } - - Data.uid = 1; - - Data.prototype = { - - cache: function ( owner ) { - - // Check if the owner object already has a cache - var value = owner[ this.expando ]; - - // If not, create one - if ( !value ) { - value = {}; - - // We can accept data for non-element nodes in modern browsers, - // but we should not, see #8335. - // Always return an empty object. - if ( acceptData( owner ) ) { - - // If it is a node unlikely to be stringify-ed or looped over - // use plain assignment - if ( owner.nodeType ) { - owner[ this.expando ] = value; - - // Otherwise secure it in a non-enumerable property - // configurable must be true to allow the property to be - // deleted when data is removed - } else { - Object.defineProperty( owner, this.expando, { - value: value, - configurable: true - } ); - } - } - } - - return value; - }, - set: function ( owner, data, value ) { - var prop, - cache = this.cache( owner ); - - // Handle: [ owner, key, value ] args - // Always use camelCase key (gh-2257) - if ( typeof data === "string" ) { - cache[ camelCase( data ) ] = value; - - // Handle: [ owner, { properties } ] args - } else { - - // Copy the properties one-by-one to the cache object - for ( prop in data ) { - cache[ camelCase( prop ) ] = data[ prop ]; - } - } - return cache; - }, - get: function ( owner, key ) { - return key === undefined ? - this.cache( owner ) : - - // Always use camelCase key (gh-2257) - owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; - }, - access: function ( owner, key, value ) { - - // In cases where either: - // - // 1. No key was specified - // 2. A string key was specified, but no value provided - // - // Take the "read" path and allow the get method to determine - // which value to return, respectively either: - // - // 1. The entire cache object - // 2. The data stored at the key - // - if ( key === undefined || - ( ( key && typeof key === "string" ) && value === undefined ) ) { - - return this.get( owner, key ); - } - - // When the key is not a string, or both a key and value - // are specified, set or extend (existing objects) with either: - // - // 1. An object of properties - // 2. A key and value - // - this.set( owner, key, value ); - - // Since the "set" path can have two possible entry points - // return the expected data based on which path was taken[*] - return value !== undefined ? value : key; - }, - remove: function ( owner, key ) { - var i, - cache = owner[ this.expando ]; - - if ( cache === undefined ) { - return; - } - - if ( key !== undefined ) { - - // Support array or space separated string of keys - if ( Array.isArray( key ) ) { - - // If key is an array of keys... - // We always set camelCase keys, so remove that. - key = key.map( camelCase ); - } else { - key = camelCase( key ); - - // If a key with the spaces exists, use it. - // Otherwise, create an array by matching non-whitespace - key = key in cache ? [ key ] : - ( key.match( rnothtmlwhite ) || [] ); - } - - i = key.length; - - while ( i-- ) { - delete cache[ key[ i ] ]; - } - } - - // Remove the expando if there's no more data - if ( key === undefined || jQuery.isEmptyObject( cache ) ) { - - // Support: Chrome <=35 - 45 - // Webkit & Blink performance suffers when deleting properties - // from DOM nodes, so set to undefined instead - // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) - if ( owner.nodeType ) { - owner[ this.expando ] = undefined; - } else { - delete owner[ this.expando ]; - } - } - }, - hasData: function ( owner ) { - var cache = owner[ this.expando ]; - return cache !== undefined && !jQuery.isEmptyObject( cache ); - } - }; - var dataPriv = new Data(); - - var dataUser = new Data(); - - - - // Implementation Summary - // - // 1. Enforce API surface and semantic compatibility with 1.9.x branch - // 2. Improve the module's maintainability by reducing the storage - // paths to a single mechanism. - // 3. Use the same single mechanism to support "private" and "user" data. - // 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) - // 5. Avoid exposing implementation details on user objects (eg. expando properties) - // 6. Provide a clear path for implementation upgrade to WeakMap in 2014 - - var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - rmultiDash = /[A-Z]/g; - - function getData( data ) { - if ( data === "true" ) { - return true; - } - - if ( data === "false" ) { - return false; - } - - if ( data === "null" ) { - return null; - } - - // Only convert to a number if it doesn't change the string - if ( data === +data + "" ) { - return +data; - } - - if ( rbrace.test( data ) ) { - return JSON.parse( data ); - } - - return data; - } - - function dataAttr( elem, key, data ) { - var name; - - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = getData( data ); - } catch ( e ) {} - - // Make sure we set the data so it isn't changed later - dataUser.set( elem, key, data ); - } else { - data = undefined; - } - } - return data; - } - - jQuery.extend( { - hasData: function ( elem ) { - return dataUser.hasData( elem ) || dataPriv.hasData( elem ); - }, - - data: function ( elem, name, data ) { - return dataUser.access( elem, name, data ); - }, - - removeData: function ( elem, name ) { - dataUser.remove( elem, name ); - }, - - // TODO: Now that all calls to _data and _removeData have been replaced - // with direct calls to dataPriv methods, these can be deprecated. - _data: function ( elem, name, data ) { - return dataPriv.access( elem, name, data ); - }, - - _removeData: function ( elem, name ) { - dataPriv.remove( elem, name ); - } - } ); - - jQuery.fn.extend( { - data: function ( key, value ) { - var i, name, data, - elem = this[ 0 ], - attrs = elem && elem.attributes; - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = dataUser.get( elem ); - - if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { - i = attrs.length; - while ( i-- ) { - - // Support: IE 11 only - // The attrs elements can be null (#14894) - if ( attrs[ i ] ) { - name = attrs[ i ].name; - if ( name.indexOf( "data-" ) === 0 ) { - name = camelCase( name.slice( 5 ) ); - dataAttr( elem, name, data[ name ] ); - } - } - } - dataPriv.set( elem, "hasDataAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each( function () { - dataUser.set( this, key ); - } ); - } - - return access( this, function ( value ) { - var data; - - // The calling jQuery object (element matches) is not empty - // (and therefore has an element appears at this[ 0 ]) and the - // `value` parameter was not undefined. An empty jQuery object - // will result in `undefined` for elem = this[ 0 ] which will - // throw an exception if an attempt to read a data cache is made. - if ( elem && value === undefined ) { - - // Attempt to get data from the cache - // The key will always be camelCased in Data - data = dataUser.get( elem, key ); - if ( data !== undefined ) { - return data; - } - - // Attempt to "discover" the data in - // HTML5 custom data-* attrs - data = dataAttr( elem, key ); - if ( data !== undefined ) { - return data; - } - - // We tried really hard, but the data doesn't exist. - return; - } - - // Set the data... - this.each( function () { - - // We always store the camelCased key - dataUser.set( this, key, value ); - } ); - }, null, value, arguments.length > 1, null, true ); - }, - - removeData: function ( key ) { - return this.each( function () { - dataUser.remove( this, key ); - } ); - } - } ); - - - jQuery.extend( { - queue: function ( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = dataPriv.get( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || Array.isArray( data ) ) { - queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function ( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function () { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // Clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // Not public - generate a queueHooks object, or return the current one - _queueHooks: function ( elem, type ) { - var key = type + "queueHooks"; - return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { - empty: jQuery.Callbacks( "once memory" ).add( function () { - dataPriv.remove( elem, [ type + "queue", key ] ); - } ) - } ); - } - } ); - - jQuery.fn.extend( { - queue: function ( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[ 0 ], type ); - } - - return data === undefined ? - this : - this.each( function () { - var queue = jQuery.queue( this, type, data ); - - // Ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - } ); - }, - dequeue: function ( type ) { - return this.each( function () { - jQuery.dequeue( this, type ); - } ); - }, - clearQueue: function ( type ) { - return this.queue( type || "fx", [] ); - }, - - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function ( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function () { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while ( i-- ) { - tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } - } ); - var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; - - var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); - - - var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; - - var documentElement = document.documentElement; - - - - var isAttached = function ( elem ) { - return jQuery.contains( elem.ownerDocument, elem ); - }, - composed = { - composed: true - }; - - // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only - // Check attachment across shadow DOM boundaries when possible (gh-3504) - // Support: iOS 10.0-10.2 only - // Early iOS 10 versions support `attachShadow` but not `getRootNode`, - // leading to errors. We need to check for `getRootNode`. - if ( documentElement.getRootNode ) { - isAttached = function ( elem ) { - return jQuery.contains( elem.ownerDocument, elem ) || - elem.getRootNode( composed ) === elem.ownerDocument; - }; - } - var isHiddenWithinTree = function ( elem, el ) { - - // isHiddenWithinTree might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - - // Inline style trumps all - return elem.style.display === "none" || - elem.style.display === "" && - - // Otherwise, check computed style - // Support: Firefox <=43 - 45 - // Disconnected elements can have computed display: none, so first confirm that elem is - // in the document. - isAttached( elem ) && - - jQuery.css( elem, "display" ) === "none"; - }; - - - - function adjustCSS( elem, prop, valueParts, tween ) { - var adjusted, scale, - maxIterations = 20, - currentValue = tween ? - function () { - return tween.cur(); - } : - function () { - return jQuery.css( elem, prop, "" ); - }, - initial = currentValue(), - unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), - - // Starting value computation is required for potential unit mismatches - initialInUnit = elem.nodeType && - ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && - rcssNum.exec( jQuery.css( elem, prop ) ); - - if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { - - // Support: Firefox <=54 - // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) - initial = initial / 2; - - // Trust units reported by jQuery.css - unit = unit || initialInUnit[ 3 ]; - - // Iteratively approximate from a nonzero starting point - initialInUnit = +initial || 1; - - while ( maxIterations-- ) { - - // Evaluate and update our best guess (doubling guesses that zero out). - // Finish if the scale equals or crosses 1 (making the old*new product non-positive). - jQuery.style( elem, prop, initialInUnit + unit ); - if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { - maxIterations = 0; - } - initialInUnit = initialInUnit / scale; - - } - - initialInUnit = initialInUnit * 2; - jQuery.style( elem, prop, initialInUnit + unit ); - - // Make sure we update the tween properties later on - valueParts = valueParts || []; - } - - if ( valueParts ) { - initialInUnit = +initialInUnit || +initial || 0; - - // Apply relative offset (+=/-=) if specified - adjusted = valueParts[ 1 ] ? - initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : - +valueParts[ 2 ]; - if ( tween ) { - tween.unit = unit; - tween.start = initialInUnit; - tween.end = adjusted; - } - } - return adjusted; - } - - - var defaultDisplayMap = {}; - - function getDefaultDisplay( elem ) { - var temp, - doc = elem.ownerDocument, - nodeName = elem.nodeName, - display = defaultDisplayMap[ nodeName ]; - - if ( display ) { - return display; - } - - temp = doc.body.appendChild( doc.createElement( nodeName ) ); - display = jQuery.css( temp, "display" ); - - temp.parentNode.removeChild( temp ); - - if ( display === "none" ) { - display = "block"; - } - defaultDisplayMap[ nodeName ] = display; - - return display; - } - - function showHide( elements, show ) { - var display, elem, - values = [], - index = 0, - length = elements.length; - - // Determine new display value for elements that need to change - for ( ; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - - display = elem.style.display; - if ( show ) { - - // Since we force visibility upon cascade-hidden elements, an immediate (and slow) - // check is required in this first loop unless we have a nonempty display value (either - // inline or about-to-be-restored) - if ( display === "none" ) { - values[ index ] = dataPriv.get( elem, "display" ) || null; - if ( !values[ index ] ) { - elem.style.display = ""; - } - } - if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { - values[ index ] = getDefaultDisplay( elem ); - } - } else { - if ( display !== "none" ) { - values[ index ] = "none"; - - // Remember what we're overwriting - dataPriv.set( elem, "display", display ); - } - } - } - - // Set the display of the elements in a second loop to avoid constant reflow - for ( index = 0; index < length; index++ ) { - if ( values[ index ] != null ) { - elements[ index ].style.display = values[ index ]; - } - } - - return elements; - } - - jQuery.fn.extend( { - show: function () { - return showHide( this, true ); - }, - hide: function () { - return showHide( this ); - }, - toggle: function ( state ) { - if ( typeof state === "boolean" ) { - return state ? this.show() : this.hide(); - } - - return this.each( function () { - if ( isHiddenWithinTree( this ) ) { - jQuery( this ).show(); - } else { - jQuery( this ).hide(); - } - } ); - } - } ); - var rcheckableType = ( /^(?:checkbox|radio)$/i ); - - var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); - - var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); - - - - ( function () { - var fragment = document.createDocumentFragment(), - div = fragment.appendChild( document.createElement( "div" ) ), - input = document.createElement( "input" ); - - // Support: Android 4.0 - 4.3 only - // Check state lost if the name is set (#11217) - // Support: Windows Web Apps (WWA) - // `name` and `type` must use .setAttribute for WWA (#14901) - input.setAttribute( "type", "radio" ); - input.setAttribute( "checked", "checked" ); - input.setAttribute( "name", "t" ); - - div.appendChild( input ); - - // Support: Android <=4.1 only - // Older WebKit doesn't clone checked state correctly in fragments - support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: IE <=11 only - // Make sure textarea (and checkbox) defaultValue is properly cloned - div.innerHTML = ""; - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; - - // Support: IE <=9 only - // IE <=9 replaces "; - support.option = !!div.lastChild; - } )(); - - - // We have to close these tags to support XHTML (#13200) - var wrapMap = { - - // XHTML parsers do not magically insert elements in the - // same way that tag soup parsers do. So we cannot shorten - // this by omitting or other required elements. - thead: [ 1, "", "
" ], - col: [ 2, "", "
" ], - tr: [ 2, "", "
" ], - td: [ 3, "", "
" ], - - _default: [ 0, "", "" ] - }; - - wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; - wrapMap.th = wrapMap.td; - - // Support: IE <=9 only - if ( !support.option ) { - wrapMap.optgroup = wrapMap.option = [ 1, "" ]; - } - - - function getAll( context, tag ) { - - // Support: IE <=9 - 11 only - // Use typeof to avoid zero-argument method invocation on host objects (#15151) - var ret; - - if ( typeof context.getElementsByTagName !== "undefined" ) { - ret = context.getElementsByTagName( tag || "*" ); - - } else if ( typeof context.querySelectorAll !== "undefined" ) { - ret = context.querySelectorAll( tag || "*" ); - - } else { - ret = []; - } - - if ( tag === undefined || tag && nodeName( context, tag ) ) { - return jQuery.merge( [ context ], ret ); - } - - return ret; - } - - - // Mark scripts as having already been evaluated - function setGlobalEval( elems, refElements ) { - var i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - dataPriv.set( - elems[ i ], - "globalEval", - !refElements || dataPriv.get( refElements[ i ], "globalEval" ) - ); - } - } - - - var rhtml = /<|&#?\w+;/; - - function buildFragment( elems, context, scripts, selection, ignored ) { - var elem, tmp, tag, wrap, attached, j, - fragment = context.createDocumentFragment(), - nodes = [], - i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( toType( elem ) === "object" ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, tmp.childNodes ); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Ensure the created nodes are orphaned (#12392) - tmp.textContent = ""; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ""; - - i = 0; - while ( ( elem = nodes[ i++ ] ) ) { - - // Skip elements already in the context collection (trac-4087) - if ( selection && jQuery.inArray( elem, selection ) > -1 ) { - if ( ignored ) { - ignored.push( elem ); - } - continue; - } - - attached = isAttached( elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( attached ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( ( elem = tmp[ j++ ] ) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; - } - - - var rtypenamespace = /^([^.]*)(?:\.(.+)|)/; - - function returnTrue() { - return true; - } - - function returnFalse() { - return false; - } - - // Support: IE <=9 - 11+ - // focus() and blur() are asynchronous, except when they are no-op. - // So expect focus to be synchronous when the element is already active, - // and blur to be synchronous when the element is not already active. - // (focus and blur are always synchronous in other supported browsers, - // this just defines when we can count on it). - function expectSync( elem, type ) { - return ( elem === safeActiveElement() ) === ( type === "focus" ); - } - - // Support: IE <=9 only - // Accessing document.activeElement can throw unexpectedly - // https://bugs.jquery.com/ticket/13393 - function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) {} - } - - function on( elem, types, selector, data, fn, one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - on( elem, type, selector, data, types[ type ], one ); - } - return elem; - } - - if ( data == null && fn == null ) { - - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return elem; - } - - if ( one === 1 ) { - origFn = fn; - fn = function ( event ) { - - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return elem.each( function () { - jQuery.event.add( this, types, fn, data, selector ); - } ); - } - - /* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ - jQuery.event = { - - global: {}, - - add: function ( elem, types, handler, data, selector ) { - - var handleObjIn, eventHandle, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.get( elem ); - - // Only attach events to objects that accept data - if ( !acceptData( elem ) ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Ensure that invalid selectors throw exceptions at attach time - // Evaluate against documentElement in case elem is a non-element node (e.g., document) - if ( selector ) { - jQuery.find.matchesSelector( documentElement, selector ); - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !( events = elemData.events ) ) { - events = elemData.events = Object.create( null ); - } - if ( !( eventHandle = elemData.handle ) ) { - eventHandle = elemData.handle = function ( e ) { - - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? - jQuery.event.dispatch.apply( elem, arguments ) : undefined; - }; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend( { - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join( "." ) - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !( handlers = events[ type ] ) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( !special.setup || - special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - }, - - // Detach an event or set of events from an element - remove: function ( elem, types, handler, selector, mappedTypes ) { - - var j, origCount, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); - - if ( !elemData || !( events = elemData.events ) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[ 2 ] && - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || - selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || - special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove data and the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - dataPriv.remove( elem, "handle events" ); - } - }, - - dispatch: function ( nativeEvent ) { - - var i, j, ret, matched, handleObj, handlerQueue, - args = new Array( arguments.length ), - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( nativeEvent ), - - handlers = ( - dataPriv.get( this, "events" ) || Object.create( null ) - )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[ 0 ] = event; - - for ( i = 1; i < arguments.length; i++ ) { - args[ i ] = arguments[ i ]; - } - - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( ( handleObj = matched.handlers[ j++ ] ) && - !event.isImmediatePropagationStopped() ) { - - // If the event is namespaced, then each handler is only invoked if it is - // specially universal or its namespaces are a superset of the event's. - if ( !event.rnamespace || handleObj.namespace === false || - event.rnamespace.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || - handleObj.handler ).apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( ( event.result = ret ) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function ( event, handlers ) { - var i, handleObj, sel, matchedHandlers, matchedSelectors, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - if ( delegateCount && - - // Support: IE <=9 - // Black-hole SVG instance trees (trac-13180) - cur.nodeType && - - // Support: Firefox <=42 - // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) - // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click - // Support: IE 11 only - // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) - !( event.type === "click" && event.button >= 1 ) ) { - - for ( ; cur !== this; cur = cur.parentNode || this ) { - - // Don't check non-elements (#13208) - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { - matchedHandlers = []; - matchedSelectors = {}; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matchedSelectors[ sel ] === undefined ) { - matchedSelectors[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) > -1 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matchedSelectors[ sel ] ) { - matchedHandlers.push( handleObj ); - } - } - if ( matchedHandlers.length ) { - handlerQueue.push( { - elem: cur, - handlers: matchedHandlers - } ); - } - } - } - } - - // Add the remaining (directly-bound) handlers - cur = this; - if ( delegateCount < handlers.length ) { - handlerQueue.push( { - elem: cur, - handlers: handlers.slice( delegateCount ) - } ); - } - - return handlerQueue; - }, - - addProp: function ( name, hook ) { - Object.defineProperty( jQuery.Event.prototype, name, { - enumerable: true, - configurable: true, - - get: isFunction( hook ) ? - function () { - if ( this.originalEvent ) { - return hook( this.originalEvent ); - } - } : function () { - if ( this.originalEvent ) { - return this.originalEvent[ name ]; - } - }, - - set: function ( value ) { - Object.defineProperty( this, name, { - enumerable: true, - configurable: true, - writable: true, - value: value - } ); - } - } ); - }, - - fix: function ( originalEvent ) { - return originalEvent[ jQuery.expando ] ? - originalEvent : - new jQuery.Event( originalEvent ); - }, - - special: { - load: { - - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - click: { - - // Utilize native event to ensure correct state for checkable inputs - setup: function ( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Claim the first handler - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - // dataPriv.set( el, "click", ... ) - leverageNative( el, "click", returnTrue ); - } - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function ( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Force setup before triggering a click - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - leverageNative( el, "click" ); - } - - // Return non-false to allow normal event-path propagation - return true; - }, - - // For cross-browser consistency, suppress native .click() on links - // Also prevent it if we're currently inside a leveraged native-event stack - _default: function ( event ) { - var target = event.target; - return rcheckableType.test( target.type ) && - target.click && nodeName( target, "input" ) && - dataPriv.get( target, "click" ) || - nodeName( target, "a" ); - } - }, - - beforeunload: { - postDispatch: function ( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined && event.originalEvent ) { - event.originalEvent.returnValue = event.result; - } - } - } - } - }; - - // Ensure the presence of an event listener that handles manually-triggered - // synthetic events by interrupting progress until reinvoked in response to - // *native* events that it fires directly, ensuring that state changes have - // already occurred before other listeners are invoked. - function leverageNative( el, type, expectSync ) { - - // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add - if ( !expectSync ) { - if ( dataPriv.get( el, type ) === undefined ) { - jQuery.event.add( el, type, returnTrue ); - } - return; - } - - // Register the controller as a special universal handler for all event namespaces - dataPriv.set( el, type, false ); - jQuery.event.add( el, type, { - namespace: false, - handler: function ( event ) { - var notAsync, result, - saved = dataPriv.get( this, type ); - - if ( ( event.isTrigger & 1 ) && this[ type ] ) { - - // Interrupt processing of the outer synthetic .trigger()ed event - // Saved data should be false in such cases, but might be a leftover capture object - // from an async native handler (gh-4350) - if ( !saved.length ) { - - // Store arguments for use when handling the inner native event - // There will always be at least one argument (an event object), so this array - // will not be confused with a leftover capture object. - saved = slice.call( arguments ); - dataPriv.set( this, type, saved ); - - // Trigger the native event and capture its result - // Support: IE <=9 - 11+ - // focus() and blur() are asynchronous - notAsync = expectSync( this, type ); - this[ type ](); - result = dataPriv.get( this, type ); - if ( saved !== result || notAsync ) { - dataPriv.set( this, type, false ); - } else { - result = {}; - } - if ( saved !== result ) { - - // Cancel the outer synthetic event - event.stopImmediatePropagation(); - event.preventDefault(); - - // Support: Chrome 86+ - // In Chrome, if an element having a focusout handler is blurred by - // clicking outside of it, it invokes the handler synchronously. If - // that handler calls `.remove()` on the element, the data is cleared, - // leaving `result` undefined. We need to guard against this. - return result && result.value; - } - - // If this is an inner synthetic event for an event with a bubbling surrogate - // (focus or blur), assume that the surrogate already propagated from triggering the - // native event and prevent that from happening again here. - // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the - // bubbling surrogate propagates *after* the non-bubbling base), but that seems - // less bad than duplication. - } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { - event.stopPropagation(); - } - - // If this is a native event triggered above, everything is now in order - // Fire an inner synthetic event with the original arguments - } else if ( saved.length ) { - - // ...and capture the result - dataPriv.set( this, type, { - value: jQuery.event.trigger( - - // Support: IE <=9 - 11+ - // Extend with the prototype to reset the above stopImmediatePropagation() - jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), - saved.slice( 1 ), - this - ) - } ); - - // Abort handling of the native event - event.stopImmediatePropagation(); - } - } - } ); - } - - jQuery.removeEvent = function ( elem, type, handle ) { - - // This "if" is needed for plain objects - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle ); - } - }; - - jQuery.Event = function ( src, props ) { - - // Allow instantiation without the 'new' keyword - if ( !( this instanceof jQuery.Event ) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented || - src.defaultPrevented === undefined && - - // Support: Android <=2.3 only - src.returnValue === false ? - returnTrue : - returnFalse; - - // Create target properties - // Support: Safari <=6 - 7 only - // Target should not be a text node (#504, #13143) - this.target = ( src.target && src.target.nodeType === 3 ) ? - src.target.parentNode : - src.target; - - this.currentTarget = src.currentTarget; - this.relatedTarget = src.relatedTarget; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || Date.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; - }; - - // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding - // https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html - jQuery.Event.prototype = { - constructor: jQuery.Event, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - isSimulated: false, - - preventDefault: function () { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - - if ( e && !this.isSimulated ) { - e.preventDefault(); - } - }, - stopPropagation: function () { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function () { - var e = this.originalEvent; - - this.isImmediatePropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopImmediatePropagation(); - } - - this.stopPropagation(); - } - }; - - // Includes all common event props including KeyEvent and MouseEvent specific props - jQuery.each( { - altKey: true, - bubbles: true, - cancelable: true, - changedTouches: true, - ctrlKey: true, - detail: true, - eventPhase: true, - metaKey: true, - pageX: true, - pageY: true, - shiftKey: true, - view: true, - "char": true, - code: true, - charCode: true, - key: true, - keyCode: true, - button: true, - buttons: true, - clientX: true, - clientY: true, - offsetX: true, - offsetY: true, - pointerId: true, - pointerType: true, - screenX: true, - screenY: true, - targetTouches: true, - toElement: true, - touches: true, - which: true - }, jQuery.event.addProp ); - - jQuery.each( { - focus: "focusin", - blur: "focusout" - }, function ( type, delegateType ) { - jQuery.event.special[ type ] = { - - // Utilize native event if possible so blur/focus sequence is correct - setup: function () { - - // Claim the first handler - // dataPriv.set( this, "focus", ... ) - // dataPriv.set( this, "blur", ... ) - leverageNative( this, type, expectSync ); - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function () { - - // Force setup before trigger - leverageNative( this, type ); - - // Return non-false to allow normal event-path propagation - return true; - }, - - // Suppress native focus or blur as it's already being fired - // in leverageNative. - _default: function () { - return true; - }, - - delegateType: delegateType - }; - } ); - - // Create mouseenter/leave events using mouseover/out and event-time checks - // so that event delegation works in jQuery. - // Do the same for pointerenter/pointerleave and pointerover/pointerout - // - // Support: Safari 7 only - // Safari sends mouseenter too often; see: - // https://bugs.chromium.org/p/chromium/issues/detail?id=470258 - // for the description of the bug (it existed in older Chrome versions as well). - jQuery.each( { - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" - }, function ( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function ( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mouseenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; - } ); - - jQuery.fn.extend( { - - on: function ( types, selector, data, fn ) { - return on( this, types, selector, data, fn ); - }, - one: function ( types, selector, data, fn ) { - return on( this, types, selector, data, fn, 1 ); - }, - off: function ( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? - handleObj.origType + "." + handleObj.namespace : - handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each( function () { - jQuery.event.remove( this, types, fn, selector ); - } ); - } - } ); - - - var - - // Support: IE <=10 - 11, Edge 12 - 13 only - // In IE/Edge using regex groups here causes severe slowdowns. - // See https://connect.microsoft.com/IE/feedback/details/1736512/ - rnoInnerhtml = /\s*$/g; - - // Prefer a tbody over its parent table for containing new rows - function manipulationTarget( elem, content ) { - if ( nodeName( elem, "table" ) && - nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { - - return jQuery( elem ).children( "tbody" )[ 0 ] || elem; - } - - return elem; - } - - // Replace/restore the type attribute of script elements for safe DOM manipulation - function disableScript( elem ) { - elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; - return elem; - } - - function restoreScript( elem ) { - if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { - elem.type = elem.type.slice( 5 ); - } else { - elem.removeAttribute( "type" ); - } - - return elem; - } - - function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( dataPriv.hasData( src ) ) { - pdataOld = dataPriv.get( src ); - events = pdataOld.events; - - if ( events ) { - dataPriv.remove( dest, "handle events" ); - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - } - - // 2. Copy user data - if ( dataUser.hasData( src ) ) { - udataOld = dataUser.access( src ); - udataCur = jQuery.extend( {}, udataOld ); - - dataUser.set( dest, udataCur ); - } - } - - // Fix IE bugs, see support tests - function fixInput( src, dest ) { - var nodeName = dest.nodeName.toLowerCase(); - - // Fails to persist the checked state of a cloned checkbox or radio button. - if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - dest.checked = src.checked; - - // Fails to return the selected option to the default selected state when cloning options - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } - } - - function domManip( collection, args, callback, ignored ) { - - // Flatten any nested arrays - args = flat( args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = collection.length, - iNoClone = l - 1, - value = args[ 0 ], - valueIsFunction = isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( valueIsFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return collection.each( function ( index ) { - var self = collection.eq( index ); - if ( valueIsFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - domManip( self, args, callback, ignored ); - } ); - } - - if ( l ) { - fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - // Require either new content or an interest in ignored elements to invoke the callback - if ( first || ignored ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item - // instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( collection[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !dataPriv.access( node, "globalEval" ) && - jQuery.contains( doc, node ) ) { - - if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { - - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl && !node.noModule ) { - jQuery._evalUrl( node.src, { - nonce: node.nonce || node.getAttribute( "nonce" ) - }, doc ); - } - } else { - DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); - } - } - } - } - } - } - - return collection; - } - - function remove( elem, selector, keepData ) { - var node, - nodes = selector ? jQuery.filter( selector, elem ) : elem, - i = 0; - - for ( ; - ( node = nodes[ i ] ) != null; i++ ) { - if ( !keepData && node.nodeType === 1 ) { - jQuery.cleanData( getAll( node ) ); - } - - if ( node.parentNode ) { - if ( keepData && isAttached( node ) ) { - setGlobalEval( getAll( node, "script" ) ); - } - node.parentNode.removeChild( node ); - } - } - - return elem; - } - - jQuery.extend( { - htmlPrefilter: function ( html ) { - return html; - }, - - clone: function ( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = isAttached( elem ); - - // Fix IE cloning issues - if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && - !jQuery.isXMLDoc( elem ) ) { - - // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - fixInput( srcElements[ i ], destElements[ i ] ); - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - cloneCopyEvent( srcElements[ i ], destElements[ i ] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - // Return the cloned set - return clone; - }, - - cleanData: function ( elems ) { - var data, elem, type, - special = jQuery.event.special, - i = 0; - - for ( ; - ( elem = elems[ i ] ) !== undefined; i++ ) { - if ( acceptData( elem ) ) { - if ( ( data = elem[ dataPriv.expando ] ) ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataPriv.expando ] = undefined; - } - if ( elem[ dataUser.expando ] ) { - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataUser.expando ] = undefined; - } - } - } - } - } ); - - jQuery.fn.extend( { - detach: function ( selector ) { - return remove( this, selector, true ); - }, - - remove: function ( selector ) { - return remove( this, selector ); - }, - - text: function ( value ) { - return access( this, function ( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().each( function () { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - this.textContent = value; - } - } ); - }, null, value, arguments.length ); - }, - - append: function () { - return domManip( this, arguments, function ( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - } ); - }, - - prepend: function () { - return domManip( this, arguments, function ( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - } ); - }, - - before: function () { - return domManip( this, arguments, function ( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - } ); - }, - - after: function () { - return domManip( this, arguments, function ( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - } ); - }, - - empty: function () { - var elem, - i = 0; - - for ( ; - ( elem = this[ i ] ) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ""; - } - } - - return this; - }, - - clone: function ( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map( function () { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - } ); - }, - - html: function ( value ) { - return access( this, function ( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined && elem.nodeType === 1 ) { - return elem.innerHTML; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - - value = jQuery.htmlPrefilter( value ); - - try { - for ( ; i < l; i++ ) { - elem = this[ i ] || {}; - - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch ( e ) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function () { - var ignored = []; - - // Make the changes, replacing each non-ignored context element with the new content - return domManip( this, arguments, function ( elem ) { - var parent = this.parentNode; - - if ( jQuery.inArray( this, ignored ) < 0 ) { - jQuery.cleanData( getAll( this ) ); - if ( parent ) { - parent.replaceChild( elem, this ); - } - } - - // Force callback invocation - }, ignored ); - } - } ); - - jQuery.each( { - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" - }, function ( name, original ) { - jQuery.fn[ name ] = function ( selector ) { - var elems, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1, - i = 0; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone( true ); - jQuery( insert[ i ] )[ original ]( elems ); - - // Support: Android <=4.0 only, PhantomJS 1 only - // .get() because push.apply(_, arraylike) throws on ancient WebKit - push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; - } ); - var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); - - var getStyles = function ( elem ) { - - // Support: IE <=11 only, Firefox <=30 (#15098, #14150) - // IE throws on elements created in popups - // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" - var view = elem.ownerDocument.defaultView; - - if ( !view || !view.opener ) { - view = window; - } - - return view.getComputedStyle( elem ); - }; - - var swap = function ( elem, options, callback ) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for ( name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - ret = callback.call( elem ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; - }; - - - var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); - - - - ( function () { - - // Executing both pixelPosition & boxSizingReliable tests require only one layout - // so they're executed at the same time to save the second computation. - function computeStyleTests() { - - // This is a singleton, we need to execute it only once - if ( !div ) { - return; - } - - container.style.cssText = "position:absolute;left:-11111px;width:60px;" + - "margin-top:1px;padding:0;border:0"; - div.style.cssText = - "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + - "margin:auto;border:1px;padding:1px;" + - "width:60%;top:1%"; - documentElement.appendChild( container ).appendChild( div ); - - var divStyle = window.getComputedStyle( div ); - pixelPositionVal = divStyle.top !== "1%"; - - // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 - reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; - - // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 - // Some styles come back with percentage values, even though they shouldn't - div.style.right = "60%"; - pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; - - // Support: IE 9 - 11 only - // Detect misreporting of content dimensions for box-sizing:border-box elements - boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; - - // Support: IE 9 only - // Detect overflow:scroll screwiness (gh-3699) - // Support: Chrome <=64 - // Don't get tricked when zoom affects offsetWidth (gh-4029) - div.style.position = "absolute"; - scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; - - documentElement.removeChild( container ); - - // Nullify the div so it wouldn't be stored in the memory and - // it will also be a sign that checks already performed - div = null; - } - - function roundPixelMeasures( measure ) { - return Math.round( parseFloat( measure ) ); - } - - var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, - reliableTrDimensionsVal, reliableMarginLeftVal, - container = document.createElement( "div" ), - div = document.createElement( "div" ); - - // Finish early in limited (non-browser) environments - if ( !div.style ) { - return; - } - - // Support: IE <=9 - 11 only - // Style of cloned element affects source element cloned (#8908) - div.style.backgroundClip = "content-box"; - div.cloneNode( true ).style.backgroundClip = ""; - support.clearCloneStyle = div.style.backgroundClip === "content-box"; - - jQuery.extend( support, { - boxSizingReliable: function () { - computeStyleTests(); - return boxSizingReliableVal; - }, - pixelBoxStyles: function () { - computeStyleTests(); - return pixelBoxStylesVal; - }, - pixelPosition: function () { - computeStyleTests(); - return pixelPositionVal; - }, - reliableMarginLeft: function () { - computeStyleTests(); - return reliableMarginLeftVal; - }, - scrollboxSize: function () { - computeStyleTests(); - return scrollboxSizeVal; - }, - - // Support: IE 9 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Behavior in IE 9 is more subtle than in newer versions & it passes - // some versions of this test; make sure not to make it pass there! - // - // Support: Firefox 70+ - // Only Firefox includes border widths - // in computed dimensions. (gh-4529) - reliableTrDimensions: function () { - var table, tr, trChild, trStyle; - if ( reliableTrDimensionsVal == null ) { - table = document.createElement( "table" ); - tr = document.createElement( "tr" ); - trChild = document.createElement( "div" ); - - table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate"; - tr.style.cssText = "border:1px solid"; - - // Support: Chrome 86+ - // Height set through cssText does not get applied. - // Computed height then comes back as 0. - tr.style.height = "1px"; - trChild.style.height = "9px"; - - // Support: Android 8 Chrome 86+ - // In our bodyBackground.html iframe, - // display for all div elements is set to "inline", - // which causes a problem only in Android 8 Chrome 86. - // Ensuring the div is display: block - // gets around this issue. - trChild.style.display = "block"; - - documentElement - .appendChild( table ) - .appendChild( tr ) - .appendChild( trChild ); - - trStyle = window.getComputedStyle( tr ); - reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) + - parseInt( trStyle.borderTopWidth, 10 ) + - parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight; - - documentElement.removeChild( table ); - } - return reliableTrDimensionsVal; - } - } ); - } )(); - - - function curCSS( elem, name, computed ) { - var width, minWidth, maxWidth, ret, - - // Support: Firefox 51+ - // Retrieving style before computed somehow - // fixes an issue with getting wrong values - // on detached elements - style = elem.style; - - computed = computed || getStyles( elem ); - - // getPropertyValue is needed for: - // .css('filter') (IE 9 only, #12537) - // .css('--customProperty) (#3144) - if ( computed ) { - ret = computed.getPropertyValue( name ) || computed[ name ]; - - if ( ret === "" && !isAttached( elem ) ) { - ret = jQuery.style( elem, name ); - } - - // A tribute to the "awesome hack by Dean Edwards" - // Android Browser returns percentage for some values, - // but width seems to be reliably pixels. - // This is against the CSSOM draft spec: - // https://drafts.csswg.org/cssom/#resolved-values - if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { - - // Remember the original values - width = style.width; - minWidth = style.minWidth; - maxWidth = style.maxWidth; - - // Put in the new values to get a computed value out - style.minWidth = style.maxWidth = style.width = ret; - ret = computed.width; - - // Revert the changed values - style.width = width; - style.minWidth = minWidth; - style.maxWidth = maxWidth; - } - } - - return ret !== undefined ? - - // Support: IE <=9 - 11 only - // IE returns zIndex value as an integer. - ret + "" : - ret; - } - - - function addGetHookIf( conditionFn, hookFn ) { - - // Define the hook, we'll check on the first run if it's really needed. - return { - get: function () { - if ( conditionFn() ) { - - // Hook not needed (or it's not possible to use it due - // to missing dependency), remove it. - delete this.get; - return; - } - - // Hook needed; redefine it so that the support test is not executed again. - return ( this.get = hookFn ).apply( this, arguments ); - } - }; - } - - - var cssPrefixes = [ "Webkit", "Moz", "ms" ], - emptyStyle = document.createElement( "div" ).style, - vendorProps = {}; - - // Return a vendor-prefixed property or undefined - function vendorPropName( name ) { - - // Check for vendor prefixed names - var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), - i = cssPrefixes.length; - - while ( i-- ) { - name = cssPrefixes[ i ] + capName; - if ( name in emptyStyle ) { - return name; - } - } - } - - // Return a potentially-mapped jQuery.cssProps or vendor prefixed property - function finalPropName( name ) { - var final = jQuery.cssProps[ name ] || vendorProps[ name ]; - - if ( final ) { - return final; - } - if ( name in emptyStyle ) { - return name; - } - return vendorProps[ name ] = vendorPropName( name ) || name; - } - - - var - - // Swappable if display is none or starts with table - // except "table", "table-cell", or "table-caption" - // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - rcustomProp = /^--/, - cssShow = { - position: "absolute", - visibility: "hidden", - display: "block" - }, - cssNormalTransform = { - letterSpacing: "0", - fontWeight: "400" - }; - - function setPositiveNumber( _elem, value, subtract ) { - - // Any relative (+/-) values have already been - // normalized at this point - var matches = rcssNum.exec( value ); - return matches ? - - // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : - value; - } - - function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { - var i = dimension === "width" ? 1 : 0, - extra = 0, - delta = 0; - - // Adjustment may not be necessary - if ( box === ( isBorderBox ? "border" : "content" ) ) { - return 0; - } - - for ( ; i < 4; i += 2 ) { - - // Both box models exclude margin - if ( box === "margin" ) { - delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); - } - - // If we get here with a content-box, we're seeking "padding" or "border" or "margin" - if ( !isBorderBox ) { - - // Add padding - delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - - // For "border" or "margin", add border - if ( box !== "padding" ) { - delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - - // But still keep track of it otherwise - } else { - extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - - // If we get here with a border-box (content + padding + border), we're seeking "content" or - // "padding" or "margin" - } else { - - // For "content", subtract padding - if ( box === "content" ) { - delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } - - // For "content" or "padding", subtract border - if ( box !== "margin" ) { - delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } - } - - // Account for positive content-box scroll gutter when requested by providing computedVal - if ( !isBorderBox && computedVal >= 0 ) { - - // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border - // Assuming integer scroll gutter, subtract the rest and round down - delta += Math.max( 0, Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - computedVal - - delta - - extra - - 0.5 - - // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter - // Use an explicit zero to avoid NaN (gh-3964) - ) ) || 0; - } - - return delta; - } - - function getWidthOrHeight( elem, dimension, extra ) { - - // Start with computed style - var styles = getStyles( elem ), - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). - // Fake content-box until we know it's needed to know the true value. - boxSizingNeeded = !support.boxSizingReliable() || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - valueIsBorderBox = isBorderBox, - - val = curCSS( elem, dimension, styles ), - offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); - - // Support: Firefox <=54 - // Return a confounding non-pixel value or feign ignorance, as appropriate. - if ( rnumnonpx.test( val ) ) { - if ( !extra ) { - return val; - } - val = "auto"; - } - - - // Support: IE 9 - 11 only - // Use offsetWidth/offsetHeight for when box sizing is unreliable. - // In those cases, the computed value can be trusted to be border-box. - if ( ( !support.boxSizingReliable() && isBorderBox || - - // Support: IE 10 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Interestingly, in some cases IE 9 doesn't suffer from this issue. - !support.reliableTrDimensions() && nodeName( elem, "tr" ) || - - // Fall back to offsetWidth/offsetHeight when value is "auto" - // This happens for inline elements with no explicit setting (gh-3571) - val === "auto" || - - // Support: Android <=4.1 - 4.3 only - // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) - !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && - - // Make sure the element is visible & connected - elem.getClientRects().length ) { - - isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; - - // Where available, offsetWidth/offsetHeight approximate border box dimensions. - // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the - // retrieved value as a content box dimension. - valueIsBorderBox = offsetProp in elem; - if ( valueIsBorderBox ) { - val = elem[ offsetProp ]; - } - } - - // Normalize "" and auto - val = parseFloat( val ) || 0; - - // Adjust for the element's box model - return ( val + - boxModelAdjustment( - elem, - dimension, - extra || ( isBorderBox ? "border" : "content" ), - valueIsBorderBox, - styles, - - // Provide the current computed size to request scroll gutter calculation (gh-3589) - val - ) - ) + "px"; - } - - jQuery.extend( { - - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: { - opacity: { - get: function ( elem, computed ) { - if ( computed ) { - - // We should always get a number back from opacity - var ret = curCSS( elem, "opacity" ); - return ret === "" ? "1" : ret; - } - } - } - }, - - // Don't automatically add "px" to these possibly-unitless properties - cssNumber: { - "animationIterationCount": true, - "columnCount": true, - "fillOpacity": true, - "flexGrow": true, - "flexShrink": true, - "fontWeight": true, - "gridArea": true, - "gridColumn": true, - "gridColumnEnd": true, - "gridColumnStart": true, - "gridRow": true, - "gridRowEnd": true, - "gridRowStart": true, - "lineHeight": true, - "opacity": true, - "order": true, - "orphans": true, - "widows": true, - "zIndex": true, - "zoom": true - }, - - // Add in properties whose names you wish to fix before - // setting or getting the value - cssProps: {}, - - // Get and set the style property on a DOM Node - style: function ( elem, name, value, extra ) { - - // Don't set styles on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { - return; - } - - // Make sure that we're working with the right name - var ret, type, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ), - style = elem.style; - - // Make sure that we're working with the right name. We don't - // want to query the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Gets hook for the prefixed version, then unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // Check if we're setting a value - if ( value !== undefined ) { - type = typeof value; - - // Convert "+=" or "-=" to relative numbers (#7345) - if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { - value = adjustCSS( elem, name, ret ); - - // Fixes bug #9237 - type = "number"; - } - - // Make sure that null and NaN values aren't set (#7116) - if ( value == null || value !== value ) { - return; - } - - // If a number was passed in, add the unit (except for certain CSS properties) - // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append - // "px" to a few hardcoded values. - if ( type === "number" && !isCustomProp ) { - value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); - } - - // background-* props affect original clone's values - if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { - style[ name ] = "inherit"; - } - - // If a hook was provided, use that value, otherwise just set the specified value - if ( !hooks || !( "set" in hooks ) || - ( value = hooks.set( elem, value, extra ) ) !== undefined ) { - - if ( isCustomProp ) { - style.setProperty( name, value ); - } else { - style[ name ] = value; - } - } - - } else { - - // If a hook was provided get the non-computed value from there - if ( hooks && "get" in hooks && - ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { - - return ret; - } - - // Otherwise just get the value from the style object - return style[ name ]; - } - }, - - css: function ( elem, name, extra, styles ) { - var val, num, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ); - - // Make sure that we're working with the right name. We don't - // want to modify the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Try prefixed name followed by the unprefixed name - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // If a hook was provided get the computed value from there - if ( hooks && "get" in hooks ) { - val = hooks.get( elem, true, extra ); - } - - // Otherwise, if a way to get the computed value exists, use that - if ( val === undefined ) { - val = curCSS( elem, name, styles ); - } - - // Convert "normal" to computed value - if ( val === "normal" && name in cssNormalTransform ) { - val = cssNormalTransform[ name ]; - } - - // Make numeric if forced or a qualifier was provided and val looks numeric - if ( extra === "" || extra ) { - num = parseFloat( val ); - return extra === true || isFinite( num ) ? num || 0 : val; - } - - return val; - } - } ); - - jQuery.each( [ "height", "width" ], function ( _i, dimension ) { - jQuery.cssHooks[ dimension ] = { - get: function ( elem, computed, extra ) { - if ( computed ) { - - // Certain elements can have dimension info if we invisibly show them - // but it must have a current display style that would benefit - return rdisplayswap.test( jQuery.css( elem, "display" ) ) && - - // Support: Safari 8+ - // Table columns in Safari have non-zero offsetWidth & zero - // getBoundingClientRect().width unless display is changed. - // Support: IE <=11 only - // Running getBoundingClientRect on a disconnected node - // in IE throws an error. - ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? - swap( elem, cssShow, function () { - return getWidthOrHeight( elem, dimension, extra ); - } ) : - getWidthOrHeight( elem, dimension, extra ); - } - }, - - set: function ( elem, value, extra ) { - var matches, - styles = getStyles( elem ), - - // Only read styles.position if the test has a chance to fail - // to avoid forcing a reflow. - scrollboxSizeBuggy = !support.scrollboxSize() && - styles.position === "absolute", - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) - boxSizingNeeded = scrollboxSizeBuggy || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - subtract = extra ? - boxModelAdjustment( - elem, - dimension, - extra, - isBorderBox, - styles - ) : - 0; - - // Account for unreliable border-box dimensions by comparing offset* to computed and - // faking a content-box to get border and padding (gh-3699) - if ( isBorderBox && scrollboxSizeBuggy ) { - subtract -= Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - parseFloat( styles[ dimension ] ) - - boxModelAdjustment( elem, dimension, "border", false, styles ) - - 0.5 - ); - } - - // Convert to pixels if value adjustment is needed - if ( subtract && ( matches = rcssNum.exec( value ) ) && - ( matches[ 3 ] || "px" ) !== "px" ) { - - elem.style[ dimension ] = value; - value = jQuery.css( elem, dimension ); - } - - return setPositiveNumber( elem, value, subtract ); - } - }; - } ); - - jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, - function ( elem, computed ) { - if ( computed ) { - return ( parseFloat( curCSS( elem, "marginLeft" ) ) || - elem.getBoundingClientRect().left - - swap( elem, { - marginLeft: 0 - }, function () { - return elem.getBoundingClientRect().left; - } ) - ) + "px"; - } - } - ); - - // These hooks are used by animate to expand properties - jQuery.each( { - margin: "", - padding: "", - border: "Width" - }, function ( prefix, suffix ) { - jQuery.cssHooks[ prefix + suffix ] = { - expand: function ( value ) { - var i = 0, - expanded = {}, - - // Assumes a single number if not a string - parts = typeof value === "string" ? value.split( " " ) : [ value ]; - - for ( ; i < 4; i++ ) { - expanded[ prefix + cssExpand[ i ] + suffix ] = - parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; - } - - return expanded; - } - }; - - if ( prefix !== "margin" ) { - jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; - } - } ); - - jQuery.fn.extend( { - css: function ( name, value ) { - return access( this, function ( elem, name, value ) { - var styles, len, - map = {}, - i = 0; - - if ( Array.isArray( name ) ) { - styles = getStyles( elem ); - len = name.length; - - for ( ; i < len; i++ ) { - map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); - } - - return map; - } - - return value !== undefined ? - jQuery.style( elem, name, value ) : - jQuery.css( elem, name ); - }, name, value, arguments.length > 1 ); - } - } ); - - - function Tween( elem, options, prop, end, easing ) { - return new Tween.prototype.init( elem, options, prop, end, easing ); - } - jQuery.Tween = Tween; - - Tween.prototype = { - constructor: Tween, - init: function ( elem, options, prop, end, easing, unit ) { - this.elem = elem; - this.prop = prop; - this.easing = easing || jQuery.easing._default; - this.options = options; - this.start = this.now = this.cur(); - this.end = end; - this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); - }, - cur: function () { - var hooks = Tween.propHooks[ this.prop ]; - - return hooks && hooks.get ? - hooks.get( this ) : - Tween.propHooks._default.get( this ); - }, - run: function ( percent ) { - var eased, - hooks = Tween.propHooks[ this.prop ]; - - if ( this.options.duration ) { - this.pos = eased = jQuery.easing[ this.easing ]( - percent, this.options.duration * percent, 0, 1, this.options.duration - ); - } else { - this.pos = eased = percent; - } - this.now = ( this.end - this.start ) * eased + this.start; - - if ( this.options.step ) { - this.options.step.call( this.elem, this.now, this ); - } - - if ( hooks && hooks.set ) { - hooks.set( this ); - } else { - Tween.propHooks._default.set( this ); - } - return this; - } - }; - - Tween.prototype.init.prototype = Tween.prototype; - - Tween.propHooks = { - _default: { - get: function ( tween ) { - var result; - - // Use a property on the element directly when it is not a DOM element, - // or when there is no matching style property that exists. - if ( tween.elem.nodeType !== 1 || - tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { - return tween.elem[ tween.prop ]; - } - - // Passing an empty string as a 3rd parameter to .css will automatically - // attempt a parseFloat and fallback to a string if the parse fails. - // Simple values such as "10px" are parsed to Float; - // complex values such as "rotate(1rad)" are returned as-is. - result = jQuery.css( tween.elem, tween.prop, "" ); - - // Empty strings, null, undefined and "auto" are converted to 0. - return !result || result === "auto" ? 0 : result; - }, - set: function ( tween ) { - - // Use step hook for back compat. - // Use cssHook if its there. - // Use .style if available and use plain properties where available. - if ( jQuery.fx.step[ tween.prop ] ) { - jQuery.fx.step[ tween.prop ]( tween ); - } else if ( tween.elem.nodeType === 1 && ( - jQuery.cssHooks[ tween.prop ] || - tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { - jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); - } else { - tween.elem[ tween.prop ] = tween.now; - } - } - } - }; - - // Support: IE <=9 only - // Panic based approach to setting things on disconnected nodes - Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { - set: function ( tween ) { - if ( tween.elem.nodeType && tween.elem.parentNode ) { - tween.elem[ tween.prop ] = tween.now; - } - } - }; - - jQuery.easing = { - linear: function ( p ) { - return p; - }, - swing: function ( p ) { - return 0.5 - Math.cos( p * Math.PI ) / 2; - }, - _default: "swing" - }; - - jQuery.fx = Tween.prototype.init; - - // Back compat <1.8 extension point - jQuery.fx.step = {}; - - - - - var - fxNow, inProgress, - rfxtypes = /^(?:toggle|show|hide)$/, - rrun = /queueHooks$/; - - function schedule() { - if ( inProgress ) { - if ( document.hidden === false && window.requestAnimationFrame ) { - window.requestAnimationFrame( schedule ); - } else { - window.setTimeout( schedule, jQuery.fx.interval ); - } - - jQuery.fx.tick(); - } - } - - // Animations created synchronously will run synchronously - function createFxNow() { - window.setTimeout( function () { - fxNow = undefined; - } ); - return ( fxNow = Date.now() ); - } - - // Generate parameters to create a standard animation - function genFx( type, includeWidth ) { - var which, - i = 0, - attrs = { - height: type - }; - - // If we include width, step value is 1 to do all cssExpand values, - // otherwise step value is 2 to skip over Left and Right - includeWidth = includeWidth ? 1 : 0; - for ( ; i < 4; i += 2 - includeWidth ) { - which = cssExpand[ i ]; - attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; - } - - if ( includeWidth ) { - attrs.opacity = attrs.width = type; - } - - return attrs; - } - - function createTween( value, prop, animation ) { - var tween, - collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), - index = 0, - length = collection.length; - for ( ; index < length; index++ ) { - if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { - - // We're done with this property - return tween; - } - } - } - - function defaultPrefilter( elem, props, opts ) { - var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, - isBox = "width" in props || "height" in props, - anim = this, - orig = {}, - style = elem.style, - hidden = elem.nodeType && isHiddenWithinTree( elem ), - dataShow = dataPriv.get( elem, "fxshow" ); - - // Queue-skipping animations hijack the fx hooks - if ( !opts.queue ) { - hooks = jQuery._queueHooks( elem, "fx" ); - if ( hooks.unqueued == null ) { - hooks.unqueued = 0; - oldfire = hooks.empty.fire; - hooks.empty.fire = function () { - if ( !hooks.unqueued ) { - oldfire(); - } - }; - } - hooks.unqueued++; - - anim.always( function () { - - // Ensure the complete handler is called before this completes - anim.always( function () { - hooks.unqueued--; - if ( !jQuery.queue( elem, "fx" ).length ) { - hooks.empty.fire(); - } - } ); - } ); - } - - // Detect show/hide animations - for ( prop in props ) { - value = props[ prop ]; - if ( rfxtypes.test( value ) ) { - delete props[ prop ]; - toggle = toggle || value === "toggle"; - if ( value === ( hidden ? "hide" : "show" ) ) { - - // Pretend to be hidden if this is a "show" and - // there is still data from a stopped show/hide - if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { - hidden = true; - - // Ignore all other no-op show/hide data - } else { - continue; - } - } - orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); - } - } - - // Bail out if this is a no-op like .hide().hide() - propTween = !jQuery.isEmptyObject( props ); - if ( !propTween && jQuery.isEmptyObject( orig ) ) { - return; - } - - // Restrict "overflow" and "display" styles during box animations - if ( isBox && elem.nodeType === 1 ) { - - // Support: IE <=9 - 11, Edge 12 - 15 - // Record all 3 overflow attributes because IE does not infer the shorthand - // from identically-valued overflowX and overflowY and Edge just mirrors - // the overflowX value there. - opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; - - // Identify a display type, preferring old show/hide data over the CSS cascade - restoreDisplay = dataShow && dataShow.display; - if ( restoreDisplay == null ) { - restoreDisplay = dataPriv.get( elem, "display" ); - } - display = jQuery.css( elem, "display" ); - if ( display === "none" ) { - if ( restoreDisplay ) { - display = restoreDisplay; - } else { - - // Get nonempty value(s) by temporarily forcing visibility - showHide( [ elem ], true ); - restoreDisplay = elem.style.display || restoreDisplay; - display = jQuery.css( elem, "display" ); - showHide( [ elem ] ); - } - } - - // Animate inline elements as inline-block - if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { - if ( jQuery.css( elem, "float" ) === "none" ) { - - // Restore the original display value at the end of pure show/hide animations - if ( !propTween ) { - anim.done( function () { - style.display = restoreDisplay; - } ); - if ( restoreDisplay == null ) { - display = style.display; - restoreDisplay = display === "none" ? "" : display; - } - } - style.display = "inline-block"; - } - } - } - - if ( opts.overflow ) { - style.overflow = "hidden"; - anim.always( function () { - style.overflow = opts.overflow[ 0 ]; - style.overflowX = opts.overflow[ 1 ]; - style.overflowY = opts.overflow[ 2 ]; - } ); - } - - // Implement show/hide animations - propTween = false; - for ( prop in orig ) { - - // General show/hide setup for this element animation - if ( !propTween ) { - if ( dataShow ) { - if ( "hidden" in dataShow ) { - hidden = dataShow.hidden; - } - } else { - dataShow = dataPriv.access( elem, "fxshow", { - display: restoreDisplay - } ); - } - - // Store hidden/visible for toggle so `.stop().toggle()` "reverses" - if ( toggle ) { - dataShow.hidden = !hidden; - } - - // Show elements before animating them - if ( hidden ) { - showHide( [ elem ], true ); - } - - /* eslint-disable no-loop-func */ - - anim.done( function () { - - /* eslint-enable no-loop-func */ - - // The final step of a "hide" animation is actually hiding the element - if ( !hidden ) { - showHide( [ elem ] ); - } - dataPriv.remove( elem, "fxshow" ); - for ( prop in orig ) { - jQuery.style( elem, prop, orig[ prop ] ); - } - } ); - } - - // Per-property setup - propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); - if ( !( prop in dataShow ) ) { - dataShow[ prop ] = propTween.start; - if ( hidden ) { - propTween.end = propTween.start; - propTween.start = 0; - } - } - } - } - - function propFilter( props, specialEasing ) { - var index, name, easing, value, hooks; - - // camelCase, specialEasing and expand cssHook pass - for ( index in props ) { - name = camelCase( index ); - easing = specialEasing[ name ]; - value = props[ index ]; - if ( Array.isArray( value ) ) { - easing = value[ 1 ]; - value = props[ index ] = value[ 0 ]; - } - - if ( index !== name ) { - props[ name ] = value; - delete props[ index ]; - } - - hooks = jQuery.cssHooks[ name ]; - if ( hooks && "expand" in hooks ) { - value = hooks.expand( value ); - delete props[ name ]; - - // Not quite $.extend, this won't overwrite existing keys. - // Reusing 'index' because we have the correct "name" - for ( index in value ) { - if ( !( index in props ) ) { - props[ index ] = value[ index ]; - specialEasing[ index ] = easing; - } - } - } else { - specialEasing[ name ] = easing; - } - } - } - - function Animation( elem, properties, options ) { - var result, - stopped, - index = 0, - length = Animation.prefilters.length, - deferred = jQuery.Deferred().always( function () { - - // Don't match elem in the :animated selector - delete tick.elem; - } ), - tick = function () { - if ( stopped ) { - return false; - } - var currentTime = fxNow || createFxNow(), - remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), - - // Support: Android 2.3 only - // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) - temp = remaining / animation.duration || 0, - percent = 1 - temp, - index = 0, - length = animation.tweens.length; - - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( percent ); - } - - deferred.notifyWith( elem, [ animation, percent, remaining ] ); - - // If there's more to do, yield - if ( percent < 1 && length ) { - return remaining; - } - - // If this was an empty animation, synthesize a final progress notification - if ( !length ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - } - - // Resolve the animation and report its conclusion - deferred.resolveWith( elem, [ animation ] ); - return false; - }, - animation = deferred.promise( { - elem: elem, - props: jQuery.extend( {}, properties ), - opts: jQuery.extend( true, { - specialEasing: {}, - easing: jQuery.easing._default - }, options ), - originalProperties: properties, - originalOptions: options, - startTime: fxNow || createFxNow(), - duration: options.duration, - tweens: [], - createTween: function ( prop, end ) { - var tween = jQuery.Tween( elem, animation.opts, prop, end, - animation.opts.specialEasing[ prop ] || animation.opts.easing ); - animation.tweens.push( tween ); - return tween; - }, - stop: function ( gotoEnd ) { - var index = 0, - - // If we are going to the end, we want to run all the tweens - // otherwise we skip this part - length = gotoEnd ? animation.tweens.length : 0; - if ( stopped ) { - return this; - } - stopped = true; - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( 1 ); - } - - // Resolve when we played the last frame; otherwise, reject - if ( gotoEnd ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - deferred.resolveWith( elem, [ animation, gotoEnd ] ); - } else { - deferred.rejectWith( elem, [ animation, gotoEnd ] ); - } - return this; - } - } ), - props = animation.props; - - propFilter( props, animation.opts.specialEasing ); - - for ( ; index < length; index++ ) { - result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); - if ( result ) { - if ( isFunction( result.stop ) ) { - jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = - result.stop.bind( result ); - } - return result; - } - } - - jQuery.map( props, createTween, animation ); - - if ( isFunction( animation.opts.start ) ) { - animation.opts.start.call( elem, animation ); - } - - // Attach callbacks from options - animation - .progress( animation.opts.progress ) - .done( animation.opts.done, animation.opts.complete ) - .fail( animation.opts.fail ) - .always( animation.opts.always ); - - jQuery.fx.timer( - jQuery.extend( tick, { - elem: elem, - anim: animation, - queue: animation.opts.queue - } ) - ); - - return animation; - } - - jQuery.Animation = jQuery.extend( Animation, { - - tweeners: { - "*": [ function ( prop, value ) { - var tween = this.createTween( prop, value ); - adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); - return tween; - } ] - }, - - tweener: function ( props, callback ) { - if ( isFunction( props ) ) { - callback = props; - props = [ "*" ]; - } else { - props = props.match( rnothtmlwhite ); - } - - var prop, - index = 0, - length = props.length; - - for ( ; index < length; index++ ) { - prop = props[ index ]; - Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; - Animation.tweeners[ prop ].unshift( callback ); - } - }, - - prefilters: [ defaultPrefilter ], - - prefilter: function ( callback, prepend ) { - if ( prepend ) { - Animation.prefilters.unshift( callback ); - } else { - Animation.prefilters.push( callback ); - } - } - } ); - - jQuery.speed = function ( speed, easing, fn ) { - var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { - complete: fn || !fn && easing || - isFunction( speed ) && speed, - duration: speed, - easing: fn && easing || easing && !isFunction( easing ) && easing - }; - - // Go to the end state if fx are off - if ( jQuery.fx.off ) { - opt.duration = 0; - - } else { - if ( typeof opt.duration !== "number" ) { - if ( opt.duration in jQuery.fx.speeds ) { - opt.duration = jQuery.fx.speeds[ opt.duration ]; - - } else { - opt.duration = jQuery.fx.speeds._default; - } - } - } - - // Normalize opt.queue - true/undefined/null -> "fx" - if ( opt.queue == null || opt.queue === true ) { - opt.queue = "fx"; - } - - // Queueing - opt.old = opt.complete; - - opt.complete = function () { - if ( isFunction( opt.old ) ) { - opt.old.call( this ); - } - - if ( opt.queue ) { - jQuery.dequeue( this, opt.queue ); - } - }; - - return opt; - }; - - jQuery.fn.extend( { - fadeTo: function ( speed, to, easing, callback ) { - - // Show any hidden elements after setting opacity to 0 - return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() - - // Animate to the value specified - .end().animate( { - opacity: to - }, speed, easing, callback ); - }, - animate: function ( prop, speed, easing, callback ) { - var empty = jQuery.isEmptyObject( prop ), - optall = jQuery.speed( speed, easing, callback ), - doAnimation = function () { - - // Operate on a copy of prop so per-property easing won't be lost - var anim = Animation( this, jQuery.extend( {}, prop ), optall ); - - // Empty animations, or finishing resolves immediately - if ( empty || dataPriv.get( this, "finish" ) ) { - anim.stop( true ); - } - }; - - doAnimation.finish = doAnimation; - - return empty || optall.queue === false ? - this.each( doAnimation ) : - this.queue( optall.queue, doAnimation ); - }, - stop: function ( type, clearQueue, gotoEnd ) { - var stopQueue = function ( hooks ) { - var stop = hooks.stop; - delete hooks.stop; - stop( gotoEnd ); - }; - - if ( typeof type !== "string" ) { - gotoEnd = clearQueue; - clearQueue = type; - type = undefined; - } - if ( clearQueue ) { - this.queue( type || "fx", [] ); - } - - return this.each( function () { - var dequeue = true, - index = type != null && type + "queueHooks", - timers = jQuery.timers, - data = dataPriv.get( this ); - - if ( index ) { - if ( data[ index ] && data[ index ].stop ) { - stopQueue( data[ index ] ); - } - } else { - for ( index in data ) { - if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { - stopQueue( data[ index ] ); - } - } - } - - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && - ( type == null || timers[ index ].queue === type ) ) { - - timers[ index ].anim.stop( gotoEnd ); - dequeue = false; - timers.splice( index, 1 ); - } - } - - // Start the next in the queue if the last step wasn't forced. - // Timers currently will call their complete callbacks, which - // will dequeue but only if they were gotoEnd. - if ( dequeue || !gotoEnd ) { - jQuery.dequeue( this, type ); - } - } ); - }, - finish: function ( type ) { - if ( type !== false ) { - type = type || "fx"; - } - return this.each( function () { - var index, - data = dataPriv.get( this ), - queue = data[ type + "queue" ], - hooks = data[ type + "queueHooks" ], - timers = jQuery.timers, - length = queue ? queue.length : 0; - - // Enable finishing flag on private data - data.finish = true; - - // Empty the queue first - jQuery.queue( this, type, [] ); - - if ( hooks && hooks.stop ) { - hooks.stop.call( this, true ); - } - - // Look for any active animations, and finish them - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && timers[ index ].queue === type ) { - timers[ index ].anim.stop( true ); - timers.splice( index, 1 ); - } - } - - // Look for any animations in the old queue and finish them - for ( index = 0; index < length; index++ ) { - if ( queue[ index ] && queue[ index ].finish ) { - queue[ index ].finish.call( this ); - } - } - - // Turn off finishing flag - delete data.finish; - } ); - } - } ); - - jQuery.each( [ "toggle", "show", "hide" ], function ( _i, name ) { - var cssFn = jQuery.fn[ name ]; - jQuery.fn[ name ] = function ( speed, easing, callback ) { - return speed == null || typeof speed === "boolean" ? - cssFn.apply( this, arguments ) : - this.animate( genFx( name, true ), speed, easing, callback ); - }; - } ); - - // Generate shortcuts for custom animations - jQuery.each( { - slideDown: genFx( "show" ), - slideUp: genFx( "hide" ), - slideToggle: genFx( "toggle" ), - fadeIn: { - opacity: "show" - }, - fadeOut: { - opacity: "hide" - }, - fadeToggle: { - opacity: "toggle" - } - }, function ( name, props ) { - jQuery.fn[ name ] = function ( speed, easing, callback ) { - return this.animate( props, speed, easing, callback ); - }; - } ); - - jQuery.timers = []; - jQuery.fx.tick = function () { - var timer, - i = 0, - timers = jQuery.timers; - - fxNow = Date.now(); - - for ( ; i < timers.length; i++ ) { - timer = timers[ i ]; - - // Run the timer and safely remove it when done (allowing for external removal) - if ( !timer() && timers[ i ] === timer ) { - timers.splice( i--, 1 ); - } - } - - if ( !timers.length ) { - jQuery.fx.stop(); - } - fxNow = undefined; - }; - - jQuery.fx.timer = function ( timer ) { - jQuery.timers.push( timer ); - jQuery.fx.start(); - }; - - jQuery.fx.interval = 13; - jQuery.fx.start = function () { - if ( inProgress ) { - return; - } - - inProgress = true; - schedule(); - }; - - jQuery.fx.stop = function () { - inProgress = null; - }; - - jQuery.fx.speeds = { - slow: 600, - fast: 200, - - // Default speed - _default: 400 - }; - - - // Based off of the plugin by Clint Helfers, with permission. - // https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ - jQuery.fn.delay = function ( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function ( next, hooks ) { - var timeout = window.setTimeout( next, time ); - hooks.stop = function () { - window.clearTimeout( timeout ); - }; - } ); - }; - - - ( function () { - var input = document.createElement( "input" ), - select = document.createElement( "select" ), - opt = select.appendChild( document.createElement( "option" ) ); - - input.type = "checkbox"; - - // Support: Android <=4.3 only - // Default value for a checkbox should be "on" - support.checkOn = input.value !== ""; - - // Support: IE <=11 only - // Must access selectedIndex to make default options select - support.optSelected = opt.selected; - - // Support: IE <=11 only - // An input loses its value after becoming a radio - input = document.createElement( "input" ); - input.value = "t"; - input.type = "radio"; - support.radioValue = input.value === "t"; - } )(); - - - var boolHook, - attrHandle = jQuery.expr.attrHandle; - - jQuery.fn.extend( { - attr: function ( name, value ) { - return access( this, jQuery.attr, name, value, arguments.length > 1 ); - }, - - removeAttr: function ( name ) { - return this.each( function () { - jQuery.removeAttr( this, name ); - } ); - } - } ); - - jQuery.extend( { - attr: function ( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set attributes on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === "undefined" ) { - return jQuery.prop( elem, name, value ); - } - - // Attribute hooks are determined by the lowercase version - // Grab necessary hook if one is defined - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - hooks = jQuery.attrHooks[ name.toLowerCase() ] || - ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); - } - - if ( value !== undefined ) { - if ( value === null ) { - jQuery.removeAttr( elem, name ); - return; - } - - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - elem.setAttribute( name, value + "" ); - return value; - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - ret = jQuery.find.attr( elem, name ); - - // Non-existent attributes return null, we normalize to undefined - return ret == null ? undefined : ret; - }, - - attrHooks: { - type: { - set: function ( elem, value ) { - if ( !support.radioValue && value === "radio" && - nodeName( elem, "input" ) ) { - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - } - }, - - removeAttr: function ( elem, value ) { - var name, - i = 0, - - // Attribute names can contain non-HTML whitespace characters - // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 - attrNames = value && value.match( rnothtmlwhite ); - - if ( attrNames && elem.nodeType === 1 ) { - while ( ( name = attrNames[ i++ ] ) ) { - elem.removeAttribute( name ); - } - } - } - } ); - - // Hooks for boolean attributes - boolHook = { - set: function ( elem, value, name ) { - if ( value === false ) { - - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - elem.setAttribute( name, name ); - } - return name; - } - }; - - jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function ( _i, name ) { - var getter = attrHandle[ name ] || jQuery.find.attr; - - attrHandle[ name ] = function ( elem, name, isXML ) { - var ret, handle, - lowercaseName = name.toLowerCase(); - - if ( !isXML ) { - - // Avoid an infinite loop by temporarily removing this function from the getter - handle = attrHandle[ lowercaseName ]; - attrHandle[ lowercaseName ] = ret; - ret = getter( elem, name, isXML ) != null ? - lowercaseName : - null; - attrHandle[ lowercaseName ] = handle; - } - return ret; - }; - } ); - - - - - var rfocusable = /^(?:input|select|textarea|button)$/i, - rclickable = /^(?:a|area)$/i; - - jQuery.fn.extend( { - prop: function ( name, value ) { - return access( this, jQuery.prop, name, value, arguments.length > 1 ); - }, - - removeProp: function ( name ) { - return this.each( function () { - delete this[ jQuery.propFix[ name ] || name ]; - } ); - } - } ); - - jQuery.extend( { - prop: function ( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set properties on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - return ( elem[ name ] = value ); - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - return elem[ name ]; - }, - - propHooks: { - tabIndex: { - get: function ( elem ) { - - // Support: IE <=9 - 11 only - // elem.tabIndex doesn't always return the - // correct value when it hasn't been explicitly set - // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - // Use proper attribute retrieval(#12072) - var tabindex = jQuery.find.attr( elem, "tabindex" ); - - if ( tabindex ) { - return parseInt( tabindex, 10 ); - } - - if ( - rfocusable.test( elem.nodeName ) || - rclickable.test( elem.nodeName ) && - elem.href - ) { - return 0; - } - - return -1; - } - } - }, - - propFix: { - "for": "htmlFor", - "class": "className" - } - } ); - - // Support: IE <=11 only - // Accessing the selectedIndex property - // forces the browser to respect setting selected - // on the option - // The getter ensures a default option is selected - // when in an optgroup - // eslint rule "no-unused-expressions" is disabled for this code - // since it considers such accessions noop - if ( !support.optSelected ) { - jQuery.propHooks.selected = { - get: function ( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent && parent.parentNode ) { - parent.parentNode.selectedIndex; - } - return null; - }, - set: function ( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent ) { - parent.selectedIndex; - - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - } - }; - } - - jQuery.each( [ - "tabIndex", - "readOnly", - "maxLength", - "cellSpacing", - "cellPadding", - "rowSpan", - "colSpan", - "useMap", - "frameBorder", - "contentEditable" - ], function () { - jQuery.propFix[ this.toLowerCase() ] = this; - } ); - - - - - // Strip and collapse whitespace according to HTML spec - // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace - function stripAndCollapse( value ) { - var tokens = value.match( rnothtmlwhite ) || []; - return tokens.join( " " ); - } - - - function getClass( elem ) { - return elem.getAttribute && elem.getAttribute( "class" ) || ""; - } - - function classesToArray( value ) { - if ( Array.isArray( value ) ) { - return value; - } - if ( typeof value === "string" ) { - return value.match( rnothtmlwhite ) || []; - } - return []; - } - - jQuery.fn.extend( { - addClass: function ( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function ( j ) { - jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - if ( cur.indexOf( " " + clazz + " " ) < 0 ) { - cur += clazz + " "; - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - removeClass: function ( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function ( j ) { - jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( !arguments.length ) { - return this.attr( "class", "" ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - - // This expression is here for better compressibility (see addClass) - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - - // Remove *all* instances - while ( cur.indexOf( " " + clazz + " " ) > -1 ) { - cur = cur.replace( " " + clazz + " ", " " ); - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - toggleClass: function ( value, stateVal ) { - var type = typeof value, - isValidValue = type === "string" || Array.isArray( value ); - - if ( typeof stateVal === "boolean" && isValidValue ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - - if ( isFunction( value ) ) { - return this.each( function ( i ) { - jQuery( this ).toggleClass( - value.call( this, i, getClass( this ), stateVal ), - stateVal - ); - } ); - } - - return this.each( function () { - var className, i, self, classNames; - - if ( isValidValue ) { - - // Toggle individual class names - i = 0; - self = jQuery( this ); - classNames = classesToArray( value ); - - while ( ( className = classNames[ i++ ] ) ) { - - // Check each className given, space separated list - if ( self.hasClass( className ) ) { - self.removeClass( className ); - } else { - self.addClass( className ); - } - } - - // Toggle whole class name - } else if ( value === undefined || type === "boolean" ) { - className = getClass( this ); - if ( className ) { - - // Store className if set - dataPriv.set( this, "__className__", className ); - } - - // If the element has a class name or if we're passed `false`, - // then remove the whole classname (if there was one, the above saved it). - // Otherwise bring back whatever was previously saved (if anything), - // falling back to the empty string if nothing was stored. - if ( this.setAttribute ) { - this.setAttribute( "class", - className || value === false ? - "" : - dataPriv.get( this, "__className__" ) || "" - ); - } - } - } ); - }, - - hasClass: function ( selector ) { - var className, elem, - i = 0; - - className = " " + selector + " "; - while ( ( elem = this[ i++ ] ) ) { - if ( elem.nodeType === 1 && - ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { - return true; - } - } - - return false; - } - } ); - - - - - var rreturn = /\r/g; - - jQuery.fn.extend( { - val: function ( value ) { - var hooks, ret, valueIsFunction, - elem = this[ 0 ]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.type ] || - jQuery.valHooks[ elem.nodeName.toLowerCase() ]; - - if ( hooks && - "get" in hooks && - ( ret = hooks.get( elem, "value" ) ) !== undefined - ) { - return ret; - } - - ret = elem.value; - - // Handle most common string cases - if ( typeof ret === "string" ) { - return ret.replace( rreturn, "" ); - } - - // Handle cases where value is null/undef or number - return ret == null ? "" : ret; - } - - return; - } - - valueIsFunction = isFunction( value ); - - return this.each( function ( i ) { - var val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( valueIsFunction ) { - val = value.call( this, i, jQuery( this ).val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - - } else if ( typeof val === "number" ) { - val += ""; - - } else if ( Array.isArray( val ) ) { - val = jQuery.map( val, function ( value ) { - return value == null ? "" : value + ""; - } ); - } - - hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - } ); - } - } ); - - jQuery.extend( { - valHooks: { - option: { - get: function ( elem ) { - - var val = jQuery.find.attr( elem, "value" ); - return val != null ? - val : - - // Support: IE <=10 - 11 only - // option.text throws exceptions (#14686, #14858) - // Strip and collapse whitespace - // https://html.spec.whatwg.org/#strip-and-collapse-whitespace - stripAndCollapse( jQuery.text( elem ) ); - } - }, - select: { - get: function ( elem ) { - var value, option, i, - options = elem.options, - index = elem.selectedIndex, - one = elem.type === "select-one", - values = one ? null : [], - max = one ? index + 1 : options.length; - - if ( index < 0 ) { - i = max; - - } else { - i = one ? index : 0; - } - - // Loop through all the selected options - for ( ; i < max; i++ ) { - option = options[ i ]; - - // Support: IE <=9 only - // IE8-9 doesn't update selected after form reset (#2551) - if ( ( option.selected || i === index ) && - - // Don't return options that are disabled or in a disabled optgroup - !option.disabled && - ( !option.parentNode.disabled || - !nodeName( option.parentNode, "optgroup" ) ) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - }, - - set: function ( elem, value ) { - var optionSet, option, - options = elem.options, - values = jQuery.makeArray( value ), - i = options.length; - - while ( i-- ) { - option = options[ i ]; - - /* eslint-disable no-cond-assign */ - - if ( option.selected = - jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 - ) { - optionSet = true; - } - - /* eslint-enable no-cond-assign */ - } - - // Force browsers to behave consistently when non-matching value is set - if ( !optionSet ) { - elem.selectedIndex = -1; - } - return values; - } - } - } - } ); - - // Radios and checkboxes getter/setter - jQuery.each( [ "radio", "checkbox" ], function () { - jQuery.valHooks[ this ] = { - set: function ( elem, value ) { - if ( Array.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); - } - } - }; - if ( !support.checkOn ) { - jQuery.valHooks[ this ].get = function ( elem ) { - return elem.getAttribute( "value" ) === null ? "on" : elem.value; - }; - } - } ); - - - - - // Return jQuery for attributes-only inclusion - - - support.focusin = "onfocusin" in window; - - - var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - stopPropagationCallback = function ( e ) { - e.stopPropagation(); - }; - - jQuery.extend( jQuery.event, { - - trigger: function ( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; - - cur = lastElement = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf( "." ) > -1 ) { - - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split( "." ); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf( ":" ) < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join( "." ); - event.rnamespace = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === ( elem.ownerDocument || document ) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { - lastElement = cur; - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] && - dataPriv.get( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && handle.apply && acceptData( cur ) ) { - event.result = handle.apply( cur, data ); - if ( event.result === false ) { - event.preventDefault(); - } - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( ( !special._default || - special._default.apply( eventPath.pop(), data ) === false ) && - acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name as the event. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - - if ( event.isPropagationStopped() ) { - lastElement.addEventListener( type, stopPropagationCallback ); - } - - elem[ type ](); - - if ( event.isPropagationStopped() ) { - lastElement.removeEventListener( type, stopPropagationCallback ); - } - - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - // Piggyback on a donor event to simulate a different one - // Used only for `focus(in | out)` events - simulate: function ( type, elem, event ) { - var e = jQuery.extend( - new jQuery.Event(), - event, { - type: type, - isSimulated: true - } - ); - - jQuery.event.trigger( e, null, elem ); - } - - } ); - - jQuery.fn.extend( { - - trigger: function ( type, data ) { - return this.each( function () { - jQuery.event.trigger( type, data, this ); - } ); - }, - triggerHandler: function ( type, data ) { - var elem = this[ 0 ]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } - } ); - - - // Support: Firefox <=44 - // Firefox doesn't have focus(in | out) events - // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 - // - // Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 - // focus(in | out) events fire after focus & blur events, - // which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order - // Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 - if ( !support.focusin ) { - jQuery.each( { - focus: "focusin", - blur: "focusout" - }, function ( orig, fix ) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function ( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); - }; - - jQuery.event.special[ fix ] = { - setup: function () { - - // Handle: regular nodes (via `this.ownerDocument`), window - // (via `this.document`) & document (via `this`). - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ); - - if ( !attaches ) { - doc.addEventListener( orig, handler, true ); - } - dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); - }, - teardown: function () { - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ) - 1; - - if ( !attaches ) { - doc.removeEventListener( orig, handler, true ); - dataPriv.remove( doc, fix ); - - } else { - dataPriv.access( doc, fix, attaches ); - } - } - }; - } ); - } - var location = window.location; - - var nonce = { - guid: Date.now() - }; - - var rquery = ( /\?/ ); - - - - // Cross-browser xml parsing - jQuery.parseXML = function ( data ) { - var xml, parserErrorElem; - if ( !data || typeof data !== "string" ) { - return null; - } - - // Support: IE 9 - 11 only - // IE throws on parseFromString with invalid input. - try { - xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); - } catch ( e ) {} - - parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ]; - if ( !xml || parserErrorElem ) { - jQuery.error( "Invalid XML: " + ( - parserErrorElem ? - jQuery.map( parserErrorElem.childNodes, function ( el ) { - return el.textContent; - } ).join( "\n" ) : - data - ) ); - } - return xml; - }; - - - var - rbracket = /\[\]$/, - rCRLF = /\r?\n/g, - rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, - rsubmittable = /^(?:input|select|textarea|keygen)/i; - - function buildParams( prefix, obj, traditional, add ) { - var name; - - if ( Array.isArray( obj ) ) { - - // Serialize array item. - jQuery.each( obj, function ( i, v ) { - if ( traditional || rbracket.test( prefix ) ) { - - // Treat each array item as a scalar. - add( prefix, v ); - - } else { - - // Item is non-scalar (array or object), encode its numeric index. - buildParams( - prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", - v, - traditional, - add - ); - } - } ); - - } else if ( !traditional && toType( obj ) === "object" ) { - - // Serialize object item. - for ( name in obj ) { - buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); - } - - } else { - - // Serialize scalar item. - add( prefix, obj ); - } - } - - // Serialize an array of form elements or a set of - // key/values into a query string - jQuery.param = function ( a, traditional ) { - var prefix, - s = [], - add = function ( key, valueOrFunction ) { - - // If value is a function, invoke it and use its return value - var value = isFunction( valueOrFunction ) ? - valueOrFunction() : - valueOrFunction; - - s[ s.length ] = encodeURIComponent( key ) + "=" + - encodeURIComponent( value == null ? "" : value ); - }; - - if ( a == null ) { - return ""; - } - - // If an array was passed in, assume that it is an array of form elements. - if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { - - // Serialize the form elements - jQuery.each( a, function () { - add( this.name, this.value ); - } ); - - } else { - - // If traditional, encode the "old" way (the way 1.3.2 or older - // did it), otherwise encode params recursively. - for ( prefix in a ) { - buildParams( prefix, a[ prefix ], traditional, add ); - } - } - - // Return the resulting serialization - return s.join( "&" ); - }; - - jQuery.fn.extend( { - serialize: function () { - return jQuery.param( this.serializeArray() ); - }, - serializeArray: function () { - return this.map( function () { - - // Can add propHook for "elements" to filter or add form elements - var elements = jQuery.prop( this, "elements" ); - return elements ? jQuery.makeArray( elements ) : this; - } ).filter( function () { - var type = this.type; - - // Use .is( ":disabled" ) so that fieldset[disabled] works - return this.name && !jQuery( this ).is( ":disabled" ) && - rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && - ( this.checked || !rcheckableType.test( type ) ); - } ).map( function ( _i, elem ) { - var val = jQuery( this ).val(); - - if ( val == null ) { - return null; - } - - if ( Array.isArray( val ) ) { - return jQuery.map( val, function ( val ) { - return { - name: elem.name, - value: val.replace( rCRLF, "\r\n" ) - }; - } ); - } - - return { - name: elem.name, - value: val.replace( rCRLF, "\r\n" ) - }; - } ).get(); - } - } ); - - - var - r20 = /%20/g, - rhash = /#.*$/, - rantiCache = /([?&])_=[^&]*/, - rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, - - // #7653, #8125, #8152: local protocol detection - rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, - rnoContent = /^(?:GET|HEAD)$/, - rprotocol = /^\/\//, - - /* Prefilters - * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) - * 2) These are called: - * - BEFORE asking for a transport - * - AFTER param serialization (s.data is a string if s.processData is true) - * 3) key is the dataType - * 4) the catchall symbol "*" can be used - * 5) execution will start with transport dataType and THEN continue down to "*" if needed - */ - prefilters = {}, - - /* Transports bindings - * 1) key is the dataType - * 2) the catchall symbol "*" can be used - * 3) selection will start with transport dataType and THEN go to "*" if needed - */ - transports = {}, - - // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression - allTypes = "*/".concat( "*" ), - - // Anchor tag for parsing the document origin - originAnchor = document.createElement( "a" ); - - originAnchor.href = location.href; - - // Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport - function addToPrefiltersOrTransports( structure ) { - - // dataTypeExpression is optional and defaults to "*" - return function ( dataTypeExpression, func ) { - - if ( typeof dataTypeExpression !== "string" ) { - func = dataTypeExpression; - dataTypeExpression = "*"; - } - - var dataType, - i = 0, - dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; - - if ( isFunction( func ) ) { - - // For each dataType in the dataTypeExpression - while ( ( dataType = dataTypes[ i++ ] ) ) { - - // Prepend if requested - if ( dataType[ 0 ] === "+" ) { - dataType = dataType.slice( 1 ) || "*"; - ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); - - // Otherwise append - } else { - ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); - } - } - } - }; - } - - // Base inspection function for prefilters and transports - function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { - - var inspected = {}, - seekingTransport = ( structure === transports ); - - function inspect( dataType ) { - var selected; - inspected[ dataType ] = true; - jQuery.each( structure[ dataType ] || [], function ( _, prefilterOrFactory ) { - var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); - if ( typeof dataTypeOrTransport === "string" && - !seekingTransport && !inspected[ dataTypeOrTransport ] ) { - - options.dataTypes.unshift( dataTypeOrTransport ); - inspect( dataTypeOrTransport ); - return false; - } else if ( seekingTransport ) { - return !( selected = dataTypeOrTransport ); - } - } ); - return selected; - } - - return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); - } - - // A special extend for ajax options - // that takes "flat" options (not to be deep extended) - // Fixes #9887 - function ajaxExtend( target, src ) { - var key, deep, - flatOptions = jQuery.ajaxSettings.flatOptions || {}; - - for ( key in src ) { - if ( src[ key ] !== undefined ) { - ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; - } - } - if ( deep ) { - jQuery.extend( true, target, deep ); - } - - return target; - } - - /* Handles responses to an ajax request: - * - finds the right dataType (mediates between content-type and expected dataType) - * - returns the corresponding response - */ - function ajaxHandleResponses( s, jqXHR, responses ) { - - var ct, type, finalDataType, firstDataType, - contents = s.contents, - dataTypes = s.dataTypes; - - // Remove auto dataType and get content-type in the process - while ( dataTypes[ 0 ] === "*" ) { - dataTypes.shift(); - if ( ct === undefined ) { - ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); - } - } - - // Check if we're dealing with a known content-type - if ( ct ) { - for ( type in contents ) { - if ( contents[ type ] && contents[ type ].test( ct ) ) { - dataTypes.unshift( type ); - break; - } - } - } - - // Check to see if we have a response for the expected dataType - if ( dataTypes[ 0 ] in responses ) { - finalDataType = dataTypes[ 0 ]; - } else { - - // Try convertible dataTypes - for ( type in responses ) { - if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { - finalDataType = type; - break; - } - if ( !firstDataType ) { - firstDataType = type; - } - } - - // Or just use first one - finalDataType = finalDataType || firstDataType; - } - - // If we found a dataType - // We add the dataType to the list if needed - // and return the corresponding response - if ( finalDataType ) { - if ( finalDataType !== dataTypes[ 0 ] ) { - dataTypes.unshift( finalDataType ); - } - return responses[ finalDataType ]; - } - } - - /* Chain conversions given the request and the original response - * Also sets the responseXXX fields on the jqXHR instance - */ - function ajaxConvert( s, response, jqXHR, isSuccess ) { - var conv2, current, conv, tmp, prev, - converters = {}, - - // Work with a copy of dataTypes in case we need to modify it for conversion - dataTypes = s.dataTypes.slice(); - - // Create converters map with lowercased keys - if ( dataTypes[ 1 ] ) { - for ( conv in s.converters ) { - converters[ conv.toLowerCase() ] = s.converters[ conv ]; - } - } - - current = dataTypes.shift(); - - // Convert to each sequential dataType - while ( current ) { - - if ( s.responseFields[ current ] ) { - jqXHR[ s.responseFields[ current ] ] = response; - } - - // Apply the dataFilter if provided - if ( !prev && isSuccess && s.dataFilter ) { - response = s.dataFilter( response, s.dataType ); - } - - prev = current; - current = dataTypes.shift(); - - if ( current ) { - - // There's only work to do if current dataType is non-auto - if ( current === "*" ) { - - current = prev; - - // Convert response if prev dataType is non-auto and differs from current - } else if ( prev !== "*" && prev !== current ) { - - // Seek a direct converter - conv = converters[ prev + " " + current ] || converters[ "* " + current ]; - - // If none found, seek a pair - if ( !conv ) { - for ( conv2 in converters ) { - - // If conv2 outputs current - tmp = conv2.split( " " ); - if ( tmp[ 1 ] === current ) { - - // If prev can be converted to accepted input - conv = converters[ prev + " " + tmp[ 0 ] ] || - converters[ "* " + tmp[ 0 ] ]; - if ( conv ) { - - // Condense equivalence converters - if ( conv === true ) { - conv = converters[ conv2 ]; - - // Otherwise, insert the intermediate dataType - } else if ( converters[ conv2 ] !== true ) { - current = tmp[ 0 ]; - dataTypes.unshift( tmp[ 1 ] ); - } - break; - } - } - } - } - - // Apply converter (if not an equivalence) - if ( conv !== true ) { - - // Unless errors are allowed to bubble, catch and return them - if ( conv && s.throws ) { - response = conv( response ); - } else { - try { - response = conv( response ); - } catch ( e ) { - return { - state: "parsererror", - error: conv ? e : "No conversion from " + prev + " to " + current - }; - } - } - } - } - } - } - - return { - state: "success", - data: response - }; - } - - jQuery.extend( { - - // Counter for holding the number of active queries - active: 0, - - // Last-Modified header cache for next request - lastModified: {}, - etag: {}, - - ajaxSettings: { - url: location.href, - type: "GET", - isLocal: rlocalProtocol.test( location.protocol ), - global: true, - processData: true, - async: true, - contentType: "application/x-www-form-urlencoded; charset=UTF-8", - - /* - timeout: 0, - data: null, - dataType: null, - username: null, - password: null, - cache: null, - throws: false, - traditional: false, - headers: {}, - */ - - accepts: { - "*": allTypes, - text: "text/plain", - html: "text/html", - xml: "application/xml, text/xml", - json: "application/json, text/javascript" - }, - - contents: { - xml: /\bxml\b/, - html: /\bhtml/, - json: /\bjson\b/ - }, - - responseFields: { - xml: "responseXML", - text: "responseText", - json: "responseJSON" - }, - - // Data converters - // Keys separate source (or catchall "*") and destination types with a single space - converters: { - - // Convert anything to text - "* text": String, - - // Text to html (true = no transformation) - "text html": true, - - // Evaluate text as a json expression - "text json": JSON.parse, - - // Parse text as xml - "text xml": jQuery.parseXML - }, - - // For options that shouldn't be deep extended: - // you can add your own custom options here if - // and when you create one that shouldn't be - // deep extended (see ajaxExtend) - flatOptions: { - url: true, - context: true - } - }, - - // Creates a full fledged settings object into target - // with both ajaxSettings and settings fields. - // If target is omitted, writes into ajaxSettings. - ajaxSetup: function ( target, settings ) { - return settings ? - - // Building a settings object - ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : - - // Extending ajaxSettings - ajaxExtend( jQuery.ajaxSettings, target ); - }, - - ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), - ajaxTransport: addToPrefiltersOrTransports( transports ), - - // Main method - ajax: function ( url, options ) { - - // If url is an object, simulate pre-1.5 signature - if ( typeof url === "object" ) { - options = url; - url = undefined; - } - - // Force options to be an object - options = options || {}; - - var transport, - - // URL without anti-cache param - cacheURL, - - // Response headers - responseHeadersString, - responseHeaders, - - // timeout handle - timeoutTimer, - - // Url cleanup var - urlAnchor, - - // Request state (becomes false upon send and true upon completion) - completed, - - // To know if global events are to be dispatched - fireGlobals, - - // Loop variable - i, - - // uncached part of the url - uncached, - - // Create the final options object - s = jQuery.ajaxSetup( {}, options ), - - // Callbacks context - callbackContext = s.context || s, - - // Context for global events is callbackContext if it is a DOM node or jQuery collection - globalEventContext = s.context && - ( callbackContext.nodeType || callbackContext.jquery ) ? - jQuery( callbackContext ) : - jQuery.event, - - // Deferreds - deferred = jQuery.Deferred(), - completeDeferred = jQuery.Callbacks( "once memory" ), - - // Status-dependent callbacks - statusCode = s.statusCode || {}, - - // Headers (they are sent all at once) - requestHeaders = {}, - requestHeadersNames = {}, - - // Default abort message - strAbort = "canceled", - - // Fake xhr - jqXHR = { - readyState: 0, - - // Builds headers hashtable if needed - getResponseHeader: function ( key ) { - var match; - if ( completed ) { - if ( !responseHeaders ) { - responseHeaders = {}; - while ( ( match = rheaders.exec( responseHeadersString ) ) ) { - responseHeaders[ match[ 1 ].toLowerCase() + " " ] = - ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) - .concat( match[ 2 ] ); - } - } - match = responseHeaders[ key.toLowerCase() + " " ]; - } - return match == null ? null : match.join( ", " ); - }, - - // Raw string - getAllResponseHeaders: function () { - return completed ? responseHeadersString : null; - }, - - // Caches the header - setRequestHeader: function ( name, value ) { - if ( completed == null ) { - name = requestHeadersNames[ name.toLowerCase() ] = - requestHeadersNames[ name.toLowerCase() ] || name; - requestHeaders[ name ] = value; - } - return this; - }, - - // Overrides response content-type header - overrideMimeType: function ( type ) { - if ( completed == null ) { - s.mimeType = type; - } - return this; - }, - - // Status-dependent callbacks - statusCode: function ( map ) { - var code; - if ( map ) { - if ( completed ) { - - // Execute the appropriate callbacks - jqXHR.always( map[ jqXHR.status ] ); - } else { - - // Lazy-add the new callbacks in a way that preserves old ones - for ( code in map ) { - statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; - } - } - } - return this; - }, - - // Cancel the request - abort: function ( statusText ) { - var finalText = statusText || strAbort; - if ( transport ) { - transport.abort( finalText ); - } - done( 0, finalText ); - return this; - } - }; - - // Attach deferreds - deferred.promise( jqXHR ); - - // Add protocol if not provided (prefilters might expect it) - // Handle falsy url in the settings object (#10093: consistency with old signature) - // We also use the url parameter if available - s.url = ( ( url || s.url || location.href ) + "" ) - .replace( rprotocol, location.protocol + "//" ); - - // Alias method option to type as per ticket #12004 - s.type = options.method || options.type || s.method || s.type; - - // Extract dataTypes list - s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; - - // A cross-domain request is in order when the origin doesn't match the current origin. - if ( s.crossDomain == null ) { - urlAnchor = document.createElement( "a" ); - - // Support: IE <=8 - 11, Edge 12 - 15 - // IE throws exception on accessing the href property if url is malformed, - // e.g. http://example.com:80x/ - try { - urlAnchor.href = s.url; - - // Support: IE <=8 - 11 only - // Anchor's host property isn't correctly set when s.url is relative - urlAnchor.href = urlAnchor.href; - s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== - urlAnchor.protocol + "//" + urlAnchor.host; - } catch ( e ) { - - // If there is an error parsing the URL, assume it is crossDomain, - // it can be rejected by the transport if it is invalid - s.crossDomain = true; - } - } - - // Convert data if not already a string - if ( s.data && s.processData && typeof s.data !== "string" ) { - s.data = jQuery.param( s.data, s.traditional ); - } - - // Apply prefilters - inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); - - // If request was aborted inside a prefilter, stop there - if ( completed ) { - return jqXHR; - } - - // We can fire global events as of now if asked to - // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) - fireGlobals = jQuery.event && s.global; - - // Watch for a new set of requests - if ( fireGlobals && jQuery.active++ === 0 ) { - jQuery.event.trigger( "ajaxStart" ); - } - - // Uppercase the type - s.type = s.type.toUpperCase(); - - // Determine if request has content - s.hasContent = !rnoContent.test( s.type ); - - // Save the URL in case we're toying with the If-Modified-Since - // and/or If-None-Match header later on - // Remove hash to simplify url manipulation - cacheURL = s.url.replace( rhash, "" ); - - // More options handling for requests with no content - if ( !s.hasContent ) { - - // Remember the hash so we can put it back - uncached = s.url.slice( cacheURL.length ); - - // If data is available and should be processed, append data to url - if ( s.data && ( s.processData || typeof s.data === "string" ) ) { - cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; - - // #9682: remove data so that it's not used in an eventual retry - delete s.data; - } - - // Add or update anti-cache param if needed - if ( s.cache === false ) { - cacheURL = cacheURL.replace( rantiCache, "$1" ); - uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + - uncached; - } - - // Put hash and anti-cache on the URL that will be requested (gh-1732) - s.url = cacheURL + uncached; - - // Change '%20' to '+' if this is encoded form body content (gh-2658) - } else if ( s.data && s.processData && - ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { - s.data = s.data.replace( r20, "+" ); - } - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - if ( jQuery.lastModified[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); - } - if ( jQuery.etag[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); - } - } - - // Set the correct header, if data is being sent - if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { - jqXHR.setRequestHeader( "Content-Type", s.contentType ); - } - - // Set the Accepts header for the server, depending on the dataType - jqXHR.setRequestHeader( - "Accept", - s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? - s.accepts[ s.dataTypes[ 0 ] ] + - ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : - s.accepts[ "*" ] - ); - - // Check for headers option - for ( i in s.headers ) { - jqXHR.setRequestHeader( i, s.headers[ i ] ); - } - - // Allow custom headers/mimetypes and early abort - if ( s.beforeSend && - ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { - - // Abort if not done already and return - return jqXHR.abort(); - } - - // Aborting is no longer a cancellation - strAbort = "abort"; - - // Install callbacks on deferreds - completeDeferred.add( s.complete ); - jqXHR.done( s.success ); - jqXHR.fail( s.error ); - - // Get transport - transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); - - // If no transport, we auto-abort - if ( !transport ) { - done( -1, "No Transport" ); - } else { - jqXHR.readyState = 1; - - // Send global event - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); - } - - // If request was aborted inside ajaxSend, stop there - if ( completed ) { - return jqXHR; - } - - // Timeout - if ( s.async && s.timeout > 0 ) { - timeoutTimer = window.setTimeout( function () { - jqXHR.abort( "timeout" ); - }, s.timeout ); - } - - try { - completed = false; - transport.send( requestHeaders, done ); - } catch ( e ) { - - // Rethrow post-completion exceptions - if ( completed ) { - throw e; - } - - // Propagate others as results - done( -1, e ); - } - } - - // Callback for when everything is done - function done( status, nativeStatusText, responses, headers ) { - var isSuccess, success, error, response, modified, - statusText = nativeStatusText; - - // Ignore repeat invocations - if ( completed ) { - return; - } - - completed = true; - - // Clear timeout if it exists - if ( timeoutTimer ) { - window.clearTimeout( timeoutTimer ); - } - - // Dereference transport for early garbage collection - // (no matter how long the jqXHR object will be used) - transport = undefined; - - // Cache response headers - responseHeadersString = headers || ""; - - // Set readyState - jqXHR.readyState = status > 0 ? 4 : 0; - - // Determine if successful - isSuccess = status >= 200 && status < 300 || status === 304; - - // Get response data - if ( responses ) { - response = ajaxHandleResponses( s, jqXHR, responses ); - } - - // Use a noop converter for missing script but not if jsonp - if ( !isSuccess && - jQuery.inArray( "script", s.dataTypes ) > -1 && - jQuery.inArray( "json", s.dataTypes ) < 0 ) { - s.converters[ "text script" ] = function () {}; - } - - // Convert no matter what (that way responseXXX fields are always set) - response = ajaxConvert( s, response, jqXHR, isSuccess ); - - // If successful, handle type chaining - if ( isSuccess ) { - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - modified = jqXHR.getResponseHeader( "Last-Modified" ); - if ( modified ) { - jQuery.lastModified[ cacheURL ] = modified; - } - modified = jqXHR.getResponseHeader( "etag" ); - if ( modified ) { - jQuery.etag[ cacheURL ] = modified; - } - } - - // if no content - if ( status === 204 || s.type === "HEAD" ) { - statusText = "nocontent"; - - // if not modified - } else if ( status === 304 ) { - statusText = "notmodified"; - - // If we have data, let's convert it - } else { - statusText = response.state; - success = response.data; - error = response.error; - isSuccess = !error; - } - } else { - - // Extract error from statusText and normalize for non-aborts - error = statusText; - if ( status || !statusText ) { - statusText = "error"; - if ( status < 0 ) { - status = 0; - } - } - } - - // Set data for the fake xhr object - jqXHR.status = status; - jqXHR.statusText = ( nativeStatusText || statusText ) + ""; - - // Success/Error - if ( isSuccess ) { - deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); - } else { - deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); - } - - // Status-dependent callbacks - jqXHR.statusCode( statusCode ); - statusCode = undefined; - - if ( fireGlobals ) { - globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", - [ jqXHR, s, isSuccess ? success : error ] ); - } - - // Complete - completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); - - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); - - // Handle the global AJAX counter - if ( !( --jQuery.active ) ) { - jQuery.event.trigger( "ajaxStop" ); - } - } - } - - return jqXHR; - }, - - getJSON: function ( url, data, callback ) { - return jQuery.get( url, data, callback, "json" ); - }, - - getScript: function ( url, callback ) { - return jQuery.get( url, undefined, callback, "script" ); - } - } ); - - jQuery.each( [ "get", "post" ], function ( _i, method ) { - jQuery[ method ] = function ( url, data, callback, type ) { - - // Shift arguments if data argument was omitted - if ( isFunction( data ) ) { - type = type || callback; - callback = data; - data = undefined; - } - - // The url can be an options object (which then must have .url) - return jQuery.ajax( jQuery.extend( { - url: url, - type: method, - dataType: type, - data: data, - success: callback - }, jQuery.isPlainObject( url ) && url ) ); - }; - } ); - - jQuery.ajaxPrefilter( function ( s ) { - var i; - for ( i in s.headers ) { - if ( i.toLowerCase() === "content-type" ) { - s.contentType = s.headers[ i ] || ""; - } - } - } ); - - - jQuery._evalUrl = function ( url, options, doc ) { - return jQuery.ajax( { - url: url, - - // Make this explicit, since user can override this through ajaxSetup (#11264) - type: "GET", - dataType: "script", - cache: true, - async: false, - global: false, - - // Only evaluate the response if it is successful (gh-4126) - // dataFilter is not invoked for failure responses, so using it instead - // of the default converter is kludgy but it works. - converters: { - "text script": function () {} - }, - dataFilter: function ( response ) { - jQuery.globalEval( response, options, doc ); - } - } ); - }; - - - jQuery.fn.extend( { - wrapAll: function ( html ) { - var wrap; - - if ( this[ 0 ] ) { - if ( isFunction( html ) ) { - html = html.call( this[ 0 ] ); - } - - // The elements to wrap the target around - wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); - - if ( this[ 0 ].parentNode ) { - wrap.insertBefore( this[ 0 ] ); - } - - wrap.map( function () { - var elem = this; - - while ( elem.firstElementChild ) { - elem = elem.firstElementChild; - } - - return elem; - } ).append( this ); - } - - return this; - }, - - wrapInner: function ( html ) { - if ( isFunction( html ) ) { - return this.each( function ( i ) { - jQuery( this ).wrapInner( html.call( this, i ) ); - } ); - } - - return this.each( function () { - var self = jQuery( this ), - contents = self.contents(); - - if ( contents.length ) { - contents.wrapAll( html ); - - } else { - self.append( html ); - } - } ); - }, - - wrap: function ( html ) { - var htmlIsFunction = isFunction( html ); - - return this.each( function ( i ) { - jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); - } ); - }, - - unwrap: function ( selector ) { - this.parent( selector ).not( "body" ).each( function () { - jQuery( this ).replaceWith( this.childNodes ); - } ); - return this; - } - } ); - - - jQuery.expr.pseudos.hidden = function ( elem ) { - return !jQuery.expr.pseudos.visible( elem ); - }; - jQuery.expr.pseudos.visible = function ( elem ) { - return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); - }; - - - - - jQuery.ajaxSettings.xhr = function () { - try { - return new window.XMLHttpRequest(); - } catch ( e ) {} - }; - - var xhrSuccessStatus = { - - // File protocol always yields status code 0, assume 200 - 0: 200, - - // Support: IE <=9 only - // #1450: sometimes IE returns 1223 when it should be 204 - 1223: 204 - }, - xhrSupported = jQuery.ajaxSettings.xhr(); - - support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); - support.ajax = xhrSupported = !!xhrSupported; - - jQuery.ajaxTransport( function ( options ) { - var callback, errorCallback; - - // Cross domain only allowed if supported through XMLHttpRequest - if ( support.cors || xhrSupported && !options.crossDomain ) { - return { - send: function ( headers, complete ) { - var i, - xhr = options.xhr(); - - xhr.open( - options.type, - options.url, - options.async, - options.username, - options.password - ); - - // Apply custom fields if provided - if ( options.xhrFields ) { - for ( i in options.xhrFields ) { - xhr[ i ] = options.xhrFields[ i ]; - } - } - - // Override mime type if needed - if ( options.mimeType && xhr.overrideMimeType ) { - xhr.overrideMimeType( options.mimeType ); - } - - // X-Requested-With header - // For cross-domain requests, seeing as conditions for a preflight are - // akin to a jigsaw puzzle, we simply never set it to be sure. - // (it can always be set on a per-request basis or even using ajaxSetup) - // For same-domain requests, won't change header if already provided. - if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { - headers[ "X-Requested-With" ] = "XMLHttpRequest"; - } - - // Set headers - for ( i in headers ) { - xhr.setRequestHeader( i, headers[ i ] ); - } - - // Callback - callback = function ( type ) { - return function () { - if ( callback ) { - callback = errorCallback = xhr.onload = - xhr.onerror = xhr.onabort = xhr.ontimeout = - xhr.onreadystatechange = null; - - if ( type === "abort" ) { - xhr.abort(); - } else if ( type === "error" ) { - - // Support: IE <=9 only - // On a manual native abort, IE9 throws - // errors on any property access that is not readyState - if ( typeof xhr.status !== "number" ) { - complete( 0, "error" ); - } else { - complete( - - // File: protocol always yields status 0; see #8605, #14207 - xhr.status, - xhr.statusText - ); - } - } else { - complete( - xhrSuccessStatus[ xhr.status ] || xhr.status, - xhr.statusText, - - // Support: IE <=9 only - // IE9 has no XHR2 but throws on binary (trac-11426) - // For XHR2 non-text, let the caller handle it (gh-2498) - ( xhr.responseType || "text" ) !== "text" || - typeof xhr.responseText !== "string" ? { - binary: xhr.response - } : { - text: xhr.responseText - }, - xhr.getAllResponseHeaders() - ); - } - } - }; - }; - - // Listen to events - xhr.onload = callback(); - errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); - - // Support: IE 9 only - // Use onreadystatechange to replace onabort - // to handle uncaught aborts - if ( xhr.onabort !== undefined ) { - xhr.onabort = errorCallback; - } else { - xhr.onreadystatechange = function () { - - // Check readyState before timeout as it changes - if ( xhr.readyState === 4 ) { - - // Allow onerror to be called first, - // but that will not handle a native abort - // Also, save errorCallback to a variable - // as xhr.onerror cannot be accessed - window.setTimeout( function () { - if ( callback ) { - errorCallback(); - } - } ); - } - }; - } - - // Create the abort callback - callback = callback( "abort" ); - - try { - - // Do send the request (this may raise an exception) - xhr.send( options.hasContent && options.data || null ); - } catch ( e ) { - - // #14683: Only rethrow if this hasn't been notified as an error yet - if ( callback ) { - throw e; - } - } - }, - - abort: function () { - if ( callback ) { - callback(); - } - } - }; - } - } ); - - - - - // Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) - jQuery.ajaxPrefilter( function ( s ) { - if ( s.crossDomain ) { - s.contents.script = false; - } - } ); - - // Install script dataType - jQuery.ajaxSetup( { - accepts: { - script: "text/javascript, application/javascript, " + - "application/ecmascript, application/x-ecmascript" - }, - contents: { - script: /\b(?:java|ecma)script\b/ - }, - converters: { - "text script": function ( text ) { - jQuery.globalEval( text ); - return text; - } - } - } ); - - // Handle cache's special case and crossDomain - jQuery.ajaxPrefilter( "script", function ( s ) { - if ( s.cache === undefined ) { - s.cache = false; - } - if ( s.crossDomain ) { - s.type = "GET"; - } - } ); - - // Bind script tag hack transport - jQuery.ajaxTransport( "script", function ( s ) { - - // This transport only deals with cross domain or forced-by-attrs requests - if ( s.crossDomain || s.scriptAttrs ) { - var script, callback; - return { - send: function ( _, complete ) { - script = jQuery( " - - - - - - - - -
-

GIT HTML PREVIEW TOOL

-

- Enter URL of the HTML file to preview: - - -

- -

try

-
  
    - -
  • - - https://github.com/bgoonz/GIT-HTML-PREVIEW-TOOL/blob/master/readme.html -
  • -
-
-

as an example

-
- - - - - diff --git a/_Resources/node_modules/web-dev-utils/GIT-HTML-PREVIEW-TOOL/GIT-HTML-PREVIEW-TOOL-master/readme.html b/_Resources/node_modules/web-dev-utils/GIT-HTML-PREVIEW-TOOL/GIT-HTML-PREVIEW-TOOL-master/readme.html deleted file mode 100644 index 78e86fe..0000000 --- a/_Resources/node_modules/web-dev-utils/GIT-HTML-PREVIEW-TOOL/GIT-HTML-PREVIEW-TOOL-master/readme.html +++ /dev/null @@ -1,1143 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - readme - - - - - - - - - - - - - - - - - -
-
- - -

- GIT HTML PREVIEW TOOL .

-

-----------------------------------------------------

- -

TOC
- About - ● FeaturesHow It - WorksDevelopment ● - Contact

-

-----------------------------------------------------

-

GitJavaScriptNodeJSCSS3HTML5BootstrapBitbucket -

-

-----------------------------------------------------

-

Usage:

-

GIT HTML PREVIEW TOOL was tested under the latest Google Chrome and Mozilla - Firefox.

-

-----------------------------------------------------

- -

GIT HTML PREVIEW TOOL

-
-

What it does is: load HTML using CORS proxy, then process all links, frames, scripts and styles, and load - each of them using CORS proxy, so they can be evaluated by the browser.

-
- -

Live Deployment

-

[Live Website] -

- - -
-

-----------------------------------------------------

-
-

➤ About

-

Many GitHub repositories don't use GitHub Pages to host their HTML files. GIT HTML PREVIEW - TOOL allows you to render those files without cloning or downloading whole repositories. It is a - client-side solution using a CORS proxy to fetch assets.

-

If you try to open raw version of any HTML, CSS or JS file in a web browser directly from GitHub, all you - will see is a source code. GitHub forces them to use the "text/plain" content-type, so they cannot - be interpreted. This script overrides it by using a CORS proxy.

-
-
-

Cross-Origin Resource Sharing (CORS) is a security mechanism that uses additional HTTP headers to tell - browsers to give a web application running at one origin, access to selected resources from a different - origin. A web application executes a cross-origin HTTP request when it requests a resource(Images, Scripts, - CSS files, etc.)that has a different origin (domain, protocol, or port) from its own.

-
-
-

Cross-origin requests, however, mean that servers must implement ways to handle requests from origins - outside of their own. CORS allows servers to specify who (i.e., which origins) can access the assets on the - server, among many other things.

-
-
-

Access-Control-Allow-Origin Header
- When Site A tries to fetch content from Site B, Site B can send an Access-Control-Allow-Origin response - header to tell the browser that the content of this page is accessible to certain origins. (An origin is a - domain, plus a scheme and port number.) By default, Site B's pages are not accessible to any other - origin; using the Access-Control-Allow-Origin header opens a door for cross-origin access by specific - requesting origins. The Access-Control-Allow-Origin header is critical to resource security.
- You can find a description of each CORS header at the following: CORS Headers.
- Pre-Flight Request
- Most servers will allow GET requests but may block requests to modify resources on the server. Servers - don't just blindly block such requests though; they have a process in place that first checks and then - communicates to the client (your web browser) which requests are allowed.
- When a request is made using any of the following HTTP request methods, a standard preflight request will be - made before the original request.
- PUT
- DELETE
- CONNECT
- OPTIONS
- TRACE
- PATCH
- Preflight requests use the OPTIONS header. The preflight request is sent before the original request, hence - the term "preflight." The purpose of the preflight request is to determine whether or not the - original request is safe (for example, a DELETE request). The server will respond to the preflight request - and indicate whether or not the original request is safe. If the server specifies that the original request - is safe, it will allow the original request. Otherwise, it will block the original request.

-
-
-

➤ Development:

-
(() => {
-  
-  const previewForm = document.getElementById('previewform');
-
-  const url = location.search.substring(1).replace(/\/\/github\.com/, '//raw.githubusercontent.com').replace(/\/blob\//, '/'); //Get URL of the raw file
-
-  const replaceAssets = () => {
-        let frame;
-        let a;
-        let link;
-        const links = [];
-        let script;
-        const scripts = [];
-        let i;
-        let href;
-        let src;
-        //Framesets
-        if (document.querySelectorAll('frameset').length)
-      return; //Don't replace CSS/JS if it's a frameset, because it will be erased by document.write()
-        //Frames
-        frame = document.querySelectorAll('iframe[src],frame[src]');
-        for (i = 0; i < frame.length; ++i) {
-      src = frame[i].src; //Get absolute URL
-      if (src.indexOf('//raw.githubusercontent.com') > 0 || src.indexOf('//bitbucket.org') > 0) { //Check if it's from raw.github.com or bitbucket.org
-        frame[i].src = '//' + location.hostname + location.pathname + '?' + src; //Then rewrite URL so it can be loaded using CORS proxy
-      }
-    }
-        //Links
-        a = document.querySelectorAll('a[href]');
-        for (i = 0; i < a.length; ++i) {
-      href = a[i].href; //Get absolute URL
-      if (href.indexOf('#') > 0) { //Check if it's an anchor
-        a[i].href = '//' + location.hostname + location.pathname + location.search + '#' + a[i].hash.substring(1); //Then rewrite URL with support for empty anchor
-      } else if ((href.indexOf('//raw.githubusercontent.com') > 0 || href.indexOf('//bitbucket.org') > 0) && (href.indexOf('.html') > 0 || href.indexOf('.htm') > 0)) { //Check if it's from raw.github.com or bitbucket.org and to HTML files
-        a[i].href = '//' + location.hostname + location.pathname + '?' + href; //Then rewrite URL so it can be loaded using CORS proxy
-      }
-    }
-        //Stylesheets
-        link = document.querySelectorAll('link[rel=stylesheet]');
-        for (i = 0; i < link.length; ++i) {
-      href = link[i].href; //Get absolute URL
-      if (href.indexOf('//raw.githubusercontent.com') > 0 || href.indexOf('//bitbucket.org') > 0) { //Check if it's from raw.github.com or bitbucket.org
-        links.push(fetchProxy(href, null, 0)); //Then add it to links queue and fetch using CORS proxy
-      }
-    }
-        Promise.all(links).then(res => {
-      for (i = 0; i < res.length; ++i) {
-        loadCSS(res[i]);
-      }
-    });
-        //Scripts
-        script = document.querySelectorAll('script[type="text/htmlpreview"]');
-        for (i = 0; i < script.length; ++i) {
-      src = script[i].src; //Get absolute URL
-      if (src.indexOf('//raw.githubusercontent.com') > 0 || src.indexOf('//bitbucket.org') > 0) { //Check if it's from raw.github.com or bitbucket.org
-        scripts.push(fetchProxy(src, null, 0)); //Then add it to scripts queue and fetch using CORS proxy
-      } else {
-        script[i].removeAttribute('type');
-        scripts.push(script[i].innerHTML); //Add inline script to queue to eval in order
-      }
-    }
-        Promise.all(scripts).then(res => {
-      for (i = 0; i < res.length; ++i) {
-        loadJS(res[i]);
-      }
-      document.dispatchEvent(new Event('DOMContentLoaded', {bubbles: true, cancelable: true})); //Dispatch DOMContentLoaded event after loading all scripts
-    });
-    };
-
-  const loadHTML = data => {
-    if (data) {
-      data = data.replace(/<head([^>]*)>/i, '<head$1><base href="' + url + '">').replace(/<script(\s*src=["'][^"']*["'])?(\s*type=["'](text|application)\/javascript["'])?/gi, '<script type="text/htmlpreview"$1'); //Add <base> just after <head> and replace <script type="text/javascript"> with <script type="text/htmlpreview">
-      setTimeout(() => {
-        document.open();
-        document.write(data);
-        document.close();
-        replaceAssets();
-      }, 10); //Delay updating document to have it cleared before
-    }
-  };
-
-  var loadCSS = data => {
-    if (data) {
-      const style = document.createElement('style');
-      style.innerHTML = data;
-      document.head.appendChild(style);
-    }
-  };
-
-  var loadJS = data => {
-    if (data) {
-      const script = document.createElement('script');
-      script.innerHTML = data;
-      document.body.appendChild(script);
-    }
-  };
-  
-  var fetchProxy = (url, options, i) => {
-    const proxy = [
-      'https://cors-anywhere.herokuapp.com/',
-      'https://yacdn.org/proxy/',
-      'https://api.codetabs.com/v1/proxy/?quest='
-    ];
-    return fetch(proxy[i] + url, options).then(res => {
-      if (!res.ok) throw new Error('Cannot load ' + url + ': ' + res.status + ' ' + res.statusText);
-      return res.text();
-    }).catch(error => {
-      if (i === proxy.length - 1)
-        throw error;
-      return fetchProxy(url, options, i + 1);
-    });
-  };
-
-  if (url && url.indexOf(location.hostname) < 0)
-    fetch(url).then(res => {
-      if (!res.ok) throw new Error('Cannot load ' + url + ': ' + res.status + ' ' + res.statusText);
-      return res.text();
-    }).then(loadHTML).catch(error => {
-      console.error(error);
-      previewForm.style.display = 'block';
-      previewForm.innerText = error;
-    });
-  else
-    previewForm.style.display = 'block';
-
-})();
-
-
-
-

➤ Bryan Guner

-

(Full-stack software developer)
- Portfolio Resume PDF Bryan's email Blog Linkedin AngelListGitHub bgoonz

-
-
-

-----------------------------------------------------

-
-

logo

-
-
- -
-
- - - - - - - - - - - - diff --git a/_Resources/node_modules/web-dev-utils/GIT-HTML-PREVIEW-TOOL/GIT-HTML-PREVIEW-TOOL-master/readme.md b/_Resources/node_modules/web-dev-utils/GIT-HTML-PREVIEW-TOOL/GIT-HTML-PREVIEW-TOOL-master/readme.md deleted file mode 100644 index 2a7dd20..0000000 --- a/_Resources/node_modules/web-dev-utils/GIT-HTML-PREVIEW-TOOL/GIT-HTML-PREVIEW-TOOL-master/readme.md +++ /dev/null @@ -1,303 +0,0 @@ - - - - - - -
- - - - - - - -# GIT HTML PREVIEW TOOL . - -[![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/colored.png)](#-) - - - **TOC** - [About](#about) ● [How It Works](#how-it-works) ● [Development](#development) ● [Contact](#contact) - - - - - - [![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/colored.png)](#-) - -GitJavaScriptCSS3HTML5BootstrapBitbucket - - [![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/colored.png)](#-) - - - -# Usage: - -![demo](./git-preview.gif) - -

Still working on getting it to render html hosted on GitLabb - - - - - - - -[![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/colored.png)](#-) - - - - -# GIT HTML PREVIEW TOOL - ->What it does is: load HTML using CORS proxy, then process all links, frames, scripts and styles, and load each of them using CORS proxy, so they can be evaluated by the browser. - - - - - - - ## Live Deployment - [Live Website] - - - -

- - - - - - - - -[![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/colored.png)](#-) - - - - - -
- - ## ➤ About - -#### Many GitHub repositories don't use GitHub Pages to host their HTML files. **GIT HTML PREVIEW TOOL** allows you to render those files without cloning or downloading whole repositories. It is a client-side solution using a CORS proxy to fetch assets. - -#### If you try to open raw version of any HTML, CSS or JS file in a web browser directly from GitHub, all you will see is a source code. GitHub forces them to use the "text/plain" content-type, so they cannot be interpreted. This script overrides it by using a CORS proxy. - - - ---- - - - ->Cross-Origin Resource Sharing (CORS) is a security mechanism that uses additional HTTP headers to tell browsers to give a web application running at one origin, access to selected resources from a different origin. A web application executes a cross-origin HTTP request when it requests a resource(Images, Scripts, CSS files, etc.)that has a different origin (domain, protocol, or port) from its own. - - ->Cross-origin requests, however, mean that servers must implement ways to handle requests from origins outside of their own. CORS allows servers to specify who (i.e., which origins) can access the assets on the server, among many other things. - ->Access-Control-Allow-Origin Header -When Site A tries to fetch content from Site B, Site B can send an Access-Control-Allow-Origin response header to tell the browser that the content of this page is accessible to certain origins. (An origin is a domain, plus a scheme and port number.) By default, Site B's pages are not accessible to any other origin; using the Access-Control-Allow-Origin header opens a door for cross-origin access by specific requesting origins. The Access-Control-Allow-Origin header is critical to resource security. -You can find a description of each CORS header at the following: CORS Headers. -Pre-Flight Request -Most servers will allow GET requests but may block requests to modify resources on the server. Servers don't just blindly block such requests though; they have a process in place that first checks and then communicates to the client (your web browser) which requests are allowed. -When a request is made using any of the following HTTP request methods, a standard preflight request will be made before the original request. -PUT -DELETE -CONNECT -OPTIONS -TRACE -PATCH -Preflight requests use the OPTIONS header. The preflight request is sent before the original request, hence the term "preflight." The purpose of the preflight request is to determine whether or not the original request is safe (for example, a DELETE request). The server will respond to the preflight request and indicate whether or not the original request is safe. If the server specifies that the original request is safe, it will allow the original request. Otherwise, it will block the original request. - ---- - - - - - - - -## ➤ Bryan Guner ---- - -***(Full-stack software developer)*** - ---- - -[![Portfolio](https://img.shields.io/badge/-❤_Portfolio-f58?style=flat-square&logo=a&logoColor=white&link=https://bgoonz.github.io/)](https://bgoonz.github.io)![Resume PDF](https://img.shields.io/badge/-Resume-f00?style=flat-square&logo=adobe-acrobat-reader&logoColor=white)[![Bryan's email](https://img.shields.io/badge/bryan.guner@gmail.com-f4b400?style=flat-square&logo=gmail&logoColor=black&link=mailto:bryan.guner@gmail.com)](mailto:bryan.guner@gmail.com)[![Blog](https://img.shields.io/badge/-Blog-21759b?style=flat-square&logo=WordPress&logoColor=white&link=https://web-dev-hub.com/)](https://web-dev-hub.com/)[![Linkedin](https://img.shields.io/badge/-LinkedIn-0077b5?style=flat-square&logo=Linkedin&logoColor=white&link=https://www.linkedin.com/in/bryan-guner-046199128/)](https://www.linkedin.com/in/bryan-guner-046199128/)[![AngelList](https://img.shields.io/badge/-AngelList-black?style=flat-square&logo=AngelList&logoColor=white&link=https://angel.co/u/bryan-guner)](https://angel.co/u/bryan-guner)[![GitHub bgoonz](https://img.shields.io/github/followers/bgoonz?label=follow&style=social)](https://github.com/bgoonz) - -
- -
- - - -[![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/colored.png)](#-) - - - -
- - - ![logo](https://avatars.githubusercontent.com/u/66654881?s=460&u=fa9d2cc45bc228dd9b7d3dee6d4653f940fab35a&v=4) - - - -
- - - - -------------------------------- - - -[![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/colored.png)](#-) - - -## ➤ Development: - -```js -(() => { - - const previewForm = document.getElementById('previewform'); - - const url = location.search.substring(1).replace(/\/\/github\.com/, '//raw.githubusercontent.com').replace(/\/blob\//, '/'); //Get URL of the raw file - - const replaceAssets = () => { - let frame; - let a; - let link; - const links = []; - let script; - const scripts = []; - let i; - let href; - let src; - //Framesets - if (document.querySelectorAll('frameset').length) - return; //Don't replace CSS/JS if it's a frameset, because it will be erased by document.write() - //Frames - frame = document.querySelectorAll('iframe[src],frame[src]'); - for (i = 0; i < frame.length; ++i) { - src = frame[i].src; //Get absolute URL - if (src.indexOf('//raw.githubusercontent.com') > 0 || src.indexOf('//bitbucket.org') > 0) { //Check if it's from raw.github.com or bitbucket.org - frame[i].src = '//' + location.hostname + location.pathname + '?' + src; //Then rewrite URL so it can be loaded using CORS proxy - } - } - //Links - a = document.querySelectorAll('a[href]'); - for (i = 0; i < a.length; ++i) { - href = a[i].href; //Get absolute URL - if (href.indexOf('#') > 0) { //Check if it's an anchor - a[i].href = '//' + location.hostname + location.pathname + location.search + '#' + a[i].hash.substring(1); //Then rewrite URL with support for empty anchor - } else if ((href.indexOf('//raw.githubusercontent.com') > 0 || href.indexOf('//bitbucket.org') > 0) && (href.indexOf('.html') > 0 || href.indexOf('.htm') > 0)) { //Check if it's from raw.github.com or bitbucket.org and to HTML files - a[i].href = '//' + location.hostname + location.pathname + '?' + href; //Then rewrite URL so it can be loaded using CORS proxy - } - } - //Stylesheets - link = document.querySelectorAll('link[rel=stylesheet]'); - for (i = 0; i < link.length; ++i) { - href = link[i].href; //Get absolute URL - if (href.indexOf('//raw.githubusercontent.com') > 0 || href.indexOf('//bitbucket.org') > 0) { //Check if it's from raw.github.com or bitbucket.org - links.push(fetchProxy(href, null, 0)); //Then add it to links queue and fetch using CORS proxy - } - } - Promise.all(links).then(res => { - for (i = 0; i < res.length; ++i) { - loadCSS(res[i]); - } - }); - //Scripts - script = document.querySelectorAll('script[type="text/htmlpreview"]'); - for (i = 0; i < script.length; ++i) { - src = script[i].src; //Get absolute URL - if (src.indexOf('//raw.githubusercontent.com') > 0 || src.indexOf('//bitbucket.org') > 0) { //Check if it's from raw.github.com or bitbucket.org - scripts.push(fetchProxy(src, null, 0)); //Then add it to scripts queue and fetch using CORS proxy - } else { - script[i].removeAttribute('type'); - scripts.push(script[i].innerHTML); //Add inline script to queue to eval in order - } - } - Promise.all(scripts).then(res => { - for (i = 0; i < res.length; ++i) { - loadJS(res[i]); - } - document.dispatchEvent(new Event('DOMContentLoaded', {bubbles: true, cancelable: true})); //Dispatch DOMContentLoaded event after loading all scripts - }); - }; - - const loadHTML = data => { - if (data) { - data = data.replace(/]*)>/i, '').replace(/ just after and replace - - - - ; - - -

Contributors Forks Stargazers - Issues MIT License LinkedIn

- -
-

-

Logo

-

- project_title -

-

- project_description
Explore the docs - »

View Demo · Report Bug · Request Feature -

-

- -
- -

- Table of Contents -

-
-
    -
  1. - About The Project - -
  2. -
  3. - Getting Started - -
  4. -
  5. - Usage -
  6. -
  7. - Roadmap -
  8. -
  9. - Contributing -
  10. -
  11. - License -
  12. -
  13. - Contact -
  14. -
  15. - Acknowledgements -
  16. -
-
- -

About The Project

-

[Product Name Screen - Shot][product-screenshot]

-

Here’s a blank template to get started: To avoid retyping too much info. Do a search and replace with - your text editor for the following: github_username, repo_name, - twitter_handle, email, project_title, project_description

-

Built With

-
    -
  • -
  • -
  • -
- -

Getting Started

-

To get a local copy up and running follow these simple steps.

-

Prerequisites

-

This is an example of how to list things you need to use the software and how to install them. * npm sh npm - install npm@latest -g

-

Installation

-
    -
  1. -

    Clone the repo

    - -
  2. -
  3. -

    Install NPM packages

    - -
  4. -
- -

Usage

-

Use this space to show useful examples of how a project can be used. Additional screenshots, code examples and - demos work well in this space. You may also link to more resources.

-

For more examples, please refer to the Documentation

- -

Roadmap

-

See the open issues for a list of proposed - features (and known issues).

- -

Contributing

-

Contributions are what make the open source community such an amazing place to be learn, inspire, and create. Any - contributions you make are greatly appreciated.

-
    -
  1. Fork the Project
  2. -
  3. Create your Feature Branch (git checkout -b feature/AmazingFeature)
  4. -
  5. Commit your Changes (git commit -m 'Add some AmazingFeature')
  6. -
  7. Push to the Branch (git push origin feature/AmazingFeature)
  8. -
  9. Open a Pull Request
  10. -
- -

License

-

Distributed under the MIT License. See LICENSE for more information.

- -

Contact

-

Your Name - [@twitter_handle](https://twitter.com/twitter_handle) - email

-

Project Link: https://github.com/github_username/repo_name

- -

Acknowledgements

-
    -
  • -
  • -
  • -
- - - - - - - - diff --git a/_Resources/node_modules/web-dev-utils/Markdown-Templates/Markdown-Templates-master/html-readmes/MAIN-README.html b/_Resources/node_modules/web-dev-utils/Markdown-Templates/Markdown-Templates-master/html-readmes/MAIN-README.html deleted file mode 100644 index 1fb55ba..0000000 --- a/_Resources/node_modules/web-dev-utils/Markdown-Templates/Markdown-Templates-master/html-readmes/MAIN-README.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Document - - - - - - - ; -

Project name

- -

Twitter Follow

-

Project name is a <utility/tool/feature> that allows - <insert_target_audience> to do <action/task_it_does>.

-

Additional line of information text about what the project does. Your introduction should be around 2 or 3 - sentences. Don’t go overboard, people won’t read it.

-

Prerequisites

-

Before you begin, ensure you have met the following requirements: - * You have installed the - latest version of <coding_language/dependency/requirement_1> * You have a - <Windows/Linux/Mac> machine. State which OS is supported/which is not. * You have read - <guide/link/documentation_related_to_project>.

-

Installing -

-

To install , follow these steps:

-

Linux and macOS:

-
<install_command>
-

Windows:

-
<install_command>
-

Using -

-

To use , follow these steps:

-
<usage_example>
-

Add run commands and examples you think users will find useful. Provide an options reference for bonus points! -

-

Contributing to -

- -

To contribute to , follow these steps:

-
    -
  1. Fork this repository.
  2. -
  3. Create a branch: git checkout -b <branch_name>.
  4. -
  5. Make your changes and commit them: git commit -m '<commit_message>'
  6. -
  7. Push to the original branch: git push origin <project_name>/<location>
  8. -
  9. Create the pull request.
  10. -
-

Alternatively see the GitHub documentation on creating - a pull request.

-

Contributors

-

Thanks to the following people who have contributed to this project:

-
    -
  • [@bgoonz](https://github.com/bgoonz) 📖
  • -
  • [@cainwatson](https://github.com/cainwatson) 🐛
  • -
  • [@calchuchesta](https://github.com/calchuchesta) 🐛 -
  • -
-

You might want to consider using something like the All Contributors specification and its emoji key.

-

Contact

-

If you want to contact me you can reach me at .

-

License

- -

This project uses the following license: - - .

- - - - - diff --git a/_Resources/node_modules/web-dev-utils/Markdown-Templates/Markdown-Templates-master/html-readmes/README.html b/_Resources/node_modules/web-dev-utils/Markdown-Templates/Markdown-Templates-master/html-readmes/README.html deleted file mode 100644 index 8ad7a5b..0000000 --- a/_Resources/node_modules/web-dev-utils/Markdown-Templates/Markdown-Templates-master/html-readmes/README.html +++ /dev/null @@ -1,381 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Document - - - - - - - ; - -
-

- - -

-
- logo -
logo
-
-

# Title ## Subtitle

-

- TOC
- About ● - FeaturesHow It WorksInstallationDevelopmentContact

-

—————————————————–

-

- A 1-5 sentence summary of what the app is.
- 1-3 sentences ideal.
- Markdown tip: Add two spaces at the end of a line to create a line break.

-

- Splashy 100%-width image -

-

- ##Try the Demo! [Live Website] - - -

-
-
-

—————————————————–

- -
-

## About

-

● See Website - ●
- (Inspired by app name)

-
-

Animated gif example of app in action, or interesting detail, etc.

-

Describe overview of app, themes and philosophy, inspiration, audience, or whatever… 1-2 paragraphs

-


- - -

-

-

-

-

- -
-

Image 1 Image 2

-
- -
-

Image 1 Image 2

-
-

—————————————————–

- -
-

## Features

-
-
    -
  • Key action word a feature here.
  • -
  • Emphasize action for this feature.
  • -
  • Feature 3 highlights this benefit.
  • -
-

##For the Future

-

An optional brief note describing scheduling or other planning details.

-
    -
  • Major (high priority) A major feature
  • -
  • Major A major feature
  • -
  • Minor (low priority) A minor feature
  • -
  • Maybe Undecided ideas or brainstorming
  • -
-

—————————————————–

- - -

##1. Step One

-

Screenshot, animated gif, diagram, etc illustrating this step

-
    -
  • To do a thing, follow this step.
  • -
  • TIP This is a helpful tip.
  • -
  • NOTE This is note about something.
  • -
  • WARNING! This is a warning!
  • -
-


-
-

Optional Special Section!
- For any additional asides. Maybe illustrating a specific example, a table of information, a code snippet, or - ‘fun facts’ or quotes!

-
    -
  1. A list
  2. -
  3. could be
  4. -
  5. nice too
  6. -
- - - - - - - - - - - - - -
Header AHeader B
AB
-
-
-

Optional extra image(s)

-
-

##How to Use Feature ABC Repeat the pattern.

-

##Troubleshooting Z Repeat the pattern.

-
-

## Installation

-
-
    -
  1. Create a new postgres database and owner.
  2. -
  3. Create a .env file matching the .env.example file and your new postgres information. -
  4. -
  5. Migrate the database with npx sequelize-cli db:migrate.
  6. -
  7. Seed the migration with npx sequelize-cli db:seed:all.
  8. -
  9. Run locally with npm start.
  10. -
-

##Get started on Heroku - Account, Database, Config Vars 1. Install the Heroku CLI, if you haven’t done so already. 2. - Create a free Heroku account. - 3. Login and create a new - Heroku app. 4. Navigate to the - Resources - tab an set up a ‘Heroku Postgres’ database for the app. 5. Select the ‘Hobby Dev - Free’ plan. 6. Navigate to the - Settings tab. Click ‘Reveal Config Vars’. Set the environment variables needed to run the app. - - NOTE NEVER check in .env files or any private keys. Environment variables set in an - .env file won’t work in Heroku anyway. - NOTE See the DATABASE_URL is - already set. This is done when the Heroku Postgres database was set up. Therefore, DB_USERNAME, - DB_PASSWORD, and DB_DATABASE arent’ required.

-

##Configure the app to use the Heroku Postgres database There are two ways to configure the - production environment: 1. With dotenv and a .sequelizerc file that points to a - config/database.js file. 2. The Sequelize CLI’s auto-generated config.json file.

-

With .sequelizerc and dotenv Update the config/database.js file with a - production key like so.

- -

With Sequelize CLI’s config.json Change the production entry to look like this:

- -

➤ Push to Heroku

-
    -
  1. In the root of the app’s repo directory, log into Heroku with heroku login.
  2. -
  3. Add a new remote to GitHub configuration with heroku git:remote -a <<app-name-here>>. -
  4. -
  5. Add all changes with git add ..
  6. -
  7. Commit changes with git commit -m "<<Add message here>>". (Optionally, git - commit -am Adds and commits in one command.)
  8. -
  9. Push changes to Heroku with git push Heroku.
  10. -
  11. You should see a successful build image.
  12. -
-

—————————————————–

-

- -

➤ Run migrations on Heroku

-
    -
  1. To migrate your Heroku Postgres database, run the migration command prefaced with heroku run - inside the repo.
  2. -
- -
    -
  1. To seed, preface the seed command with heroku run as well.
  2. -
- -
    -
  1. To roll back, instead of dropping the database, first try to migrate down and up (shown below). If this - doesn’t work, reset the entire database by removing and adding the ‘Heroku Postgres’ add-on again, then - migrating and seeding as the first time.
  2. -
- -

—————————————————–

-
-

## ➤ Development

-

DEV TOC
- TechnologiesConcept - ● ModelsRoutesWireframesCode HighlightsDev - Snapshots

-

[ See full dev notes HERE ]
- The full notes on this project’s development are kept in a separate document linked above.
- It details the technical aspects of this project’s development.
- A few sample snapshots are below from the development process.

-

Snapshot 1 Snapshot 2 - Snapshot 3

-
-
- -
-

—————————————————–

-

➤Contact

-

Thank you very much for your interest in this project.
- Feel free to reach out to provide feedback, bug reports, or anything else :) .

- - -

Bryan Gimer

-
-

##Bryan Guner (Full-stack software developer)

-

Portfolio Resume PDF - Blog Linkedin AngelList GitHub bgoonz -

- -


-
- - - - - - diff --git a/_Resources/node_modules/web-dev-utils/Markdown-Templates/Markdown-Templates-master/html-readmes/Standard-Project-README.html b/_Resources/node_modules/web-dev-utils/Markdown-Templates/Markdown-Templates-master/html-readmes/Standard-Project-README.html deleted file mode 100644 index fecc595..0000000 --- a/_Resources/node_modules/web-dev-utils/Markdown-Templates/Markdown-Templates-master/html-readmes/Standard-Project-README.html +++ /dev/null @@ -1,277 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Document - - - - - - - ; - - -

Contributors Forks Stargazers Issues MIT License LinkedIn

- -
-

-

Logo

-

- Best-README-Template -

-

- An awesome README template to jumpstart your projects!
Explore the docs »

View Demo · Report Bug · Request Feature -

-

- -
- Table of Contents -
    -
  1. - About The Project - -
  2. -
  3. - Getting Started - -
  4. -
  5. - Usage -
  6. -
  7. - Roadmap -
  8. -
  9. - Contributing -
  10. -
  11. - License -
  12. -
  13. - Contact -
  14. -
  15. - Acknowledgements -
  16. -
-
- -

About The Project

-

Product Name Screen Shot

-

There are many great README templates available on GitHub, however, I didn’t find one that really suit my needs - so I created this enhanced one. I want to create a README template so amazing that it’ll be the last one you ever - need – I think this is it.

-

Here’s why: * Your time should be focused on creating something amazing. A project that solves a problem and - helps others * You shouldn’t be doing the same tasks over and over like creating a README from scratch * You - should element DRY principles to the rest of your life :smile:

-

Of course, no one template will serve all projects since your needs may be different. So I’ll be adding more in - the near future. You may also suggest changes by forking this repo and creating a pull request or opening an - issue. Thanks to all the people have have contributed to expanding this template!

-

A list of commonly used resources that I find helpful are listed in the acknowledgements.

-

Built With

-

This section should list any major frameworks that you built your project using. Leave any add-ons/plugins for - the acknowledgements section. Here are a few examples. * Bootstrap * JQuery * Laravel

- -

Getting Started

-

This is an example of how you may give instructions on setting up your project locally. To get a local copy up - and running follow these simple example steps.

-

Prerequisites

-

This is an example of how to list things you need to use the software and how to install them. * npm sh npm - install npm@latest -g

-

Installation

-
    -
  1. Get a free API Key at https://example.com
  2. -
  3. -

    Clone the repo

    - -
  4. -
  5. -

    Install NPM packages

    - -
  6. -
  7. -

    Enter your API in config.js

    - -
  8. -
- -

Usage

-

Use this space to show useful examples of how a project can be used. Additional screenshots, code examples and - demos work well in this space. You may also link to more resources.

-

For more examples, please refer to the Documentation

- -

Roadmap

-

See the open issues for a list of proposed - features (and known issues).

- -

Contributing

-

Contributions are what make the open source community such an amazing place to be learn, inspire, and create. Any - contributions you make are greatly appreciated.

-
    -
  1. Fork the Project
  2. -
  3. Create your Feature Branch (git checkout -b feature/AmazingFeature)
  4. -
  5. Commit your Changes (git commit -m 'Add some AmazingFeature')
  6. -
  7. Push to the Branch (git push origin feature/AmazingFeature)
  8. -
  9. Open a Pull Request
  10. -
- -

License

-

Distributed under the MIT License. See LICENSE for more information.

- -

Contact

-

Your Name - [@your_twitter](https://twitter.com/your_username) - email@example.com

-

Project Link: https://github.com/your_username/repo_name -

- -

Acknowledgements

- - - - - - - - - diff --git a/_Resources/node_modules/web-dev-utils/Markdown-Templates/Markdown-Templates-master/html-readmes/alt-README.html b/_Resources/node_modules/web-dev-utils/Markdown-Templates/Markdown-Templates-master/html-readmes/alt-README.html deleted file mode 100644 index 28b7d17..0000000 --- a/_Resources/node_modules/web-dev-utils/Markdown-Templates/Markdown-Templates-master/html-readmes/alt-README.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Document - - - - - - - ; -

gr# Product Name > Short blurb about what your product does.

-

NPM Version Build Status Downloads Stats

-

One to two paragraph statement about your product and what it does.

-

-

Installation

-

OS X & Linux:

- -

Windows:

- -

Usage example

-

A few motivating and useful examples of how your product can be used. Spice this up with code blocks and - potentially more screenshots.

-

For more examples and usage, please refer to the Wiki.

-

Development setup

-

Describe how to install all development dependencies and how to run an automated test-suite of some kind. - Potentially do this for multiple platforms.

- -

Release History

-
    -
  • 0.2.1 -
      -
    • CHANGE: Update docs (module code remains unchanged)
    • -
    -
  • -
  • 0.2.0 -
      -
    • CHANGE: Remove setDefaultXYZ()
    • -
    • ADD: Add init()
    • -
    -
  • -
  • 0.1.1 -
      -
    • FIX: Crash when calling baz() (Thanks @GenerousContributorName!)
    • -
    -
  • -
  • 0.1.0 -
      -
    • The first proper release
    • -
    • CHANGE: Rename foo() to bar()
    • -
    -
  • -
  • 0.0.1 -
      -
    • Work in progress
    • -
    -
  • -
-

Meta

-

Your Name – [@YourTwitter](https://twitter.com/dbader_org) - – YourEmail@example.com

-

Distributed under the XYZ license. See LICENSE for more information.

-

https://github.com/yourname/github-link

-

Contributing

-
    -
  1. Fork it (https://github.com/yourname/yourproject/fork)
  2. -
  3. Create your feature branch (git checkout -b feature/fooBar)
  4. -
  5. Commit your changes (git commit -am 'Add some fooBar')
  6. -
  7. Push to the branch (git push origin feature/fooBar)
  8. -
  9. Create a new Pull Request
  10. -
- - - - - - - - diff --git a/_Resources/node_modules/web-dev-utils/Markdown-Templates/Markdown-Templates-master/html-readmes/index.html b/_Resources/node_modules/web-dev-utils/Markdown-Templates/Markdown-Templates-master/html-readmes/index.html deleted file mode 100644 index b42cfda..0000000 --- a/_Resources/node_modules/web-dev-utils/Markdown-Templates/Markdown-Templates-master/html-readmes/index.html +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - - - - - directory - - - - - - - - - - - - diff --git a/_Resources/node_modules/web-dev-utils/Markdown-Templates/Markdown-Templates-master/html-readmes/notes-template.html b/_Resources/node_modules/web-dev-utils/Markdown-Templates/Markdown-Templates-master/html-readmes/notes-template.html deleted file mode 100644 index 71e3322..0000000 --- a/_Resources/node_modules/web-dev-utils/Markdown-Templates/Markdown-Templates-master/html-readmes/notes-template.html +++ /dev/null @@ -1,752 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Document - - - - - - - ; -

# Title

-
    -
  • Description: > /* Description here */
  • -
-

Main Notes:

-
-

-
-
-
-
-
-
-
-
-

10 X 10 Table

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   - -   - -   - -   - -   - -   - -   - -   - -   - -   -
-   - -   - -   - -   - -   - -   - -   - -   - -   - -   -
-   - -   - -   - -   - -   - -   - -   - -   - -   - -   -
-   - -   - -   - -   - -   - -   - -   - -   - -   - -   -
-   - -   - -   - -   - -   - -   - -   - -   - -   - -   -
-   - -   - -   - -   - -   - -   - -   - -   - -   - -   -
-   - -   - -   - -   - -   - -   - -   - -   - -   - -   -
-   - -   - -   - -   - -   - -   - -   - -   - -   - -   -
-   - -   - -   - -   - -   - -   - -   - -   - -   - -   -
-   - -   - -   - -   - -   - -   - -   - -   - -   - -   -
-

-

Headers

-
# H1
-## H2
-### H3
-#### H4
-##### H5
-###### H6
-
-Alternatively, for H1 and H2, an underline-ish style:
-
-Alt-H1
-======
-
-Alt-H2
-------
-

H1

-

H2

-

H3

-

H4

-
H5
-
H6
-

Alternatively, for H1 and H2, an underline-ish style:

-

Alt-H1

-

Alt-H2

-

-

Emphasis

-
Emphasis, aka italics, with *asterisks* or _underscores_.
-
-Strong emphasis, aka bold, with **asterisks** or __underscores__.
-
-Combined emphasis with **asterisks and _underscores_**.
-
-Strikethrough uses two tildes. ~~Scratch this.~~
-

Emphasis, aka italics, with asterisks or underscores.

-

Strong emphasis, aka bold, with asterisks or underscores.

-

Combined emphasis with asterisks and underscores.

-

Strikethrough uses two tildes. Scratch this.

-

-

Lists

-

(In this example, leading and trailing spaces are shown with with dots: ⋅)

-
1. First ordered list item
-2. Another item
-⋅⋅* Unordered sub-list. 
-1. Actual numbers don't matter, just that it's a number
-⋅⋅1. Ordered sub-list
-4. And another item.
-
-⋅⋅⋅You can have properly indented paragraphs within list items. Notice the blank line above, and the leading spaces (at least one, but we'll use three here to also align the raw Markdown).
-
-⋅⋅⋅To have a line break without a paragraph, you will need to use two trailing spaces.⋅⋅
-⋅⋅⋅Note that this line is separate, but within the same paragraph.⋅⋅
-⋅⋅⋅(This is contrary to the typical GFM line break behaviour, where trailing spaces are not required.)
-
-* Unordered list can use asterisks
-- Or minuses
-+ Or pluses
-
    -
  1. First ordered list item
  2. -
  3. Another item
  4. -
-
    -
  • Unordered sub-list.
  • -
-
    -
  1. Actual numbers don’t matter, just that it’s a number
  2. -
  3. Ordered sub-list
  4. -
  5. -

    And another item.

    -

    You can have properly indented paragraphs within list items. Notice the blank line above, and the leading - spaces (at least one, but we’ll use three here to also align the raw Markdown).

    -

    To have a line break without a paragraph, you will need to use two trailing spaces.
    - Note that this line is separate, but within the same paragraph.
    - (This is contrary to the typical GFM line break behaviour, where trailing spaces are not required.)

    -
  6. -
-
    -
  • Unordered list can use asterisks
  • -
  • Or minuses
  • -
  • Or pluses
  • -
-

- -

There are two ways to create links.

-
[I'm an inline-style link](https://www.google.com)
-
-[I'm an inline-style link with title](https://www.google.com "Google's Homepage")
-
-[I'm a reference-style link][Arbitrary case-insensitive reference text]
-
-[I'm a relative reference to a repository file](../blob/master/LICENSE)
-
-[You can use numbers for reference-style link definitions][1]
-
-Or leave it empty and use the [link text itself].
-
-URLs and URLs in angle brackets will automatically get turned into links. 
-http://www.example.com or <http://www.example.com> and sometimes 
-example.com (but not on Github, for example).
-
-Some text to show that the reference links can follow later.
-
-[arbitrary case-insensitive reference text]: https://www.mozilla.org
-[1]: http://slashdot.org
-[link text itself]: http://www.reddit.com
-

I’m an inline-style link

-

I’m an - inline-style link with title

-

I’m a reference-style link

-

I’m a relative reference to a - repository file

-

You can use numbers for reference-style - link definitions

-

Or leave it empty and use the link text - itself.

-

URLs and URLs in angle brackets will automatically get turned into links. http://www.example.com or http://www.example.com and sometimes example.com (but not on - Github, for example).

-

Some text to show that the reference links can follow later.

-

-

Images

-
Here's our logo (hover to see the title text):
-
-Inline-style: 
-![alt text](https://github.com/adam-p/markdown-here/raw/master/src/common/images/icon48.png "Logo Title Text 1")
-
-Reference-style: 
-![alt text][logo]
-
-[logo]: https://github.com/adam-p/markdown-here/raw/master/src/common/images/icon48.png "Logo Title Text 2"
-

Here’s our logo (hover to see the title text):

-

Inline-style: alt text

-

Reference-style: alt text

-

-

Code and Syntax Highlighting

-

Code blocks are part of the Markdown spec, but syntax highlighting isn’t. However, many renderers – like Github’s - and Markdown Here – support syntax highlighting. Which languages are supported and how those language - names should be written will vary from renderer to renderer. Markdown Here supports highlighting for - dozens of languages (and not-really-languages, like diffs and HTTP headers); to see the complete list, and how to - write the language names, see the highlight.js - demo page.

-
Inline `code` has `back-ticks around` it.
-

Inline code has back-ticks around it.

-

Blocks of code are either fenced by lines with three back-ticks ```, or are indented with four - spaces. I recommend only using the fenced code blocks – they’re easier and only they support syntax highlighting. -

-
```javascript
-var s = "JavaScript syntax highlighting";
-alert(s);
-```
- 
-```python
-s = "Python syntax highlighting"
-print s
-```
- 
-```
-No language indicated, so no syntax highlighting. 
-But let's throw in a <b>tag</b>.
-```
-
- - -
No language indicated, so no syntax highlighting in Markdown Here (varies on Github). 
-But let's throw in a <b>tag</b>.
-

-

Tables

-

Tables aren’t part of the core Markdown spec, but they are part of GFM and Markdown Here supports them. - They are an easy way of adding tables to your email – a task that would otherwise require copy-pasting from - another application.

-
Colons can be used to align columns.
-
-| Tables        | Are           | Cool  |
-| ------------- |:-------------:| -----:|
-| col 3 is      | right-aligned | $1600 |
-| col 2 is      | centered      |   $12 |
-| zebra stripes | are neat      |    $1 |
-
-There must be at least 3 dashes separating each header cell.
-The outer pipes (|) are optional, and you don't need to make the 
-raw Markdown line up prettily. You can also use inline Markdown.
-
-Markdown | Less | Pretty
---- | --- | ---
-*Still* | `renders` | **nicely**
-1 | 2 | 3
-

Colons can be used to align columns.

- - - - - - - - - - - - - - - - - - - - - - - - - -
TablesAreCool
col 3 isright-aligned$1600
col 2 iscentered$12
zebra stripesare neat$1
-

There must be at least 3 dashes separating each header cell. The outer pipes (|) are optional, and you don’t need - to make the raw Markdown line up prettily. You can also use inline Markdown.

- - - - - - - - - - - - - - - - - - - - -
MarkdownLessPretty
Stillrendersnicely
123
-

-

Blockquotes

-
> Blockquotes are very handy in email to emulate reply text.
-> This line is part of the same quote.
-
-Quote break.
-
-> This is a very long line that will still be quoted properly when it wraps. Oh boy let's keep writing to make sure this is long enough to actually wrap for everyone. Oh, you can *put* **Markdown** into a blockquote. 
-
-

Blockquotes are very handy in email to emulate reply text. This line is part of the same quote.

-
-

Quote break.

-
-

This is a very long line that will still be quoted properly when it wraps. Oh boy let’s keep writing to make - sure this is long enough to actually wrap for everyone. Oh, you can put Markdown into - a blockquote.

-
-

-

Inline HTML

-

You can also use raw HTML in your Markdown, and it’ll mostly work pretty well.

-
<dl>
-  <dt>Definition list</dt>
-  <dd>Is something people use sometimes.</dd>
-
-  <dt>Markdown in HTML</dt>
-  <dd>Does *not* work **very** well. Use HTML <em>tags</em>.</dd>
-</dl>
-
-
- Definition list -
-
- Is something people use sometimes. -
-
- Markdown in HTML -
-
- Does not work very well. Use HTML tags. -
-
-

-

Horizontal Rule

-
Three or more...
-
----
-
-Hyphens
-
-***
-
-Asterisks
-
-___
-
-Underscores
-

Three or more…

-
-

Hyphens

-
-

Asterisks

-
-

Underscores

-

-

Line Breaks

-

My basic recommendation for learning how line breaks work is to experiment and discover – hit <Enter> once - (i.e., insert one newline), then hit it twice (i.e., insert two newlines), see what happens. You’ll soon learn to - get what you want. “Markdown Toggle” is your friend.

-

Here are some things to try out:

-
Here's a line for us to start with.
-
-This line is separated from the one above by two newlines, so it will be a *separate paragraph*.
-
-This line is also a separate paragraph, but...
-This line is only separated by a single newline, so it's a separate line in the *same paragraph*.
-

Here’s a line for us to start with.

-

This line is separated from the one above by two newlines, so it will be a separate paragraph.

-

This line is also begins a separate paragraph, but…
- This line is only separated by a single newline, so it’s a separate line in the same paragraph.

-

(Technical note: Markdown Here uses GFM line breaks, so there’s no need to use MD’s two-space line - breaks.)

-

-

YouTube Videos

-

They can’t be added directly but you can add an image with a link to the video like this:

-
<a href="http://www.youtube.com/watch?feature=player_embedded&v=YOUTUBE_VIDEO_ID_HERE
-" target="_blank"><img src="http://img.youtube.com/vi/YOUTUBE_VIDEO_ID_HERE/0.jpg" 
-alt="IMAGE ALT TEXT HERE" width="240" height="180" border="10" /></a>
-

Or, in pure Markdown, but losing the image sizing and border:

-
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/YOUTUBE_VIDEO_ID_HERE/0.jpg)](http://www.youtube.com/watch?v=YOUTUBE_VIDEO_ID_HERE)
-
- -
- - - - diff --git a/_Resources/node_modules/web-dev-utils/Markdown-Templates/Markdown-Templates-master/html-readmes/readme-alt-2.html b/_Resources/node_modules/web-dev-utils/Markdown-Templates/Markdown-Templates-master/html-readmes/readme-alt-2.html deleted file mode 100644 index 6560749..0000000 --- a/_Resources/node_modules/web-dev-utils/Markdown-Templates/Markdown-Templates-master/html-readmes/readme-alt-2.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Document - - - - - - - ; -

Project Title

-

One Paragraph of project description goes here

-

Getting Started

-

These instructions will get you a copy of the project up and running on your local machine for development and - testing purposes. See deployment for notes on how to deploy the project on a live system.

-

Prerequisites

-

What things you need to install the software and how to install them

-
Give examples
-

Installing

-

A step by step series of examples that tell you how to get a development env running

-

Say what the step will be

-
Give the example
-

And repeat

-
until finished
-

End with an example of getting some data out of the system or using it for a little demo

-

Running the tests

-

Explain how to run the automated tests for this system

-

Break down into end to end tests

-

Explain what these tests test and why

-
Give an example
-

And coding style tests

-

Explain what these tests test and why

-
Give an example
-

Deployment

-

Add additional notes about how to deploy this on a live system

-

Built With

-
    -
  • Dropwizard - The - web framework used
  • -
  • Maven - Dependency - Management
  • -
  • ROME - Used to - generate RSS Feeds
  • -
-

Contributing

-

Please read CONTRIBUTING.md for details on our code of conduct, and - the process for submitting pull requests to us.

-

Versioning

-

We use SemVer for versioning. For the - versions available, see the tags on this repository.

-

Authors

-
    -
  • Bryan Guner - Initial work - bgoonz
  • -
-

See also the list of contributors who participated in - this project.

-

License

-

This project is licensed under the MIT License - see the LICENSE.md file for details

-

Acknowledgments

-
    -
  • Hat tip to anyone whose code was used
  • -
  • Inspiration
  • -
  • etc
  • -
- - - - - diff --git a/_Resources/node_modules/web-dev-utils/Markdown-Templates/Markdown-Templates-master/html-readmes/right.html b/_Resources/node_modules/web-dev-utils/Markdown-Templates/Markdown-Templates-master/html-readmes/right.html deleted file mode 100644 index 80f6a56..0000000 --- a/_Resources/node_modules/web-dev-utils/Markdown-Templates/Markdown-Templates-master/html-readmes/right.html +++ /dev/null @@ -1,552 +0,0 @@ - - - - - -html-readmes - - - Stable - - - - - - - - - - - - -
Folders
<Go Back>
-
- - - - - -
FileFileFileFileFileFileFileFile
alt-README.html index.html MAIN-README.html notes-te....html readme-a....html README.html right.html Standard....html 
BLANK_RE....html 
- -

-Folders: 1
-Files: 9
-Size of all files: 115222 KB

- - - \ No newline at end of file diff --git a/_Resources/node_modules/web-dev-utils/Markdown-Templates/Markdown-Templates-master/images/logo.png b/_Resources/node_modules/web-dev-utils/Markdown-Templates/Markdown-Templates-master/images/logo.png deleted file mode 100644 index 01219e5..0000000 Binary files a/_Resources/node_modules/web-dev-utils/Markdown-Templates/Markdown-Templates-master/images/logo.png and /dev/null differ diff --git a/_Resources/node_modules/web-dev-utils/Markdown-Templates/Markdown-Templates-master/images/right.html b/_Resources/node_modules/web-dev-utils/Markdown-Templates/Markdown-Templates-master/images/right.html deleted file mode 100644 index 9573fec..0000000 --- a/_Resources/node_modules/web-dev-utils/Markdown-Templates/Markdown-Templates-master/images/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -images - - - Stable - - - - - - - - - - - - -
Folders
<Go Back>
-
- - - - -
FileFileFileFileFileFileFileFile
right.html logo.png screenshot.png 
- -

-Folders: 1
-Files: 3
-Size of all files: 19017 KB

- - - \ No newline at end of file diff --git a/_Resources/node_modules/web-dev-utils/Markdown-Templates/Markdown-Templates-master/images/screenshot.png b/_Resources/node_modules/web-dev-utils/Markdown-Templates/Markdown-Templates-master/images/screenshot.png deleted file mode 100644 index 6a5bf5c..0000000 Binary files a/_Resources/node_modules/web-dev-utils/Markdown-Templates/Markdown-Templates-master/images/screenshot.png and /dev/null differ diff --git a/_Resources/node_modules/web-dev-utils/Markdown-Templates/Markdown-Templates-master/notes-template.md b/_Resources/node_modules/web-dev-utils/Markdown-Templates/Markdown-Templates-master/notes-template.md deleted file mode 100644 index a65ba80..0000000 --- a/_Resources/node_modules/web-dev-utils/Markdown-Templates/Markdown-Templates-master/notes-template.md +++ /dev/null @@ -1,678 +0,0 @@ -# Title ---- -* Description: -> /* Description here */ - - - - - - ---- -## ToC: -- [H1](#h1) - - [H2](#h2) - - [H3](#h3) - - [H4](#h4) - - [H5](#h5) - - [H6](#h6) -- [Alt-H1](#alt-h1) - - [Alt-H2](#alt-h2) - - [Emphasis](#emphasis) - - [Lists](#lists) - - [Links](#links) - - [Images](#images) - - [Code and Syntax Highlighting](#code-and-syntax-highlighting) - - [Tables](#tables) - - [Blockquotes](#blockquotes) - - [Inline HTML](#inline-html) - - [Horizontal Rule](#horizontal-rule) - - [Line Breaks](#line-breaks) - - [YouTube Videos](#youtube-videos) - - - - - ---- - - -## Main Notes: - - - -```html - - - - -``` ---- -```js - - - - - -``` - ---- - - - - - - - - ---- - - - - - - ---- - - - - - - - ---- - - - - - - - - - - - ---- - - - - - - - - - - - - - - - - ---- - - - - - - - ---- -## Resource Links: - -1. []() - - -1. []() - - -2. []() - - -3. []() - - -4. []() - - -5. []() - - - - - - - - - - - - - - - ---- - - - - - -## 10 X 10 Table - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          
          
          
          
          
          
          
          
          
          
- - - - - - - - -## Headers - -```no-highlight -# H1 -## H2 -### H3 -#### H4 -##### H5 -###### H6 - -Alternatively, for H1 and H2, an underline-ish style: - -Alt-H1 -====== - -Alt-H2 ------- -``` - -# H1 -## H2 -### H3 -#### H4 -##### H5 -###### H6 - -Alternatively, for H1 and H2, an underline-ish style: - -Alt-H1 -====== - -Alt-H2 ------- - - - -## Emphasis - -```no-highlight -Emphasis, aka italics, with *asterisks* or _underscores_. - -Strong emphasis, aka bold, with **asterisks** or __underscores__. - -Combined emphasis with **asterisks and _underscores_**. - -Strikethrough uses two tildes. ~~Scratch this.~~ -``` - -Emphasis, aka italics, with *asterisks* or _underscores_. - -Strong emphasis, aka bold, with **asterisks** or __underscores__. - -Combined emphasis with **asterisks and _underscores_**. - -Strikethrough uses two tildes. ~~Scratch this.~~ - - - - -## Lists - -(In this example, leading and trailing spaces are shown with with dots: ⋅) - -```no-highlight -1. First ordered list item -2. Another item -⋅⋅* Unordered sub-list. -1. Actual numbers don't matter, just that it's a number -⋅⋅1. Ordered sub-list -4. And another item. - -⋅⋅⋅You can have properly indented paragraphs within list items. Notice the blank line above, and the leading spaces (at least one, but we'll use three here to also align the raw Markdown). - -⋅⋅⋅To have a line break without a paragraph, you will need to use two trailing spaces.⋅⋅ -⋅⋅⋅Note that this line is separate, but within the same paragraph.⋅⋅ -⋅⋅⋅(This is contrary to the typical GFM line break behaviour, where trailing spaces are not required.) - -* Unordered list can use asterisks -- Or minuses -+ Or pluses -``` - -1. First ordered list item -2. Another item - * Unordered sub-list. -1. Actual numbers don't matter, just that it's a number - 1. Ordered sub-list -4. And another item. - - You can have properly indented paragraphs within list items. Notice the blank line above, and the leading spaces (at least one, but we'll use three here to also align the raw Markdown). - - To have a line break without a paragraph, you will need to use two trailing spaces. - Note that this line is separate, but within the same paragraph. - (This is contrary to the typical GFM line break behaviour, where trailing spaces are not required.) - -* Unordered list can use asterisks -- Or minuses -+ Or pluses - - - -## Links - -There are two ways to create links. - -```no-highlight -[I'm an inline-style link](https://www.google.com) - -[I'm an inline-style link with title](https://www.google.com "Google's Homepage") - -[I'm a reference-style link][Arbitrary case-insensitive reference text] - -[I'm a relative reference to a repository file](../blob/master/LICENSE) - -[You can use numbers for reference-style link definitions][1] - -Or leave it empty and use the [link text itself]. - -URLs and URLs in angle brackets will automatically get turned into links. -http://www.example.com or and sometimes -example.com (but not on Github, for example). - -Some text to show that the reference links can follow later. - -[arbitrary case-insensitive reference text]: https://www.mozilla.org -[1]: http://slashdot.org -[link text itself]: http://www.reddit.com -``` - -[I'm an inline-style link](https://www.google.com) - -[I'm an inline-style link with title](https://www.google.com "Google's Homepage") - -[I'm a reference-style link][Arbitrary case-insensitive reference text] - -[I'm a relative reference to a repository file](../blob/master/LICENSE) - -[You can use numbers for reference-style link definitions][1] - -Or leave it empty and use the [link text itself]. - -URLs and URLs in angle brackets will automatically get turned into links. -http://www.example.com or and sometimes -example.com (but not on Github, for example). - -Some text to show that the reference links can follow later. - -[arbitrary case-insensitive reference text]: https://www.mozilla.org -[1]: http://slashdot.org -[link text itself]: http://www.reddit.com - - - -## Images - -```no-highlight -Here's our logo (hover to see the title text): - -Inline-style: -![alt text](https://github.com/adam-p/markdown-here/raw/master/src/common/images/icon48.png "Logo Title Text 1") - -Reference-style: -![alt text][logo] - -[logo]: https://github.com/adam-p/markdown-here/raw/master/src/common/images/icon48.png "Logo Title Text 2" -``` - -Here's our logo (hover to see the title text): - -Inline-style: -![alt text](https://github.com/adam-p/markdown-here/raw/master/src/common/images/icon48.png "Logo Title Text 1") - -Reference-style: -![alt text][logo] - -[logo]: https://github.com/adam-p/markdown-here/raw/master/src/common/images/icon48.png "Logo Title Text 2" - - - -## Code and Syntax Highlighting - -Code blocks are part of the Markdown spec, but syntax highlighting isn't. However, many renderers -- like Github's and *Markdown Here* -- support syntax highlighting. Which languages are supported and how those language names should be written will vary from renderer to renderer. *Markdown Here* supports highlighting for dozens of languages (and not-really-languages, like diffs and HTTP headers); to see the complete list, and how to write the language names, see the [highlight.js demo page](http://softwaremaniacs.org/media/soft/highlight/test.html). - -```no-highlight -Inline `code` has `back-ticks around` it. -``` - -Inline `code` has `back-ticks around` it. - -Blocks of code are either fenced by lines with three back-ticks ```, or are indented with four spaces. I recommend only using the fenced code blocks -- they're easier and only they support syntax highlighting. - -
```javascript
-var s = "JavaScript syntax highlighting";
-alert(s);
-```
- 
-```python
-s = "Python syntax highlighting"
-print s
-```
- 
-```
-No language indicated, so no syntax highlighting. 
-But let's throw in a <b>tag</b>.
-```
-
- - - -```javascript -var s = "JavaScript syntax highlighting"; -alert(s); -``` - -```python -s = "Python syntax highlighting" -print s -``` - -``` -No language indicated, so no syntax highlighting in Markdown Here (varies on Github). -But let's throw in a tag. -``` - - -
- -## Tables - -Tables aren't part of the core Markdown spec, but they are part of GFM and *Markdown Here* supports them. They are an easy way of adding tables to your email -- a task that would otherwise require copy-pasting from another application. - -```no-highlight -Colons can be used to align columns. - -| Tables | Are | Cool | -| ------------- |:-------------:| -----:| -| col 3 is | right-aligned | $1600 | -| col 2 is | centered | $12 | -| zebra stripes | are neat | $1 | - -There must be at least 3 dashes separating each header cell. -The outer pipes (|) are optional, and you don't need to make the -raw Markdown line up prettily. You can also use inline Markdown. - -Markdown | Less | Pretty ---- | --- | --- -*Still* | `renders` | **nicely** -1 | 2 | 3 -``` - -Colons can be used to align columns. - -| Tables | Are | Cool | -| ------------- |:-------------:| -----:| -| col 3 is | right-aligned | $1600 | -| col 2 is | centered | $12 | -| zebra stripes | are neat | $1 | - -There must be at least 3 dashes separating each header cell. The outer pipes (|) are optional, and you don't need to make the raw Markdown line up prettily. You can also use inline Markdown. - -Markdown | Less | Pretty ---- | --- | --- -*Still* | `renders` | **nicely** -1 | 2 | 3 - - - -## Blockquotes - -```no-highlight -> Blockquotes are very handy in email to emulate reply text. -> This line is part of the same quote. - -Quote break. - -> This is a very long line that will still be quoted properly when it wraps. Oh boy let's keep writing to make sure this is long enough to actually wrap for everyone. Oh, you can *put* **Markdown** into a blockquote. -``` - -> Blockquotes are very handy in email to emulate reply text. -> This line is part of the same quote. - -Quote break. - -> This is a very long line that will still be quoted properly when it wraps. Oh boy let's keep writing to make sure this is long enough to actually wrap for everyone. Oh, you can *put* **Markdown** into a blockquote. - - - -## Inline HTML - -You can also use raw HTML in your Markdown, and it'll mostly work pretty well. - -```no-highlight -
-
Definition list
-
Is something people use sometimes.
- -
Markdown in HTML
-
Does *not* work **very** well. Use HTML tags.
-
-``` - -
-
Definition list
-
Is something people use sometimes.
- -
Markdown in HTML
-
Does *not* work **very** well. Use HTML tags.
-
- -
- -## Horizontal Rule - -``` -Three or more... - ---- - -Hyphens - -*** - -Asterisks - -___ - -Underscores -``` - -Three or more... - ---- - -Hyphens - -*** - -Asterisks - -___ - -Underscores - - - -## Line Breaks - -My basic recommendation for learning how line breaks work is to experiment and discover -- hit <Enter> once (i.e., insert one newline), then hit it twice (i.e., insert two newlines), see what happens. You'll soon learn to get what you want. "Markdown Toggle" is your friend. - -Here are some things to try out: - -``` -Here's a line for us to start with. - -This line is separated from the one above by two newlines, so it will be a *separate paragraph*. - -This line is also a separate paragraph, but... -This line is only separated by a single newline, so it's a separate line in the *same paragraph*. -``` - -Here's a line for us to start with. - -This line is separated from the one above by two newlines, so it will be a *separate paragraph*. - -This line is also begins a separate paragraph, but... -This line is only separated by a single newline, so it's a separate line in the *same paragraph*. - -(Technical note: *Markdown Here* uses GFM line breaks, so there's no need to use MD's two-space line breaks.) - - - -## YouTube Videos - -They can't be added directly but you can add an image with a link to the video like this: - -```no-highlight - -``` - -Or, in pure Markdown, but losing the image sizing and border: - -```no-highlight -[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/YOUTUBE_VIDEO_ID_HERE/0.jpg)](http://www.youtube.com/watch?v=YOUTUBE_VIDEO_ID_HERE) -``` diff --git a/_Resources/node_modules/web-dev-utils/Markdown-Templates/Markdown-Templates-master/readme-alt-2.md b/_Resources/node_modules/web-dev-utils/Markdown-Templates/Markdown-Templates-master/readme-alt-2.md deleted file mode 100644 index 0177d4a..0000000 --- a/_Resources/node_modules/web-dev-utils/Markdown-Templates/Markdown-Templates-master/readme-alt-2.md +++ /dev/null @@ -1,87 +0,0 @@ -# Project Title - -One Paragraph of project description goes here - -## Getting Started - -These instructions will get you a copy of the project up and running on your local machine for development and testing purposes. See deployment for notes on how to deploy the project on a live system. - -### Prerequisites - -What things you need to install the software and how to install them - -``` -Give examples -``` - -### Installing - -A step by step series of examples that tell you how to get a development env running - -Say what the step will be - -``` -Give the example -``` - -And repeat - -``` -until finished -``` - -End with an example of getting some data out of the system or using it for a little demo - -## Running the tests - -Explain how to run the automated tests for this system - -### Break down into end to end tests - -Explain what these tests test and why - -``` -Give an example -``` - -### And coding style tests - -Explain what these tests test and why - -``` -Give an example -``` - -## Deployment - -Add additional notes about how to deploy this on a live system - -## Built With - -* [Dropwizard](http://www.dropwizard.io/1.0.2/docs/) - The web framework used -* [Maven](https://maven.apache.org/) - Dependency Management -* [ROME](https://rometools.github.io/rome/) - Used to generate RSS Feeds - -## Contributing - -Please read [CONTRIBUTING.md](https://gist.github.com/bgoonz) for details on our code of conduct, and the process for submitting pull requests to us. - -## Versioning - -We use [SemVer](http://semver.org/) for versioning. For the versions available, see the [tags on this repository](https://github.com/your/project/tags). - -## Authors - -* **Bryan Guner** - *Initial work* - [bgoonz](https://github.com/bgoonz) - -See also the list of [contributors](https://github.com/your/project/contributors) who participated in this project. - -## License - -This project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details - -## Acknowledgments - -* Hat tip to anyone whose code was used -* Inspiration -* etc diff --git a/_Resources/node_modules/web-dev-utils/Markdown-Templates/Markdown-Templates-master/right.html b/_Resources/node_modules/web-dev-utils/Markdown-Templates/Markdown-Templates-master/right.html deleted file mode 100644 index 89c29f3..0000000 --- a/_Resources/node_modules/web-dev-utils/Markdown-Templates/Markdown-Templates-master/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -Markdown-Templates-master - - - Stable - - - - - - - - - - - - -
Folders
<Go Back> html-readmes images
-
- - - - -
FileFileFileFileFileFileFileFile
right.html alt-README.md BLANK_README.md MAIN-README.md notes-te...te.md readme-alt-2.md README.md Standard...ME.md 
- -

-Folders: 3
-Files: 8
-Size of all files: 63286 KB

- - - \ No newline at end of file diff --git a/_Resources/node_modules/web-dev-utils/Markdown-Templates/right.html b/_Resources/node_modules/web-dev-utils/Markdown-Templates/right.html deleted file mode 100644 index c740427..0000000 --- a/_Resources/node_modules/web-dev-utils/Markdown-Templates/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -Markdown-Templates - - - Stable - - - - - - - - - - - - -
Folders
<Go Back> Markdown...aster
-
- - - - -
FileFileFileFileFileFileFileFile
right.html 
- -

-Folders: 2
-Files: 1
-Size of all files: 13768 KB

- - - \ No newline at end of file diff --git a/_Resources/node_modules/web-dev-utils/README.md b/_Resources/node_modules/web-dev-utils/README.md deleted file mode 100644 index 6d415d6..0000000 --- a/_Resources/node_modules/web-dev-utils/README.md +++ /dev/null @@ -1,156 +0,0 @@ --testing - -
- - - - - - ![logo](https://avatars.githubusercontent.com/u/66654881?s=460&u=fa9d2cc45bc228dd9b7d3dee6d4653f940fab35a&v=4) - - -# MY WEB-DEV UTILITIES NPM PACKAGE - - -### This code is not exclusivley written by me ... it is just a list of files I use often during website development... use at your own risk - - - - -## Copy-2-Clipboard: - -![](./images/copy-2-clip.PNG) - ---- - -## Git-Html Preview-Tool: - -![](images/git-preview.gif) - - - ---- - -## Markdown Templates: - -![](images/markdown-template.png) - ---- - -## Text Tools: - -![](images/TexTools.PNG) - - ---- - -## Automatic Table Of Contents Generator: - -![](images/toc.PNG) - - - ---- - -## Text-File-2-JS-Array: - -![](images/text-file-2-JS-Array.PNG) - - ---- - -### Usage: - -```bash -npm i web-dev-utils -``` - -
---- - -``` -. -├── GIT-HTML-PREVIEW-TOOL -│   └── GIT-HTML-PREVIEW-TOOL-master -├── Markdown-Templates-master -│   └── Markdown-Templates-master -│   └── images -├── TexTools-master -│   └── TexTools-master -│   ├── backup-stable-build -│   │   ├── css -│   │   └── js -│   ├── css -│   ├── js -│   └── sandbox -├── bootstrap-4.3.1-dist -│   ├── css -│   └── js -├── jquery -│   ├── dist -│   ├── external -│   │   └── sizzle -│   │   └── dist -│   └── src -│   ├── ajax -│   │   └── var -│   ├── attributes -│   ├── core -│   │   └── var -│   ├── css -│   │   └── var -│   ├── data -│   │   └── var -│   ├── deferred -│   ├── deprecated -│   ├── effects -│   ├── event -│   ├── exports -│   ├── manipulation -│   │   └── var -│   ├── queue -│   ├── traversing -│   │   └── var -│   └── var -├── loadashes6 -│   └── lodash -│   └── fp -├── mout -│   ├── array -│   ├── collection -│   ├── date -│   │   └── i18n -│   ├── doc -│   ├── function -│   ├── lang -│   ├── math -│   ├── number -│   ├── object -│   ├── queryString -│   ├── random -│   ├── src -│   │   ├── array -│   │   ├── collection -│   │   ├── date -│   │   │   └── i18n -│   │   ├── function -│   │   ├── lang -│   │   ├── math -│   │   ├── number -│   │   ├── object -│   │   ├── queryString -│   │   ├── random -│   │   ├── string -│   │   └── time -│   ├── string -│   └── time -└── personal-utilities - ├── Auto-table-Of-Contents - ├── copy-2-clip - ├── css - ├── html - ├── js - └── prism - -81 directories -``` diff --git a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/.vscode/settings.json b/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/.vscode/settings.json deleted file mode 100644 index 54ece48..0000000 --- a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "liveServer.settings.port": 5503 -} \ No newline at end of file diff --git a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/README.md b/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/README.md deleted file mode 100644 index fec74ca..0000000 --- a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/README.md +++ /dev/null @@ -1,113 +0,0 @@ - - -
- - - - -# Deployment: - -[deployment](https://devtools42.netlify.app/) - - -# TexTools . - -[![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/colored.png)](#-) - - - **TOC** - [About](#about) ● [Features](#features) ● [How It Works](#how-it-works) ● [Installation](#installation) ● [Development](#development) ● [Contact](#contact) - - - - ![logo](https://avatars.githubusercontent.com/u/66654881?s=460&u=fa9d2cc45bc228dd9b7d3dee6d4653f940fab35a&v=4) - - [![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/colored.png)](#-) - -GitjQueryJavaScriptNodeJSCSS3HTML5BootstrapBitbucketAdobe XDRepl.it - - [![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/colored.png)](#-) - - - -# Usage: - -

-# Tools - -## \*8 text manipulation tools: . - ->1. Duplicate Remover (duplicate lines... Case and whitespace sensative) - -[![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/colored.png)](#-) - - ->2. Find and Replace - -[![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/colored.png)](#-) - - ->3. Compare Text Files: compares text files and if common text is detected between them only one of them will retain the text that previously existed in both. - -[![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/colored.png)](#-) - - ->4. Add Prefix/Suffix (by line.. not by file) - -[![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/colored.png)](#-) - - ->5. White Space remover (It removes all the whitespace within your text. I use it for creating javascript for iMacros for Firefox) - -[![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/colored.png)](#-) - - ->6. Sort Text Lines (It sorts text lines alphabetically in ascending and descending order) - -[![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/colored.png)](#-) - - ->7. Replace Lines Breaks (Replace line breaks with some text. One of the example where it can be used is to convert a normal text file with line breaks to csv type file.) - -[![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/colored.png)](#-) - - ->8. Letter Case Converter (Converts the letter case of your text. Currently , only upper and lower letter cases are supported). - - -##Bryan Guner -*(Full-stack software developer)* - -[![Portfolio](https://img.shields.io/badge/-❤_Portfolio-f58?style=flat-square&logo=a&logoColor=white&link=https://bgoonz.github.io/)](https://bgoonz.github.io) -![Resume PDF](https://img.shields.io/badge/-Resume-f00?style=flat-square&logo=adobe-acrobat-reader&logoColor=white) -[![Bryan's email](https://img.shields.io/badge/bryan.guner@gmail.com-f4b400?style=flat-square&logo=gmail&logoColor=black&link=mailto:bryan.guner@gmail.com)](mailto:bryan.guner@gmail.com) -[![Blog](https://img.shields.io/badge/-Blog-21759b?style=flat-square&logo=WordPress&logoColor=white&link=https://web-dev-hub.com/)](https://web-dev-hub.com/) -[![Linkedin](https://img.shields.io/badge/-LinkedIn-0077b5?style=flat-square&logo=Linkedin&logoColor=white&link=https://www.linkedin.com/in/bryan-guner-046199128/)](https://www.linkedin.com/in/bryan-guner-046199128/) -[![AngelList](https://img.shields.io/badge/-AngelList-black?style=flat-square&logo=AngelList&logoColor=white&link=https://angel.co/u/bryan-guner)](https://angel.co/u/bryan-guner) -[![GitHub bgoonz](https://img.shields.io/github/followers/bgoonz?label=follow&style=social)](https://github.com/bgoonz) - -

- -
- -[![-----------------------------------------------------](https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/colored.png)](#-) - - - - - - diff --git a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/backup-stable-build/compare-text-files.html b/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/backup-stable-build/compare-text-files.html deleted file mode 100644 index ab5dd38..0000000 --- a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/backup-stable-build/compare-text-files.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - - - - - Compare Text Files - - - - - - - - - - - -
- - - - - - -
- - - - -
-

Compare files and delete duplicate lines

-

This tool compare two texts and removes the duplicate lines which exist in both files. - The duplicates are only removed from second file so the output will contain only the non-duplicate data of - the second file.

-

Paste your text in the original text box below. This text will be used - for comparison to find duplicate lines from the other text.

-

Finally, click the "Remove Duplicates" button. -

- -
- -
-
-
- - - - -
- -
-
-
- -
-
- -
- - - - - - - - - - - - - - - - - - diff --git a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/backup-stable-build/css/bootstrap.min.css b/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/backup-stable-build/css/bootstrap.min.css deleted file mode 100644 index e6b4977..0000000 --- a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/backup-stable-build/css/bootstrap.min.css +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v4.2.1 (https://getbootstrap.com/) - * Copyright 2011-2018 The Bootstrap Authors - * Copyright 2011-2018 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-family:inherit;font-weight:500;line-height:1.2;color:inherit}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.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-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.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-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.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-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;margin-bottom:1rem;background-color:transparent}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table .table{background-color:#fff}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#7abaff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#b3b7bb}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#8fd19e}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#86cfda}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ffdf7e}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#ed969e}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#95999c}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#212529;border-color:#32383e}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#212529}.table-dark td,.table-dark th,.table-dark thead th{border-color:#32383e}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(2.25rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.8125rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(2.875rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.form-control.is-valid,.was-validated .form-control:valid{border-color:#28a745;padding-right:2.25rem;background-repeat:no-repeat;background-position:center right calc(2.25rem / 4);background-size:calc(2.25rem / 2) calc(2.25rem / 2);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e")}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:2.25rem;background-position:top calc(2.25rem / 4) right calc(2.25rem / 4)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#28a745;padding-right:3.4375rem;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") no-repeat center right 1.75rem/1.125rem 1.125rem}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip{display:block}.form-control-file.is-valid~.valid-feedback,.form-control-file.is-valid~.valid-tooltip,.was-validated .form-control-file:valid~.valid-feedback,.was-validated .form-control-file:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{border-color:#28a745}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{border-color:#34ce57;background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:2.25rem;background-repeat:no-repeat;background-position:center right calc(2.25rem / 4);background-size:calc(2.25rem / 2) calc(2.25rem / 2);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E")}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:2.25rem;background-position:top calc(2.25rem / 4) right calc(2.25rem / 4)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#dc3545;padding-right:3.4375rem;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E") no-repeat center right 1.75rem/1.125rem 1.125rem}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip{display:block}.form-control-file.is-invalid~.invalid-feedback,.form-control-file.is-invalid~.invalid-tooltip,.was-validated .form-control-file:invalid~.invalid-feedback,.was-validated .form-control-file:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{border-color:#dc3545}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{border-color:#e4606d;background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff}.btn-link:hover{color:#0056b3;text-decoration:underline}.btn-link.focus,.btn-link:focus{text-decoration:underline;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media screen and (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media screen and (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-right{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-right{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-right{right:0;left:auto}}.dropdown-menu-left{right:auto;left:0}@media (min-width:576px){.dropdown-menu-sm-left{right:auto;left:0}}@media (min-width:768px){.dropdown-menu-md-left{right:auto;left:0}}@media (min-width:992px){.dropdown-menu-lg-left{right:auto;left:0}}@media (min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:first-child{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.dropdown-item:last-child{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:1 1 auto;flex:1 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(2.875rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.8125rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#007bff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#80bdff}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#b3d7ff;border-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:#adb5bd solid 1px}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background-repeat:no-repeat;background-position:center center;background-size:50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{border-color:#007bff;background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label::after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff;-webkit-transform:translateX(.75rem);transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(2.25rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(128,189,255,.5)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{height:calc(1.8125rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(2.875rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(2.25rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(2.25rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:disabled~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(2.25rem + 2px);padding:.375rem .75rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:2.25rem;padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:calc(1rem + .4rem);padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media screen and (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media screen and (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media screen and (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler:not(:disabled):not(.disabled){cursor:pointer}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;color:inherit;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-ms-flexbox;display:flex;-ms-flex:1 0 0%;flex:1 0 0%;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:first-child .card-header,.card-group>.card:first-child .card-img-top{border-top-right-radius:0}.card-group>.card:first-child .card-footer,.card-group>.card:first-child .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:last-child .card-header,.card-group>.card:last-child .card-img-top{border-top-left-radius:0}.card-group>.card:last-child .card-footer,.card-group>.card:last-child .card-img-bottom{border-bottom-left-radius:0}.card-group>.card:only-child{border-radius:.25rem}.card-group>.card:only-child .card-header,.card-group>.card:only-child .card-img-top{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-group>.card:only-child .card-footer,.card-group>.card:only-child .card-img-bottom{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-group>.card:not(:first-child):not(:last-child):not(:only-child){border-radius:0}.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-footer,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-header,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-top{border-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion .card{overflow:hidden}.accordion .card:not(:first-of-type) .card-header:first-child{border-radius:0}.accordion .card:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.accordion .card:first-of-type{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion .card:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.accordion .card .card-header{margin-bottom:-1px}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-link:not(:disabled):not(.disabled){cursor:pointer}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#0062cc}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#545b62}.badge-success{color:#fff;background-color:#28a745}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#1e7e34}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#117a8b}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:focus,a.badge-warning:hover{color:#212529;background-color:#d39e00}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#bd2130}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:focus,a.badge-light:hover{color:#212529;background-color:#dae0e5}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#1d2124}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media screen and (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{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);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item:focus,.list-group-item:hover{z-index:1;text-decoration:none}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush .list-group-item:last-child{margin-bottom:-1px}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{margin-bottom:0;border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled){cursor:pointer}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}a.close.disabled{pointer-events:none}.toast{max-width:350px;overflow:hidden;font-size:.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);border-radius:.25rem;box-shadow:0 .25rem .75rem rgba(0,0,0,.1);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);opacity:0}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-50px);transform:translate(0,-50px)}@media screen and (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - (.5rem * 2))}.modal-dialog-centered::before{display:block;height:calc(100vh - (.5rem * 2));content:""}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #e9ecef;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #e9ecef;border-bottom-right-radius:.3rem;border-bottom-left-radius:.3rem}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-centered{min-height:calc(100% - (1.75rem * 2))}.modal-dialog-centered::before{height:calc(100vh - (1.75rem * 2))}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top] .arrow,.bs-popover-top .arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::after,.bs-popover-top .arrow::before{border-width:.5rem .5rem 0}.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::before{bottom:0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-top .arrow::after{bottom:1px;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right] .arrow,.bs-popover-right .arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::after,.bs-popover-right .arrow::before{border-width:.5rem .5rem .5rem 0}.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::before{left:0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-right .arrow::after{left:1px;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom] .arrow,.bs-popover-bottom .arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::after,.bs-popover-bottom .arrow::before{border-width:0 .5rem .5rem .5rem}.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::before{top:0;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-bottom .arrow::after{top:1px;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left] .arrow,.bs-popover-left .arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::after,.bs-popover-left .arrow::before{border-width:.5rem 0 .5rem .5rem}.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::before{right:0;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-left .arrow::after{right:1px;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;color:inherit;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{-ms-touch-action:pan-y;touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){-webkit-transform:translateX(100%);transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){-webkit-transform:translateX(-100%);transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;-webkit-transform:none;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:0s .6s opacity}@media screen and (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5;transition:opacity .15s ease}@media screen and (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:transparent no-repeat center center;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media screen and (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:spinner-border .75s linear infinite;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:spinner-grow .75s linear infinite;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-3by4::before{padding-top:133.333333%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0056b3!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#a71d2a!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}} -/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/backup-stable-build/css/right.html b/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/backup-stable-build/css/right.html deleted file mode 100644 index 8765260..0000000 --- a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/backup-stable-build/css/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -css - - - Stable - - - - - - - - - - - - -
Folders
<Go Back>
-
- - - - -
FileFileFileFileFileFileFileFile
bootstra...n.css simple-s...r.css right.html 
- -

-Folders: 1
-Files: 3
-Size of all files: 168275 KB

- - - \ No newline at end of file diff --git a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/backup-stable-build/css/simple-sidebar.css b/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/backup-stable-build/css/simple-sidebar.css deleted file mode 100644 index 9b92f5b..0000000 --- a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/backup-stable-build/css/simple-sidebar.css +++ /dev/null @@ -1,49 +0,0 @@ -/*! - * Start Bootstrap - Simple Sidebar (https://startbootstrap.com/template-overviews/simple-sidebar) - * Copyright 2013-2019 Start Bootstrap - * Licensed under MIT (https://github.com/BlackrockDigital/startbootstrap-simple-sidebar/blob/master/LICENSE) - */ -body { - overflow-x: hidden; -} - -#sidebar-wrapper { - min-height: 100vh; - margin-left: -15rem; - -webkit-transition: margin .25s ease-out; - -moz-transition: margin .25s ease-out; - -o-transition: margin .25s ease-out; - transition: margin .25s ease-out; -} - -#sidebar-wrapper .sidebar-heading { - padding: 0.875rem 1.25rem; - font-size: 1.2rem; -} - -#sidebar-wrapper .list-group { - width: 15rem; -} - -#page-content-wrapper { - min-width: 100vw; -} - -#wrapper.toggled #sidebar-wrapper { - margin-left: 0; -} - -@media (min-width: 768px) { - #sidebar-wrapper { - margin-left: 0; - } - - #page-content-wrapper { - min-width: 0; - width: 100%; - } - - #wrapper.toggled #sidebar-wrapper { - margin-left: -15rem; - } -} diff --git a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/backup-stable-build/duplicate-text-line-remover.html b/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/backup-stable-build/duplicate-text-line-remover.html deleted file mode 100644 index 0fa1e43..0000000 --- a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/backup-stable-build/duplicate-text-line-remover.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - Duplicate Text Line Remover - - - - - - - - - - - -
- - - - - - -
- - - - -
-

Duplicate Text Line Remover

-

First, paste your text in the input box below. Then, click on the "Remove duplicate - Lines".

-

Finally, You will get your file in an output box with all the duplicates removed.

- -
- -
-
- -
- - - -
-
-
-
-
- -
- - - - - - - - - - - - - - - - - - - diff --git a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/backup-stable-build/find-replace-text.html b/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/backup-stable-build/find-replace-text.html deleted file mode 100644 index 88d5541..0000000 --- a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/backup-stable-build/find-replace-text.html +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - - - - - Find and Replace Text - - - - - - - - - - - -
- - - - - - -
- - - - -
-

Find and Replace Text

-

First, paste your text in the input box below. Write the text, in the appropriate - boxes, you want to find - and what text do you want to replace it with.

-

Finally, click the "Find and Replace" button. -

- -
- -
-
- -
- Find - - - - - - - -
- - - -
-
-
-
-
- -
- - - - - - - - - - - - - - - - - - diff --git a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/backup-stable-build/index.html b/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/backup-stable-build/index.html deleted file mode 100644 index f33f17a..0000000 --- a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/backup-stable-build/index.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - TexTools Tools - - - - - - - - - - - -
- - - - - - -
- - - - -
-

TexTools Tools

-

You need Javascript enabled in your web-browser to use this website. -

You can choose the appropriate tool from below and use it.

- -
- - -
- -
- -
Duplicate Text Line Remover
-
-

Removes Duplicate Lines from your file.

-

- Please Note: Make sure that your data is on seperate lines.

-
- - -
- -
Find and Replace
-
-

Find and replace Words in your text.

-
- - -
- -
Compare Text Files (Remove Dupes)
-
-

Compare files and remove duplicates of one file from the other.

-
- -
- -
Add Prefix/Suffix to Lines
-
-

Add text before or at the end of each line.

-
-
- - - - -
- -
- -
WhiteSpace Remover
-
-

Removes all the whitespace in your text including space.

-
- - -
- -
Sort Text Lines
-
-

Sorts data lines in ascending or descending order.

-
- -
- -
Replace Line Breaks
-
-

Replace line breaks with anything text, for example a comma (,).

-
- -
- -
Letter Case Converter
-
-

Convert Letter Cases of your text.

-
- -
- - - - - - -
- -
- - - - - - - - - - - - - - - - - - - - - - diff --git a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/backup-stable-build/js/bootstrap.bundle.min.js b/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/backup-stable-build/js/bootstrap.bundle.min.js deleted file mode 100644 index 97f14c0..0000000 --- a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/backup-stable-build/js/bootstrap.bundle.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v4.2.1 (https://getbootstrap.com/) - * Copyright 2011-2018 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jquery")):"function"==typeof define&&define.amd?define(["exports","jquery"],e):e(t.bootstrap={},t.jQuery)}(this,function(t,p){"use strict";function i(t,e){for(var n=0;nthis._items.length-1||t<0))if(this._isSliding)p(this._element).one(q.SLID,function(){return e.to(t)});else{if(n===t)return this.pause(),void this.cycle();var i=n=i.clientWidth&&n>=i.clientHeight}),h=0l[t]&&!i.escapeWithReference&&(n=Math.min(h[e],l[t]-("right"===t?h.width:h.height))),Kt({},e,n)}};return c.forEach(function(t){var e=-1!==["left","top"].indexOf(t)?"primary":"secondary";h=Qt({},h,u[e](t))}),t.offsets.popper=h,t},priority:["left","right","top","bottom"],padding:5,boundariesElement:"scrollParent"},keepTogether:{order:400,enabled:!0,fn:function(t){var e=t.offsets,n=e.popper,i=e.reference,o=t.placement.split("-")[0],r=Math.floor,s=-1!==["top","bottom"].indexOf(o),a=s?"right":"bottom",l=s?"left":"top",c=s?"width":"height";return n[a]r(i[a])&&(t.offsets.popper[l]=r(i[a])),t}},arrow:{order:500,enabled:!0,fn:function(t,e){var n;if(!fe(t.instance.modifiers,"arrow","keepTogether"))return t;var i=e.element;if("string"==typeof i){if(!(i=t.instance.popper.querySelector(i)))return t}else if(!t.instance.popper.contains(i))return console.warn("WARNING: `arrow.element` must be child of its popper element!"),t;var o=t.placement.split("-")[0],r=t.offsets,s=r.popper,a=r.reference,l=-1!==["left","right"].indexOf(o),c=l?"height":"width",h=l?"Top":"Left",u=h.toLowerCase(),f=l?"left":"top",d=l?"bottom":"right",p=$t(i)[c];a[d]-ps[d]&&(t.offsets.popper[u]+=a[u]+p-s[d]),t.offsets.popper=Yt(t.offsets.popper);var m=a[u]+a[c]/2-p/2,g=Nt(t.instance.popper),_=parseFloat(g["margin"+h],10),v=parseFloat(g["border"+h+"Width"],10),y=m-t.offsets.popper[u]-_-v;return y=Math.max(Math.min(s[c]-p,y),0),t.arrowElement=i,t.offsets.arrow=(Kt(n={},u,Math.round(y)),Kt(n,f,""),n),t},element:"[x-arrow]"},flip:{order:600,enabled:!0,fn:function(p,m){if(oe(p.instance.modifiers,"inner"))return p;if(p.flipped&&p.placement===p.originalPlacement)return p;var g=Gt(p.instance.popper,p.instance.reference,m.padding,m.boundariesElement,p.positionFixed),_=p.placement.split("-")[0],v=te(_),y=p.placement.split("-")[1]||"",E=[];switch(m.behavior){case ge:E=[_,v];break;case _e:E=me(_);break;case ve:E=me(_,!0);break;default:E=m.behavior}return E.forEach(function(t,e){if(_!==t||E.length===e+1)return p;_=p.placement.split("-")[0],v=te(_);var n,i=p.offsets.popper,o=p.offsets.reference,r=Math.floor,s="left"===_&&r(i.right)>r(o.left)||"right"===_&&r(i.left)r(o.top)||"bottom"===_&&r(i.top)r(g.right),c=r(i.top)r(g.bottom),u="left"===_&&a||"right"===_&&l||"top"===_&&c||"bottom"===_&&h,f=-1!==["top","bottom"].indexOf(_),d=!!m.flipVariations&&(f&&"start"===y&&a||f&&"end"===y&&l||!f&&"start"===y&&c||!f&&"end"===y&&h);(s||u||d)&&(p.flipped=!0,(s||u)&&(_=E[e+1]),d&&(y="end"===(n=y)?"start":"start"===n?"end":n),p.placement=_+(y?"-"+y:""),p.offsets.popper=Qt({},p.offsets.popper,ee(p.instance.popper,p.offsets.reference,p.placement)),p=ie(p.instance.modifiers,p,"flip"))}),p},behavior:"flip",padding:5,boundariesElement:"viewport"},inner:{order:700,enabled:!1,fn:function(t){var e=t.placement,n=e.split("-")[0],i=t.offsets,o=i.popper,r=i.reference,s=-1!==["left","right"].indexOf(n),a=-1===["top","left"].indexOf(n);return o[s?"left":"top"]=r[n]-(a?o[s?"width":"height"]:0),t.placement=te(e),t.offsets.popper=Yt(o),t}},hide:{order:800,enabled:!0,fn:function(t){if(!fe(t.instance.modifiers,"hide","preventOverflow"))return t;var e=t.offsets.reference,n=ne(t.instance.modifiers,function(t){return"preventOverflow"===t.name}).boundaries;if(e.bottomn.right||e.top>n.bottom||e.rightdocument.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},t._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},t._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right
',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent"},Cn="show",Sn="out",Dn={HIDE:"hide"+_n,HIDDEN:"hidden"+_n,SHOW:"show"+_n,SHOWN:"shown"+_n,INSERTED:"inserted"+_n,CLICK:"click"+_n,FOCUSIN:"focusin"+_n,FOCUSOUT:"focusout"+_n,MOUSEENTER:"mouseenter"+_n,MOUSELEAVE:"mouseleave"+_n},In="fade",An="show",On=".tooltip-inner",Nn=".arrow",kn="hover",Ln="focus",Pn="click",xn="manual",Hn=function(){function i(t,e){if("undefined"==typeof be)throw new TypeError("Bootstrap's tooltips require Popper.js (https://popper.js.org/)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var t=i.prototype;return t.enable=function(){this._isEnabled=!0},t.disable=function(){this._isEnabled=!1},t.toggleEnabled=function(){this._isEnabled=!this._isEnabled},t.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=p(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),p(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(p(this.getTipElement()).hasClass(An))return void this._leave(null,this);this._enter(null,this)}},t.dispose=function(){clearTimeout(this._timeout),p.removeData(this.element,this.constructor.DATA_KEY),p(this.element).off(this.constructor.EVENT_KEY),p(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&p(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,(this._activeTrigger=null)!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},t.show=function(){var e=this;if("none"===p(this.element).css("display"))throw new Error("Please use show on visible elements");var t=p.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){p(this.element).trigger(t);var n=m.findShadowRoot(this.element),i=p.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(t.isDefaultPrevented()||!i)return;var o=this.getTipElement(),r=m.getUID(this.constructor.NAME);o.setAttribute("id",r),this.element.setAttribute("aria-describedby",r),this.setContent(),this.config.animation&&p(o).addClass(In);var s="function"==typeof this.config.placement?this.config.placement.call(this,o,this.element):this.config.placement,a=this._getAttachment(s);this.addAttachmentClass(a);var l=this._getContainer();p(o).data(this.constructor.DATA_KEY,this),p.contains(this.element.ownerDocument.documentElement,this.tip)||p(o).appendTo(l),p(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new be(this.element,o,{placement:a,modifiers:{offset:{offset:this.config.offset},flip:{behavior:this.config.fallbackPlacement},arrow:{element:Nn},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}}),p(o).addClass(An),"ontouchstart"in document.documentElement&&p(document.body).children().on("mouseover",null,p.noop);var c=function(){e.config.animation&&e._fixTransition();var t=e._hoverState;e._hoverState=null,p(e.element).trigger(e.constructor.Event.SHOWN),t===Sn&&e._leave(null,e)};if(p(this.tip).hasClass(In)){var h=m.getTransitionDurationFromElement(this.tip);p(this.tip).one(m.TRANSITION_END,c).emulateTransitionEnd(h)}else c()}},t.hide=function(t){var e=this,n=this.getTipElement(),i=p.Event(this.constructor.Event.HIDE),o=function(){e._hoverState!==Cn&&n.parentNode&&n.parentNode.removeChild(n),e._cleanTipClass(),e.element.removeAttribute("aria-describedby"),p(e.element).trigger(e.constructor.Event.HIDDEN),null!==e._popper&&e._popper.destroy(),t&&t()};if(p(this.element).trigger(i),!i.isDefaultPrevented()){if(p(n).removeClass(An),"ontouchstart"in document.documentElement&&p(document.body).children().off("mouseover",null,p.noop),this._activeTrigger[Pn]=!1,this._activeTrigger[Ln]=!1,this._activeTrigger[kn]=!1,p(this.tip).hasClass(In)){var r=m.getTransitionDurationFromElement(n);p(n).one(m.TRANSITION_END,o).emulateTransitionEnd(r)}else o();this._hoverState=""}},t.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},t.isWithContent=function(){return Boolean(this.getTitle())},t.addAttachmentClass=function(t){p(this.getTipElement()).addClass(yn+"-"+t)},t.getTipElement=function(){return this.tip=this.tip||p(this.config.template)[0],this.tip},t.setContent=function(){var t=this.getTipElement();this.setElementContent(p(t.querySelectorAll(On)),this.getTitle()),p(t).removeClass(In+" "+An)},t.setElementContent=function(t,e){var n=this.config.html;"object"==typeof e&&(e.nodeType||e.jquery)?n?p(e).parent().is(t)||t.empty().append(e):t.text(p(e).text()):t[n?"html":"text"](e)},t.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},t._getContainer=function(){return!1===this.config.container?document.body:m.isElement(this.config.container)?p(this.config.container):p(document).find(this.config.container)},t._getAttachment=function(t){return wn[t.toUpperCase()]},t._setListeners=function(){var i=this;this.config.trigger.split(" ").forEach(function(t){if("click"===t)p(i.element).on(i.constructor.Event.CLICK,i.config.selector,function(t){return i.toggle(t)});else if(t!==xn){var e=t===kn?i.constructor.Event.MOUSEENTER:i.constructor.Event.FOCUSIN,n=t===kn?i.constructor.Event.MOUSELEAVE:i.constructor.Event.FOCUSOUT;p(i.element).on(e,i.config.selector,function(t){return i._enter(t)}).on(n,i.config.selector,function(t){return i._leave(t)})}}),p(this.element).closest(".modal").on("hide.bs.modal",function(){i.element&&i.hide()}),this.config.selector?this.config=l({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},t._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},t._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||p(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),p(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusin"===t.type?Ln:kn]=!0),p(e.getTipElement()).hasClass(An)||e._hoverState===Cn?e._hoverState=Cn:(clearTimeout(e._timeout),e._hoverState=Cn,e.config.delay&&e.config.delay.show?e._timeout=setTimeout(function(){e._hoverState===Cn&&e.show()},e.config.delay.show):e.show())},t._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||p(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),p(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusout"===t.type?Ln:kn]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=Sn,e.config.delay&&e.config.delay.hide?e._timeout=setTimeout(function(){e._hoverState===Sn&&e.hide()},e.config.delay.hide):e.hide())},t._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},t._getConfig=function(t){return"number"==typeof(t=l({},this.constructor.Default,p(this.element).data(),"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),m.typeCheckConfig(mn,t,this.constructor.DefaultType),t},t._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},t._cleanTipClass=function(){var t=p(this.getTipElement()),e=t.attr("class").match(En);null!==e&&e.length&&t.removeClass(e.join(""))},t._handlePopperPlacementChange=function(t){var e=t.instance;this.tip=e.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},t._fixTransition=function(){var t=this.getTipElement(),e=this.config.animation;null===t.getAttribute("x-placement")&&(p(t).removeClass(In),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},i._jQueryInterface=function(n){return this.each(function(){var t=p(this).data(gn),e="object"==typeof n&&n;if((t||!/dispose|hide/.test(n))&&(t||(t=new i(this,e),p(this).data(gn,t)),"string"==typeof n)){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.2.1"}},{key:"Default",get:function(){return Tn}},{key:"NAME",get:function(){return mn}},{key:"DATA_KEY",get:function(){return gn}},{key:"Event",get:function(){return Dn}},{key:"EVENT_KEY",get:function(){return _n}},{key:"DefaultType",get:function(){return bn}}]),i}();p.fn[mn]=Hn._jQueryInterface,p.fn[mn].Constructor=Hn,p.fn[mn].noConflict=function(){return p.fn[mn]=vn,Hn._jQueryInterface};var jn="popover",Rn="bs.popover",Fn="."+Rn,Mn=p.fn[jn],Wn="bs-popover",Un=new RegExp("(^|\\s)"+Wn+"\\S+","g"),Bn=l({},Hn.Default,{placement:"right",trigger:"click",content:"",template:''}),qn=l({},Hn.DefaultType,{content:"(string|element|function)"}),Kn="fade",Qn="show",Yn=".popover-header",Vn=".popover-body",Xn={HIDE:"hide"+Fn,HIDDEN:"hidden"+Fn,SHOW:"show"+Fn,SHOWN:"shown"+Fn,INSERTED:"inserted"+Fn,CLICK:"click"+Fn,FOCUSIN:"focusin"+Fn,FOCUSOUT:"focusout"+Fn,MOUSEENTER:"mouseenter"+Fn,MOUSELEAVE:"mouseleave"+Fn},zn=function(t){var e,n;function i(){return t.apply(this,arguments)||this}n=t,(e=i).prototype=Object.create(n.prototype),(e.prototype.constructor=e).__proto__=n;var o=i.prototype;return o.isWithContent=function(){return this.getTitle()||this._getContent()},o.addAttachmentClass=function(t){p(this.getTipElement()).addClass(Wn+"-"+t)},o.getTipElement=function(){return this.tip=this.tip||p(this.config.template)[0],this.tip},o.setContent=function(){var t=p(this.getTipElement());this.setElementContent(t.find(Yn),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(Vn),e),t.removeClass(Kn+" "+Qn)},o._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},o._cleanTipClass=function(){var t=p(this.getTipElement()),e=t.attr("class").match(Un);null!==e&&0=this._offsets[o]&&("undefined"==typeof this._offsets[o+1]||t= 0 && n < t ? [ this[ n ] ] : [] ) - }, - end: function () { - return this.prevObject || this.constructor() - }, - push: s, - sort: n.sort, - splice: n.splice - }, w.extend = w.fn.extend = function () { - var e, t, n, r, i, o, a = arguments[ 0 ] || {}, - s = 1, - u = arguments.length, - l = !1; - for ( "boolean" == typeof a && ( l = a, a = arguments[ s ] || {}, s++ ), "object" == typeof a || g( a ) || ( a = {} ), s === u && ( a = this, s-- ); s < u; s++ ) - if ( null != ( e = arguments[ s ] ) ) - for ( t in e ) n = a[ t ], a !== ( r = e[ t ] ) && ( l && r && ( w.isPlainObject( r ) || ( i = Array.isArray( r ) ) ) ? ( i ? ( i = !1, o = n && Array.isArray( n ) ? n : [] ) : o = n && w.isPlainObject( n ) ? n : {}, a[ t ] = w.extend( l, o, r ) ) : void 0 !== r && ( a[ t ] = r ) ); - return a - }, w.extend( { - expando: "jQuery" + ( "3.3.1" + Math.random() ).replace( /\D/g, "" ), - isReady: !0, - error: function ( e ) { - throw new Error( e ) - }, - noop: function () {}, - isPlainObject: function ( e ) { - var t, n; - return !( !e || "[object Object]" !== c.call( e ) ) && ( !( t = i( e ) ) || "function" == typeof ( n = f.call( t, "constructor" ) && t.constructor ) && p.call( n ) === d ) - }, - isEmptyObject: function ( e ) { - var t; - for ( t in e ) return !1; - return !0 - }, - globalEval: function ( e ) { - m( e ) - }, - each: function ( e, t ) { - var n, r = 0; - if ( C( e ) ) { - for ( n = e.length; r < n; r++ ) - if ( !1 === t.call( e[ r ], r, e[ r ] ) ) break - } else - for ( r in e ) - if ( !1 === t.call( e[ r ], r, e[ r ] ) ) break; - return e - }, - trim: function ( e ) { - return null == e ? "" : ( e + "" ).replace( T, "" ) - }, - makeArray: function ( e, t ) { - var n = t || []; - return null != e && ( C( Object( e ) ) ? w.merge( n, "string" == typeof e ? [ e ] : e ) : s.call( n, e ) ), n - }, - inArray: function ( e, t, n ) { - return null == t ? -1 : u.call( t, e, n ) - }, - merge: function ( e, t ) { - for ( var n = +t.length, r = 0, i = e.length; r < n; r++ ) e[ i++ ] = t[ r ]; - return e.length = i, e - }, - grep: function ( e, t, n ) { - for ( var r, i = [], o = 0, a = e.length, s = !n; o < a; o++ )( r = !t( e[ o ], o ) ) !== s && i.push( e[ o ] ); - return i - }, - map: function ( e, t, n ) { - var r, i, o = 0, - s = []; - if ( C( e ) ) - for ( r = e.length; o < r; o++ ) null != ( i = t( e[ o ], o, n ) ) && s.push( i ); - else - for ( o in e ) null != ( i = t( e[ o ], o, n ) ) && s.push( i ); - return a.apply( [], s ) - }, - guid: 1, - support: h - } ), "function" == typeof Symbol && ( w.fn[ Symbol.iterator ] = n[ Symbol.iterator ] ), w.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), function ( e, t ) { - l[ "[object " + t + "]" ] = t.toLowerCase() - } ); - - function C( e ) { - var t = !!e && "length" in e && e.length, - n = x( e ); - return !g( e ) && !y( e ) && ( "array" === n || 0 === t || "number" == typeof t && t > 0 && t - 1 in e ) - } - var E = function ( e ) { - var t, n, r, i, o, a, s, u, l, c, f, p, d, h, g, y, v, m, x, b = "sizzle" + 1 * new Date, - w = e.document, - T = 0, - C = 0, - E = ae(), - k = ae(), - S = ae(), - D = function ( e, t ) { - return e === t && ( f = !0 ), 0 - }, - N = {}.hasOwnProperty, - A = [], - j = A.pop, - q = A.push, - L = A.push, - H = A.slice, - O = function ( e, t ) { - for ( var n = 0, r = e.length; n < r; n++ ) - if ( e[ n ] === t ) return n; - return -1 - }, - P = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", - M = "[\\x20\\t\\r\\n\\f]", - R = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+", - I = "\\[" + M + "*(" + R + ")(?:" + M + "*([*^$|!~]?=)" + M + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + R + "))|)" + M + "*\\]", - W = ":(" + R + ")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|" + I + ")*)|.*)\\)|)", - $ = new RegExp( M + "+", "g" ), - B = new RegExp( "^" + M + "+|((?:^|[^\\\\])(?:\\\\.)*)" + M + "+$", "g" ), - F = new RegExp( "^" + M + "*," + M + "*" ), - _ = new RegExp( "^" + M + "*([>+~]|" + M + ")" + M + "*" ), - z = new RegExp( "=" + M + "*([^\\]'\"]*?)" + M + "*\\]", "g" ), - X = new RegExp( W ), - U = new RegExp( "^" + R + "$" ), - V = { - ID: new RegExp( "^#(" + R + ")" ), - CLASS: new RegExp( "^\\.(" + R + ")" ), - TAG: new RegExp( "^(" + R + "|[*])" ), - ATTR: new RegExp( "^" + I ), - PSEUDO: new RegExp( "^" + W ), - CHILD: new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + M + "*(even|odd|(([+-]|)(\\d*)n|)" + M + "*(?:([+-]|)" + M + "*(\\d+)|))" + M + "*\\)|)", "i" ), - bool: new RegExp( "^(?:" + P + ")$", "i" ), - needsContext: new RegExp( "^" + M + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + M + "*((?:-\\d)?\\d*)" + M + "*\\)|)(?=[^-]|$)", "i" ) - }, - G = /^(?:input|select|textarea|button)$/i, - Y = /^h\d$/i, - Q = /^[^{]+\{\s*\[native \w/, - J = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - K = /[+~]/, - Z = new RegExp( "\\\\([\\da-f]{1,6}" + M + "?|(" + M + ")|.)", "ig" ), - ee = function ( e, t, n ) { - var r = "0x" + t - 65536; - return r !== r || n ? t : r < 0 ? String.fromCharCode( r + 65536 ) : String.fromCharCode( r >> 10 | 55296, 1023 & r | 56320 ) - }, - te = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, - ne = function ( e, t ) { - return t ? "\0" === e ? "\ufffd" : e.slice( 0, -1 ) + "\\" + e.charCodeAt( e.length - 1 ).toString( 16 ) + " " : "\\" + e - }, - re = function () { - p() - }, - ie = me( function ( e ) { - return !0 === e.disabled && ( "form" in e || "label" in e ) - }, { - dir: "parentNode", - next: "legend" - } ); - try { - L.apply( A = H.call( w.childNodes ), w.childNodes ), A[ w.childNodes.length ].nodeType - } catch ( e ) { - L = { - apply: A.length ? function ( e, t ) { - q.apply( e, H.call( t ) ) - } : function ( e, t ) { - var n = e.length, - r = 0; - while ( e[ n++ ] = t[ r++ ] ); - e.length = n - 1 - } - } - } - - function oe( e, t, r, i ) { - var o, s, l, c, f, h, v, m = t && t.ownerDocument, - T = t ? t.nodeType : 9; - if ( r = r || [], "string" != typeof e || !e || 1 !== T && 9 !== T && 11 !== T ) return r; - if ( !i && ( ( t ? t.ownerDocument || t : w ) !== d && p( t ), t = t || d, g ) ) { - if ( 11 !== T && ( f = J.exec( e ) ) ) - if ( o = f[ 1 ] ) { - if ( 9 === T ) { - if ( !( l = t.getElementById( o ) ) ) return r; - if ( l.id === o ) return r.push( l ), r - } else if ( m && ( l = m.getElementById( o ) ) && x( t, l ) && l.id === o ) return r.push( l ), r - } else { - if ( f[ 2 ] ) return L.apply( r, t.getElementsByTagName( e ) ), r; - if ( ( o = f[ 3 ] ) && n.getElementsByClassName && t.getElementsByClassName ) return L.apply( r, t.getElementsByClassName( o ) ), r - } if ( n.qsa && !S[ e + " " ] && ( !y || !y.test( e ) ) ) { - if ( 1 !== T ) m = t, v = e; - else if ( "object" !== t.nodeName.toLowerCase() ) { - ( c = t.getAttribute( "id" ) ) ? c = c.replace( te, ne ): t.setAttribute( "id", c = b ), s = ( h = a( e ) ).length; - while ( s-- ) h[ s ] = "#" + c + " " + ve( h[ s ] ); - v = h.join( "," ), m = K.test( e ) && ge( t.parentNode ) || t - } - if ( v ) try { - return L.apply( r, m.querySelectorAll( v ) ), r - } catch ( e ) {} finally { - c === b && t.removeAttribute( "id" ) - } - } - } - return u( e.replace( B, "$1" ), t, r, i ) - } - - function ae() { - var e = []; - - function t( n, i ) { - return e.push( n + " " ) > r.cacheLength && delete t[ e.shift() ], t[ n + " " ] = i - } - return t - } - - function se( e ) { - return e[ b ] = !0, e - } - - function ue( e ) { - var t = d.createElement( "fieldset" ); - try { - return !!e( t ) - } catch ( e ) { - return !1 - } finally { - t.parentNode && t.parentNode.removeChild( t ), t = null - } - } - - function le( e, t ) { - var n = e.split( "|" ), - i = n.length; - while ( i-- ) r.attrHandle[ n[ i ] ] = t - } - - function ce( e, t ) { - var n = t && e, - r = n && 1 === e.nodeType && 1 === t.nodeType && e.sourceIndex - t.sourceIndex; - if ( r ) return r; - if ( n ) - while ( n = n.nextSibling ) - if ( n === t ) return -1; - return e ? 1 : -1 - } - - function fe( e ) { - return function ( t ) { - return "input" === t.nodeName.toLowerCase() && t.type === e - } - } - - function pe( e ) { - return function ( t ) { - var n = t.nodeName.toLowerCase(); - return ( "input" === n || "button" === n ) && t.type === e - } - } - - function de( e ) { - return function ( t ) { - return "form" in t ? t.parentNode && !1 === t.disabled ? "label" in t ? "label" in t.parentNode ? t.parentNode.disabled === e : t.disabled === e : t.isDisabled === e || t.isDisabled !== !e && ie( t ) === e : t.disabled === e : "label" in t && t.disabled === e - } - } - - function he( e ) { - return se( function ( t ) { - return t = +t, se( function ( n, r ) { - var i, o = e( [], n.length, t ), - a = o.length; - while ( a-- ) n[ i = o[ a ] ] && ( n[ i ] = !( r[ i ] = n[ i ] ) ) - } ) - } ) - } - - function ge( e ) { - return e && "undefined" != typeof e.getElementsByTagName && e - } - n = oe.support = {}, o = oe.isXML = function ( e ) { - var t = e && ( e.ownerDocument || e ).documentElement; - return !!t && "HTML" !== t.nodeName - }, p = oe.setDocument = function ( e ) { - var t, i, a = e ? e.ownerDocument || e : w; - return a !== d && 9 === a.nodeType && a.documentElement ? ( d = a, h = d.documentElement, g = !o( d ), w !== d && ( i = d.defaultView ) && i.top !== i && ( i.addEventListener ? i.addEventListener( "unload", re, !1 ) : i.attachEvent && i.attachEvent( "onunload", re ) ), n.attributes = ue( function ( e ) { - return e.className = "i", !e.getAttribute( "className" ) - } ), n.getElementsByTagName = ue( function ( e ) { - return e.appendChild( d.createComment( "" ) ), !e.getElementsByTagName( "*" ).length - } ), n.getElementsByClassName = Q.test( d.getElementsByClassName ), n.getById = ue( function ( e ) { - return h.appendChild( e ).id = b, !d.getElementsByName || !d.getElementsByName( b ).length - } ), n.getById ? ( r.filter.ID = function ( e ) { - var t = e.replace( Z, ee ); - return function ( e ) { - return e.getAttribute( "id" ) === t - } - }, r.find.ID = function ( e, t ) { - if ( "undefined" != typeof t.getElementById && g ) { - var n = t.getElementById( e ); - return n ? [ n ] : [] - } - } ) : ( r.filter.ID = function ( e ) { - var t = e.replace( Z, ee ); - return function ( e ) { - var n = "undefined" != typeof e.getAttributeNode && e.getAttributeNode( "id" ); - return n && n.value === t - } - }, r.find.ID = function ( e, t ) { - if ( "undefined" != typeof t.getElementById && g ) { - var n, r, i, o = t.getElementById( e ); - if ( o ) { - if ( ( n = o.getAttributeNode( "id" ) ) && n.value === e ) return [ o ]; - i = t.getElementsByName( e ), r = 0; - while ( o = i[ r++ ] ) - if ( ( n = o.getAttributeNode( "id" ) ) && n.value === e ) return [ o ] - } - return [] - } - } ), r.find.TAG = n.getElementsByTagName ? function ( e, t ) { - return "undefined" != typeof t.getElementsByTagName ? t.getElementsByTagName( e ) : n.qsa ? t.querySelectorAll( e ) : void 0 - } : function ( e, t ) { - var n, r = [], - i = 0, - o = t.getElementsByTagName( e ); - if ( "*" === e ) { - while ( n = o[ i++ ] ) 1 === n.nodeType && r.push( n ); - return r - } - return o - }, r.find.CLASS = n.getElementsByClassName && function ( e, t ) { - if ( "undefined" != typeof t.getElementsByClassName && g ) return t.getElementsByClassName( e ) - }, v = [], y = [], ( n.qsa = Q.test( d.querySelectorAll ) ) && ( ue( function ( e ) { - h.appendChild( e ).innerHTML = "", e.querySelectorAll( "[msallowcapture^='']" ).length && y.push( "[*^$]=" + M + "*(?:''|\"\")" ), e.querySelectorAll( "[selected]" ).length || y.push( "\\[" + M + "*(?:value|" + P + ")" ), e.querySelectorAll( "[id~=" + b + "-]" ).length || y.push( "~=" ), e.querySelectorAll( ":checked" ).length || y.push( ":checked" ), e.querySelectorAll( "a#" + b + "+*" ).length || y.push( ".#.+[+~]" ) - } ), ue( function ( e ) { - e.innerHTML = ""; - var t = d.createElement( "input" ); - t.setAttribute( "type", "hidden" ), e.appendChild( t ).setAttribute( "name", "D" ), e.querySelectorAll( "[name=d]" ).length && y.push( "name" + M + "*[*^$|!~]?=" ), 2 !== e.querySelectorAll( ":enabled" ).length && y.push( ":enabled", ":disabled" ), h.appendChild( e ).disabled = !0, 2 !== e.querySelectorAll( ":disabled" ).length && y.push( ":enabled", ":disabled" ), e.querySelectorAll( "*,:x" ), y.push( ",.*:" ) - } ) ), ( n.matchesSelector = Q.test( m = h.matches || h.webkitMatchesSelector || h.mozMatchesSelector || h.oMatchesSelector || h.msMatchesSelector ) ) && ue( function ( e ) { - n.disconnectedMatch = m.call( e, "*" ), m.call( e, "[s!='']:x" ), v.push( "!=", W ) - } ), y = y.length && new RegExp( y.join( "|" ) ), v = v.length && new RegExp( v.join( "|" ) ), t = Q.test( h.compareDocumentPosition ), x = t || Q.test( h.contains ) ? function ( e, t ) { - var n = 9 === e.nodeType ? e.documentElement : e, - r = t && t.parentNode; - return e === r || !( !r || 1 !== r.nodeType || !( n.contains ? n.contains( r ) : e.compareDocumentPosition && 16 & e.compareDocumentPosition( r ) ) ) - } : function ( e, t ) { - if ( t ) - while ( t = t.parentNode ) - if ( t === e ) return !0; - return !1 - }, D = t ? function ( e, t ) { - if ( e === t ) return f = !0, 0; - var r = !e.compareDocumentPosition - !t.compareDocumentPosition; - return r || ( 1 & ( r = ( e.ownerDocument || e ) === ( t.ownerDocument || t ) ? e.compareDocumentPosition( t ) : 1 ) || !n.sortDetached && t.compareDocumentPosition( e ) === r ? e === d || e.ownerDocument === w && x( w, e ) ? -1 : t === d || t.ownerDocument === w && x( w, t ) ? 1 : c ? O( c, e ) - O( c, t ) : 0 : 4 & r ? -1 : 1 ) - } : function ( e, t ) { - if ( e === t ) return f = !0, 0; - var n, r = 0, - i = e.parentNode, - o = t.parentNode, - a = [ e ], - s = [ t ]; - if ( !i || !o ) return e === d ? -1 : t === d ? 1 : i ? -1 : o ? 1 : c ? O( c, e ) - O( c, t ) : 0; - if ( i === o ) return ce( e, t ); - n = e; - while ( n = n.parentNode ) a.unshift( n ); - n = t; - while ( n = n.parentNode ) s.unshift( n ); - while ( a[ r ] === s[ r ] ) r++; - return r ? ce( a[ r ], s[ r ] ) : a[ r ] === w ? -1 : s[ r ] === w ? 1 : 0 - }, d ) : d - }, oe.matches = function ( e, t ) { - return oe( e, null, null, t ) - }, oe.matchesSelector = function ( e, t ) { - if ( ( e.ownerDocument || e ) !== d && p( e ), t = t.replace( z, "='$1']" ), n.matchesSelector && g && !S[ t + " " ] && ( !v || !v.test( t ) ) && ( !y || !y.test( t ) ) ) try { - var r = m.call( e, t ); - if ( r || n.disconnectedMatch || e.document && 11 !== e.document.nodeType ) return r - } catch ( e ) {} - return oe( t, d, null, [ e ] ).length > 0 - }, oe.contains = function ( e, t ) { - return ( e.ownerDocument || e ) !== d && p( e ), x( e, t ) - }, oe.attr = function ( e, t ) { - ( e.ownerDocument || e ) !== d && p( e ); - var i = r.attrHandle[ t.toLowerCase() ], - o = i && N.call( r.attrHandle, t.toLowerCase() ) ? i( e, t, !g ) : void 0; - return void 0 !== o ? o : n.attributes || !g ? e.getAttribute( t ) : ( o = e.getAttributeNode( t ) ) && o.specified ? o.value : null - }, oe.escape = function ( e ) { - return ( e + "" ).replace( te, ne ) - }, oe.error = function ( e ) { - throw new Error( "Syntax error, unrecognized expression: " + e ) - }, oe.uniqueSort = function ( e ) { - var t, r = [], - i = 0, - o = 0; - if ( f = !n.detectDuplicates, c = !n.sortStable && e.slice( 0 ), e.sort( D ), f ) { - while ( t = e[ o++ ] ) t === e[ o ] && ( i = r.push( o ) ); - while ( i-- ) e.splice( r[ i ], 1 ) - } - return c = null, e - }, i = oe.getText = function ( e ) { - var t, n = "", - r = 0, - o = e.nodeType; - if ( o ) { - if ( 1 === o || 9 === o || 11 === o ) { - if ( "string" == typeof e.textContent ) return e.textContent; - for ( e = e.firstChild; e; e = e.nextSibling ) n += i( e ) - } else if ( 3 === o || 4 === o ) return e.nodeValue - } else - while ( t = e[ r++ ] ) n += i( t ); - return n - }, ( r = oe.selectors = { - cacheLength: 50, - createPseudo: se, - match: V, - attrHandle: {}, - find: {}, - relative: { - ">": { - dir: "parentNode", - first: !0 - }, - " ": { - dir: "parentNode" - }, - "+": { - dir: "previousSibling", - first: !0 - }, - "~": { - dir: "previousSibling" - } - }, - preFilter: { - ATTR: function ( e ) { - return e[ 1 ] = e[ 1 ].replace( Z, ee ), e[ 3 ] = ( e[ 3 ] || e[ 4 ] || e[ 5 ] || "" ).replace( Z, ee ), "~=" === e[ 2 ] && ( e[ 3 ] = " " + e[ 3 ] + " " ), e.slice( 0, 4 ) - }, - CHILD: function ( e ) { - return e[ 1 ] = e[ 1 ].toLowerCase(), "nth" === e[ 1 ].slice( 0, 3 ) ? ( e[ 3 ] || oe.error( e[ 0 ] ), e[ 4 ] = +( e[ 4 ] ? e[ 5 ] + ( e[ 6 ] || 1 ) : 2 * ( "even" === e[ 3 ] || "odd" === e[ 3 ] ) ), e[ 5 ] = +( e[ 7 ] + e[ 8 ] || "odd" === e[ 3 ] ) ) : e[ 3 ] && oe.error( e[ 0 ] ), e - }, - PSEUDO: function ( e ) { - var t, n = !e[ 6 ] && e[ 2 ]; - return V.CHILD.test( e[ 0 ] ) ? null : ( e[ 3 ] ? e[ 2 ] = e[ 4 ] || e[ 5 ] || "" : n && X.test( n ) && ( t = a( n, !0 ) ) && ( t = n.indexOf( ")", n.length - t ) - n.length ) && ( e[ 0 ] = e[ 0 ].slice( 0, t ), e[ 2 ] = n.slice( 0, t ) ), e.slice( 0, 3 ) ) - } - }, - filter: { - TAG: function ( e ) { - var t = e.replace( Z, ee ).toLowerCase(); - return "*" === e ? function () { - return !0 - } : function ( e ) { - return e.nodeName && e.nodeName.toLowerCase() === t - } - }, - CLASS: function ( e ) { - var t = E[ e + " " ]; - return t || ( t = new RegExp( "(^|" + M + ")" + e + "(" + M + "|$)" ) ) && E( e, function ( e ) { - return t.test( "string" == typeof e.className && e.className || "undefined" != typeof e.getAttribute && e.getAttribute( "class" ) || "" ) - } ) - }, - ATTR: function ( e, t, n ) { - return function ( r ) { - var i = oe.attr( r, e ); - return null == i ? "!=" === t : !t || ( i += "", "=" === t ? i === n : "!=" === t ? i !== n : "^=" === t ? n && 0 === i.indexOf( n ) : "*=" === t ? n && i.indexOf( n ) > -1 : "$=" === t ? n && i.slice( -n.length ) === n : "~=" === t ? ( " " + i.replace( $, " " ) + " " ).indexOf( n ) > -1 : "|=" === t && ( i === n || i.slice( 0, n.length + 1 ) === n + "-" ) ) - } - }, - CHILD: function ( e, t, n, r, i ) { - var o = "nth" !== e.slice( 0, 3 ), - a = "last" !== e.slice( -4 ), - s = "of-type" === t; - return 1 === r && 0 === i ? function ( e ) { - return !!e.parentNode - } : function ( t, n, u ) { - var l, c, f, p, d, h, g = o !== a ? "nextSibling" : "previousSibling", - y = t.parentNode, - v = s && t.nodeName.toLowerCase(), - m = !u && !s, - x = !1; - if ( y ) { - if ( o ) { - while ( g ) { - p = t; - while ( p = p[ g ] ) - if ( s ? p.nodeName.toLowerCase() === v : 1 === p.nodeType ) return !1; - h = g = "only" === e && !h && "nextSibling" - } - return !0 - } - if ( h = [ a ? y.firstChild : y.lastChild ], a && m ) { - x = ( d = ( l = ( c = ( f = ( p = y )[ b ] || ( p[ b ] = {} ) )[ p.uniqueID ] || ( f[ p.uniqueID ] = {} ) )[ e ] || [] )[ 0 ] === T && l[ 1 ] ) && l[ 2 ], p = d && y.childNodes[ d ]; - while ( p = ++d && p && p[ g ] || ( x = d = 0 ) || h.pop() ) - if ( 1 === p.nodeType && ++x && p === t ) { - c[ e ] = [ T, d, x ]; - break - } - } else if ( m && ( x = d = ( l = ( c = ( f = ( p = t )[ b ] || ( p[ b ] = {} ) )[ p.uniqueID ] || ( f[ p.uniqueID ] = {} ) )[ e ] || [] )[ 0 ] === T && l[ 1 ] ), !1 === x ) - while ( p = ++d && p && p[ g ] || ( x = d = 0 ) || h.pop() ) - if ( ( s ? p.nodeName.toLowerCase() === v : 1 === p.nodeType ) && ++x && ( m && ( ( c = ( f = p[ b ] || ( p[ b ] = {} ) )[ p.uniqueID ] || ( f[ p.uniqueID ] = {} ) )[ e ] = [ T, x ] ), p === t ) ) break; - return ( x -= i ) === r || x % r == 0 && x / r >= 0 - } - } - }, - PSEUDO: function ( e, t ) { - var n, i = r.pseudos[ e ] || r.setFilters[ e.toLowerCase() ] || oe.error( "unsupported pseudo: " + e ); - return i[ b ] ? i( t ) : i.length > 1 ? ( n = [ e, e, "", t ], r.setFilters.hasOwnProperty( e.toLowerCase() ) ? se( function ( e, n ) { - var r, o = i( e, t ), - a = o.length; - while ( a-- ) e[ r = O( e, o[ a ] ) ] = !( n[ r ] = o[ a ] ) - } ) : function ( e ) { - return i( e, 0, n ) - } ) : i - } - }, - pseudos: { - not: se( function ( e ) { - var t = [], - n = [], - r = s( e.replace( B, "$1" ) ); - return r[ b ] ? se( function ( e, t, n, i ) { - var o, a = r( e, null, i, [] ), - s = e.length; - while ( s-- )( o = a[ s ] ) && ( e[ s ] = !( t[ s ] = o ) ) - } ) : function ( e, i, o ) { - return t[ 0 ] = e, r( t, null, o, n ), t[ 0 ] = null, !n.pop() - } - } ), - has: se( function ( e ) { - return function ( t ) { - return oe( e, t ).length > 0 - } - } ), - contains: se( function ( e ) { - return e = e.replace( Z, ee ), - function ( t ) { - return ( t.textContent || t.innerText || i( t ) ).indexOf( e ) > -1 - } - } ), - lang: se( function ( e ) { - return U.test( e || "" ) || oe.error( "unsupported lang: " + e ), e = e.replace( Z, ee ).toLowerCase(), - function ( t ) { - var n; - do { - if ( n = g ? t.lang : t.getAttribute( "xml:lang" ) || t.getAttribute( "lang" ) ) return ( n = n.toLowerCase() ) === e || 0 === n.indexOf( e + "-" ) - } while ( ( t = t.parentNode ) && 1 === t.nodeType ); - return !1 - } - } ), - target: function ( t ) { - var n = e.location && e.location.hash; - return n && n.slice( 1 ) === t.id - }, - root: function ( e ) { - return e === h - }, - focus: function ( e ) { - return e === d.activeElement && ( !d.hasFocus || d.hasFocus() ) && !!( e.type || e.href || ~e.tabIndex ) - }, - enabled: de( !1 ), - disabled: de( !0 ), - checked: function ( e ) { - var t = e.nodeName.toLowerCase(); - return "input" === t && !!e.checked || "option" === t && !!e.selected - }, - selected: function ( e ) { - return e.parentNode && e.parentNode.selectedIndex, !0 === e.selected - }, - empty: function ( e ) { - for ( e = e.firstChild; e; e = e.nextSibling ) - if ( e.nodeType < 6 ) return !1; - return !0 - }, - parent: function ( e ) { - return !r.pseudos.empty( e ) - }, - header: function ( e ) { - return Y.test( e.nodeName ) - }, - input: function ( e ) { - return G.test( e.nodeName ) - }, - button: function ( e ) { - var t = e.nodeName.toLowerCase(); - return "input" === t && "button" === e.type || "button" === t - }, - text: function ( e ) { - var t; - return "input" === e.nodeName.toLowerCase() && "text" === e.type && ( null == ( t = e.getAttribute( "type" ) ) || "text" === t.toLowerCase() ) - }, - first: he( function () { - return [ 0 ] - } ), - last: he( function ( e, t ) { - return [ t - 1 ] - } ), - eq: he( function ( e, t, n ) { - return [ n < 0 ? n + t : n ] - } ), - even: he( function ( e, t ) { - for ( var n = 0; n < t; n += 2 ) e.push( n ); - return e - } ), - odd: he( function ( e, t ) { - for ( var n = 1; n < t; n += 2 ) e.push( n ); - return e - } ), - lt: he( function ( e, t, n ) { - for ( var r = n < 0 ? n + t : n; --r >= 0; ) e.push( r ); - return e - } ), - gt: he( function ( e, t, n ) { - for ( var r = n < 0 ? n + t : n; ++r < t; ) e.push( r ); - return e - } ) - } - } ).pseudos.nth = r.pseudos.eq; - for ( t in { - radio: !0, - checkbox: !0, - file: !0, - password: !0, - image: !0 - } ) r.pseudos[ t ] = fe( t ); - for ( t in { - submit: !0, - reset: !0 - } ) r.pseudos[ t ] = pe( t ); - - function ye() {} - ye.prototype = r.filters = r.pseudos, r.setFilters = new ye, a = oe.tokenize = function ( e, t ) { - var n, i, o, a, s, u, l, c = k[ e + " " ]; - if ( c ) return t ? 0 : c.slice( 0 ); - s = e, u = [], l = r.preFilter; - while ( s ) { - n && !( i = F.exec( s ) ) || ( i && ( s = s.slice( i[ 0 ].length ) || s ), u.push( o = [] ) ), n = !1, ( i = _.exec( s ) ) && ( n = i.shift(), o.push( { - value: n, - type: i[ 0 ].replace( B, " " ) - } ), s = s.slice( n.length ) ); - for ( a in r.filter ) !( i = V[ a ].exec( s ) ) || l[ a ] && !( i = l[ a ]( i ) ) || ( n = i.shift(), o.push( { - value: n, - type: a, - matches: i - } ), s = s.slice( n.length ) ); - if ( !n ) break - } - return t ? s.length : s ? oe.error( e ) : k( e, u ).slice( 0 ) - }; - - function ve( e ) { - for ( var t = 0, n = e.length, r = ""; t < n; t++ ) r += e[ t ].value; - return r - } - - function me( e, t, n ) { - var r = t.dir, - i = t.next, - o = i || r, - a = n && "parentNode" === o, - s = C++; - return t.first ? function ( t, n, i ) { - while ( t = t[ r ] ) - if ( 1 === t.nodeType || a ) return e( t, n, i ); - return !1 - } : function ( t, n, u ) { - var l, c, f, p = [ T, s ]; - if ( u ) { - while ( t = t[ r ] ) - if ( ( 1 === t.nodeType || a ) && e( t, n, u ) ) return !0 - } else - while ( t = t[ r ] ) - if ( 1 === t.nodeType || a ) - if ( f = t[ b ] || ( t[ b ] = {} ), c = f[ t.uniqueID ] || ( f[ t.uniqueID ] = {} ), i && i === t.nodeName.toLowerCase() ) t = t[ r ] || t; - else { - if ( ( l = c[ o ] ) && l[ 0 ] === T && l[ 1 ] === s ) return p[ 2 ] = l[ 2 ]; - if ( c[ o ] = p, p[ 2 ] = e( t, n, u ) ) return !0 - } return !1 - } - } - - function xe( e ) { - return e.length > 1 ? function ( t, n, r ) { - var i = e.length; - while ( i-- ) - if ( !e[ i ]( t, n, r ) ) return !1; - return !0 - } : e[ 0 ] - } - - function be( e, t, n ) { - for ( var r = 0, i = t.length; r < i; r++ ) oe( e, t[ r ], n ); - return n - } - - function we( e, t, n, r, i ) { - for ( var o, a = [], s = 0, u = e.length, l = null != t; s < u; s++ )( o = e[ s ] ) && ( n && !n( o, r, i ) || ( a.push( o ), l && t.push( s ) ) ); - return a - } - - function Te( e, t, n, r, i, o ) { - return r && !r[ b ] && ( r = Te( r ) ), i && !i[ b ] && ( i = Te( i, o ) ), se( function ( o, a, s, u ) { - var l, c, f, p = [], - d = [], - h = a.length, - g = o || be( t || "*", s.nodeType ? [ s ] : s, [] ), - y = !e || !o && t ? g : we( g, p, e, s, u ), - v = n ? i || ( o ? e : h || r ) ? [] : a : y; - if ( n && n( y, v, s, u ), r ) { - l = we( v, d ), r( l, [], s, u ), c = l.length; - while ( c-- )( f = l[ c ] ) && ( v[ d[ c ] ] = !( y[ d[ c ] ] = f ) ) - } - if ( o ) { - if ( i || e ) { - if ( i ) { - l = [], c = v.length; - while ( c-- )( f = v[ c ] ) && l.push( y[ c ] = f ); - i( null, v = [], l, u ) - } - c = v.length; - while ( c-- )( f = v[ c ] ) && ( l = i ? O( o, f ) : p[ c ] ) > -1 && ( o[ l ] = !( a[ l ] = f ) ) - } - } else v = we( v === a ? v.splice( h, v.length ) : v ), i ? i( null, a, v, u ) : L.apply( a, v ) - } ) - } - - function Ce( e ) { - for ( var t, n, i, o = e.length, a = r.relative[ e[ 0 ].type ], s = a || r.relative[ " " ], u = a ? 1 : 0, c = me( function ( e ) { - return e === t - }, s, !0 ), f = me( function ( e ) { - return O( t, e ) > -1 - }, s, !0 ), p = [ function ( e, n, r ) { - var i = !a && ( r || n !== l ) || ( ( t = n ).nodeType ? c( e, n, r ) : f( e, n, r ) ); - return t = null, i - } ]; u < o; u++ ) - if ( n = r.relative[ e[ u ].type ] ) p = [ me( xe( p ), n ) ]; - else { - if ( ( n = r.filter[ e[ u ].type ].apply( null, e[ u ].matches ) )[ b ] ) { - for ( i = ++u; i < o; i++ ) - if ( r.relative[ e[ i ].type ] ) break; - return Te( u > 1 && xe( p ), u > 1 && ve( e.slice( 0, u - 1 ).concat( { - value: " " === e[ u - 2 ].type ? "*" : "" - } ) ).replace( B, "$1" ), n, u < i && Ce( e.slice( u, i ) ), i < o && Ce( e = e.slice( i ) ), i < o && ve( e ) ) - } - p.push( n ) - } return xe( p ) - } - - function Ee( e, t ) { - var n = t.length > 0, - i = e.length > 0, - o = function ( o, a, s, u, c ) { - var f, h, y, v = 0, - m = "0", - x = o && [], - b = [], - w = l, - C = o || i && r.find.TAG( "*", c ), - E = T += null == w ? 1 : Math.random() || .1, - k = C.length; - for ( c && ( l = a === d || a || c ); m !== k && null != ( f = C[ m ] ); m++ ) { - if ( i && f ) { - h = 0, a || f.ownerDocument === d || ( p( f ), s = !g ); - while ( y = e[ h++ ] ) - if ( y( f, a || d, s ) ) { - u.push( f ); - break - } c && ( T = E ) - } - n && ( ( f = !y && f ) && v--, o && x.push( f ) ) - } - if ( v += m, n && m !== v ) { - h = 0; - while ( y = t[ h++ ] ) y( x, b, a, s ); - if ( o ) { - if ( v > 0 ) - while ( m-- ) x[ m ] || b[ m ] || ( b[ m ] = j.call( u ) ); - b = we( b ) - } - L.apply( u, b ), c && !o && b.length > 0 && v + t.length > 1 && oe.uniqueSort( u ) - } - return c && ( T = E, l = w ), x - }; - return n ? se( o ) : o - } - return s = oe.compile = function ( e, t ) { - var n, r = [], - i = [], - o = S[ e + " " ]; - if ( !o ) { - t || ( t = a( e ) ), n = t.length; - while ( n-- )( o = Ce( t[ n ] ) )[ b ] ? r.push( o ) : i.push( o ); - ( o = S( e, Ee( i, r ) ) ).selector = e - } - return o - }, u = oe.select = function ( e, t, n, i ) { - var o, u, l, c, f, p = "function" == typeof e && e, - d = !i && a( e = p.selector || e ); - if ( n = n || [], 1 === d.length ) { - if ( ( u = d[ 0 ] = d[ 0 ].slice( 0 ) ).length > 2 && "ID" === ( l = u[ 0 ] ).type && 9 === t.nodeType && g && r.relative[ u[ 1 ].type ] ) { - if ( !( t = ( r.find.ID( l.matches[ 0 ].replace( Z, ee ), t ) || [] )[ 0 ] ) ) return n; - p && ( t = t.parentNode ), e = e.slice( u.shift().value.length ) - } - o = V.needsContext.test( e ) ? 0 : u.length; - while ( o-- ) { - if ( l = u[ o ], r.relative[ c = l.type ] ) break; - if ( ( f = r.find[ c ] ) && ( i = f( l.matches[ 0 ].replace( Z, ee ), K.test( u[ 0 ].type ) && ge( t.parentNode ) || t ) ) ) { - if ( u.splice( o, 1 ), !( e = i.length && ve( u ) ) ) return L.apply( n, i ), n; - break - } - } - } - return ( p || s( e, d ) )( i, t, !g, n, !t || K.test( e ) && ge( t.parentNode ) || t ), n - }, n.sortStable = b.split( "" ).sort( D ).join( "" ) === b, n.detectDuplicates = !!f, p(), n.sortDetached = ue( function ( e ) { - return 1 & e.compareDocumentPosition( d.createElement( "fieldset" ) ) - } ), ue( function ( e ) { - return e.innerHTML = "", "#" === e.firstChild.getAttribute( "href" ) - } ) || le( "type|href|height|width", function ( e, t, n ) { - if ( !n ) return e.getAttribute( t, "type" === t.toLowerCase() ? 1 : 2 ) - } ), n.attributes && ue( function ( e ) { - return e.innerHTML = "", e.firstChild.setAttribute( "value", "" ), "" === e.firstChild.getAttribute( "value" ) - } ) || le( "value", function ( e, t, n ) { - if ( !n && "input" === e.nodeName.toLowerCase() ) return e.defaultValue - } ), ue( function ( e ) { - return null == e.getAttribute( "disabled" ) - } ) || le( P, function ( e, t, n ) { - var r; - if ( !n ) return !0 === e[ t ] ? t.toLowerCase() : ( r = e.getAttributeNode( t ) ) && r.specified ? r.value : null - } ), oe - }( e ); - w.find = E, w.expr = E.selectors, w.expr[ ":" ] = w.expr.pseudos, w.uniqueSort = w.unique = E.uniqueSort, w.text = E.getText, w.isXMLDoc = E.isXML, w.contains = E.contains, w.escapeSelector = E.escape; - var k = function ( e, t, n ) { - var r = [], - i = void 0 !== n; - while ( ( e = e[ t ] ) && 9 !== e.nodeType ) - if ( 1 === e.nodeType ) { - if ( i && w( e ).is( n ) ) break; - r.push( e ) - } return r - }, - S = function ( e, t ) { - for ( var n = []; e; e = e.nextSibling ) 1 === e.nodeType && e !== t && n.push( e ); - return n - }, - D = w.expr.match.needsContext; - - function N( e, t ) { - return e.nodeName && e.nodeName.toLowerCase() === t.toLowerCase() - } - var A = /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i; - - function j( e, t, n ) { - return g( t ) ? w.grep( e, function ( e, r ) { - return !!t.call( e, r, e ) !== n - } ) : t.nodeType ? w.grep( e, function ( e ) { - return e === t !== n - } ) : "string" != typeof t ? w.grep( e, function ( e ) { - return u.call( t, e ) > -1 !== n - } ) : w.filter( t, e, n ) - } - w.filter = function ( e, t, n ) { - var r = t[ 0 ]; - return n && ( e = ":not(" + e + ")" ), 1 === t.length && 1 === r.nodeType ? w.find.matchesSelector( r, e ) ? [ r ] : [] : w.find.matches( e, w.grep( t, function ( e ) { - return 1 === e.nodeType - } ) ) - }, w.fn.extend( { - find: function ( e ) { - var t, n, r = this.length, - i = this; - if ( "string" != typeof e ) return this.pushStack( w( e ).filter( function () { - for ( t = 0; t < r; t++ ) - if ( w.contains( i[ t ], this ) ) return !0 - } ) ); - for ( n = this.pushStack( [] ), t = 0; t < r; t++ ) w.find( e, i[ t ], n ); - return r > 1 ? w.uniqueSort( n ) : n - }, - filter: function ( e ) { - return this.pushStack( j( this, e || [], !1 ) ) - }, - not: function ( e ) { - return this.pushStack( j( this, e || [], !0 ) ) - }, - is: function ( e ) { - return !!j( this, "string" == typeof e && D.test( e ) ? w( e ) : e || [], !1 ).length - } - } ); - var q, L = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/; - ( w.fn.init = function ( e, t, n ) { - var i, o; - if ( !e ) return this; - if ( n = n || q, "string" == typeof e ) { - if ( !( i = "<" === e[ 0 ] && ">" === e[ e.length - 1 ] && e.length >= 3 ? [ null, e, null ] : L.exec( e ) ) || !i[ 1 ] && t ) return !t || t.jquery ? ( t || n ).find( e ) : this.constructor( t ).find( e ); - if ( i[ 1 ] ) { - if ( t = t instanceof w ? t[ 0 ] : t, w.merge( this, w.parseHTML( i[ 1 ], t && t.nodeType ? t.ownerDocument || t : r, !0 ) ), A.test( i[ 1 ] ) && w.isPlainObject( t ) ) - for ( i in t ) g( this[ i ] ) ? this[ i ]( t[ i ] ) : this.attr( i, t[ i ] ); - return this - } - return ( o = r.getElementById( i[ 2 ] ) ) && ( this[ 0 ] = o, this.length = 1 ), this - } - return e.nodeType ? ( this[ 0 ] = e, this.length = 1, this ) : g( e ) ? void 0 !== n.ready ? n.ready( e ) : e( w ) : w.makeArray( e, this ) - } ).prototype = w.fn, q = w( r ); - var H = /^(?:parents|prev(?:Until|All))/, - O = { - children: !0, - contents: !0, - next: !0, - prev: !0 - }; - w.fn.extend( { - has: function ( e ) { - var t = w( e, this ), - n = t.length; - return this.filter( function () { - for ( var e = 0; e < n; e++ ) - if ( w.contains( this, t[ e ] ) ) return !0 - } ) - }, - closest: function ( e, t ) { - var n, r = 0, - i = this.length, - o = [], - a = "string" != typeof e && w( e ); - if ( !D.test( e ) ) - for ( ; r < i; r++ ) - for ( n = this[ r ]; n && n !== t; n = n.parentNode ) - if ( n.nodeType < 11 && ( a ? a.index( n ) > -1 : 1 === n.nodeType && w.find.matchesSelector( n, e ) ) ) { - o.push( n ); - break - } return this.pushStack( o.length > 1 ? w.uniqueSort( o ) : o ) - }, - index: function ( e ) { - return e ? "string" == typeof e ? u.call( w( e ), this[ 0 ] ) : u.call( this, e.jquery ? e[ 0 ] : e ) : this[ 0 ] && this[ 0 ].parentNode ? this.first().prevAll().length : -1 - }, - add: function ( e, t ) { - return this.pushStack( w.uniqueSort( w.merge( this.get(), w( e, t ) ) ) ) - }, - addBack: function ( e ) { - return this.add( null == e ? this.prevObject : this.prevObject.filter( e ) ) - } - } ); - - function P( e, t ) { - while ( ( e = e[ t ] ) && 1 !== e.nodeType ); - return e - } - w.each( { - parent: function ( e ) { - var t = e.parentNode; - return t && 11 !== t.nodeType ? t : null - }, - parents: function ( e ) { - return k( e, "parentNode" ) - }, - parentsUntil: function ( e, t, n ) { - return k( e, "parentNode", n ) - }, - next: function ( e ) { - return P( e, "nextSibling" ) - }, - prev: function ( e ) { - return P( e, "previousSibling" ) - }, - nextAll: function ( e ) { - return k( e, "nextSibling" ) - }, - prevAll: function ( e ) { - return k( e, "previousSibling" ) - }, - nextUntil: function ( e, t, n ) { - return k( e, "nextSibling", n ) - }, - prevUntil: function ( e, t, n ) { - return k( e, "previousSibling", n ) - }, - siblings: function ( e ) { - return S( ( e.parentNode || {} ).firstChild, e ) - }, - children: function ( e ) { - return S( e.firstChild ) - }, - contents: function ( e ) { - return N( e, "iframe" ) ? e.contentDocument : ( N( e, "template" ) && ( e = e.content || e ), w.merge( [], e.childNodes ) ) - } - }, function ( e, t ) { - w.fn[ e ] = function ( n, r ) { - var i = w.map( this, t, n ); - return "Until" !== e.slice( -5 ) && ( r = n ), r && "string" == typeof r && ( i = w.filter( r, i ) ), this.length > 1 && ( O[ e ] || w.uniqueSort( i ), H.test( e ) && i.reverse() ), this.pushStack( i ) - } - } ); - var M = /[^\x20\t\r\n\f]+/g; - - function R( e ) { - var t = {}; - return w.each( e.match( M ) || [], function ( e, n ) { - t[ n ] = !0 - } ), t - } - w.Callbacks = function ( e ) { - e = "string" == typeof e ? R( e ) : w.extend( {}, e ); - var t, n, r, i, o = [], - a = [], - s = -1, - u = function () { - for ( i = i || e.once, r = t = !0; a.length; s = -1 ) { - n = a.shift(); - while ( ++s < o.length ) !1 === o[ s ].apply( n[ 0 ], n[ 1 ] ) && e.stopOnFalse && ( s = o.length, n = !1 ) - } - e.memory || ( n = !1 ), t = !1, i && ( o = n ? [] : "" ) - }, - l = { - add: function () { - return o && ( n && !t && ( s = o.length - 1, a.push( n ) ), function t( n ) { - w.each( n, function ( n, r ) { - g( r ) ? e.unique && l.has( r ) || o.push( r ) : r && r.length && "string" !== x( r ) && t( r ) - } ) - }( arguments ), n && !t && u() ), this - }, - remove: function () { - return w.each( arguments, function ( e, t ) { - var n; - while ( ( n = w.inArray( t, o, n ) ) > -1 ) o.splice( n, 1 ), n <= s && s-- - } ), this - }, - has: function ( e ) { - return e ? w.inArray( e, o ) > -1 : o.length > 0 - }, - empty: function () { - return o && ( o = [] ), this - }, - disable: function () { - return i = a = [], o = n = "", this - }, - disabled: function () { - return !o - }, - lock: function () { - return i = a = [], n || t || ( o = n = "" ), this - }, - locked: function () { - return !!i - }, - fireWith: function ( e, n ) { - return i || ( n = [ e, ( n = n || [] ).slice ? n.slice() : n ], a.push( n ), t || u() ), this - }, - fire: function () { - return l.fireWith( this, arguments ), this - }, - fired: function () { - return !!r - } - }; - return l - }; - - function I( e ) { - return e - } - - function W( e ) { - throw e - } - - function $( e, t, n, r ) { - var i; - try { - e && g( i = e.promise ) ? i.call( e ).done( t ).fail( n ) : e && g( i = e.then ) ? i.call( e, t, n ) : t.apply( void 0, [ e ].slice( r ) ) - } catch ( e ) { - n.apply( void 0, [ e ] ) - } - } - w.extend( { - Deferred: function ( t ) { - var n = [ - [ "notify", "progress", w.Callbacks( "memory" ), w.Callbacks( "memory" ), 2 ], - [ "resolve", "done", w.Callbacks( "once memory" ), w.Callbacks( "once memory" ), 0, "resolved" ], - [ "reject", "fail", w.Callbacks( "once memory" ), w.Callbacks( "once memory" ), 1, "rejected" ] - ], - r = "pending", - i = { - state: function () { - return r - }, - always: function () { - return o.done( arguments ).fail( arguments ), this - }, - "catch": function ( e ) { - return i.then( null, e ) - }, - pipe: function () { - var e = arguments; - return w.Deferred( function ( t ) { - w.each( n, function ( n, r ) { - var i = g( e[ r[ 4 ] ] ) && e[ r[ 4 ] ]; - o[ r[ 1 ] ]( function () { - var e = i && i.apply( this, arguments ); - e && g( e.promise ) ? e.promise().progress( t.notify ).done( t.resolve ).fail( t.reject ) : t[ r[ 0 ] + "With" ]( this, i ? [ e ] : arguments ) - } ) - } ), e = null - } ).promise() - }, - then: function ( t, r, i ) { - var o = 0; - - function a( t, n, r, i ) { - return function () { - var s = this, - u = arguments, - l = function () { - var e, l; - if ( !( t < o ) ) { - if ( ( e = r.apply( s, u ) ) === n.promise() ) throw new TypeError( "Thenable self-resolution" ); - l = e && ( "object" == typeof e || "function" == typeof e ) && e.then, g( l ) ? i ? l.call( e, a( o, n, I, i ), a( o, n, W, i ) ) : ( o++, l.call( e, a( o, n, I, i ), a( o, n, W, i ), a( o, n, I, n.notifyWith ) ) ) : ( r !== I && ( s = void 0, u = [ e ] ), ( i || n.resolveWith )( s, u ) ) - } - }, - c = i ? l : function () { - try { - l() - } catch ( e ) { - w.Deferred.exceptionHook && w.Deferred.exceptionHook( e, c.stackTrace ), t + 1 >= o && ( r !== W && ( s = void 0, u = [ e ] ), n.rejectWith( s, u ) ) - } - }; - t ? c() : ( w.Deferred.getStackHook && ( c.stackTrace = w.Deferred.getStackHook() ), e.setTimeout( c ) ) - } - } - return w.Deferred( function ( e ) { - n[ 0 ][ 3 ].add( a( 0, e, g( i ) ? i : I, e.notifyWith ) ), n[ 1 ][ 3 ].add( a( 0, e, g( t ) ? t : I ) ), n[ 2 ][ 3 ].add( a( 0, e, g( r ) ? r : W ) ) - } ).promise() - }, - promise: function ( e ) { - return null != e ? w.extend( e, i ) : i - } - }, - o = {}; - return w.each( n, function ( e, t ) { - var a = t[ 2 ], - s = t[ 5 ]; - i[ t[ 1 ] ] = a.add, s && a.add( function () { - r = s - }, n[ 3 - e ][ 2 ].disable, n[ 3 - e ][ 3 ].disable, n[ 0 ][ 2 ].lock, n[ 0 ][ 3 ].lock ), a.add( t[ 3 ].fire ), o[ t[ 0 ] ] = function () { - return o[ t[ 0 ] + "With" ]( this === o ? void 0 : this, arguments ), this - }, o[ t[ 0 ] + "With" ] = a.fireWith - } ), i.promise( o ), t && t.call( o, o ), o - }, - when: function ( e ) { - var t = arguments.length, - n = t, - r = Array( n ), - i = o.call( arguments ), - a = w.Deferred(), - s = function ( e ) { - return function ( n ) { - r[ e ] = this, i[ e ] = arguments.length > 1 ? o.call( arguments ) : n, --t || a.resolveWith( r, i ) - } - }; - if ( t <= 1 && ( $( e, a.done( s( n ) ).resolve, a.reject, !t ), "pending" === a.state() || g( i[ n ] && i[ n ].then ) ) ) return a.then(); - while ( n-- ) $( i[ n ], s( n ), a.reject ); - return a.promise() - } - } ); - var B = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; - w.Deferred.exceptionHook = function ( t, n ) { - e.console && e.console.warn && t && B.test( t.name ) && e.console.warn( "jQuery.Deferred exception: " + t.message, t.stack, n ) - }, w.readyException = function ( t ) { - e.setTimeout( function () { - throw t - } ) - }; - var F = w.Deferred(); - w.fn.ready = function ( e ) { - return F.then( e )[ "catch" ]( function ( e ) { - w.readyException( e ) - } ), this - }, w.extend( { - isReady: !1, - readyWait: 1, - ready: function ( e ) { - ( !0 === e ? --w.readyWait : w.isReady ) || ( w.isReady = !0, !0 !== e && --w.readyWait > 0 || F.resolveWith( r, [ w ] ) ) - } - } ), w.ready.then = F.then; - - function _() { - r.removeEventListener( "DOMContentLoaded", _ ), e.removeEventListener( "load", _ ), w.ready() - } - "complete" === r.readyState || "loading" !== r.readyState && !r.documentElement.doScroll ? e.setTimeout( w.ready ) : ( r.addEventListener( "DOMContentLoaded", _ ), e.addEventListener( "load", _ ) ); - var z = function ( e, t, n, r, i, o, a ) { - var s = 0, - u = e.length, - l = null == n; - if ( "object" === x( n ) ) { - i = !0; - for ( s in n ) z( e, t, s, n[ s ], !0, o, a ) - } else if ( void 0 !== r && ( i = !0, g( r ) || ( a = !0 ), l && ( a ? ( t.call( e, r ), t = null ) : ( l = t, t = function ( e, t, n ) { - return l.call( w( e ), n ) - } ) ), t ) ) - for ( ; s < u; s++ ) t( e[ s ], n, a ? r : r.call( e[ s ], s, t( e[ s ], n ) ) ); - return i ? e : l ? t.call( e ) : u ? t( e[ 0 ], n ) : o - }, - X = /^-ms-/, - U = /-([a-z])/g; - - function V( e, t ) { - return t.toUpperCase() - } - - function G( e ) { - return e.replace( X, "ms-" ).replace( U, V ) - } - var Y = function ( e ) { - return 1 === e.nodeType || 9 === e.nodeType || !+e.nodeType - }; - - function Q() { - this.expando = w.expando + Q.uid++ - } - Q.uid = 1, Q.prototype = { - cache: function ( e ) { - var t = e[ this.expando ]; - return t || ( t = {}, Y( e ) && ( e.nodeType ? e[ this.expando ] = t : Object.defineProperty( e, this.expando, { - value: t, - configurable: !0 - } ) ) ), t - }, - set: function ( e, t, n ) { - var r, i = this.cache( e ); - if ( "string" == typeof t ) i[ G( t ) ] = n; - else - for ( r in t ) i[ G( r ) ] = t[ r ]; - return i - }, - get: function ( e, t ) { - return void 0 === t ? this.cache( e ) : e[ this.expando ] && e[ this.expando ][ G( t ) ] - }, - access: function ( e, t, n ) { - return void 0 === t || t && "string" == typeof t && void 0 === n ? this.get( e, t ) : ( this.set( e, t, n ), void 0 !== n ? n : t ) - }, - remove: function ( e, t ) { - var n, r = e[ this.expando ]; - if ( void 0 !== r ) { - if ( void 0 !== t ) { - n = ( t = Array.isArray( t ) ? t.map( G ) : ( t = G( t ) ) in r ? [ t ] : t.match( M ) || [] ).length; - while ( n-- ) delete r[ t[ n ] ] - }( void 0 === t || w.isEmptyObject( r ) ) && ( e.nodeType ? e[ this.expando ] = void 0 : delete e[ this.expando ] ) - } - }, - hasData: function ( e ) { - var t = e[ this.expando ]; - return void 0 !== t && !w.isEmptyObject( t ) - } - }; - var J = new Q, - K = new Q, - Z = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - ee = /[A-Z]/g; - - function te( e ) { - return "true" === e || "false" !== e && ( "null" === e ? null : e === +e + "" ? +e : Z.test( e ) ? JSON.parse( e ) : e ) - } - - function ne( e, t, n ) { - var r; - if ( void 0 === n && 1 === e.nodeType ) - if ( r = "data-" + t.replace( ee, "-$&" ).toLowerCase(), "string" == typeof ( n = e.getAttribute( r ) ) ) { - try { - n = te( n ) - } catch ( e ) {} - K.set( e, t, n ) - } else n = void 0; - return n - } - w.extend( { - hasData: function ( e ) { - return K.hasData( e ) || J.hasData( e ) - }, - data: function ( e, t, n ) { - return K.access( e, t, n ) - }, - removeData: function ( e, t ) { - K.remove( e, t ) - }, - _data: function ( e, t, n ) { - return J.access( e, t, n ) - }, - _removeData: function ( e, t ) { - J.remove( e, t ) - } - } ), w.fn.extend( { - data: function ( e, t ) { - var n, r, i, o = this[ 0 ], - a = o && o.attributes; - if ( void 0 === e ) { - if ( this.length && ( i = K.get( o ), 1 === o.nodeType && !J.get( o, "hasDataAttrs" ) ) ) { - n = a.length; - while ( n-- ) a[ n ] && 0 === ( r = a[ n ].name ).indexOf( "data-" ) && ( r = G( r.slice( 5 ) ), ne( o, r, i[ r ] ) ); - J.set( o, "hasDataAttrs", !0 ) - } - return i - } - return "object" == typeof e ? this.each( function () { - K.set( this, e ) - } ) : z( this, function ( t ) { - var n; - if ( o && void 0 === t ) { - if ( void 0 !== ( n = K.get( o, e ) ) ) return n; - if ( void 0 !== ( n = ne( o, e ) ) ) return n - } else this.each( function () { - K.set( this, e, t ) - } ) - }, null, t, arguments.length > 1, null, !0 ) - }, - removeData: function ( e ) { - return this.each( function () { - K.remove( this, e ) - } ) - } - } ), w.extend( { - queue: function ( e, t, n ) { - var r; - if ( e ) return t = ( t || "fx" ) + "queue", r = J.get( e, t ), n && ( !r || Array.isArray( n ) ? r = J.access( e, t, w.makeArray( n ) ) : r.push( n ) ), r || [] - }, - dequeue: function ( e, t ) { - t = t || "fx"; - var n = w.queue( e, t ), - r = n.length, - i = n.shift(), - o = w._queueHooks( e, t ), - a = function () { - w.dequeue( e, t ) - }; - "inprogress" === i && ( i = n.shift(), r-- ), i && ( "fx" === t && n.unshift( "inprogress" ), delete o.stop, i.call( e, a, o ) ), !r && o && o.empty.fire() - }, - _queueHooks: function ( e, t ) { - var n = t + "queueHooks"; - return J.get( e, n ) || J.access( e, n, { - empty: w.Callbacks( "once memory" ).add( function () { - J.remove( e, [ t + "queue", n ] ) - } ) - } ) - } - } ), w.fn.extend( { - queue: function ( e, t ) { - var n = 2; - return "string" != typeof e && ( t = e, e = "fx", n-- ), arguments.length < n ? w.queue( this[ 0 ], e ) : void 0 === t ? this : this.each( function () { - var n = w.queue( this, e, t ); - w._queueHooks( this, e ), "fx" === e && "inprogress" !== n[ 0 ] && w.dequeue( this, e ) - } ) - }, - dequeue: function ( e ) { - return this.each( function () { - w.dequeue( this, e ) - } ) - }, - clearQueue: function ( e ) { - return this.queue( e || "fx", [] ) - }, - promise: function ( e, t ) { - var n, r = 1, - i = w.Deferred(), - o = this, - a = this.length, - s = function () { - --r || i.resolveWith( o, [ o ] ) - }; - "string" != typeof e && ( t = e, e = void 0 ), e = e || "fx"; - while ( a-- )( n = J.get( o[ a ], e + "queueHooks" ) ) && n.empty && ( r++, n.empty.add( s ) ); - return s(), i.promise( t ) - } - } ); - var re = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source, - ie = new RegExp( "^(?:([+-])=|)(" + re + ")([a-z%]*)$", "i" ), - oe = [ "Top", "Right", "Bottom", "Left" ], - ae = function ( e, t ) { - return "none" === ( e = t || e ).style.display || "" === e.style.display && w.contains( e.ownerDocument, e ) && "none" === w.css( e, "display" ) - }, - se = function ( e, t, n, r ) { - var i, o, a = {}; - for ( o in t ) a[ o ] = e.style[ o ], e.style[ o ] = t[ o ]; - i = n.apply( e, r || [] ); - for ( o in t ) e.style[ o ] = a[ o ]; - return i - }; - - function ue( e, t, n, r ) { - var i, o, a = 20, - s = r ? function () { - return r.cur() - } : function () { - return w.css( e, t, "" ) - }, - u = s(), - l = n && n[ 3 ] || ( w.cssNumber[ t ] ? "" : "px" ), - c = ( w.cssNumber[ t ] || "px" !== l && +u ) && ie.exec( w.css( e, t ) ); - if ( c && c[ 3 ] !== l ) { - u /= 2, l = l || c[ 3 ], c = +u || 1; - while ( a-- ) w.style( e, t, c + l ), ( 1 - o ) * ( 1 - ( o = s() / u || .5 ) ) <= 0 && ( a = 0 ), c /= o; - c *= 2, w.style( e, t, c + l ), n = n || [] - } - return n && ( c = +c || +u || 0, i = n[ 1 ] ? c + ( n[ 1 ] + 1 ) * n[ 2 ] : +n[ 2 ], r && ( r.unit = l, r.start = c, r.end = i ) ), i - } - var le = {}; - - function ce( e ) { - var t, n = e.ownerDocument, - r = e.nodeName, - i = le[ r ]; - return i || ( t = n.body.appendChild( n.createElement( r ) ), i = w.css( t, "display" ), t.parentNode.removeChild( t ), "none" === i && ( i = "block" ), le[ r ] = i, i ) - } - - function fe( e, t ) { - for ( var n, r, i = [], o = 0, a = e.length; o < a; o++ )( r = e[ o ] ).style && ( n = r.style.display, t ? ( "none" === n && ( i[ o ] = J.get( r, "display" ) || null, i[ o ] || ( r.style.display = "" ) ), "" === r.style.display && ae( r ) && ( i[ o ] = ce( r ) ) ) : "none" !== n && ( i[ o ] = "none", J.set( r, "display", n ) ) ); - for ( o = 0; o < a; o++ ) null != i[ o ] && ( e[ o ].style.display = i[ o ] ); - return e - } - w.fn.extend( { - show: function () { - return fe( this, !0 ) - }, - hide: function () { - return fe( this ) - }, - toggle: function ( e ) { - return "boolean" == typeof e ? e ? this.show() : this.hide() : this.each( function () { - ae( this ) ? w( this ).show() : w( this ).hide() - } ) - } - } ); - var pe = /^(?:checkbox|radio)$/i, - de = /<([a-z][^\/\0>\x20\t\r\n\f]+)/i, - he = /^$|^module$|\/(?:java|ecma)script/i, - ge = { - option: [ 1, "" ], - thead: [ 1, "", "
" ], - col: [ 2, "", "
" ], - tr: [ 2, "", "
" ], - td: [ 3, "", "
" ], - _default: [ 0, "", "" ] - }; - ge.optgroup = ge.option, ge.tbody = ge.tfoot = ge.colgroup = ge.caption = ge.thead, ge.th = ge.td; - - function ye( e, t ) { - var n; - return n = "undefined" != typeof e.getElementsByTagName ? e.getElementsByTagName( t || "*" ) : "undefined" != typeof e.querySelectorAll ? e.querySelectorAll( t || "*" ) : [], void 0 === t || t && N( e, t ) ? w.merge( [ e ], n ) : n - } - - function ve( e, t ) { - for ( var n = 0, r = e.length; n < r; n++ ) J.set( e[ n ], "globalEval", !t || J.get( t[ n ], "globalEval" ) ) - } - var me = /<|&#?\w+;/; - - function xe( e, t, n, r, i ) { - for ( var o, a, s, u, l, c, f = t.createDocumentFragment(), p = [], d = 0, h = e.length; d < h; d++ ) - if ( ( o = e[ d ] ) || 0 === o ) - if ( "object" === x( o ) ) w.merge( p, o.nodeType ? [ o ] : o ); - else if ( me.test( o ) ) { - a = a || f.appendChild( t.createElement( "div" ) ), s = ( de.exec( o ) || [ "", "" ] )[ 1 ].toLowerCase(), u = ge[ s ] || ge._default, a.innerHTML = u[ 1 ] + w.htmlPrefilter( o ) + u[ 2 ], c = u[ 0 ]; - while ( c-- ) a = a.lastChild; - w.merge( p, a.childNodes ), ( a = f.firstChild ).textContent = "" - } else p.push( t.createTextNode( o ) ); - f.textContent = "", d = 0; - while ( o = p[ d++ ] ) - if ( r && w.inArray( o, r ) > -1 ) i && i.push( o ); - else if ( l = w.contains( o.ownerDocument, o ), a = ye( f.appendChild( o ), "script" ), l && ve( a ), n ) { - c = 0; - while ( o = a[ c++ ] ) he.test( o.type || "" ) && n.push( o ) - } - return f - }! function () { - var e = r.createDocumentFragment().appendChild( r.createElement( "div" ) ), - t = r.createElement( "input" ); - t.setAttribute( "type", "radio" ), t.setAttribute( "checked", "checked" ), t.setAttribute( "name", "t" ), e.appendChild( t ), h.checkClone = e.cloneNode( !0 ).cloneNode( !0 ).lastChild.checked, e.innerHTML = "", h.noCloneChecked = !!e.cloneNode( !0 ).lastChild.defaultValue - }(); - var be = r.documentElement, - we = /^key/, - Te = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, - Ce = /^([^.]*)(?:\.(.+)|)/; - - function Ee() { - return !0 - } - - function ke() { - return !1 - } - - function Se() { - try { - return r.activeElement - } catch ( e ) {} - } - - function De( e, t, n, r, i, o ) { - var a, s; - if ( "object" == typeof t ) { - "string" != typeof n && ( r = r || n, n = void 0 ); - for ( s in t ) De( e, s, n, r, t[ s ], o ); - return e - } - if ( null == r && null == i ? ( i = n, r = n = void 0 ) : null == i && ( "string" == typeof n ? ( i = r, r = void 0 ) : ( i = r, r = n, n = void 0 ) ), !1 === i ) i = ke; - else if ( !i ) return e; - return 1 === o && ( a = i, ( i = function ( e ) { - return w().off( e ), a.apply( this, arguments ) - } ).guid = a.guid || ( a.guid = w.guid++ ) ), e.each( function () { - w.event.add( this, t, i, r, n ) - } ) - } - w.event = { - global: {}, - add: function ( e, t, n, r, i ) { - var o, a, s, u, l, c, f, p, d, h, g, y = J.get( e ); - if ( y ) { - n.handler && ( n = ( o = n ).handler, i = o.selector ), i && w.find.matchesSelector( be, i ), n.guid || ( n.guid = w.guid++ ), ( u = y.events ) || ( u = y.events = {} ), ( a = y.handle ) || ( a = y.handle = function ( t ) { - return "undefined" != typeof w && w.event.triggered !== t.type ? w.event.dispatch.apply( e, arguments ) : void 0 - } ), l = ( t = ( t || "" ).match( M ) || [ "" ] ).length; - while ( l-- ) d = g = ( s = Ce.exec( t[ l ] ) || [] )[ 1 ], h = ( s[ 2 ] || "" ).split( "." ).sort(), d && ( f = w.event.special[ d ] || {}, d = ( i ? f.delegateType : f.bindType ) || d, f = w.event.special[ d ] || {}, c = w.extend( { - type: d, - origType: g, - data: r, - handler: n, - guid: n.guid, - selector: i, - needsContext: i && w.expr.match.needsContext.test( i ), - namespace: h.join( "." ) - }, o ), ( p = u[ d ] ) || ( ( p = u[ d ] = [] ).delegateCount = 0, f.setup && !1 !== f.setup.call( e, r, h, a ) || e.addEventListener && e.addEventListener( d, a ) ), f.add && ( f.add.call( e, c ), c.handler.guid || ( c.handler.guid = n.guid ) ), i ? p.splice( p.delegateCount++, 0, c ) : p.push( c ), w.event.global[ d ] = !0 ) - } - }, - remove: function ( e, t, n, r, i ) { - var o, a, s, u, l, c, f, p, d, h, g, y = J.hasData( e ) && J.get( e ); - if ( y && ( u = y.events ) ) { - l = ( t = ( t || "" ).match( M ) || [ "" ] ).length; - while ( l-- ) - if ( s = Ce.exec( t[ l ] ) || [], d = g = s[ 1 ], h = ( s[ 2 ] || "" ).split( "." ).sort(), d ) { - f = w.event.special[ d ] || {}, p = u[ d = ( r ? f.delegateType : f.bindType ) || d ] || [], s = s[ 2 ] && new RegExp( "(^|\\.)" + h.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ), a = o = p.length; - while ( o-- ) c = p[ o ], !i && g !== c.origType || n && n.guid !== c.guid || s && !s.test( c.namespace ) || r && r !== c.selector && ( "**" !== r || !c.selector ) || ( p.splice( o, 1 ), c.selector && p.delegateCount--, f.remove && f.remove.call( e, c ) ); - a && !p.length && ( f.teardown && !1 !== f.teardown.call( e, h, y.handle ) || w.removeEvent( e, d, y.handle ), delete u[ d ] ) - } else - for ( d in u ) w.event.remove( e, d + t[ l ], n, r, !0 ); - w.isEmptyObject( u ) && J.remove( e, "handle events" ) - } - }, - dispatch: function ( e ) { - var t = w.event.fix( e ), - n, r, i, o, a, s, u = new Array( arguments.length ), - l = ( J.get( this, "events" ) || {} )[ t.type ] || [], - c = w.event.special[ t.type ] || {}; - for ( u[ 0 ] = t, n = 1; n < arguments.length; n++ ) u[ n ] = arguments[ n ]; - if ( t.delegateTarget = this, !c.preDispatch || !1 !== c.preDispatch.call( this, t ) ) { - s = w.event.handlers.call( this, t, l ), n = 0; - while ( ( o = s[ n++ ] ) && !t.isPropagationStopped() ) { - t.currentTarget = o.elem, r = 0; - while ( ( a = o.handlers[ r++ ] ) && !t.isImmediatePropagationStopped() ) t.rnamespace && !t.rnamespace.test( a.namespace ) || ( t.handleObj = a, t.data = a.data, void 0 !== ( i = ( ( w.event.special[ a.origType ] || {} ).handle || a.handler ).apply( o.elem, u ) ) && !1 === ( t.result = i ) && ( t.preventDefault(), t.stopPropagation() ) ) - } - return c.postDispatch && c.postDispatch.call( this, t ), t.result - } - }, - handlers: function ( e, t ) { - var n, r, i, o, a, s = [], - u = t.delegateCount, - l = e.target; - if ( u && l.nodeType && !( "click" === e.type && e.button >= 1 ) ) - for ( ; l !== this; l = l.parentNode || this ) - if ( 1 === l.nodeType && ( "click" !== e.type || !0 !== l.disabled ) ) { - for ( o = [], a = {}, n = 0; n < u; n++ ) void 0 === a[ i = ( r = t[ n ] ).selector + " " ] && ( a[ i ] = r.needsContext ? w( i, this ).index( l ) > -1 : w.find( i, this, null, [ l ] ).length ), a[ i ] && o.push( r ); - o.length && s.push( { - elem: l, - handlers: o - } ) - } return l = this, u < t.length && s.push( { - elem: l, - handlers: t.slice( u ) - } ), s - }, - addProp: function ( e, t ) { - Object.defineProperty( w.Event.prototype, e, { - enumerable: !0, - configurable: !0, - get: g( t ) ? function () { - if ( this.originalEvent ) return t( this.originalEvent ) - } : function () { - if ( this.originalEvent ) return this.originalEvent[ e ] - }, - set: function ( t ) { - Object.defineProperty( this, e, { - enumerable: !0, - configurable: !0, - writable: !0, - value: t - } ) - } - } ) - }, - fix: function ( e ) { - return e[ w.expando ] ? e : new w.Event( e ) - }, - special: { - load: { - noBubble: !0 - }, - focus: { - trigger: function () { - if ( this !== Se() && this.focus ) return this.focus(), !1 - }, - delegateType: "focusin" - }, - blur: { - trigger: function () { - if ( this === Se() && this.blur ) return this.blur(), !1 - }, - delegateType: "focusout" - }, - click: { - trigger: function () { - if ( "checkbox" === this.type && this.click && N( this, "input" ) ) return this.click(), !1 - }, - _default: function ( e ) { - return N( e.target, "a" ) - } - }, - beforeunload: { - postDispatch: function ( e ) { - void 0 !== e.result && e.originalEvent && ( e.originalEvent.returnValue = e.result ) - } - } - } - }, w.removeEvent = function ( e, t, n ) { - e.removeEventListener && e.removeEventListener( t, n ) - }, w.Event = function ( e, t ) { - if ( !( this instanceof w.Event ) ) return new w.Event( e, t ); - e && e.type ? ( this.originalEvent = e, this.type = e.type, this.isDefaultPrevented = e.defaultPrevented || void 0 === e.defaultPrevented && !1 === e.returnValue ? Ee : ke, this.target = e.target && 3 === e.target.nodeType ? e.target.parentNode : e.target, this.currentTarget = e.currentTarget, this.relatedTarget = e.relatedTarget ) : this.type = e, t && w.extend( this, t ), this.timeStamp = e && e.timeStamp || Date.now(), this[ w.expando ] = !0 - }, w.Event.prototype = { - constructor: w.Event, - isDefaultPrevented: ke, - isPropagationStopped: ke, - isImmediatePropagationStopped: ke, - isSimulated: !1, - preventDefault: function () { - var e = this.originalEvent; - this.isDefaultPrevented = Ee, e && !this.isSimulated && e.preventDefault() - }, - stopPropagation: function () { - var e = this.originalEvent; - this.isPropagationStopped = Ee, e && !this.isSimulated && e.stopPropagation() - }, - stopImmediatePropagation: function () { - var e = this.originalEvent; - this.isImmediatePropagationStopped = Ee, e && !this.isSimulated && e.stopImmediatePropagation(), this.stopPropagation() - } - }, w.each( { - altKey: !0, - bubbles: !0, - cancelable: !0, - changedTouches: !0, - ctrlKey: !0, - detail: !0, - eventPhase: !0, - metaKey: !0, - pageX: !0, - pageY: !0, - shiftKey: !0, - view: !0, - "char": !0, - charCode: !0, - key: !0, - keyCode: !0, - button: !0, - buttons: !0, - clientX: !0, - clientY: !0, - offsetX: !0, - offsetY: !0, - pointerId: !0, - pointerType: !0, - screenX: !0, - screenY: !0, - targetTouches: !0, - toElement: !0, - touches: !0, - which: function ( e ) { - var t = e.button; - return null == e.which && we.test( e.type ) ? null != e.charCode ? e.charCode : e.keyCode : !e.which && void 0 !== t && Te.test( e.type ) ? 1 & t ? 1 : 2 & t ? 3 : 4 & t ? 2 : 0 : e.which - } - }, w.event.addProp ), w.each( { - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" - }, function ( e, t ) { - w.event.special[ e ] = { - delegateType: t, - bindType: t, - handle: function ( e ) { - var n, r = this, - i = e.relatedTarget, - o = e.handleObj; - return i && ( i === r || w.contains( r, i ) ) || ( e.type = o.origType, n = o.handler.apply( this, arguments ), e.type = t ), n - } - } - } ), w.fn.extend( { - on: function ( e, t, n, r ) { - return De( this, e, t, n, r ) - }, - one: function ( e, t, n, r ) { - return De( this, e, t, n, r, 1 ) - }, - off: function ( e, t, n ) { - var r, i; - if ( e && e.preventDefault && e.handleObj ) return r = e.handleObj, w( e.delegateTarget ).off( r.namespace ? r.origType + "." + r.namespace : r.origType, r.selector, r.handler ), this; - if ( "object" == typeof e ) { - for ( i in e ) this.off( i, t, e[ i ] ); - return this - } - return !1 !== t && "function" != typeof t || ( n = t, t = void 0 ), !1 === n && ( n = ke ), this.each( function () { - w.event.remove( this, e, n, t ) - } ) - } - } ); - var Ne = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi, - Ae = /\s*$/g; - - function Le( e, t ) { - return N( e, "table" ) && N( 11 !== t.nodeType ? t : t.firstChild, "tr" ) ? w( e ).children( "tbody" )[ 0 ] || e : e - } - - function He( e ) { - return e.type = ( null !== e.getAttribute( "type" ) ) + "/" + e.type, e - } - - function Oe( e ) { - return "true/" === ( e.type || "" ).slice( 0, 5 ) ? e.type = e.type.slice( 5 ) : e.removeAttribute( "type" ), e - } - - function Pe( e, t ) { - var n, r, i, o, a, s, u, l; - if ( 1 === t.nodeType ) { - if ( J.hasData( e ) && ( o = J.access( e ), a = J.set( t, o ), l = o.events ) ) { - delete a.handle, a.events = {}; - for ( i in l ) - for ( n = 0, r = l[ i ].length; n < r; n++ ) w.event.add( t, i, l[ i ][ n ] ) - } - K.hasData( e ) && ( s = K.access( e ), u = w.extend( {}, s ), K.set( t, u ) ) - } - } - - function Me( e, t ) { - var n = t.nodeName.toLowerCase(); - "input" === n && pe.test( e.type ) ? t.checked = e.checked : "input" !== n && "textarea" !== n || ( t.defaultValue = e.defaultValue ) - } - - function Re( e, t, n, r ) { - t = a.apply( [], t ); - var i, o, s, u, l, c, f = 0, - p = e.length, - d = p - 1, - y = t[ 0 ], - v = g( y ); - if ( v || p > 1 && "string" == typeof y && !h.checkClone && je.test( y ) ) return e.each( function ( i ) { - var o = e.eq( i ); - v && ( t[ 0 ] = y.call( this, i, o.html() ) ), Re( o, t, n, r ) - } ); - if ( p && ( i = xe( t, e[ 0 ].ownerDocument, !1, e, r ), o = i.firstChild, 1 === i.childNodes.length && ( i = o ), o || r ) ) { - for ( u = ( s = w.map( ye( i, "script" ), He ) ).length; f < p; f++ ) l = i, f !== d && ( l = w.clone( l, !0, !0 ), u && w.merge( s, ye( l, "script" ) ) ), n.call( e[ f ], l, f ); - if ( u ) - for ( c = s[ s.length - 1 ].ownerDocument, w.map( s, Oe ), f = 0; f < u; f++ ) l = s[ f ], he.test( l.type || "" ) && !J.access( l, "globalEval" ) && w.contains( c, l ) && ( l.src && "module" !== ( l.type || "" ).toLowerCase() ? w._evalUrl && w._evalUrl( l.src ) : m( l.textContent.replace( qe, "" ), c, l ) ) - } - return e - } - - function Ie( e, t, n ) { - for ( var r, i = t ? w.filter( t, e ) : e, o = 0; null != ( r = i[ o ] ); o++ ) n || 1 !== r.nodeType || w.cleanData( ye( r ) ), r.parentNode && ( n && w.contains( r.ownerDocument, r ) && ve( ye( r, "script" ) ), r.parentNode.removeChild( r ) ); - return e - } - w.extend( { - htmlPrefilter: function ( e ) { - return e.replace( Ne, "<$1>" ) - }, - clone: function ( e, t, n ) { - var r, i, o, a, s = e.cloneNode( !0 ), - u = w.contains( e.ownerDocument, e ); - if ( !( h.noCloneChecked || 1 !== e.nodeType && 11 !== e.nodeType || w.isXMLDoc( e ) ) ) - for ( a = ye( s ), r = 0, i = ( o = ye( e ) ).length; r < i; r++ ) Me( o[ r ], a[ r ] ); - if ( t ) - if ( n ) - for ( o = o || ye( e ), a = a || ye( s ), r = 0, i = o.length; r < i; r++ ) Pe( o[ r ], a[ r ] ); - else Pe( e, s ); - return ( a = ye( s, "script" ) ).length > 0 && ve( a, !u && ye( e, "script" ) ), s - }, - cleanData: function ( e ) { - for ( var t, n, r, i = w.event.special, o = 0; void 0 !== ( n = e[ o ] ); o++ ) - if ( Y( n ) ) { - if ( t = n[ J.expando ] ) { - if ( t.events ) - for ( r in t.events ) i[ r ] ? w.event.remove( n, r ) : w.removeEvent( n, r, t.handle ); - n[ J.expando ] = void 0 - } - n[ K.expando ] && ( n[ K.expando ] = void 0 ) - } - } - } ), w.fn.extend( { - detach: function ( e ) { - return Ie( this, e, !0 ) - }, - remove: function ( e ) { - return Ie( this, e ) - }, - text: function ( e ) { - return z( this, function ( e ) { - return void 0 === e ? w.text( this ) : this.empty().each( function () { - 1 !== this.nodeType && 11 !== this.nodeType && 9 !== this.nodeType || ( this.textContent = e ) - } ) - }, null, e, arguments.length ) - }, - append: function () { - return Re( this, arguments, function ( e ) { - 1 !== this.nodeType && 11 !== this.nodeType && 9 !== this.nodeType || Le( this, e ).appendChild( e ) - } ) - }, - prepend: function () { - return Re( this, arguments, function ( e ) { - if ( 1 === this.nodeType || 11 === this.nodeType || 9 === this.nodeType ) { - var t = Le( this, e ); - t.insertBefore( e, t.firstChild ) - } - } ) - }, - before: function () { - return Re( this, arguments, function ( e ) { - this.parentNode && this.parentNode.insertBefore( e, this ) - } ) - }, - after: function () { - return Re( this, arguments, function ( e ) { - this.parentNode && this.parentNode.insertBefore( e, this.nextSibling ) - } ) - }, - empty: function () { - for ( var e, t = 0; null != ( e = this[ t ] ); t++ ) 1 === e.nodeType && ( w.cleanData( ye( e, !1 ) ), e.textContent = "" ); - return this - }, - clone: function ( e, t ) { - return e = null != e && e, t = null == t ? e : t, this.map( function () { - return w.clone( this, e, t ) - } ) - }, - html: function ( e ) { - return z( this, function ( e ) { - var t = this[ 0 ] || {}, - n = 0, - r = this.length; - if ( void 0 === e && 1 === t.nodeType ) return t.innerHTML; - if ( "string" == typeof e && !Ae.test( e ) && !ge[ ( de.exec( e ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - e = w.htmlPrefilter( e ); - try { - for ( ; n < r; n++ ) 1 === ( t = this[ n ] || {} ).nodeType && ( w.cleanData( ye( t, !1 ) ), t.innerHTML = e ); - t = 0 - } catch ( e ) {} - } - t && this.empty().append( e ) - }, null, e, arguments.length ) - }, - replaceWith: function () { - var e = []; - return Re( this, arguments, function ( t ) { - var n = this.parentNode; - w.inArray( this, e ) < 0 && ( w.cleanData( ye( this ) ), n && n.replaceChild( t, this ) ) - }, e ) - } - } ), w.each( { - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" - }, function ( e, t ) { - w.fn[ e ] = function ( e ) { - for ( var n, r = [], i = w( e ), o = i.length - 1, a = 0; a <= o; a++ ) n = a === o ? this : this.clone( !0 ), w( i[ a ] )[ t ]( n ), s.apply( r, n.get() ); - return this.pushStack( r ) - } - } ); - var We = new RegExp( "^(" + re + ")(?!px)[a-z%]+$", "i" ), - $e = function ( t ) { - var n = t.ownerDocument.defaultView; - return n && n.opener || ( n = e ), n.getComputedStyle( t ) - }, - Be = new RegExp( oe.join( "|" ), "i" ); - ! function () { - function t() { - if ( c ) { - l.style.cssText = "position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0", c.style.cssText = "position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%", be.appendChild( l ).appendChild( c ); - var t = e.getComputedStyle( c ); - i = "1%" !== t.top, u = 12 === n( t.marginLeft ), c.style.right = "60%", s = 36 === n( t.right ), o = 36 === n( t.width ), c.style.position = "absolute", a = 36 === c.offsetWidth || "absolute", be.removeChild( l ), c = null - } - } - - function n( e ) { - return Math.round( parseFloat( e ) ) - } - var i, o, a, s, u, l = r.createElement( "div" ), - c = r.createElement( "div" ); - c.style && ( c.style.backgroundClip = "content-box", c.cloneNode( !0 ).style.backgroundClip = "", h.clearCloneStyle = "content-box" === c.style.backgroundClip, w.extend( h, { - boxSizingReliable: function () { - return t(), o - }, - pixelBoxStyles: function () { - return t(), s - }, - pixelPosition: function () { - return t(), i - }, - reliableMarginLeft: function () { - return t(), u - }, - scrollboxSize: function () { - return t(), a - } - } ) ) - }(); - - function Fe( e, t, n ) { - var r, i, o, a, s = e.style; - return ( n = n || $e( e ) ) && ( "" !== ( a = n.getPropertyValue( t ) || n[ t ] ) || w.contains( e.ownerDocument, e ) || ( a = w.style( e, t ) ), !h.pixelBoxStyles() && We.test( a ) && Be.test( t ) && ( r = s.width, i = s.minWidth, o = s.maxWidth, s.minWidth = s.maxWidth = s.width = a, a = n.width, s.width = r, s.minWidth = i, s.maxWidth = o ) ), void 0 !== a ? a + "" : a - } - - function _e( e, t ) { - return { - get: function () { - if ( !e() ) return ( this.get = t ).apply( this, arguments ); - delete this.get - } - } - } - var ze = /^(none|table(?!-c[ea]).+)/, - Xe = /^--/, - Ue = { - position: "absolute", - visibility: "hidden", - display: "block" - }, - Ve = { - letterSpacing: "0", - fontWeight: "400" - }, - Ge = [ "Webkit", "Moz", "ms" ], - Ye = r.createElement( "div" ).style; - - function Qe( e ) { - if ( e in Ye ) return e; - var t = e[ 0 ].toUpperCase() + e.slice( 1 ), - n = Ge.length; - while ( n-- ) - if ( ( e = Ge[ n ] + t ) in Ye ) return e - } - - function Je( e ) { - var t = w.cssProps[ e ]; - return t || ( t = w.cssProps[ e ] = Qe( e ) || e ), t - } - - function Ke( e, t, n ) { - var r = ie.exec( t ); - return r ? Math.max( 0, r[ 2 ] - ( n || 0 ) ) + ( r[ 3 ] || "px" ) : t - } - - function Ze( e, t, n, r, i, o ) { - var a = "width" === t ? 1 : 0, - s = 0, - u = 0; - if ( n === ( r ? "border" : "content" ) ) return 0; - for ( ; a < 4; a += 2 ) "margin" === n && ( u += w.css( e, n + oe[ a ], !0, i ) ), r ? ( "content" === n && ( u -= w.css( e, "padding" + oe[ a ], !0, i ) ), "margin" !== n && ( u -= w.css( e, "border" + oe[ a ] + "Width", !0, i ) ) ) : ( u += w.css( e, "padding" + oe[ a ], !0, i ), "padding" !== n ? u += w.css( e, "border" + oe[ a ] + "Width", !0, i ) : s += w.css( e, "border" + oe[ a ] + "Width", !0, i ) ); - return !r && o >= 0 && ( u += Math.max( 0, Math.ceil( e[ "offset" + t[ 0 ].toUpperCase() + t.slice( 1 ) ] - o - u - s - .5 ) ) ), u - } - - function et( e, t, n ) { - var r = $e( e ), - i = Fe( e, t, r ), - o = "border-box" === w.css( e, "boxSizing", !1, r ), - a = o; - if ( We.test( i ) ) { - if ( !n ) return i; - i = "auto" - } - return a = a && ( h.boxSizingReliable() || i === e.style[ t ] ), ( "auto" === i || !parseFloat( i ) && "inline" === w.css( e, "display", !1, r ) ) && ( i = e[ "offset" + t[ 0 ].toUpperCase() + t.slice( 1 ) ], a = !0 ), ( i = parseFloat( i ) || 0 ) + Ze( e, t, n || ( o ? "border" : "content" ), a, r, i ) + "px" - } - w.extend( { - cssHooks: { - opacity: { - get: function ( e, t ) { - if ( t ) { - var n = Fe( e, "opacity" ); - return "" === n ? "1" : n - } - } - } - }, - cssNumber: { - animationIterationCount: !0, - columnCount: !0, - fillOpacity: !0, - flexGrow: !0, - flexShrink: !0, - fontWeight: !0, - lineHeight: !0, - opacity: !0, - order: !0, - orphans: !0, - widows: !0, - zIndex: !0, - zoom: !0 - }, - cssProps: {}, - style: function ( e, t, n, r ) { - if ( e && 3 !== e.nodeType && 8 !== e.nodeType && e.style ) { - var i, o, a, s = G( t ), - u = Xe.test( t ), - l = e.style; - if ( u || ( t = Je( s ) ), a = w.cssHooks[ t ] || w.cssHooks[ s ], void 0 === n ) return a && "get" in a && void 0 !== ( i = a.get( e, !1, r ) ) ? i : l[ t ]; - "string" == ( o = typeof n ) && ( i = ie.exec( n ) ) && i[ 1 ] && ( n = ue( e, t, i ), o = "number" ), null != n && n === n && ( "number" === o && ( n += i && i[ 3 ] || ( w.cssNumber[ s ] ? "" : "px" ) ), h.clearCloneStyle || "" !== n || 0 !== t.indexOf( "background" ) || ( l[ t ] = "inherit" ), a && "set" in a && void 0 === ( n = a.set( e, n, r ) ) || ( u ? l.setProperty( t, n ) : l[ t ] = n ) ) - } - }, - css: function ( e, t, n, r ) { - var i, o, a, s = G( t ); - return Xe.test( t ) || ( t = Je( s ) ), ( a = w.cssHooks[ t ] || w.cssHooks[ s ] ) && "get" in a && ( i = a.get( e, !0, n ) ), void 0 === i && ( i = Fe( e, t, r ) ), "normal" === i && t in Ve && ( i = Ve[ t ] ), "" === n || n ? ( o = parseFloat( i ), !0 === n || isFinite( o ) ? o || 0 : i ) : i - } - } ), w.each( [ "height", "width" ], function ( e, t ) { - w.cssHooks[ t ] = { - get: function ( e, n, r ) { - if ( n ) return !ze.test( w.css( e, "display" ) ) || e.getClientRects().length && e.getBoundingClientRect().width ? et( e, t, r ) : se( e, Ue, function () { - return et( e, t, r ) - } ) - }, - set: function ( e, n, r ) { - var i, o = $e( e ), - a = "border-box" === w.css( e, "boxSizing", !1, o ), - s = r && Ze( e, t, r, a, o ); - return a && h.scrollboxSize() === o.position && ( s -= Math.ceil( e[ "offset" + t[ 0 ].toUpperCase() + t.slice( 1 ) ] - parseFloat( o[ t ] ) - Ze( e, t, "border", !1, o ) - .5 ) ), s && ( i = ie.exec( n ) ) && "px" !== ( i[ 3 ] || "px" ) && ( e.style[ t ] = n, n = w.css( e, t ) ), Ke( e, n, s ) - } - } - } ), w.cssHooks.marginLeft = _e( h.reliableMarginLeft, function ( e, t ) { - if ( t ) return ( parseFloat( Fe( e, "marginLeft" ) ) || e.getBoundingClientRect().left - se( e, { - marginLeft: 0 - }, function () { - return e.getBoundingClientRect().left - } ) ) + "px" - } ), w.each( { - margin: "", - padding: "", - border: "Width" - }, function ( e, t ) { - w.cssHooks[ e + t ] = { - expand: function ( n ) { - for ( var r = 0, i = {}, o = "string" == typeof n ? n.split( " " ) : [ n ]; r < 4; r++ ) i[ e + oe[ r ] + t ] = o[ r ] || o[ r - 2 ] || o[ 0 ]; - return i - } - }, "margin" !== e && ( w.cssHooks[ e + t ].set = Ke ) - } ), w.fn.extend( { - css: function ( e, t ) { - return z( this, function ( e, t, n ) { - var r, i, o = {}, - a = 0; - if ( Array.isArray( t ) ) { - for ( r = $e( e ), i = t.length; a < i; a++ ) o[ t[ a ] ] = w.css( e, t[ a ], !1, r ); - return o - } - return void 0 !== n ? w.style( e, t, n ) : w.css( e, t ) - }, e, t, arguments.length > 1 ) - } - } ); - - function tt( e, t, n, r, i ) { - return new tt.prototype.init( e, t, n, r, i ) - } - w.Tween = tt, tt.prototype = { - constructor: tt, - init: function ( e, t, n, r, i, o ) { - this.elem = e, this.prop = n, this.easing = i || w.easing._default, this.options = t, this.start = this.now = this.cur(), this.end = r, this.unit = o || ( w.cssNumber[ n ] ? "" : "px" ) - }, - cur: function () { - var e = tt.propHooks[ this.prop ]; - return e && e.get ? e.get( this ) : tt.propHooks._default.get( this ) - }, - run: function ( e ) { - var t, n = tt.propHooks[ this.prop ]; - return this.options.duration ? this.pos = t = w.easing[ this.easing ]( e, this.options.duration * e, 0, 1, this.options.duration ) : this.pos = t = e, this.now = ( this.end - this.start ) * t + this.start, this.options.step && this.options.step.call( this.elem, this.now, this ), n && n.set ? n.set( this ) : tt.propHooks._default.set( this ), this - } - }, tt.prototype.init.prototype = tt.prototype, tt.propHooks = { - _default: { - get: function ( e ) { - var t; - return 1 !== e.elem.nodeType || null != e.elem[ e.prop ] && null == e.elem.style[ e.prop ] ? e.elem[ e.prop ] : ( t = w.css( e.elem, e.prop, "" ) ) && "auto" !== t ? t : 0 - }, - set: function ( e ) { - w.fx.step[ e.prop ] ? w.fx.step[ e.prop ]( e ) : 1 !== e.elem.nodeType || null == e.elem.style[ w.cssProps[ e.prop ] ] && !w.cssHooks[ e.prop ] ? e.elem[ e.prop ] = e.now : w.style( e.elem, e.prop, e.now + e.unit ) - } - } - }, tt.propHooks.scrollTop = tt.propHooks.scrollLeft = { - set: function ( e ) { - e.elem.nodeType && e.elem.parentNode && ( e.elem[ e.prop ] = e.now ) - } - }, w.easing = { - linear: function ( e ) { - return e - }, - swing: function ( e ) { - return .5 - Math.cos( e * Math.PI ) / 2 - }, - _default: "swing" - }, w.fx = tt.prototype.init, w.fx.step = {}; - var nt, rt, it = /^(?:toggle|show|hide)$/, - ot = /queueHooks$/; - - function at() { - rt && ( !1 === r.hidden && e.requestAnimationFrame ? e.requestAnimationFrame( at ) : e.setTimeout( at, w.fx.interval ), w.fx.tick() ) - } - - function st() { - return e.setTimeout( function () { - nt = void 0 - } ), nt = Date.now() - } - - function ut( e, t ) { - var n, r = 0, - i = { - height: e - }; - for ( t = t ? 1 : 0; r < 4; r += 2 - t ) i[ "margin" + ( n = oe[ r ] ) ] = i[ "padding" + n ] = e; - return t && ( i.opacity = i.width = e ), i - } - - function lt( e, t, n ) { - for ( var r, i = ( pt.tweeners[ t ] || [] ).concat( pt.tweeners[ "*" ] ), o = 0, a = i.length; o < a; o++ ) - if ( r = i[ o ].call( n, t, e ) ) return r - } - - function ct( e, t, n ) { - var r, i, o, a, s, u, l, c, f = "width" in t || "height" in t, - p = this, - d = {}, - h = e.style, - g = e.nodeType && ae( e ), - y = J.get( e, "fxshow" ); - n.queue || ( null == ( a = w._queueHooks( e, "fx" ) ).unqueued && ( a.unqueued = 0, s = a.empty.fire, a.empty.fire = function () { - a.unqueued || s() - } ), a.unqueued++, p.always( function () { - p.always( function () { - a.unqueued--, w.queue( e, "fx" ).length || a.empty.fire() - } ) - } ) ); - for ( r in t ) - if ( i = t[ r ], it.test( i ) ) { - if ( delete t[ r ], o = o || "toggle" === i, i === ( g ? "hide" : "show" ) ) { - if ( "show" !== i || !y || void 0 === y[ r ] ) continue; - g = !0 - } - d[ r ] = y && y[ r ] || w.style( e, r ) - } if ( ( u = !w.isEmptyObject( t ) ) || !w.isEmptyObject( d ) ) { - f && 1 === e.nodeType && ( n.overflow = [ h.overflow, h.overflowX, h.overflowY ], null == ( l = y && y.display ) && ( l = J.get( e, "display" ) ), "none" === ( c = w.css( e, "display" ) ) && ( l ? c = l : ( fe( [ e ], !0 ), l = e.style.display || l, c = w.css( e, "display" ), fe( [ e ] ) ) ), ( "inline" === c || "inline-block" === c && null != l ) && "none" === w.css( e, "float" ) && ( u || ( p.done( function () { - h.display = l - } ), null == l && ( c = h.display, l = "none" === c ? "" : c ) ), h.display = "inline-block" ) ), n.overflow && ( h.overflow = "hidden", p.always( function () { - h.overflow = n.overflow[ 0 ], h.overflowX = n.overflow[ 1 ], h.overflowY = n.overflow[ 2 ] - } ) ), u = !1; - for ( r in d ) u || ( y ? "hidden" in y && ( g = y.hidden ) : y = J.access( e, "fxshow", { - display: l - } ), o && ( y.hidden = !g ), g && fe( [ e ], !0 ), p.done( function () { - g || fe( [ e ] ), J.remove( e, "fxshow" ); - for ( r in d ) w.style( e, r, d[ r ] ) - } ) ), u = lt( g ? y[ r ] : 0, r, p ), r in y || ( y[ r ] = u.start, g && ( u.end = u.start, u.start = 0 ) ) - } - } - - function ft( e, t ) { - var n, r, i, o, a; - for ( n in e ) - if ( r = G( n ), i = t[ r ], o = e[ n ], Array.isArray( o ) && ( i = o[ 1 ], o = e[ n ] = o[ 0 ] ), n !== r && ( e[ r ] = o, delete e[ n ] ), ( a = w.cssHooks[ r ] ) && "expand" in a ) { - o = a.expand( o ), delete e[ r ]; - for ( n in o ) n in e || ( e[ n ] = o[ n ], t[ n ] = i ) - } else t[ r ] = i - } - - function pt( e, t, n ) { - var r, i, o = 0, - a = pt.prefilters.length, - s = w.Deferred().always( function () { - delete u.elem - } ), - u = function () { - if ( i ) return !1; - for ( var t = nt || st(), n = Math.max( 0, l.startTime + l.duration - t ), r = 1 - ( n / l.duration || 0 ), o = 0, a = l.tweens.length; o < a; o++ ) l.tweens[ o ].run( r ); - return s.notifyWith( e, [ l, r, n ] ), r < 1 && a ? n : ( a || s.notifyWith( e, [ l, 1, 0 ] ), s.resolveWith( e, [ l ] ), !1 ) - }, - l = s.promise( { - elem: e, - props: w.extend( {}, t ), - opts: w.extend( !0, { - specialEasing: {}, - easing: w.easing._default - }, n ), - originalProperties: t, - originalOptions: n, - startTime: nt || st(), - duration: n.duration, - tweens: [], - createTween: function ( t, n ) { - var r = w.Tween( e, l.opts, t, n, l.opts.specialEasing[ t ] || l.opts.easing ); - return l.tweens.push( r ), r - }, - stop: function ( t ) { - var n = 0, - r = t ? l.tweens.length : 0; - if ( i ) return this; - for ( i = !0; n < r; n++ ) l.tweens[ n ].run( 1 ); - return t ? ( s.notifyWith( e, [ l, 1, 0 ] ), s.resolveWith( e, [ l, t ] ) ) : s.rejectWith( e, [ l, t ] ), this - } - } ), - c = l.props; - for ( ft( c, l.opts.specialEasing ); o < a; o++ ) - if ( r = pt.prefilters[ o ].call( l, e, c, l.opts ) ) return g( r.stop ) && ( w._queueHooks( l.elem, l.opts.queue ).stop = r.stop.bind( r ) ), r; - return w.map( c, lt, l ), g( l.opts.start ) && l.opts.start.call( e, l ), l.progress( l.opts.progress ).done( l.opts.done, l.opts.complete ).fail( l.opts.fail ).always( l.opts.always ), w.fx.timer( w.extend( u, { - elem: e, - anim: l, - queue: l.opts.queue - } ) ), l - } - w.Animation = w.extend( pt, { - tweeners: { - "*": [ function ( e, t ) { - var n = this.createTween( e, t ); - return ue( n.elem, e, ie.exec( t ), n ), n - } ] - }, - tweener: function ( e, t ) { - g( e ) ? ( t = e, e = [ "*" ] ) : e = e.match( M ); - for ( var n, r = 0, i = e.length; r < i; r++ ) n = e[ r ], pt.tweeners[ n ] = pt.tweeners[ n ] || [], pt.tweeners[ n ].unshift( t ) - }, - prefilters: [ ct ], - prefilter: function ( e, t ) { - t ? pt.prefilters.unshift( e ) : pt.prefilters.push( e ) - } - } ), w.speed = function ( e, t, n ) { - var r = e && "object" == typeof e ? w.extend( {}, e ) : { - complete: n || !n && t || g( e ) && e, - duration: e, - easing: n && t || t && !g( t ) && t - }; - return w.fx.off ? r.duration = 0 : "number" != typeof r.duration && ( r.duration in w.fx.speeds ? r.duration = w.fx.speeds[ r.duration ] : r.duration = w.fx.speeds._default ), null != r.queue && !0 !== r.queue || ( r.queue = "fx" ), r.old = r.complete, r.complete = function () { - g( r.old ) && r.old.call( this ), r.queue && w.dequeue( this, r.queue ) - }, r - }, w.fn.extend( { - fadeTo: function ( e, t, n, r ) { - return this.filter( ae ).css( "opacity", 0 ).show().end().animate( { - opacity: t - }, e, n, r ) - }, - animate: function ( e, t, n, r ) { - var i = w.isEmptyObject( e ), - o = w.speed( t, n, r ), - a = function () { - var t = pt( this, w.extend( {}, e ), o ); - ( i || J.get( this, "finish" ) ) && t.stop( !0 ) - }; - return a.finish = a, i || !1 === o.queue ? this.each( a ) : this.queue( o.queue, a ) - }, - stop: function ( e, t, n ) { - var r = function ( e ) { - var t = e.stop; - delete e.stop, t( n ) - }; - return "string" != typeof e && ( n = t, t = e, e = void 0 ), t && !1 !== e && this.queue( e || "fx", [] ), this.each( function () { - var t = !0, - i = null != e && e + "queueHooks", - o = w.timers, - a = J.get( this ); - if ( i ) a[ i ] && a[ i ].stop && r( a[ i ] ); - else - for ( i in a ) a[ i ] && a[ i ].stop && ot.test( i ) && r( a[ i ] ); - for ( i = o.length; i--; ) o[ i ].elem !== this || null != e && o[ i ].queue !== e || ( o[ i ].anim.stop( n ), t = !1, o.splice( i, 1 ) ); - !t && n || w.dequeue( this, e ) - } ) - }, - finish: function ( e ) { - return !1 !== e && ( e = e || "fx" ), this.each( function () { - var t, n = J.get( this ), - r = n[ e + "queue" ], - i = n[ e + "queueHooks" ], - o = w.timers, - a = r ? r.length : 0; - for ( n.finish = !0, w.queue( this, e, [] ), i && i.stop && i.stop.call( this, !0 ), t = o.length; t--; ) o[ t ].elem === this && o[ t ].queue === e && ( o[ t ].anim.stop( !0 ), o.splice( t, 1 ) ); - for ( t = 0; t < a; t++ ) r[ t ] && r[ t ].finish && r[ t ].finish.call( this ); - delete n.finish - } ) - } - } ), w.each( [ "toggle", "show", "hide" ], function ( e, t ) { - var n = w.fn[ t ]; - w.fn[ t ] = function ( e, r, i ) { - return null == e || "boolean" == typeof e ? n.apply( this, arguments ) : this.animate( ut( t, !0 ), e, r, i ) - } - } ), w.each( { - slideDown: ut( "show" ), - slideUp: ut( "hide" ), - slideToggle: ut( "toggle" ), - fadeIn: { - opacity: "show" - }, - fadeOut: { - opacity: "hide" - }, - fadeToggle: { - opacity: "toggle" - } - }, function ( e, t ) { - w.fn[ e ] = function ( e, n, r ) { - return this.animate( t, e, n, r ) - } - } ), w.timers = [], w.fx.tick = function () { - var e, t = 0, - n = w.timers; - for ( nt = Date.now(); t < n.length; t++ )( e = n[ t ] )() || n[ t ] !== e || n.splice( t--, 1 ); - n.length || w.fx.stop(), nt = void 0 - }, w.fx.timer = function ( e ) { - w.timers.push( e ), w.fx.start() - }, w.fx.interval = 13, w.fx.start = function () { - rt || ( rt = !0, at() ) - }, w.fx.stop = function () { - rt = null - }, w.fx.speeds = { - slow: 600, - fast: 200, - _default: 400 - }, w.fn.delay = function ( t, n ) { - return t = w.fx ? w.fx.speeds[ t ] || t : t, n = n || "fx", this.queue( n, function ( n, r ) { - var i = e.setTimeout( n, t ); - r.stop = function () { - e.clearTimeout( i ) - } - } ) - }, - function () { - var e = r.createElement( "input" ), - t = r.createElement( "select" ).appendChild( r.createElement( "option" ) ); - e.type = "checkbox", h.checkOn = "" !== e.value, h.optSelected = t.selected, ( e = r.createElement( "input" ) ).value = "t", e.type = "radio", h.radioValue = "t" === e.value - }(); - var dt, ht = w.expr.attrHandle; - w.fn.extend( { - attr: function ( e, t ) { - return z( this, w.attr, e, t, arguments.length > 1 ) - }, - removeAttr: function ( e ) { - return this.each( function () { - w.removeAttr( this, e ) - } ) - } - } ), w.extend( { - attr: function ( e, t, n ) { - var r, i, o = e.nodeType; - if ( 3 !== o && 8 !== o && 2 !== o ) return "undefined" == typeof e.getAttribute ? w.prop( e, t, n ) : ( 1 === o && w.isXMLDoc( e ) || ( i = w.attrHooks[ t.toLowerCase() ] || ( w.expr.match.bool.test( t ) ? dt : void 0 ) ), void 0 !== n ? null === n ? void w.removeAttr( e, t ) : i && "set" in i && void 0 !== ( r = i.set( e, n, t ) ) ? r : ( e.setAttribute( t, n + "" ), n ) : i && "get" in i && null !== ( r = i.get( e, t ) ) ? r : null == ( r = w.find.attr( e, t ) ) ? void 0 : r ) - }, - attrHooks: { - type: { - set: function ( e, t ) { - if ( !h.radioValue && "radio" === t && N( e, "input" ) ) { - var n = e.value; - return e.setAttribute( "type", t ), n && ( e.value = n ), t - } - } - } - }, - removeAttr: function ( e, t ) { - var n, r = 0, - i = t && t.match( M ); - if ( i && 1 === e.nodeType ) - while ( n = i[ r++ ] ) e.removeAttribute( n ) - } - } ), dt = { - set: function ( e, t, n ) { - return !1 === t ? w.removeAttr( e, n ) : e.setAttribute( n, n ), n - } - }, w.each( w.expr.match.bool.source.match( /\w+/g ), function ( e, t ) { - var n = ht[ t ] || w.find.attr; - ht[ t ] = function ( e, t, r ) { - var i, o, a = t.toLowerCase(); - return r || ( o = ht[ a ], ht[ a ] = i, i = null != n( e, t, r ) ? a : null, ht[ a ] = o ), i - } - } ); - var gt = /^(?:input|select|textarea|button)$/i, - yt = /^(?:a|area)$/i; - w.fn.extend( { - prop: function ( e, t ) { - return z( this, w.prop, e, t, arguments.length > 1 ) - }, - removeProp: function ( e ) { - return this.each( function () { - delete this[ w.propFix[ e ] || e ] - } ) - } - } ), w.extend( { - prop: function ( e, t, n ) { - var r, i, o = e.nodeType; - if ( 3 !== o && 8 !== o && 2 !== o ) return 1 === o && w.isXMLDoc( e ) || ( t = w.propFix[ t ] || t, i = w.propHooks[ t ] ), void 0 !== n ? i && "set" in i && void 0 !== ( r = i.set( e, n, t ) ) ? r : e[ t ] = n : i && "get" in i && null !== ( r = i.get( e, t ) ) ? r : e[ t ] - }, - propHooks: { - tabIndex: { - get: function ( e ) { - var t = w.find.attr( e, "tabindex" ); - return t ? parseInt( t, 10 ) : gt.test( e.nodeName ) || yt.test( e.nodeName ) && e.href ? 0 : -1 - } - } - }, - propFix: { - "for": "htmlFor", - "class": "className" - } - } ), h.optSelected || ( w.propHooks.selected = { - get: function ( e ) { - var t = e.parentNode; - return t && t.parentNode && t.parentNode.selectedIndex, null - }, - set: function ( e ) { - var t = e.parentNode; - t && ( t.selectedIndex, t.parentNode && t.parentNode.selectedIndex ) - } - } ), w.each( [ "tabIndex", "readOnly", "maxLength", "cellSpacing", "cellPadding", "rowSpan", "colSpan", "useMap", "frameBorder", "contentEditable" ], function () { - w.propFix[ this.toLowerCase() ] = this - } ); - - function vt( e ) { - return ( e.match( M ) || [] ).join( " " ) - } - - function mt( e ) { - return e.getAttribute && e.getAttribute( "class" ) || "" - } - - function xt( e ) { - return Array.isArray( e ) ? e : "string" == typeof e ? e.match( M ) || [] : [] - } - w.fn.extend( { - addClass: function ( e ) { - var t, n, r, i, o, a, s, u = 0; - if ( g( e ) ) return this.each( function ( t ) { - w( this ).addClass( e.call( this, t, mt( this ) ) ) - } ); - if ( ( t = xt( e ) ).length ) - while ( n = this[ u++ ] ) - if ( i = mt( n ), r = 1 === n.nodeType && " " + vt( i ) + " " ) { - a = 0; - while ( o = t[ a++ ] ) r.indexOf( " " + o + " " ) < 0 && ( r += o + " " ); - i !== ( s = vt( r ) ) && n.setAttribute( "class", s ) - } return this - }, - removeClass: function ( e ) { - var t, n, r, i, o, a, s, u = 0; - if ( g( e ) ) return this.each( function ( t ) { - w( this ).removeClass( e.call( this, t, mt( this ) ) ) - } ); - if ( !arguments.length ) return this.attr( "class", "" ); - if ( ( t = xt( e ) ).length ) - while ( n = this[ u++ ] ) - if ( i = mt( n ), r = 1 === n.nodeType && " " + vt( i ) + " " ) { - a = 0; - while ( o = t[ a++ ] ) - while ( r.indexOf( " " + o + " " ) > -1 ) r = r.replace( " " + o + " ", " " ); - i !== ( s = vt( r ) ) && n.setAttribute( "class", s ) - } return this - }, - toggleClass: function ( e, t ) { - var n = typeof e, - r = "string" === n || Array.isArray( e ); - return "boolean" == typeof t && r ? t ? this.addClass( e ) : this.removeClass( e ) : g( e ) ? this.each( function ( n ) { - w( this ).toggleClass( e.call( this, n, mt( this ), t ), t ) - } ) : this.each( function () { - var t, i, o, a; - if ( r ) { - i = 0, o = w( this ), a = xt( e ); - while ( t = a[ i++ ] ) o.hasClass( t ) ? o.removeClass( t ) : o.addClass( t ) - } else void 0 !== e && "boolean" !== n || ( ( t = mt( this ) ) && J.set( this, "__className__", t ), this.setAttribute && this.setAttribute( "class", t || !1 === e ? "" : J.get( this, "__className__" ) || "" ) ) - } ) - }, - hasClass: function ( e ) { - var t, n, r = 0; - t = " " + e + " "; - while ( n = this[ r++ ] ) - if ( 1 === n.nodeType && ( " " + vt( mt( n ) ) + " " ).indexOf( t ) > -1 ) return !0; - return !1 - } - } ); - var bt = /\r/g; - w.fn.extend( { - val: function ( e ) { - var t, n, r, i = this[ 0 ]; { - if ( arguments.length ) return r = g( e ), this.each( function ( n ) { - var i; - 1 === this.nodeType && ( null == ( i = r ? e.call( this, n, w( this ).val() ) : e ) ? i = "" : "number" == typeof i ? i += "" : Array.isArray( i ) && ( i = w.map( i, function ( e ) { - return null == e ? "" : e + "" - } ) ), ( t = w.valHooks[ this.type ] || w.valHooks[ this.nodeName.toLowerCase() ] ) && "set" in t && void 0 !== t.set( this, i, "value" ) || ( this.value = i ) ) - } ); - if ( i ) return ( t = w.valHooks[ i.type ] || w.valHooks[ i.nodeName.toLowerCase() ] ) && "get" in t && void 0 !== ( n = t.get( i, "value" ) ) ? n : "string" == typeof ( n = i.value ) ? n.replace( bt, "" ) : null == n ? "" : n - } - } - } ), w.extend( { - valHooks: { - option: { - get: function ( e ) { - var t = w.find.attr( e, "value" ); - return null != t ? t : vt( w.text( e ) ) - } - }, - select: { - get: function ( e ) { - var t, n, r, i = e.options, - o = e.selectedIndex, - a = "select-one" === e.type, - s = a ? null : [], - u = a ? o + 1 : i.length; - for ( r = o < 0 ? u : a ? o : 0; r < u; r++ ) - if ( ( ( n = i[ r ] ).selected || r === o ) && !n.disabled && ( !n.parentNode.disabled || !N( n.parentNode, "optgroup" ) ) ) { - if ( t = w( n ).val(), a ) return t; - s.push( t ) - } return s - }, - set: function ( e, t ) { - var n, r, i = e.options, - o = w.makeArray( t ), - a = i.length; - while ( a-- )( ( r = i[ a ] ).selected = w.inArray( w.valHooks.option.get( r ), o ) > -1 ) && ( n = !0 ); - return n || ( e.selectedIndex = -1 ), o - } - } - } - } ), w.each( [ "radio", "checkbox" ], function () { - w.valHooks[ this ] = { - set: function ( e, t ) { - if ( Array.isArray( t ) ) return e.checked = w.inArray( w( e ).val(), t ) > -1 - } - }, h.checkOn || ( w.valHooks[ this ].get = function ( e ) { - return null === e.getAttribute( "value" ) ? "on" : e.value - } ) - } ), h.focusin = "onfocusin" in e; - var wt = /^(?:focusinfocus|focusoutblur)$/, - Tt = function ( e ) { - e.stopPropagation() - }; - w.extend( w.event, { - trigger: function ( t, n, i, o ) { - var a, s, u, l, c, p, d, h, v = [ i || r ], - m = f.call( t, "type" ) ? t.type : t, - x = f.call( t, "namespace" ) ? t.namespace.split( "." ) : []; - if ( s = h = u = i = i || r, 3 !== i.nodeType && 8 !== i.nodeType && !wt.test( m + w.event.triggered ) && ( m.indexOf( "." ) > -1 && ( m = ( x = m.split( "." ) ).shift(), x.sort() ), c = m.indexOf( ":" ) < 0 && "on" + m, t = t[ w.expando ] ? t : new w.Event( m, "object" == typeof t && t ), t.isTrigger = o ? 2 : 3, t.namespace = x.join( "." ), t.rnamespace = t.namespace ? new RegExp( "(^|\\.)" + x.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : null, t.result = void 0, t.target || ( t.target = i ), n = null == n ? [ t ] : w.makeArray( n, [ t ] ), d = w.event.special[ m ] || {}, o || !d.trigger || !1 !== d.trigger.apply( i, n ) ) ) { - if ( !o && !d.noBubble && !y( i ) ) { - for ( l = d.delegateType || m, wt.test( l + m ) || ( s = s.parentNode ); s; s = s.parentNode ) v.push( s ), u = s; - u === ( i.ownerDocument || r ) && v.push( u.defaultView || u.parentWindow || e ) - } - a = 0; - while ( ( s = v[ a++ ] ) && !t.isPropagationStopped() ) h = s, t.type = a > 1 ? l : d.bindType || m, ( p = ( J.get( s, "events" ) || {} )[ t.type ] && J.get( s, "handle" ) ) && p.apply( s, n ), ( p = c && s[ c ] ) && p.apply && Y( s ) && ( t.result = p.apply( s, n ), !1 === t.result && t.preventDefault() ); - return t.type = m, o || t.isDefaultPrevented() || d._default && !1 !== d._default.apply( v.pop(), n ) || !Y( i ) || c && g( i[ m ] ) && !y( i ) && ( ( u = i[ c ] ) && ( i[ c ] = null ), w.event.triggered = m, t.isPropagationStopped() && h.addEventListener( m, Tt ), i[ m ](), t.isPropagationStopped() && h.removeEventListener( m, Tt ), w.event.triggered = void 0, u && ( i[ c ] = u ) ), t.result - } - }, - simulate: function ( e, t, n ) { - var r = w.extend( new w.Event, n, { - type: e, - isSimulated: !0 - } ); - w.event.trigger( r, null, t ) - } - } ), w.fn.extend( { - trigger: function ( e, t ) { - return this.each( function () { - w.event.trigger( e, t, this ) - } ) - }, - triggerHandler: function ( e, t ) { - var n = this[ 0 ]; - if ( n ) return w.event.trigger( e, t, n, !0 ) - } - } ), h.focusin || w.each( { - focus: "focusin", - blur: "focusout" - }, function ( e, t ) { - var n = function ( e ) { - w.event.simulate( t, e.target, w.event.fix( e ) ) - }; - w.event.special[ t ] = { - setup: function () { - var r = this.ownerDocument || this, - i = J.access( r, t ); - i || r.addEventListener( e, n, !0 ), J.access( r, t, ( i || 0 ) + 1 ) - }, - teardown: function () { - var r = this.ownerDocument || this, - i = J.access( r, t ) - 1; - i ? J.access( r, t, i ) : ( r.removeEventListener( e, n, !0 ), J.remove( r, t ) ) - } - } - } ); - var Ct = e.location, - Et = Date.now(), - kt = /\?/; - w.parseXML = function ( t ) { - var n; - if ( !t || "string" != typeof t ) return null; - try { - n = ( new e.DOMParser ).parseFromString( t, "text/xml" ) - } catch ( e ) { - n = void 0 - } - return n && !n.getElementsByTagName( "parsererror" ).length || w.error( "Invalid XML: " + t ), n - }; - var St = /\[\]$/, - Dt = /\r?\n/g, - Nt = /^(?:submit|button|image|reset|file)$/i, - At = /^(?:input|select|textarea|keygen)/i; - - function jt( e, t, n, r ) { - var i; - if ( Array.isArray( t ) ) w.each( t, function ( t, i ) { - n || St.test( e ) ? r( e, i ) : jt( e + "[" + ( "object" == typeof i && null != i ? t : "" ) + "]", i, n, r ) - } ); - else if ( n || "object" !== x( t ) ) r( e, t ); - else - for ( i in t ) jt( e + "[" + i + "]", t[ i ], n, r ) - } - w.param = function ( e, t ) { - var n, r = [], - i = function ( e, t ) { - var n = g( t ) ? t() : t; - r[ r.length ] = encodeURIComponent( e ) + "=" + encodeURIComponent( null == n ? "" : n ) - }; - if ( Array.isArray( e ) || e.jquery && !w.isPlainObject( e ) ) w.each( e, function () { - i( this.name, this.value ) - } ); - else - for ( n in e ) jt( n, e[ n ], t, i ); - return r.join( "&" ) - }, w.fn.extend( { - serialize: function () { - return w.param( this.serializeArray() ) - }, - serializeArray: function () { - return this.map( function () { - var e = w.prop( this, "elements" ); - return e ? w.makeArray( e ) : this - } ).filter( function () { - var e = this.type; - return this.name && !w( this ).is( ":disabled" ) && At.test( this.nodeName ) && !Nt.test( e ) && ( this.checked || !pe.test( e ) ) - } ).map( function ( e, t ) { - var n = w( this ).val(); - return null == n ? null : Array.isArray( n ) ? w.map( n, function ( e ) { - return { - name: t.name, - value: e.replace( Dt, "\r\n" ) - } - } ) : { - name: t.name, - value: n.replace( Dt, "\r\n" ) - } - } ).get() - } - } ); - var qt = /%20/g, - Lt = /#.*$/, - Ht = /([?&])_=[^&]*/, - Ot = /^(.*?):[ \t]*([^\r\n]*)$/gm, - Pt = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, - Mt = /^(?:GET|HEAD)$/, - Rt = /^\/\//, - It = {}, - Wt = {}, - $t = "*/".concat( "*" ), - Bt = r.createElement( "a" ); - Bt.href = Ct.href; - - function Ft( e ) { - return function ( t, n ) { - "string" != typeof t && ( n = t, t = "*" ); - var r, i = 0, - o = t.toLowerCase().match( M ) || []; - if ( g( n ) ) - while ( r = o[ i++ ] ) "+" === r[ 0 ] ? ( r = r.slice( 1 ) || "*", ( e[ r ] = e[ r ] || [] ).unshift( n ) ) : ( e[ r ] = e[ r ] || [] ).push( n ) - } - } - - function _t( e, t, n, r ) { - var i = {}, - o = e === Wt; - - function a( s ) { - var u; - return i[ s ] = !0, w.each( e[ s ] || [], function ( e, s ) { - var l = s( t, n, r ); - return "string" != typeof l || o || i[ l ] ? o ? !( u = l ) : void 0 : ( t.dataTypes.unshift( l ), a( l ), !1 ) - } ), u - } - return a( t.dataTypes[ 0 ] ) || !i[ "*" ] && a( "*" ) - } - - function zt( e, t ) { - var n, r, i = w.ajaxSettings.flatOptions || {}; - for ( n in t ) void 0 !== t[ n ] && ( ( i[ n ] ? e : r || ( r = {} ) )[ n ] = t[ n ] ); - return r && w.extend( !0, e, r ), e - } - - function Xt( e, t, n ) { - var r, i, o, a, s = e.contents, - u = e.dataTypes; - while ( "*" === u[ 0 ] ) u.shift(), void 0 === r && ( r = e.mimeType || t.getResponseHeader( "Content-Type" ) ); - if ( r ) - for ( i in s ) - if ( s[ i ] && s[ i ].test( r ) ) { - u.unshift( i ); - break - } if ( u[ 0 ] in n ) o = u[ 0 ]; - else { - for ( i in n ) { - if ( !u[ 0 ] || e.converters[ i + " " + u[ 0 ] ] ) { - o = i; - break - } - a || ( a = i ) - } - o = o || a - } - if ( o ) return o !== u[ 0 ] && u.unshift( o ), n[ o ] - } - - function Ut( e, t, n, r ) { - var i, o, a, s, u, l = {}, - c = e.dataTypes.slice(); - if ( c[ 1 ] ) - for ( a in e.converters ) l[ a.toLowerCase() ] = e.converters[ a ]; - o = c.shift(); - while ( o ) - if ( e.responseFields[ o ] && ( n[ e.responseFields[ o ] ] = t ), !u && r && e.dataFilter && ( t = e.dataFilter( t, e.dataType ) ), u = o, o = c.shift() ) - if ( "*" === o ) o = u; - else if ( "*" !== u && u !== o ) { - if ( !( a = l[ u + " " + o ] || l[ "* " + o ] ) ) - for ( i in l ) - if ( ( s = i.split( " " ) )[ 1 ] === o && ( a = l[ u + " " + s[ 0 ] ] || l[ "* " + s[ 0 ] ] ) ) { - !0 === a ? a = l[ i ] : !0 !== l[ i ] && ( o = s[ 0 ], c.unshift( s[ 1 ] ) ); - break - } if ( !0 !== a ) - if ( a && e[ "throws" ] ) t = a( t ); - else try { - t = a( t ) - } catch ( e ) { - return { - state: "parsererror", - error: a ? e : "No conversion from " + u + " to " + o - } - } - } - return { - state: "success", - data: t - } - } - w.extend( { - active: 0, - lastModified: {}, - etag: {}, - ajaxSettings: { - url: Ct.href, - type: "GET", - isLocal: Pt.test( Ct.protocol ), - global: !0, - processData: !0, - async: !0, - contentType: "application/x-www-form-urlencoded; charset=UTF-8", - accepts: { - "*": $t, - text: "text/plain", - html: "text/html", - xml: "application/xml, text/xml", - json: "application/json, text/javascript" - }, - contents: { - xml: /\bxml\b/, - html: /\bhtml/, - json: /\bjson\b/ - }, - responseFields: { - xml: "responseXML", - text: "responseText", - json: "responseJSON" - }, - converters: { - "* text": String, - "text html": !0, - "text json": JSON.parse, - "text xml": w.parseXML - }, - flatOptions: { - url: !0, - context: !0 - } - }, - ajaxSetup: function ( e, t ) { - return t ? zt( zt( e, w.ajaxSettings ), t ) : zt( w.ajaxSettings, e ) - }, - ajaxPrefilter: Ft( It ), - ajaxTransport: Ft( Wt ), - ajax: function ( t, n ) { - "object" == typeof t && ( n = t, t = void 0 ), n = n || {}; - var i, o, a, s, u, l, c, f, p, d, h = w.ajaxSetup( {}, n ), - g = h.context || h, - y = h.context && ( g.nodeType || g.jquery ) ? w( g ) : w.event, - v = w.Deferred(), - m = w.Callbacks( "once memory" ), - x = h.statusCode || {}, - b = {}, - T = {}, - C = "canceled", - E = { - readyState: 0, - getResponseHeader: function ( e ) { - var t; - if ( c ) { - if ( !s ) { - s = {}; - while ( t = Ot.exec( a ) ) s[ t[ 1 ].toLowerCase() ] = t[ 2 ] - } - t = s[ e.toLowerCase() ] - } - return null == t ? null : t - }, - getAllResponseHeaders: function () { - return c ? a : null - }, - setRequestHeader: function ( e, t ) { - return null == c && ( e = T[ e.toLowerCase() ] = T[ e.toLowerCase() ] || e, b[ e ] = t ), this - }, - overrideMimeType: function ( e ) { - return null == c && ( h.mimeType = e ), this - }, - statusCode: function ( e ) { - var t; - if ( e ) - if ( c ) E.always( e[ E.status ] ); - else - for ( t in e ) x[ t ] = [ x[ t ], e[ t ] ]; - return this - }, - abort: function ( e ) { - var t = e || C; - return i && i.abort( t ), k( 0, t ), this - } - }; - if ( v.promise( E ), h.url = ( ( t || h.url || Ct.href ) + "" ).replace( Rt, Ct.protocol + "//" ), h.type = n.method || n.type || h.method || h.type, h.dataTypes = ( h.dataType || "*" ).toLowerCase().match( M ) || [ "" ], null == h.crossDomain ) { - l = r.createElement( "a" ); - try { - l.href = h.url, l.href = l.href, h.crossDomain = Bt.protocol + "//" + Bt.host != l.protocol + "//" + l.host - } catch ( e ) { - h.crossDomain = !0 - } - } - if ( h.data && h.processData && "string" != typeof h.data && ( h.data = w.param( h.data, h.traditional ) ), _t( It, h, n, E ), c ) return E; - ( f = w.event && h.global ) && 0 == w.active++ && w.event.trigger( "ajaxStart" ), h.type = h.type.toUpperCase(), h.hasContent = !Mt.test( h.type ), o = h.url.replace( Lt, "" ), h.hasContent ? h.data && h.processData && 0 === ( h.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) && ( h.data = h.data.replace( qt, "+" ) ) : ( d = h.url.slice( o.length ), h.data && ( h.processData || "string" == typeof h.data ) && ( o += ( kt.test( o ) ? "&" : "?" ) + h.data, delete h.data ), !1 === h.cache && ( o = o.replace( Ht, "$1" ), d = ( kt.test( o ) ? "&" : "?" ) + "_=" + Et++ + d ), h.url = o + d ), h.ifModified && ( w.lastModified[ o ] && E.setRequestHeader( "If-Modified-Since", w.lastModified[ o ] ), w.etag[ o ] && E.setRequestHeader( "If-None-Match", w.etag[ o ] ) ), ( h.data && h.hasContent && !1 !== h.contentType || n.contentType ) && E.setRequestHeader( "Content-Type", h.contentType ), E.setRequestHeader( "Accept", h.dataTypes[ 0 ] && h.accepts[ h.dataTypes[ 0 ] ] ? h.accepts[ h.dataTypes[ 0 ] ] + ( "*" !== h.dataTypes[ 0 ] ? ", " + $t + "; q=0.01" : "" ) : h.accepts[ "*" ] ); - for ( p in h.headers ) E.setRequestHeader( p, h.headers[ p ] ); - if ( h.beforeSend && ( !1 === h.beforeSend.call( g, E, h ) || c ) ) return E.abort(); - if ( C = "abort", m.add( h.complete ), E.done( h.success ), E.fail( h.error ), i = _t( Wt, h, n, E ) ) { - if ( E.readyState = 1, f && y.trigger( "ajaxSend", [ E, h ] ), c ) return E; - h.async && h.timeout > 0 && ( u = e.setTimeout( function () { - E.abort( "timeout" ) - }, h.timeout ) ); - try { - c = !1, i.send( b, k ) - } catch ( e ) { - if ( c ) throw e; - k( -1, e ) - } - } else k( -1, "No Transport" ); - - function k( t, n, r, s ) { - var l, p, d, b, T, C = n; - c || ( c = !0, u && e.clearTimeout( u ), i = void 0, a = s || "", E.readyState = t > 0 ? 4 : 0, l = t >= 200 && t < 300 || 304 === t, r && ( b = Xt( h, E, r ) ), b = Ut( h, b, E, l ), l ? ( h.ifModified && ( ( T = E.getResponseHeader( "Last-Modified" ) ) && ( w.lastModified[ o ] = T ), ( T = E.getResponseHeader( "etag" ) ) && ( w.etag[ o ] = T ) ), 204 === t || "HEAD" === h.type ? C = "nocontent" : 304 === t ? C = "notmodified" : ( C = b.state, p = b.data, l = !( d = b.error ) ) ) : ( d = C, !t && C || ( C = "error", t < 0 && ( t = 0 ) ) ), E.status = t, E.statusText = ( n || C ) + "", l ? v.resolveWith( g, [ p, C, E ] ) : v.rejectWith( g, [ E, C, d ] ), E.statusCode( x ), x = void 0, f && y.trigger( l ? "ajaxSuccess" : "ajaxError", [ E, h, l ? p : d ] ), m.fireWith( g, [ E, C ] ), f && ( y.trigger( "ajaxComplete", [ E, h ] ), --w.active || w.event.trigger( "ajaxStop" ) ) ) - } - return E - }, - getJSON: function ( e, t, n ) { - return w.get( e, t, n, "json" ) - }, - getScript: function ( e, t ) { - return w.get( e, void 0, t, "script" ) - } - } ), w.each( [ "get", "post" ], function ( e, t ) { - w[ t ] = function ( e, n, r, i ) { - return g( n ) && ( i = i || r, r = n, n = void 0 ), w.ajax( w.extend( { - url: e, - type: t, - dataType: i, - data: n, - success: r - }, w.isPlainObject( e ) && e ) ) - } - } ), w._evalUrl = function ( e ) { - return w.ajax( { - url: e, - type: "GET", - dataType: "script", - cache: !0, - async: !1, - global: !1, - "throws": !0 - } ) - }, w.fn.extend( { - wrapAll: function ( e ) { - var t; - return this[ 0 ] && ( g( e ) && ( e = e.call( this[ 0 ] ) ), t = w( e, this[ 0 ].ownerDocument ).eq( 0 ).clone( !0 ), this[ 0 ].parentNode && t.insertBefore( this[ 0 ] ), t.map( function () { - var e = this; - while ( e.firstElementChild ) e = e.firstElementChild; - return e - } ).append( this ) ), this - }, - wrapInner: function ( e ) { - return g( e ) ? this.each( function ( t ) { - w( this ).wrapInner( e.call( this, t ) ) - } ) : this.each( function () { - var t = w( this ), - n = t.contents(); - n.length ? n.wrapAll( e ) : t.append( e ) - } ) - }, - wrap: function ( e ) { - var t = g( e ); - return this.each( function ( n ) { - w( this ).wrapAll( t ? e.call( this, n ) : e ) - } ) - }, - unwrap: function ( e ) { - return this.parent( e ).not( "body" ).each( function () { - w( this ).replaceWith( this.childNodes ) - } ), this - } - } ), w.expr.pseudos.hidden = function ( e ) { - return !w.expr.pseudos.visible( e ) - }, w.expr.pseudos.visible = function ( e ) { - return !!( e.offsetWidth || e.offsetHeight || e.getClientRects().length ) - }, w.ajaxSettings.xhr = function () { - try { - return new e.XMLHttpRequest - } catch ( e ) {} - }; - var Vt = { - 0: 200, - 1223: 204 - }, - Gt = w.ajaxSettings.xhr(); - h.cors = !!Gt && "withCredentials" in Gt, h.ajax = Gt = !!Gt, w.ajaxTransport( function ( t ) { - var n, r; - if ( h.cors || Gt && !t.crossDomain ) return { - send: function ( i, o ) { - var a, s = t.xhr(); - if ( s.open( t.type, t.url, t.async, t.username, t.password ), t.xhrFields ) - for ( a in t.xhrFields ) s[ a ] = t.xhrFields[ a ]; - t.mimeType && s.overrideMimeType && s.overrideMimeType( t.mimeType ), t.crossDomain || i[ "X-Requested-With" ] || ( i[ "X-Requested-With" ] = "XMLHttpRequest" ); - for ( a in i ) s.setRequestHeader( a, i[ a ] ); - n = function ( e ) { - return function () { - n && ( n = r = s.onload = s.onerror = s.onabort = s.ontimeout = s.onreadystatechange = null, "abort" === e ? s.abort() : "error" === e ? "number" != typeof s.status ? o( 0, "error" ) : o( s.status, s.statusText ) : o( Vt[ s.status ] || s.status, s.statusText, "text" !== ( s.responseType || "text" ) || "string" != typeof s.responseText ? { - binary: s.response - } : { - text: s.responseText - }, s.getAllResponseHeaders() ) ) - } - }, s.onload = n(), r = s.onerror = s.ontimeout = n( "error" ), void 0 !== s.onabort ? s.onabort = r : s.onreadystatechange = function () { - 4 === s.readyState && e.setTimeout( function () { - n && r() - } ) - }, n = n( "abort" ); - try { - s.send( t.hasContent && t.data || null ) - } catch ( e ) { - if ( n ) throw e - } - }, - abort: function () { - n && n() - } - } - } ), w.ajaxPrefilter( function ( e ) { - e.crossDomain && ( e.contents.script = !1 ) - } ), w.ajaxSetup( { - accepts: { - script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript" - }, - contents: { - script: /\b(?:java|ecma)script\b/ - }, - converters: { - "text script": function ( e ) { - return w.globalEval( e ), e - } - } - } ), w.ajaxPrefilter( "script", function ( e ) { - void 0 === e.cache && ( e.cache = !1 ), e.crossDomain && ( e.type = "GET" ) - } ), w.ajaxTransport( "script", function ( e ) { - if ( e.crossDomain ) { - var t, n; - return { - send: function ( i, o ) { - t = w( " - - - - - - - - - diff --git a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/backup-stable-build/prefix-suffix-lines.html b/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/backup-stable-build/prefix-suffix-lines.html deleted file mode 100644 index 0431322..0000000 --- a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/backup-stable-build/prefix-suffix-lines.html +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - - - - - - Add Prefix/Suffix to Text Lines - - - - - - - - - - - -
- - - - - - -
- - - - -
-

Add Prefix/Suffix to Each Line

-

First, paste your text in the input box below. Select if you want to add a - prefix (in the beginning of each line) or a suffix (at the end of each line).

-

Write the text you want to add. Finally, click the "Add Prefix/Suffix" - button. -

- -
- -
-
-
- -
- - - - - -
- - - -
-
-
-
-
- -
- - - - - - - - - - - - - - - - - - - diff --git a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/backup-stable-build/replace-line-breaks.html b/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/backup-stable-build/replace-line-breaks.html deleted file mode 100644 index e5752e9..0000000 --- a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/backup-stable-build/replace-line-breaks.html +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - - - - - Replace Line Breaks - - - - - - - - - - - -
- - - - - - -
- - - - -
-

Replace Line Breaks

-

First, paste your text in the input box below. Write in the box what do you want the - line breaks to be replaced with.

-

Finally, click the "Replace Line Breaks" button. -

- -
- -
-
-
- -
- - - -
- - - -
-
-
-
-
- -
- - - - - - - - - - - - - - - - - - - diff --git a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/backup-stable-build/right.html b/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/backup-stable-build/right.html deleted file mode 100644 index f06a03c..0000000 --- a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/backup-stable-build/right.html +++ /dev/null @@ -1,552 +0,0 @@ - - - - - -backup-stable-build - - - Stable - - - - - - - - - - - - -
Folders
<Go Back> css js
-
- - - - - -
FileFileFileFileFileFileFileFile
compare-....html find-rep....html letter-c....html prefix-s....html replace-....html right.html sort-tex....html whitespa....html 
duplicat....html index.html 
- -

-Folders: 3
-Files: 10
-Size of all files: 68399 KB

- - - \ No newline at end of file diff --git a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/backup-stable-build/sort-text-lines.html b/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/backup-stable-build/sort-text-lines.html deleted file mode 100644 index 925a48b..0000000 --- a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/backup-stable-build/sort-text-lines.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - - - - - Sort Text Lines - - - - - - - - - - - -
- - - - - - -
- - - - -
-

Sort Text Lines

-

First, paste your text in the input box below. You can choose how you want the - text to be sorted. Finally, click on the "Sort" - button.

-

Please note: At the moment the data is only sorted in - alphabetical - order. So you might have trouble sorted multiple numbers.

- -
- -
-
- - - - - - - -
-
-
-
-
- -
- - - - - - - - - - - - - - - - - - - diff --git a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/backup-stable-build/whitespace-remover.html b/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/backup-stable-build/whitespace-remover.html deleted file mode 100644 index 120e0f2..0000000 --- a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/backup-stable-build/whitespace-remover.html +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - - Whitespace Remover - - - - - - - - - - - -
- - - - - - -
- - - - -
-

Whitespace Remover

-

Removes all the whitespace in your text, including space.

-

First, paste your text in the input box below. Then, click on the Remove - whitespace button.

- - -
- -
-
- - - -
-
-
-
-
- -
- - - - - - - - - - - - - - - - - - - diff --git a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/compare-text-files.html b/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/compare-text-files.html deleted file mode 100644 index ab5dd38..0000000 --- a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/compare-text-files.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - - - - - Compare Text Files - - - - - - - - - - - -
- - - - - - -
- - - - -
-

Compare files and delete duplicate lines

-

This tool compare two texts and removes the duplicate lines which exist in both files. - The duplicates are only removed from second file so the output will contain only the non-duplicate data of - the second file.

-

Paste your text in the original text box below. This text will be used - for comparison to find duplicate lines from the other text.

-

Finally, click the "Remove Duplicates" button. -

- -
- -
-
-
- - - - -
- -
-
-
- -
-
- -
- - - - - - - - - - - - - - - - - - diff --git a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/css/bootstrap.min.css b/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/css/bootstrap.min.css deleted file mode 100644 index e6b4977..0000000 --- a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/css/bootstrap.min.css +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v4.2.1 (https://getbootstrap.com/) - * Copyright 2011-2018 The Bootstrap Authors - * Copyright 2011-2018 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-family:inherit;font-weight:500;line-height:1.2;color:inherit}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.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-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.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-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.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-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;margin-bottom:1rem;background-color:transparent}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table .table{background-color:#fff}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#7abaff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#b3b7bb}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#8fd19e}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#86cfda}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ffdf7e}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#ed969e}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#95999c}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#212529;border-color:#32383e}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#212529}.table-dark td,.table-dark th,.table-dark thead th{border-color:#32383e}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(2.25rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.8125rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(2.875rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.form-control.is-valid,.was-validated .form-control:valid{border-color:#28a745;padding-right:2.25rem;background-repeat:no-repeat;background-position:center right calc(2.25rem / 4);background-size:calc(2.25rem / 2) calc(2.25rem / 2);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e")}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:2.25rem;background-position:top calc(2.25rem / 4) right calc(2.25rem / 4)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#28a745;padding-right:3.4375rem;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") no-repeat center right 1.75rem/1.125rem 1.125rem}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip{display:block}.form-control-file.is-valid~.valid-feedback,.form-control-file.is-valid~.valid-tooltip,.was-validated .form-control-file:valid~.valid-feedback,.was-validated .form-control-file:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{border-color:#28a745}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{border-color:#34ce57;background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:2.25rem;background-repeat:no-repeat;background-position:center right calc(2.25rem / 4);background-size:calc(2.25rem / 2) calc(2.25rem / 2);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E")}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:2.25rem;background-position:top calc(2.25rem / 4) right calc(2.25rem / 4)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#dc3545;padding-right:3.4375rem;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E") no-repeat center right 1.75rem/1.125rem 1.125rem}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip{display:block}.form-control-file.is-invalid~.invalid-feedback,.form-control-file.is-invalid~.invalid-tooltip,.was-validated .form-control-file:invalid~.invalid-feedback,.was-validated .form-control-file:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{border-color:#dc3545}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{border-color:#e4606d;background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff}.btn-link:hover{color:#0056b3;text-decoration:underline}.btn-link.focus,.btn-link:focus{text-decoration:underline;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media screen and (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media screen and (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-right{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-right{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-right{right:0;left:auto}}.dropdown-menu-left{right:auto;left:0}@media (min-width:576px){.dropdown-menu-sm-left{right:auto;left:0}}@media (min-width:768px){.dropdown-menu-md-left{right:auto;left:0}}@media (min-width:992px){.dropdown-menu-lg-left{right:auto;left:0}}@media (min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:first-child{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.dropdown-item:last-child{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:1 1 auto;flex:1 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(2.875rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.8125rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#007bff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#80bdff}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#b3d7ff;border-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:#adb5bd solid 1px}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background-repeat:no-repeat;background-position:center center;background-size:50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{border-color:#007bff;background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label::after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff;-webkit-transform:translateX(.75rem);transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(2.25rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(128,189,255,.5)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{height:calc(1.8125rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(2.875rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(2.25rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(2.25rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:disabled~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(2.25rem + 2px);padding:.375rem .75rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:2.25rem;padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:calc(1rem + .4rem);padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media screen and (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media screen and (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media screen and (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler:not(:disabled):not(.disabled){cursor:pointer}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;color:inherit;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-ms-flexbox;display:flex;-ms-flex:1 0 0%;flex:1 0 0%;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:first-child .card-header,.card-group>.card:first-child .card-img-top{border-top-right-radius:0}.card-group>.card:first-child .card-footer,.card-group>.card:first-child .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:last-child .card-header,.card-group>.card:last-child .card-img-top{border-top-left-radius:0}.card-group>.card:last-child .card-footer,.card-group>.card:last-child .card-img-bottom{border-bottom-left-radius:0}.card-group>.card:only-child{border-radius:.25rem}.card-group>.card:only-child .card-header,.card-group>.card:only-child .card-img-top{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-group>.card:only-child .card-footer,.card-group>.card:only-child .card-img-bottom{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-group>.card:not(:first-child):not(:last-child):not(:only-child){border-radius:0}.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-footer,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-header,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-top{border-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion .card{overflow:hidden}.accordion .card:not(:first-of-type) .card-header:first-child{border-radius:0}.accordion .card:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.accordion .card:first-of-type{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion .card:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.accordion .card .card-header{margin-bottom:-1px}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-link:not(:disabled):not(.disabled){cursor:pointer}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#0062cc}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#545b62}.badge-success{color:#fff;background-color:#28a745}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#1e7e34}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#117a8b}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:focus,a.badge-warning:hover{color:#212529;background-color:#d39e00}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#bd2130}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:focus,a.badge-light:hover{color:#212529;background-color:#dae0e5}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#1d2124}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media screen and (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{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);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item:focus,.list-group-item:hover{z-index:1;text-decoration:none}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush .list-group-item:last-child{margin-bottom:-1px}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{margin-bottom:0;border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled){cursor:pointer}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}a.close.disabled{pointer-events:none}.toast{max-width:350px;overflow:hidden;font-size:.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);border-radius:.25rem;box-shadow:0 .25rem .75rem rgba(0,0,0,.1);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);opacity:0}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-50px);transform:translate(0,-50px)}@media screen and (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - (.5rem * 2))}.modal-dialog-centered::before{display:block;height:calc(100vh - (.5rem * 2));content:""}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #e9ecef;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #e9ecef;border-bottom-right-radius:.3rem;border-bottom-left-radius:.3rem}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-centered{min-height:calc(100% - (1.75rem * 2))}.modal-dialog-centered::before{height:calc(100vh - (1.75rem * 2))}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top] .arrow,.bs-popover-top .arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::after,.bs-popover-top .arrow::before{border-width:.5rem .5rem 0}.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::before{bottom:0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-top .arrow::after{bottom:1px;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right] .arrow,.bs-popover-right .arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::after,.bs-popover-right .arrow::before{border-width:.5rem .5rem .5rem 0}.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::before{left:0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-right .arrow::after{left:1px;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom] .arrow,.bs-popover-bottom .arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::after,.bs-popover-bottom .arrow::before{border-width:0 .5rem .5rem .5rem}.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::before{top:0;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-bottom .arrow::after{top:1px;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left] .arrow,.bs-popover-left .arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::after,.bs-popover-left .arrow::before{border-width:.5rem 0 .5rem .5rem}.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::before{right:0;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-left .arrow::after{right:1px;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;color:inherit;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{-ms-touch-action:pan-y;touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){-webkit-transform:translateX(100%);transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){-webkit-transform:translateX(-100%);transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;-webkit-transform:none;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:0s .6s opacity}@media screen and (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5;transition:opacity .15s ease}@media screen and (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:transparent no-repeat center center;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media screen and (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:spinner-border .75s linear infinite;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:spinner-grow .75s linear infinite;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-3by4::before{padding-top:133.333333%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0056b3!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#a71d2a!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}} -/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/css/right.html b/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/css/right.html deleted file mode 100644 index 8765260..0000000 --- a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/css/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -css - - - Stable - - - - - - - - - - - - -
Folders
<Go Back>
-
- - - - -
FileFileFileFileFileFileFileFile
bootstra...n.css simple-s...r.css right.html 
- -

-Folders: 1
-Files: 3
-Size of all files: 168275 KB

- - - \ No newline at end of file diff --git a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/css/simple-sidebar.css b/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/css/simple-sidebar.css deleted file mode 100644 index 9b92f5b..0000000 --- a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/css/simple-sidebar.css +++ /dev/null @@ -1,49 +0,0 @@ -/*! - * Start Bootstrap - Simple Sidebar (https://startbootstrap.com/template-overviews/simple-sidebar) - * Copyright 2013-2019 Start Bootstrap - * Licensed under MIT (https://github.com/BlackrockDigital/startbootstrap-simple-sidebar/blob/master/LICENSE) - */ -body { - overflow-x: hidden; -} - -#sidebar-wrapper { - min-height: 100vh; - margin-left: -15rem; - -webkit-transition: margin .25s ease-out; - -moz-transition: margin .25s ease-out; - -o-transition: margin .25s ease-out; - transition: margin .25s ease-out; -} - -#sidebar-wrapper .sidebar-heading { - padding: 0.875rem 1.25rem; - font-size: 1.2rem; -} - -#sidebar-wrapper .list-group { - width: 15rem; -} - -#page-content-wrapper { - min-width: 100vw; -} - -#wrapper.toggled #sidebar-wrapper { - margin-left: 0; -} - -@media (min-width: 768px) { - #sidebar-wrapper { - margin-left: 0; - } - - #page-content-wrapper { - min-width: 0; - width: 100%; - } - - #wrapper.toggled #sidebar-wrapper { - margin-left: -15rem; - } -} diff --git a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/duplicate-text-line-remover.html b/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/duplicate-text-line-remover.html deleted file mode 100644 index 0fa1e43..0000000 --- a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/duplicate-text-line-remover.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - Duplicate Text Line Remover - - - - - - - - - - - -
- - - - - - -
- - - - -
-

Duplicate Text Line Remover

-

First, paste your text in the input box below. Then, click on the "Remove duplicate - Lines".

-

Finally, You will get your file in an output box with all the duplicates removed.

- -
- -
-
- -
- - - -
-
-
-
-
- -
- - - - - - - - - - - - - - - - - - - diff --git a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/find-replace-text.html b/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/find-replace-text.html deleted file mode 100644 index 88d5541..0000000 --- a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/find-replace-text.html +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - - - - - Find and Replace Text - - - - - - - - - - - -
- - - - - - -
- - - - -
-

Find and Replace Text

-

First, paste your text in the input box below. Write the text, in the appropriate - boxes, you want to find - and what text do you want to replace it with.

-

Finally, click the "Find and Replace" button. -

- -
- -
-
- -
- Find - - - - - - - -
- - - -
-
-
-
-
- -
- - - - - - - - - - - - - - - - - - diff --git a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/index.html b/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/index.html deleted file mode 100644 index f33f17a..0000000 --- a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/index.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - TexTools Tools - - - - - - - - - - - -
- - - - - - -
- - - - -
-

TexTools Tools

-

You need Javascript enabled in your web-browser to use this website. -

You can choose the appropriate tool from below and use it.

- -
- - -
- -
- -
Duplicate Text Line Remover
-
-

Removes Duplicate Lines from your file.

-

- Please Note: Make sure that your data is on seperate lines.

-
- - -
- -
Find and Replace
-
-

Find and replace Words in your text.

-
- - -
- -
Compare Text Files (Remove Dupes)
-
-

Compare files and remove duplicates of one file from the other.

-
- -
- -
Add Prefix/Suffix to Lines
-
-

Add text before or at the end of each line.

-
-
- - - - -
- -
- -
WhiteSpace Remover
-
-

Removes all the whitespace in your text including space.

-
- - -
- -
Sort Text Lines
-
-

Sorts data lines in ascending or descending order.

-
- -
- -
Replace Line Breaks
-
-

Replace line breaks with anything text, for example a comma (,).

-
- -
- -
Letter Case Converter
-
-

Convert Letter Cases of your text.

-
- -
- - - - - - -
- -
- - - - - - - - - - - - - - - - - - - - - - diff --git a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/js/bootstrap.bundle.min.js b/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/js/bootstrap.bundle.min.js deleted file mode 100644 index 97f14c0..0000000 --- a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/js/bootstrap.bundle.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v4.2.1 (https://getbootstrap.com/) - * Copyright 2011-2018 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jquery")):"function"==typeof define&&define.amd?define(["exports","jquery"],e):e(t.bootstrap={},t.jQuery)}(this,function(t,p){"use strict";function i(t,e){for(var n=0;nthis._items.length-1||t<0))if(this._isSliding)p(this._element).one(q.SLID,function(){return e.to(t)});else{if(n===t)return this.pause(),void this.cycle();var i=n=i.clientWidth&&n>=i.clientHeight}),h=0l[t]&&!i.escapeWithReference&&(n=Math.min(h[e],l[t]-("right"===t?h.width:h.height))),Kt({},e,n)}};return c.forEach(function(t){var e=-1!==["left","top"].indexOf(t)?"primary":"secondary";h=Qt({},h,u[e](t))}),t.offsets.popper=h,t},priority:["left","right","top","bottom"],padding:5,boundariesElement:"scrollParent"},keepTogether:{order:400,enabled:!0,fn:function(t){var e=t.offsets,n=e.popper,i=e.reference,o=t.placement.split("-")[0],r=Math.floor,s=-1!==["top","bottom"].indexOf(o),a=s?"right":"bottom",l=s?"left":"top",c=s?"width":"height";return n[a]r(i[a])&&(t.offsets.popper[l]=r(i[a])),t}},arrow:{order:500,enabled:!0,fn:function(t,e){var n;if(!fe(t.instance.modifiers,"arrow","keepTogether"))return t;var i=e.element;if("string"==typeof i){if(!(i=t.instance.popper.querySelector(i)))return t}else if(!t.instance.popper.contains(i))return console.warn("WARNING: `arrow.element` must be child of its popper element!"),t;var o=t.placement.split("-")[0],r=t.offsets,s=r.popper,a=r.reference,l=-1!==["left","right"].indexOf(o),c=l?"height":"width",h=l?"Top":"Left",u=h.toLowerCase(),f=l?"left":"top",d=l?"bottom":"right",p=$t(i)[c];a[d]-ps[d]&&(t.offsets.popper[u]+=a[u]+p-s[d]),t.offsets.popper=Yt(t.offsets.popper);var m=a[u]+a[c]/2-p/2,g=Nt(t.instance.popper),_=parseFloat(g["margin"+h],10),v=parseFloat(g["border"+h+"Width"],10),y=m-t.offsets.popper[u]-_-v;return y=Math.max(Math.min(s[c]-p,y),0),t.arrowElement=i,t.offsets.arrow=(Kt(n={},u,Math.round(y)),Kt(n,f,""),n),t},element:"[x-arrow]"},flip:{order:600,enabled:!0,fn:function(p,m){if(oe(p.instance.modifiers,"inner"))return p;if(p.flipped&&p.placement===p.originalPlacement)return p;var g=Gt(p.instance.popper,p.instance.reference,m.padding,m.boundariesElement,p.positionFixed),_=p.placement.split("-")[0],v=te(_),y=p.placement.split("-")[1]||"",E=[];switch(m.behavior){case ge:E=[_,v];break;case _e:E=me(_);break;case ve:E=me(_,!0);break;default:E=m.behavior}return E.forEach(function(t,e){if(_!==t||E.length===e+1)return p;_=p.placement.split("-")[0],v=te(_);var n,i=p.offsets.popper,o=p.offsets.reference,r=Math.floor,s="left"===_&&r(i.right)>r(o.left)||"right"===_&&r(i.left)r(o.top)||"bottom"===_&&r(i.top)r(g.right),c=r(i.top)r(g.bottom),u="left"===_&&a||"right"===_&&l||"top"===_&&c||"bottom"===_&&h,f=-1!==["top","bottom"].indexOf(_),d=!!m.flipVariations&&(f&&"start"===y&&a||f&&"end"===y&&l||!f&&"start"===y&&c||!f&&"end"===y&&h);(s||u||d)&&(p.flipped=!0,(s||u)&&(_=E[e+1]),d&&(y="end"===(n=y)?"start":"start"===n?"end":n),p.placement=_+(y?"-"+y:""),p.offsets.popper=Qt({},p.offsets.popper,ee(p.instance.popper,p.offsets.reference,p.placement)),p=ie(p.instance.modifiers,p,"flip"))}),p},behavior:"flip",padding:5,boundariesElement:"viewport"},inner:{order:700,enabled:!1,fn:function(t){var e=t.placement,n=e.split("-")[0],i=t.offsets,o=i.popper,r=i.reference,s=-1!==["left","right"].indexOf(n),a=-1===["top","left"].indexOf(n);return o[s?"left":"top"]=r[n]-(a?o[s?"width":"height"]:0),t.placement=te(e),t.offsets.popper=Yt(o),t}},hide:{order:800,enabled:!0,fn:function(t){if(!fe(t.instance.modifiers,"hide","preventOverflow"))return t;var e=t.offsets.reference,n=ne(t.instance.modifiers,function(t){return"preventOverflow"===t.name}).boundaries;if(e.bottomn.right||e.top>n.bottom||e.rightdocument.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},t._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},t._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right
',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent"},Cn="show",Sn="out",Dn={HIDE:"hide"+_n,HIDDEN:"hidden"+_n,SHOW:"show"+_n,SHOWN:"shown"+_n,INSERTED:"inserted"+_n,CLICK:"click"+_n,FOCUSIN:"focusin"+_n,FOCUSOUT:"focusout"+_n,MOUSEENTER:"mouseenter"+_n,MOUSELEAVE:"mouseleave"+_n},In="fade",An="show",On=".tooltip-inner",Nn=".arrow",kn="hover",Ln="focus",Pn="click",xn="manual",Hn=function(){function i(t,e){if("undefined"==typeof be)throw new TypeError("Bootstrap's tooltips require Popper.js (https://popper.js.org/)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var t=i.prototype;return t.enable=function(){this._isEnabled=!0},t.disable=function(){this._isEnabled=!1},t.toggleEnabled=function(){this._isEnabled=!this._isEnabled},t.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=p(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),p(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(p(this.getTipElement()).hasClass(An))return void this._leave(null,this);this._enter(null,this)}},t.dispose=function(){clearTimeout(this._timeout),p.removeData(this.element,this.constructor.DATA_KEY),p(this.element).off(this.constructor.EVENT_KEY),p(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&p(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,(this._activeTrigger=null)!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},t.show=function(){var e=this;if("none"===p(this.element).css("display"))throw new Error("Please use show on visible elements");var t=p.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){p(this.element).trigger(t);var n=m.findShadowRoot(this.element),i=p.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(t.isDefaultPrevented()||!i)return;var o=this.getTipElement(),r=m.getUID(this.constructor.NAME);o.setAttribute("id",r),this.element.setAttribute("aria-describedby",r),this.setContent(),this.config.animation&&p(o).addClass(In);var s="function"==typeof this.config.placement?this.config.placement.call(this,o,this.element):this.config.placement,a=this._getAttachment(s);this.addAttachmentClass(a);var l=this._getContainer();p(o).data(this.constructor.DATA_KEY,this),p.contains(this.element.ownerDocument.documentElement,this.tip)||p(o).appendTo(l),p(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new be(this.element,o,{placement:a,modifiers:{offset:{offset:this.config.offset},flip:{behavior:this.config.fallbackPlacement},arrow:{element:Nn},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}}),p(o).addClass(An),"ontouchstart"in document.documentElement&&p(document.body).children().on("mouseover",null,p.noop);var c=function(){e.config.animation&&e._fixTransition();var t=e._hoverState;e._hoverState=null,p(e.element).trigger(e.constructor.Event.SHOWN),t===Sn&&e._leave(null,e)};if(p(this.tip).hasClass(In)){var h=m.getTransitionDurationFromElement(this.tip);p(this.tip).one(m.TRANSITION_END,c).emulateTransitionEnd(h)}else c()}},t.hide=function(t){var e=this,n=this.getTipElement(),i=p.Event(this.constructor.Event.HIDE),o=function(){e._hoverState!==Cn&&n.parentNode&&n.parentNode.removeChild(n),e._cleanTipClass(),e.element.removeAttribute("aria-describedby"),p(e.element).trigger(e.constructor.Event.HIDDEN),null!==e._popper&&e._popper.destroy(),t&&t()};if(p(this.element).trigger(i),!i.isDefaultPrevented()){if(p(n).removeClass(An),"ontouchstart"in document.documentElement&&p(document.body).children().off("mouseover",null,p.noop),this._activeTrigger[Pn]=!1,this._activeTrigger[Ln]=!1,this._activeTrigger[kn]=!1,p(this.tip).hasClass(In)){var r=m.getTransitionDurationFromElement(n);p(n).one(m.TRANSITION_END,o).emulateTransitionEnd(r)}else o();this._hoverState=""}},t.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},t.isWithContent=function(){return Boolean(this.getTitle())},t.addAttachmentClass=function(t){p(this.getTipElement()).addClass(yn+"-"+t)},t.getTipElement=function(){return this.tip=this.tip||p(this.config.template)[0],this.tip},t.setContent=function(){var t=this.getTipElement();this.setElementContent(p(t.querySelectorAll(On)),this.getTitle()),p(t).removeClass(In+" "+An)},t.setElementContent=function(t,e){var n=this.config.html;"object"==typeof e&&(e.nodeType||e.jquery)?n?p(e).parent().is(t)||t.empty().append(e):t.text(p(e).text()):t[n?"html":"text"](e)},t.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},t._getContainer=function(){return!1===this.config.container?document.body:m.isElement(this.config.container)?p(this.config.container):p(document).find(this.config.container)},t._getAttachment=function(t){return wn[t.toUpperCase()]},t._setListeners=function(){var i=this;this.config.trigger.split(" ").forEach(function(t){if("click"===t)p(i.element).on(i.constructor.Event.CLICK,i.config.selector,function(t){return i.toggle(t)});else if(t!==xn){var e=t===kn?i.constructor.Event.MOUSEENTER:i.constructor.Event.FOCUSIN,n=t===kn?i.constructor.Event.MOUSELEAVE:i.constructor.Event.FOCUSOUT;p(i.element).on(e,i.config.selector,function(t){return i._enter(t)}).on(n,i.config.selector,function(t){return i._leave(t)})}}),p(this.element).closest(".modal").on("hide.bs.modal",function(){i.element&&i.hide()}),this.config.selector?this.config=l({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},t._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},t._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||p(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),p(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusin"===t.type?Ln:kn]=!0),p(e.getTipElement()).hasClass(An)||e._hoverState===Cn?e._hoverState=Cn:(clearTimeout(e._timeout),e._hoverState=Cn,e.config.delay&&e.config.delay.show?e._timeout=setTimeout(function(){e._hoverState===Cn&&e.show()},e.config.delay.show):e.show())},t._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||p(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),p(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusout"===t.type?Ln:kn]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=Sn,e.config.delay&&e.config.delay.hide?e._timeout=setTimeout(function(){e._hoverState===Sn&&e.hide()},e.config.delay.hide):e.hide())},t._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},t._getConfig=function(t){return"number"==typeof(t=l({},this.constructor.Default,p(this.element).data(),"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),m.typeCheckConfig(mn,t,this.constructor.DefaultType),t},t._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},t._cleanTipClass=function(){var t=p(this.getTipElement()),e=t.attr("class").match(En);null!==e&&e.length&&t.removeClass(e.join(""))},t._handlePopperPlacementChange=function(t){var e=t.instance;this.tip=e.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},t._fixTransition=function(){var t=this.getTipElement(),e=this.config.animation;null===t.getAttribute("x-placement")&&(p(t).removeClass(In),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},i._jQueryInterface=function(n){return this.each(function(){var t=p(this).data(gn),e="object"==typeof n&&n;if((t||!/dispose|hide/.test(n))&&(t||(t=new i(this,e),p(this).data(gn,t)),"string"==typeof n)){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.2.1"}},{key:"Default",get:function(){return Tn}},{key:"NAME",get:function(){return mn}},{key:"DATA_KEY",get:function(){return gn}},{key:"Event",get:function(){return Dn}},{key:"EVENT_KEY",get:function(){return _n}},{key:"DefaultType",get:function(){return bn}}]),i}();p.fn[mn]=Hn._jQueryInterface,p.fn[mn].Constructor=Hn,p.fn[mn].noConflict=function(){return p.fn[mn]=vn,Hn._jQueryInterface};var jn="popover",Rn="bs.popover",Fn="."+Rn,Mn=p.fn[jn],Wn="bs-popover",Un=new RegExp("(^|\\s)"+Wn+"\\S+","g"),Bn=l({},Hn.Default,{placement:"right",trigger:"click",content:"",template:''}),qn=l({},Hn.DefaultType,{content:"(string|element|function)"}),Kn="fade",Qn="show",Yn=".popover-header",Vn=".popover-body",Xn={HIDE:"hide"+Fn,HIDDEN:"hidden"+Fn,SHOW:"show"+Fn,SHOWN:"shown"+Fn,INSERTED:"inserted"+Fn,CLICK:"click"+Fn,FOCUSIN:"focusin"+Fn,FOCUSOUT:"focusout"+Fn,MOUSEENTER:"mouseenter"+Fn,MOUSELEAVE:"mouseleave"+Fn},zn=function(t){var e,n;function i(){return t.apply(this,arguments)||this}n=t,(e=i).prototype=Object.create(n.prototype),(e.prototype.constructor=e).__proto__=n;var o=i.prototype;return o.isWithContent=function(){return this.getTitle()||this._getContent()},o.addAttachmentClass=function(t){p(this.getTipElement()).addClass(Wn+"-"+t)},o.getTipElement=function(){return this.tip=this.tip||p(this.config.template)[0],this.tip},o.setContent=function(){var t=p(this.getTipElement());this.setElementContent(t.find(Yn),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(Vn),e),t.removeClass(Kn+" "+Qn)},o._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},o._cleanTipClass=function(){var t=p(this.getTipElement()),e=t.attr("class").match(Un);null!==e&&0=this._offsets[o]&&("undefined"==typeof this._offsets[o+1]||t= 0 && n < t ? [ this[ n ] ] : [] ) - }, - end: function () { - return this.prevObject || this.constructor() - }, - push: s, - sort: n.sort, - splice: n.splice - }, w.extend = w.fn.extend = function () { - var e, t, n, r, i, o, a = arguments[ 0 ] || {}, - s = 1, - u = arguments.length, - l = !1; - for ( "boolean" == typeof a && ( l = a, a = arguments[ s ] || {}, s++ ), "object" == typeof a || g( a ) || ( a = {} ), s === u && ( a = this, s-- ); s < u; s++ ) - if ( null != ( e = arguments[ s ] ) ) - for ( t in e ) n = a[ t ], a !== ( r = e[ t ] ) && ( l && r && ( w.isPlainObject( r ) || ( i = Array.isArray( r ) ) ) ? ( i ? ( i = !1, o = n && Array.isArray( n ) ? n : [] ) : o = n && w.isPlainObject( n ) ? n : {}, a[ t ] = w.extend( l, o, r ) ) : void 0 !== r && ( a[ t ] = r ) ); - return a - }, w.extend( { - expando: "jQuery" + ( "3.3.1" + Math.random() ).replace( /\D/g, "" ), - isReady: !0, - error: function ( e ) { - throw new Error( e ) - }, - noop: function () {}, - isPlainObject: function ( e ) { - var t, n; - return !( !e || "[object Object]" !== c.call( e ) ) && ( !( t = i( e ) ) || "function" == typeof ( n = f.call( t, "constructor" ) && t.constructor ) && p.call( n ) === d ) - }, - isEmptyObject: function ( e ) { - var t; - for ( t in e ) return !1; - return !0 - }, - globalEval: function ( e ) { - m( e ) - }, - each: function ( e, t ) { - var n, r = 0; - if ( C( e ) ) { - for ( n = e.length; r < n; r++ ) - if ( !1 === t.call( e[ r ], r, e[ r ] ) ) break - } else - for ( r in e ) - if ( !1 === t.call( e[ r ], r, e[ r ] ) ) break; - return e - }, - trim: function ( e ) { - return null == e ? "" : ( e + "" ).replace( T, "" ) - }, - makeArray: function ( e, t ) { - var n = t || []; - return null != e && ( C( Object( e ) ) ? w.merge( n, "string" == typeof e ? [ e ] : e ) : s.call( n, e ) ), n - }, - inArray: function ( e, t, n ) { - return null == t ? -1 : u.call( t, e, n ) - }, - merge: function ( e, t ) { - for ( var n = +t.length, r = 0, i = e.length; r < n; r++ ) e[ i++ ] = t[ r ]; - return e.length = i, e - }, - grep: function ( e, t, n ) { - for ( var r, i = [], o = 0, a = e.length, s = !n; o < a; o++ )( r = !t( e[ o ], o ) ) !== s && i.push( e[ o ] ); - return i - }, - map: function ( e, t, n ) { - var r, i, o = 0, - s = []; - if ( C( e ) ) - for ( r = e.length; o < r; o++ ) null != ( i = t( e[ o ], o, n ) ) && s.push( i ); - else - for ( o in e ) null != ( i = t( e[ o ], o, n ) ) && s.push( i ); - return a.apply( [], s ) - }, - guid: 1, - support: h - } ), "function" == typeof Symbol && ( w.fn[ Symbol.iterator ] = n[ Symbol.iterator ] ), w.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), function ( e, t ) { - l[ "[object " + t + "]" ] = t.toLowerCase() - } ); - - function C( e ) { - var t = !!e && "length" in e && e.length, - n = x( e ); - return !g( e ) && !y( e ) && ( "array" === n || 0 === t || "number" == typeof t && t > 0 && t - 1 in e ) - } - var E = function ( e ) { - var t, n, r, i, o, a, s, u, l, c, f, p, d, h, g, y, v, m, x, b = "sizzle" + 1 * new Date, - w = e.document, - T = 0, - C = 0, - E = ae(), - k = ae(), - S = ae(), - D = function ( e, t ) { - return e === t && ( f = !0 ), 0 - }, - N = {}.hasOwnProperty, - A = [], - j = A.pop, - q = A.push, - L = A.push, - H = A.slice, - O = function ( e, t ) { - for ( var n = 0, r = e.length; n < r; n++ ) - if ( e[ n ] === t ) return n; - return -1 - }, - P = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", - M = "[\\x20\\t\\r\\n\\f]", - R = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+", - I = "\\[" + M + "*(" + R + ")(?:" + M + "*([*^$|!~]?=)" + M + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + R + "))|)" + M + "*\\]", - W = ":(" + R + ")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|" + I + ")*)|.*)\\)|)", - $ = new RegExp( M + "+", "g" ), - B = new RegExp( "^" + M + "+|((?:^|[^\\\\])(?:\\\\.)*)" + M + "+$", "g" ), - F = new RegExp( "^" + M + "*," + M + "*" ), - _ = new RegExp( "^" + M + "*([>+~]|" + M + ")" + M + "*" ), - z = new RegExp( "=" + M + "*([^\\]'\"]*?)" + M + "*\\]", "g" ), - X = new RegExp( W ), - U = new RegExp( "^" + R + "$" ), - V = { - ID: new RegExp( "^#(" + R + ")" ), - CLASS: new RegExp( "^\\.(" + R + ")" ), - TAG: new RegExp( "^(" + R + "|[*])" ), - ATTR: new RegExp( "^" + I ), - PSEUDO: new RegExp( "^" + W ), - CHILD: new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + M + "*(even|odd|(([+-]|)(\\d*)n|)" + M + "*(?:([+-]|)" + M + "*(\\d+)|))" + M + "*\\)|)", "i" ), - bool: new RegExp( "^(?:" + P + ")$", "i" ), - needsContext: new RegExp( "^" + M + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + M + "*((?:-\\d)?\\d*)" + M + "*\\)|)(?=[^-]|$)", "i" ) - }, - G = /^(?:input|select|textarea|button)$/i, - Y = /^h\d$/i, - Q = /^[^{]+\{\s*\[native \w/, - J = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - K = /[+~]/, - Z = new RegExp( "\\\\([\\da-f]{1,6}" + M + "?|(" + M + ")|.)", "ig" ), - ee = function ( e, t, n ) { - var r = "0x" + t - 65536; - return r !== r || n ? t : r < 0 ? String.fromCharCode( r + 65536 ) : String.fromCharCode( r >> 10 | 55296, 1023 & r | 56320 ) - }, - te = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, - ne = function ( e, t ) { - return t ? "\0" === e ? "\ufffd" : e.slice( 0, -1 ) + "\\" + e.charCodeAt( e.length - 1 ).toString( 16 ) + " " : "\\" + e - }, - re = function () { - p() - }, - ie = me( function ( e ) { - return !0 === e.disabled && ( "form" in e || "label" in e ) - }, { - dir: "parentNode", - next: "legend" - } ); - try { - L.apply( A = H.call( w.childNodes ), w.childNodes ), A[ w.childNodes.length ].nodeType - } catch ( e ) { - L = { - apply: A.length ? function ( e, t ) { - q.apply( e, H.call( t ) ) - } : function ( e, t ) { - var n = e.length, - r = 0; - while ( e[ n++ ] = t[ r++ ] ); - e.length = n - 1 - } - } - } - - function oe( e, t, r, i ) { - var o, s, l, c, f, h, v, m = t && t.ownerDocument, - T = t ? t.nodeType : 9; - if ( r = r || [], "string" != typeof e || !e || 1 !== T && 9 !== T && 11 !== T ) return r; - if ( !i && ( ( t ? t.ownerDocument || t : w ) !== d && p( t ), t = t || d, g ) ) { - if ( 11 !== T && ( f = J.exec( e ) ) ) - if ( o = f[ 1 ] ) { - if ( 9 === T ) { - if ( !( l = t.getElementById( o ) ) ) return r; - if ( l.id === o ) return r.push( l ), r - } else if ( m && ( l = m.getElementById( o ) ) && x( t, l ) && l.id === o ) return r.push( l ), r - } else { - if ( f[ 2 ] ) return L.apply( r, t.getElementsByTagName( e ) ), r; - if ( ( o = f[ 3 ] ) && n.getElementsByClassName && t.getElementsByClassName ) return L.apply( r, t.getElementsByClassName( o ) ), r - } if ( n.qsa && !S[ e + " " ] && ( !y || !y.test( e ) ) ) { - if ( 1 !== T ) m = t, v = e; - else if ( "object" !== t.nodeName.toLowerCase() ) { - ( c = t.getAttribute( "id" ) ) ? c = c.replace( te, ne ): t.setAttribute( "id", c = b ), s = ( h = a( e ) ).length; - while ( s-- ) h[ s ] = "#" + c + " " + ve( h[ s ] ); - v = h.join( "," ), m = K.test( e ) && ge( t.parentNode ) || t - } - if ( v ) try { - return L.apply( r, m.querySelectorAll( v ) ), r - } catch ( e ) {} finally { - c === b && t.removeAttribute( "id" ) - } - } - } - return u( e.replace( B, "$1" ), t, r, i ) - } - - function ae() { - var e = []; - - function t( n, i ) { - return e.push( n + " " ) > r.cacheLength && delete t[ e.shift() ], t[ n + " " ] = i - } - return t - } - - function se( e ) { - return e[ b ] = !0, e - } - - function ue( e ) { - var t = d.createElement( "fieldset" ); - try { - return !!e( t ) - } catch ( e ) { - return !1 - } finally { - t.parentNode && t.parentNode.removeChild( t ), t = null - } - } - - function le( e, t ) { - var n = e.split( "|" ), - i = n.length; - while ( i-- ) r.attrHandle[ n[ i ] ] = t - } - - function ce( e, t ) { - var n = t && e, - r = n && 1 === e.nodeType && 1 === t.nodeType && e.sourceIndex - t.sourceIndex; - if ( r ) return r; - if ( n ) - while ( n = n.nextSibling ) - if ( n === t ) return -1; - return e ? 1 : -1 - } - - function fe( e ) { - return function ( t ) { - return "input" === t.nodeName.toLowerCase() && t.type === e - } - } - - function pe( e ) { - return function ( t ) { - var n = t.nodeName.toLowerCase(); - return ( "input" === n || "button" === n ) && t.type === e - } - } - - function de( e ) { - return function ( t ) { - return "form" in t ? t.parentNode && !1 === t.disabled ? "label" in t ? "label" in t.parentNode ? t.parentNode.disabled === e : t.disabled === e : t.isDisabled === e || t.isDisabled !== !e && ie( t ) === e : t.disabled === e : "label" in t && t.disabled === e - } - } - - function he( e ) { - return se( function ( t ) { - return t = +t, se( function ( n, r ) { - var i, o = e( [], n.length, t ), - a = o.length; - while ( a-- ) n[ i = o[ a ] ] && ( n[ i ] = !( r[ i ] = n[ i ] ) ) - } ) - } ) - } - - function ge( e ) { - return e && "undefined" != typeof e.getElementsByTagName && e - } - n = oe.support = {}, o = oe.isXML = function ( e ) { - var t = e && ( e.ownerDocument || e ).documentElement; - return !!t && "HTML" !== t.nodeName - }, p = oe.setDocument = function ( e ) { - var t, i, a = e ? e.ownerDocument || e : w; - return a !== d && 9 === a.nodeType && a.documentElement ? ( d = a, h = d.documentElement, g = !o( d ), w !== d && ( i = d.defaultView ) && i.top !== i && ( i.addEventListener ? i.addEventListener( "unload", re, !1 ) : i.attachEvent && i.attachEvent( "onunload", re ) ), n.attributes = ue( function ( e ) { - return e.className = "i", !e.getAttribute( "className" ) - } ), n.getElementsByTagName = ue( function ( e ) { - return e.appendChild( d.createComment( "" ) ), !e.getElementsByTagName( "*" ).length - } ), n.getElementsByClassName = Q.test( d.getElementsByClassName ), n.getById = ue( function ( e ) { - return h.appendChild( e ).id = b, !d.getElementsByName || !d.getElementsByName( b ).length - } ), n.getById ? ( r.filter.ID = function ( e ) { - var t = e.replace( Z, ee ); - return function ( e ) { - return e.getAttribute( "id" ) === t - } - }, r.find.ID = function ( e, t ) { - if ( "undefined" != typeof t.getElementById && g ) { - var n = t.getElementById( e ); - return n ? [ n ] : [] - } - } ) : ( r.filter.ID = function ( e ) { - var t = e.replace( Z, ee ); - return function ( e ) { - var n = "undefined" != typeof e.getAttributeNode && e.getAttributeNode( "id" ); - return n && n.value === t - } - }, r.find.ID = function ( e, t ) { - if ( "undefined" != typeof t.getElementById && g ) { - var n, r, i, o = t.getElementById( e ); - if ( o ) { - if ( ( n = o.getAttributeNode( "id" ) ) && n.value === e ) return [ o ]; - i = t.getElementsByName( e ), r = 0; - while ( o = i[ r++ ] ) - if ( ( n = o.getAttributeNode( "id" ) ) && n.value === e ) return [ o ] - } - return [] - } - } ), r.find.TAG = n.getElementsByTagName ? function ( e, t ) { - return "undefined" != typeof t.getElementsByTagName ? t.getElementsByTagName( e ) : n.qsa ? t.querySelectorAll( e ) : void 0 - } : function ( e, t ) { - var n, r = [], - i = 0, - o = t.getElementsByTagName( e ); - if ( "*" === e ) { - while ( n = o[ i++ ] ) 1 === n.nodeType && r.push( n ); - return r - } - return o - }, r.find.CLASS = n.getElementsByClassName && function ( e, t ) { - if ( "undefined" != typeof t.getElementsByClassName && g ) return t.getElementsByClassName( e ) - }, v = [], y = [], ( n.qsa = Q.test( d.querySelectorAll ) ) && ( ue( function ( e ) { - h.appendChild( e ).innerHTML = "", e.querySelectorAll( "[msallowcapture^='']" ).length && y.push( "[*^$]=" + M + "*(?:''|\"\")" ), e.querySelectorAll( "[selected]" ).length || y.push( "\\[" + M + "*(?:value|" + P + ")" ), e.querySelectorAll( "[id~=" + b + "-]" ).length || y.push( "~=" ), e.querySelectorAll( ":checked" ).length || y.push( ":checked" ), e.querySelectorAll( "a#" + b + "+*" ).length || y.push( ".#.+[+~]" ) - } ), ue( function ( e ) { - e.innerHTML = ""; - var t = d.createElement( "input" ); - t.setAttribute( "type", "hidden" ), e.appendChild( t ).setAttribute( "name", "D" ), e.querySelectorAll( "[name=d]" ).length && y.push( "name" + M + "*[*^$|!~]?=" ), 2 !== e.querySelectorAll( ":enabled" ).length && y.push( ":enabled", ":disabled" ), h.appendChild( e ).disabled = !0, 2 !== e.querySelectorAll( ":disabled" ).length && y.push( ":enabled", ":disabled" ), e.querySelectorAll( "*,:x" ), y.push( ",.*:" ) - } ) ), ( n.matchesSelector = Q.test( m = h.matches || h.webkitMatchesSelector || h.mozMatchesSelector || h.oMatchesSelector || h.msMatchesSelector ) ) && ue( function ( e ) { - n.disconnectedMatch = m.call( e, "*" ), m.call( e, "[s!='']:x" ), v.push( "!=", W ) - } ), y = y.length && new RegExp( y.join( "|" ) ), v = v.length && new RegExp( v.join( "|" ) ), t = Q.test( h.compareDocumentPosition ), x = t || Q.test( h.contains ) ? function ( e, t ) { - var n = 9 === e.nodeType ? e.documentElement : e, - r = t && t.parentNode; - return e === r || !( !r || 1 !== r.nodeType || !( n.contains ? n.contains( r ) : e.compareDocumentPosition && 16 & e.compareDocumentPosition( r ) ) ) - } : function ( e, t ) { - if ( t ) - while ( t = t.parentNode ) - if ( t === e ) return !0; - return !1 - }, D = t ? function ( e, t ) { - if ( e === t ) return f = !0, 0; - var r = !e.compareDocumentPosition - !t.compareDocumentPosition; - return r || ( 1 & ( r = ( e.ownerDocument || e ) === ( t.ownerDocument || t ) ? e.compareDocumentPosition( t ) : 1 ) || !n.sortDetached && t.compareDocumentPosition( e ) === r ? e === d || e.ownerDocument === w && x( w, e ) ? -1 : t === d || t.ownerDocument === w && x( w, t ) ? 1 : c ? O( c, e ) - O( c, t ) : 0 : 4 & r ? -1 : 1 ) - } : function ( e, t ) { - if ( e === t ) return f = !0, 0; - var n, r = 0, - i = e.parentNode, - o = t.parentNode, - a = [ e ], - s = [ t ]; - if ( !i || !o ) return e === d ? -1 : t === d ? 1 : i ? -1 : o ? 1 : c ? O( c, e ) - O( c, t ) : 0; - if ( i === o ) return ce( e, t ); - n = e; - while ( n = n.parentNode ) a.unshift( n ); - n = t; - while ( n = n.parentNode ) s.unshift( n ); - while ( a[ r ] === s[ r ] ) r++; - return r ? ce( a[ r ], s[ r ] ) : a[ r ] === w ? -1 : s[ r ] === w ? 1 : 0 - }, d ) : d - }, oe.matches = function ( e, t ) { - return oe( e, null, null, t ) - }, oe.matchesSelector = function ( e, t ) { - if ( ( e.ownerDocument || e ) !== d && p( e ), t = t.replace( z, "='$1']" ), n.matchesSelector && g && !S[ t + " " ] && ( !v || !v.test( t ) ) && ( !y || !y.test( t ) ) ) try { - var r = m.call( e, t ); - if ( r || n.disconnectedMatch || e.document && 11 !== e.document.nodeType ) return r - } catch ( e ) {} - return oe( t, d, null, [ e ] ).length > 0 - }, oe.contains = function ( e, t ) { - return ( e.ownerDocument || e ) !== d && p( e ), x( e, t ) - }, oe.attr = function ( e, t ) { - ( e.ownerDocument || e ) !== d && p( e ); - var i = r.attrHandle[ t.toLowerCase() ], - o = i && N.call( r.attrHandle, t.toLowerCase() ) ? i( e, t, !g ) : void 0; - return void 0 !== o ? o : n.attributes || !g ? e.getAttribute( t ) : ( o = e.getAttributeNode( t ) ) && o.specified ? o.value : null - }, oe.escape = function ( e ) { - return ( e + "" ).replace( te, ne ) - }, oe.error = function ( e ) { - throw new Error( "Syntax error, unrecognized expression: " + e ) - }, oe.uniqueSort = function ( e ) { - var t, r = [], - i = 0, - o = 0; - if ( f = !n.detectDuplicates, c = !n.sortStable && e.slice( 0 ), e.sort( D ), f ) { - while ( t = e[ o++ ] ) t === e[ o ] && ( i = r.push( o ) ); - while ( i-- ) e.splice( r[ i ], 1 ) - } - return c = null, e - }, i = oe.getText = function ( e ) { - var t, n = "", - r = 0, - o = e.nodeType; - if ( o ) { - if ( 1 === o || 9 === o || 11 === o ) { - if ( "string" == typeof e.textContent ) return e.textContent; - for ( e = e.firstChild; e; e = e.nextSibling ) n += i( e ) - } else if ( 3 === o || 4 === o ) return e.nodeValue - } else - while ( t = e[ r++ ] ) n += i( t ); - return n - }, ( r = oe.selectors = { - cacheLength: 50, - createPseudo: se, - match: V, - attrHandle: {}, - find: {}, - relative: { - ">": { - dir: "parentNode", - first: !0 - }, - " ": { - dir: "parentNode" - }, - "+": { - dir: "previousSibling", - first: !0 - }, - "~": { - dir: "previousSibling" - } - }, - preFilter: { - ATTR: function ( e ) { - return e[ 1 ] = e[ 1 ].replace( Z, ee ), e[ 3 ] = ( e[ 3 ] || e[ 4 ] || e[ 5 ] || "" ).replace( Z, ee ), "~=" === e[ 2 ] && ( e[ 3 ] = " " + e[ 3 ] + " " ), e.slice( 0, 4 ) - }, - CHILD: function ( e ) { - return e[ 1 ] = e[ 1 ].toLowerCase(), "nth" === e[ 1 ].slice( 0, 3 ) ? ( e[ 3 ] || oe.error( e[ 0 ] ), e[ 4 ] = +( e[ 4 ] ? e[ 5 ] + ( e[ 6 ] || 1 ) : 2 * ( "even" === e[ 3 ] || "odd" === e[ 3 ] ) ), e[ 5 ] = +( e[ 7 ] + e[ 8 ] || "odd" === e[ 3 ] ) ) : e[ 3 ] && oe.error( e[ 0 ] ), e - }, - PSEUDO: function ( e ) { - var t, n = !e[ 6 ] && e[ 2 ]; - return V.CHILD.test( e[ 0 ] ) ? null : ( e[ 3 ] ? e[ 2 ] = e[ 4 ] || e[ 5 ] || "" : n && X.test( n ) && ( t = a( n, !0 ) ) && ( t = n.indexOf( ")", n.length - t ) - n.length ) && ( e[ 0 ] = e[ 0 ].slice( 0, t ), e[ 2 ] = n.slice( 0, t ) ), e.slice( 0, 3 ) ) - } - }, - filter: { - TAG: function ( e ) { - var t = e.replace( Z, ee ).toLowerCase(); - return "*" === e ? function () { - return !0 - } : function ( e ) { - return e.nodeName && e.nodeName.toLowerCase() === t - } - }, - CLASS: function ( e ) { - var t = E[ e + " " ]; - return t || ( t = new RegExp( "(^|" + M + ")" + e + "(" + M + "|$)" ) ) && E( e, function ( e ) { - return t.test( "string" == typeof e.className && e.className || "undefined" != typeof e.getAttribute && e.getAttribute( "class" ) || "" ) - } ) - }, - ATTR: function ( e, t, n ) { - return function ( r ) { - var i = oe.attr( r, e ); - return null == i ? "!=" === t : !t || ( i += "", "=" === t ? i === n : "!=" === t ? i !== n : "^=" === t ? n && 0 === i.indexOf( n ) : "*=" === t ? n && i.indexOf( n ) > -1 : "$=" === t ? n && i.slice( -n.length ) === n : "~=" === t ? ( " " + i.replace( $, " " ) + " " ).indexOf( n ) > -1 : "|=" === t && ( i === n || i.slice( 0, n.length + 1 ) === n + "-" ) ) - } - }, - CHILD: function ( e, t, n, r, i ) { - var o = "nth" !== e.slice( 0, 3 ), - a = "last" !== e.slice( -4 ), - s = "of-type" === t; - return 1 === r && 0 === i ? function ( e ) { - return !!e.parentNode - } : function ( t, n, u ) { - var l, c, f, p, d, h, g = o !== a ? "nextSibling" : "previousSibling", - y = t.parentNode, - v = s && t.nodeName.toLowerCase(), - m = !u && !s, - x = !1; - if ( y ) { - if ( o ) { - while ( g ) { - p = t; - while ( p = p[ g ] ) - if ( s ? p.nodeName.toLowerCase() === v : 1 === p.nodeType ) return !1; - h = g = "only" === e && !h && "nextSibling" - } - return !0 - } - if ( h = [ a ? y.firstChild : y.lastChild ], a && m ) { - x = ( d = ( l = ( c = ( f = ( p = y )[ b ] || ( p[ b ] = {} ) )[ p.uniqueID ] || ( f[ p.uniqueID ] = {} ) )[ e ] || [] )[ 0 ] === T && l[ 1 ] ) && l[ 2 ], p = d && y.childNodes[ d ]; - while ( p = ++d && p && p[ g ] || ( x = d = 0 ) || h.pop() ) - if ( 1 === p.nodeType && ++x && p === t ) { - c[ e ] = [ T, d, x ]; - break - } - } else if ( m && ( x = d = ( l = ( c = ( f = ( p = t )[ b ] || ( p[ b ] = {} ) )[ p.uniqueID ] || ( f[ p.uniqueID ] = {} ) )[ e ] || [] )[ 0 ] === T && l[ 1 ] ), !1 === x ) - while ( p = ++d && p && p[ g ] || ( x = d = 0 ) || h.pop() ) - if ( ( s ? p.nodeName.toLowerCase() === v : 1 === p.nodeType ) && ++x && ( m && ( ( c = ( f = p[ b ] || ( p[ b ] = {} ) )[ p.uniqueID ] || ( f[ p.uniqueID ] = {} ) )[ e ] = [ T, x ] ), p === t ) ) break; - return ( x -= i ) === r || x % r == 0 && x / r >= 0 - } - } - }, - PSEUDO: function ( e, t ) { - var n, i = r.pseudos[ e ] || r.setFilters[ e.toLowerCase() ] || oe.error( "unsupported pseudo: " + e ); - return i[ b ] ? i( t ) : i.length > 1 ? ( n = [ e, e, "", t ], r.setFilters.hasOwnProperty( e.toLowerCase() ) ? se( function ( e, n ) { - var r, o = i( e, t ), - a = o.length; - while ( a-- ) e[ r = O( e, o[ a ] ) ] = !( n[ r ] = o[ a ] ) - } ) : function ( e ) { - return i( e, 0, n ) - } ) : i - } - }, - pseudos: { - not: se( function ( e ) { - var t = [], - n = [], - r = s( e.replace( B, "$1" ) ); - return r[ b ] ? se( function ( e, t, n, i ) { - var o, a = r( e, null, i, [] ), - s = e.length; - while ( s-- )( o = a[ s ] ) && ( e[ s ] = !( t[ s ] = o ) ) - } ) : function ( e, i, o ) { - return t[ 0 ] = e, r( t, null, o, n ), t[ 0 ] = null, !n.pop() - } - } ), - has: se( function ( e ) { - return function ( t ) { - return oe( e, t ).length > 0 - } - } ), - contains: se( function ( e ) { - return e = e.replace( Z, ee ), - function ( t ) { - return ( t.textContent || t.innerText || i( t ) ).indexOf( e ) > -1 - } - } ), - lang: se( function ( e ) { - return U.test( e || "" ) || oe.error( "unsupported lang: " + e ), e = e.replace( Z, ee ).toLowerCase(), - function ( t ) { - var n; - do { - if ( n = g ? t.lang : t.getAttribute( "xml:lang" ) || t.getAttribute( "lang" ) ) return ( n = n.toLowerCase() ) === e || 0 === n.indexOf( e + "-" ) - } while ( ( t = t.parentNode ) && 1 === t.nodeType ); - return !1 - } - } ), - target: function ( t ) { - var n = e.location && e.location.hash; - return n && n.slice( 1 ) === t.id - }, - root: function ( e ) { - return e === h - }, - focus: function ( e ) { - return e === d.activeElement && ( !d.hasFocus || d.hasFocus() ) && !!( e.type || e.href || ~e.tabIndex ) - }, - enabled: de( !1 ), - disabled: de( !0 ), - checked: function ( e ) { - var t = e.nodeName.toLowerCase(); - return "input" === t && !!e.checked || "option" === t && !!e.selected - }, - selected: function ( e ) { - return e.parentNode && e.parentNode.selectedIndex, !0 === e.selected - }, - empty: function ( e ) { - for ( e = e.firstChild; e; e = e.nextSibling ) - if ( e.nodeType < 6 ) return !1; - return !0 - }, - parent: function ( e ) { - return !r.pseudos.empty( e ) - }, - header: function ( e ) { - return Y.test( e.nodeName ) - }, - input: function ( e ) { - return G.test( e.nodeName ) - }, - button: function ( e ) { - var t = e.nodeName.toLowerCase(); - return "input" === t && "button" === e.type || "button" === t - }, - text: function ( e ) { - var t; - return "input" === e.nodeName.toLowerCase() && "text" === e.type && ( null == ( t = e.getAttribute( "type" ) ) || "text" === t.toLowerCase() ) - }, - first: he( function () { - return [ 0 ] - } ), - last: he( function ( e, t ) { - return [ t - 1 ] - } ), - eq: he( function ( e, t, n ) { - return [ n < 0 ? n + t : n ] - } ), - even: he( function ( e, t ) { - for ( var n = 0; n < t; n += 2 ) e.push( n ); - return e - } ), - odd: he( function ( e, t ) { - for ( var n = 1; n < t; n += 2 ) e.push( n ); - return e - } ), - lt: he( function ( e, t, n ) { - for ( var r = n < 0 ? n + t : n; --r >= 0; ) e.push( r ); - return e - } ), - gt: he( function ( e, t, n ) { - for ( var r = n < 0 ? n + t : n; ++r < t; ) e.push( r ); - return e - } ) - } - } ).pseudos.nth = r.pseudos.eq; - for ( t in { - radio: !0, - checkbox: !0, - file: !0, - password: !0, - image: !0 - } ) r.pseudos[ t ] = fe( t ); - for ( t in { - submit: !0, - reset: !0 - } ) r.pseudos[ t ] = pe( t ); - - function ye() {} - ye.prototype = r.filters = r.pseudos, r.setFilters = new ye, a = oe.tokenize = function ( e, t ) { - var n, i, o, a, s, u, l, c = k[ e + " " ]; - if ( c ) return t ? 0 : c.slice( 0 ); - s = e, u = [], l = r.preFilter; - while ( s ) { - n && !( i = F.exec( s ) ) || ( i && ( s = s.slice( i[ 0 ].length ) || s ), u.push( o = [] ) ), n = !1, ( i = _.exec( s ) ) && ( n = i.shift(), o.push( { - value: n, - type: i[ 0 ].replace( B, " " ) - } ), s = s.slice( n.length ) ); - for ( a in r.filter ) !( i = V[ a ].exec( s ) ) || l[ a ] && !( i = l[ a ]( i ) ) || ( n = i.shift(), o.push( { - value: n, - type: a, - matches: i - } ), s = s.slice( n.length ) ); - if ( !n ) break - } - return t ? s.length : s ? oe.error( e ) : k( e, u ).slice( 0 ) - }; - - function ve( e ) { - for ( var t = 0, n = e.length, r = ""; t < n; t++ ) r += e[ t ].value; - return r - } - - function me( e, t, n ) { - var r = t.dir, - i = t.next, - o = i || r, - a = n && "parentNode" === o, - s = C++; - return t.first ? function ( t, n, i ) { - while ( t = t[ r ] ) - if ( 1 === t.nodeType || a ) return e( t, n, i ); - return !1 - } : function ( t, n, u ) { - var l, c, f, p = [ T, s ]; - if ( u ) { - while ( t = t[ r ] ) - if ( ( 1 === t.nodeType || a ) && e( t, n, u ) ) return !0 - } else - while ( t = t[ r ] ) - if ( 1 === t.nodeType || a ) - if ( f = t[ b ] || ( t[ b ] = {} ), c = f[ t.uniqueID ] || ( f[ t.uniqueID ] = {} ), i && i === t.nodeName.toLowerCase() ) t = t[ r ] || t; - else { - if ( ( l = c[ o ] ) && l[ 0 ] === T && l[ 1 ] === s ) return p[ 2 ] = l[ 2 ]; - if ( c[ o ] = p, p[ 2 ] = e( t, n, u ) ) return !0 - } return !1 - } - } - - function xe( e ) { - return e.length > 1 ? function ( t, n, r ) { - var i = e.length; - while ( i-- ) - if ( !e[ i ]( t, n, r ) ) return !1; - return !0 - } : e[ 0 ] - } - - function be( e, t, n ) { - for ( var r = 0, i = t.length; r < i; r++ ) oe( e, t[ r ], n ); - return n - } - - function we( e, t, n, r, i ) { - for ( var o, a = [], s = 0, u = e.length, l = null != t; s < u; s++ )( o = e[ s ] ) && ( n && !n( o, r, i ) || ( a.push( o ), l && t.push( s ) ) ); - return a - } - - function Te( e, t, n, r, i, o ) { - return r && !r[ b ] && ( r = Te( r ) ), i && !i[ b ] && ( i = Te( i, o ) ), se( function ( o, a, s, u ) { - var l, c, f, p = [], - d = [], - h = a.length, - g = o || be( t || "*", s.nodeType ? [ s ] : s, [] ), - y = !e || !o && t ? g : we( g, p, e, s, u ), - v = n ? i || ( o ? e : h || r ) ? [] : a : y; - if ( n && n( y, v, s, u ), r ) { - l = we( v, d ), r( l, [], s, u ), c = l.length; - while ( c-- )( f = l[ c ] ) && ( v[ d[ c ] ] = !( y[ d[ c ] ] = f ) ) - } - if ( o ) { - if ( i || e ) { - if ( i ) { - l = [], c = v.length; - while ( c-- )( f = v[ c ] ) && l.push( y[ c ] = f ); - i( null, v = [], l, u ) - } - c = v.length; - while ( c-- )( f = v[ c ] ) && ( l = i ? O( o, f ) : p[ c ] ) > -1 && ( o[ l ] = !( a[ l ] = f ) ) - } - } else v = we( v === a ? v.splice( h, v.length ) : v ), i ? i( null, a, v, u ) : L.apply( a, v ) - } ) - } - - function Ce( e ) { - for ( var t, n, i, o = e.length, a = r.relative[ e[ 0 ].type ], s = a || r.relative[ " " ], u = a ? 1 : 0, c = me( function ( e ) { - return e === t - }, s, !0 ), f = me( function ( e ) { - return O( t, e ) > -1 - }, s, !0 ), p = [ function ( e, n, r ) { - var i = !a && ( r || n !== l ) || ( ( t = n ).nodeType ? c( e, n, r ) : f( e, n, r ) ); - return t = null, i - } ]; u < o; u++ ) - if ( n = r.relative[ e[ u ].type ] ) p = [ me( xe( p ), n ) ]; - else { - if ( ( n = r.filter[ e[ u ].type ].apply( null, e[ u ].matches ) )[ b ] ) { - for ( i = ++u; i < o; i++ ) - if ( r.relative[ e[ i ].type ] ) break; - return Te( u > 1 && xe( p ), u > 1 && ve( e.slice( 0, u - 1 ).concat( { - value: " " === e[ u - 2 ].type ? "*" : "" - } ) ).replace( B, "$1" ), n, u < i && Ce( e.slice( u, i ) ), i < o && Ce( e = e.slice( i ) ), i < o && ve( e ) ) - } - p.push( n ) - } return xe( p ) - } - - function Ee( e, t ) { - var n = t.length > 0, - i = e.length > 0, - o = function ( o, a, s, u, c ) { - var f, h, y, v = 0, - m = "0", - x = o && [], - b = [], - w = l, - C = o || i && r.find.TAG( "*", c ), - E = T += null == w ? 1 : Math.random() || .1, - k = C.length; - for ( c && ( l = a === d || a || c ); m !== k && null != ( f = C[ m ] ); m++ ) { - if ( i && f ) { - h = 0, a || f.ownerDocument === d || ( p( f ), s = !g ); - while ( y = e[ h++ ] ) - if ( y( f, a || d, s ) ) { - u.push( f ); - break - } c && ( T = E ) - } - n && ( ( f = !y && f ) && v--, o && x.push( f ) ) - } - if ( v += m, n && m !== v ) { - h = 0; - while ( y = t[ h++ ] ) y( x, b, a, s ); - if ( o ) { - if ( v > 0 ) - while ( m-- ) x[ m ] || b[ m ] || ( b[ m ] = j.call( u ) ); - b = we( b ) - } - L.apply( u, b ), c && !o && b.length > 0 && v + t.length > 1 && oe.uniqueSort( u ) - } - return c && ( T = E, l = w ), x - }; - return n ? se( o ) : o - } - return s = oe.compile = function ( e, t ) { - var n, r = [], - i = [], - o = S[ e + " " ]; - if ( !o ) { - t || ( t = a( e ) ), n = t.length; - while ( n-- )( o = Ce( t[ n ] ) )[ b ] ? r.push( o ) : i.push( o ); - ( o = S( e, Ee( i, r ) ) ).selector = e - } - return o - }, u = oe.select = function ( e, t, n, i ) { - var o, u, l, c, f, p = "function" == typeof e && e, - d = !i && a( e = p.selector || e ); - if ( n = n || [], 1 === d.length ) { - if ( ( u = d[ 0 ] = d[ 0 ].slice( 0 ) ).length > 2 && "ID" === ( l = u[ 0 ] ).type && 9 === t.nodeType && g && r.relative[ u[ 1 ].type ] ) { - if ( !( t = ( r.find.ID( l.matches[ 0 ].replace( Z, ee ), t ) || [] )[ 0 ] ) ) return n; - p && ( t = t.parentNode ), e = e.slice( u.shift().value.length ) - } - o = V.needsContext.test( e ) ? 0 : u.length; - while ( o-- ) { - if ( l = u[ o ], r.relative[ c = l.type ] ) break; - if ( ( f = r.find[ c ] ) && ( i = f( l.matches[ 0 ].replace( Z, ee ), K.test( u[ 0 ].type ) && ge( t.parentNode ) || t ) ) ) { - if ( u.splice( o, 1 ), !( e = i.length && ve( u ) ) ) return L.apply( n, i ), n; - break - } - } - } - return ( p || s( e, d ) )( i, t, !g, n, !t || K.test( e ) && ge( t.parentNode ) || t ), n - }, n.sortStable = b.split( "" ).sort( D ).join( "" ) === b, n.detectDuplicates = !!f, p(), n.sortDetached = ue( function ( e ) { - return 1 & e.compareDocumentPosition( d.createElement( "fieldset" ) ) - } ), ue( function ( e ) { - return e.innerHTML = "", "#" === e.firstChild.getAttribute( "href" ) - } ) || le( "type|href|height|width", function ( e, t, n ) { - if ( !n ) return e.getAttribute( t, "type" === t.toLowerCase() ? 1 : 2 ) - } ), n.attributes && ue( function ( e ) { - return e.innerHTML = "", e.firstChild.setAttribute( "value", "" ), "" === e.firstChild.getAttribute( "value" ) - } ) || le( "value", function ( e, t, n ) { - if ( !n && "input" === e.nodeName.toLowerCase() ) return e.defaultValue - } ), ue( function ( e ) { - return null == e.getAttribute( "disabled" ) - } ) || le( P, function ( e, t, n ) { - var r; - if ( !n ) return !0 === e[ t ] ? t.toLowerCase() : ( r = e.getAttributeNode( t ) ) && r.specified ? r.value : null - } ), oe - }( e ); - w.find = E, w.expr = E.selectors, w.expr[ ":" ] = w.expr.pseudos, w.uniqueSort = w.unique = E.uniqueSort, w.text = E.getText, w.isXMLDoc = E.isXML, w.contains = E.contains, w.escapeSelector = E.escape; - var k = function ( e, t, n ) { - var r = [], - i = void 0 !== n; - while ( ( e = e[ t ] ) && 9 !== e.nodeType ) - if ( 1 === e.nodeType ) { - if ( i && w( e ).is( n ) ) break; - r.push( e ) - } return r - }, - S = function ( e, t ) { - for ( var n = []; e; e = e.nextSibling ) 1 === e.nodeType && e !== t && n.push( e ); - return n - }, - D = w.expr.match.needsContext; - - function N( e, t ) { - return e.nodeName && e.nodeName.toLowerCase() === t.toLowerCase() - } - var A = /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i; - - function j( e, t, n ) { - return g( t ) ? w.grep( e, function ( e, r ) { - return !!t.call( e, r, e ) !== n - } ) : t.nodeType ? w.grep( e, function ( e ) { - return e === t !== n - } ) : "string" != typeof t ? w.grep( e, function ( e ) { - return u.call( t, e ) > -1 !== n - } ) : w.filter( t, e, n ) - } - w.filter = function ( e, t, n ) { - var r = t[ 0 ]; - return n && ( e = ":not(" + e + ")" ), 1 === t.length && 1 === r.nodeType ? w.find.matchesSelector( r, e ) ? [ r ] : [] : w.find.matches( e, w.grep( t, function ( e ) { - return 1 === e.nodeType - } ) ) - }, w.fn.extend( { - find: function ( e ) { - var t, n, r = this.length, - i = this; - if ( "string" != typeof e ) return this.pushStack( w( e ).filter( function () { - for ( t = 0; t < r; t++ ) - if ( w.contains( i[ t ], this ) ) return !0 - } ) ); - for ( n = this.pushStack( [] ), t = 0; t < r; t++ ) w.find( e, i[ t ], n ); - return r > 1 ? w.uniqueSort( n ) : n - }, - filter: function ( e ) { - return this.pushStack( j( this, e || [], !1 ) ) - }, - not: function ( e ) { - return this.pushStack( j( this, e || [], !0 ) ) - }, - is: function ( e ) { - return !!j( this, "string" == typeof e && D.test( e ) ? w( e ) : e || [], !1 ).length - } - } ); - var q, L = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/; - ( w.fn.init = function ( e, t, n ) { - var i, o; - if ( !e ) return this; - if ( n = n || q, "string" == typeof e ) { - if ( !( i = "<" === e[ 0 ] && ">" === e[ e.length - 1 ] && e.length >= 3 ? [ null, e, null ] : L.exec( e ) ) || !i[ 1 ] && t ) return !t || t.jquery ? ( t || n ).find( e ) : this.constructor( t ).find( e ); - if ( i[ 1 ] ) { - if ( t = t instanceof w ? t[ 0 ] : t, w.merge( this, w.parseHTML( i[ 1 ], t && t.nodeType ? t.ownerDocument || t : r, !0 ) ), A.test( i[ 1 ] ) && w.isPlainObject( t ) ) - for ( i in t ) g( this[ i ] ) ? this[ i ]( t[ i ] ) : this.attr( i, t[ i ] ); - return this - } - return ( o = r.getElementById( i[ 2 ] ) ) && ( this[ 0 ] = o, this.length = 1 ), this - } - return e.nodeType ? ( this[ 0 ] = e, this.length = 1, this ) : g( e ) ? void 0 !== n.ready ? n.ready( e ) : e( w ) : w.makeArray( e, this ) - } ).prototype = w.fn, q = w( r ); - var H = /^(?:parents|prev(?:Until|All))/, - O = { - children: !0, - contents: !0, - next: !0, - prev: !0 - }; - w.fn.extend( { - has: function ( e ) { - var t = w( e, this ), - n = t.length; - return this.filter( function () { - for ( var e = 0; e < n; e++ ) - if ( w.contains( this, t[ e ] ) ) return !0 - } ) - }, - closest: function ( e, t ) { - var n, r = 0, - i = this.length, - o = [], - a = "string" != typeof e && w( e ); - if ( !D.test( e ) ) - for ( ; r < i; r++ ) - for ( n = this[ r ]; n && n !== t; n = n.parentNode ) - if ( n.nodeType < 11 && ( a ? a.index( n ) > -1 : 1 === n.nodeType && w.find.matchesSelector( n, e ) ) ) { - o.push( n ); - break - } return this.pushStack( o.length > 1 ? w.uniqueSort( o ) : o ) - }, - index: function ( e ) { - return e ? "string" == typeof e ? u.call( w( e ), this[ 0 ] ) : u.call( this, e.jquery ? e[ 0 ] : e ) : this[ 0 ] && this[ 0 ].parentNode ? this.first().prevAll().length : -1 - }, - add: function ( e, t ) { - return this.pushStack( w.uniqueSort( w.merge( this.get(), w( e, t ) ) ) ) - }, - addBack: function ( e ) { - return this.add( null == e ? this.prevObject : this.prevObject.filter( e ) ) - } - } ); - - function P( e, t ) { - while ( ( e = e[ t ] ) && 1 !== e.nodeType ); - return e - } - w.each( { - parent: function ( e ) { - var t = e.parentNode; - return t && 11 !== t.nodeType ? t : null - }, - parents: function ( e ) { - return k( e, "parentNode" ) - }, - parentsUntil: function ( e, t, n ) { - return k( e, "parentNode", n ) - }, - next: function ( e ) { - return P( e, "nextSibling" ) - }, - prev: function ( e ) { - return P( e, "previousSibling" ) - }, - nextAll: function ( e ) { - return k( e, "nextSibling" ) - }, - prevAll: function ( e ) { - return k( e, "previousSibling" ) - }, - nextUntil: function ( e, t, n ) { - return k( e, "nextSibling", n ) - }, - prevUntil: function ( e, t, n ) { - return k( e, "previousSibling", n ) - }, - siblings: function ( e ) { - return S( ( e.parentNode || {} ).firstChild, e ) - }, - children: function ( e ) { - return S( e.firstChild ) - }, - contents: function ( e ) { - return N( e, "iframe" ) ? e.contentDocument : ( N( e, "template" ) && ( e = e.content || e ), w.merge( [], e.childNodes ) ) - } - }, function ( e, t ) { - w.fn[ e ] = function ( n, r ) { - var i = w.map( this, t, n ); - return "Until" !== e.slice( -5 ) && ( r = n ), r && "string" == typeof r && ( i = w.filter( r, i ) ), this.length > 1 && ( O[ e ] || w.uniqueSort( i ), H.test( e ) && i.reverse() ), this.pushStack( i ) - } - } ); - var M = /[^\x20\t\r\n\f]+/g; - - function R( e ) { - var t = {}; - return w.each( e.match( M ) || [], function ( e, n ) { - t[ n ] = !0 - } ), t - } - w.Callbacks = function ( e ) { - e = "string" == typeof e ? R( e ) : w.extend( {}, e ); - var t, n, r, i, o = [], - a = [], - s = -1, - u = function () { - for ( i = i || e.once, r = t = !0; a.length; s = -1 ) { - n = a.shift(); - while ( ++s < o.length ) !1 === o[ s ].apply( n[ 0 ], n[ 1 ] ) && e.stopOnFalse && ( s = o.length, n = !1 ) - } - e.memory || ( n = !1 ), t = !1, i && ( o = n ? [] : "" ) - }, - l = { - add: function () { - return o && ( n && !t && ( s = o.length - 1, a.push( n ) ), function t( n ) { - w.each( n, function ( n, r ) { - g( r ) ? e.unique && l.has( r ) || o.push( r ) : r && r.length && "string" !== x( r ) && t( r ) - } ) - }( arguments ), n && !t && u() ), this - }, - remove: function () { - return w.each( arguments, function ( e, t ) { - var n; - while ( ( n = w.inArray( t, o, n ) ) > -1 ) o.splice( n, 1 ), n <= s && s-- - } ), this - }, - has: function ( e ) { - return e ? w.inArray( e, o ) > -1 : o.length > 0 - }, - empty: function () { - return o && ( o = [] ), this - }, - disable: function () { - return i = a = [], o = n = "", this - }, - disabled: function () { - return !o - }, - lock: function () { - return i = a = [], n || t || ( o = n = "" ), this - }, - locked: function () { - return !!i - }, - fireWith: function ( e, n ) { - return i || ( n = [ e, ( n = n || [] ).slice ? n.slice() : n ], a.push( n ), t || u() ), this - }, - fire: function () { - return l.fireWith( this, arguments ), this - }, - fired: function () { - return !!r - } - }; - return l - }; - - function I( e ) { - return e - } - - function W( e ) { - throw e - } - - function $( e, t, n, r ) { - var i; - try { - e && g( i = e.promise ) ? i.call( e ).done( t ).fail( n ) : e && g( i = e.then ) ? i.call( e, t, n ) : t.apply( void 0, [ e ].slice( r ) ) - } catch ( e ) { - n.apply( void 0, [ e ] ) - } - } - w.extend( { - Deferred: function ( t ) { - var n = [ - [ "notify", "progress", w.Callbacks( "memory" ), w.Callbacks( "memory" ), 2 ], - [ "resolve", "done", w.Callbacks( "once memory" ), w.Callbacks( "once memory" ), 0, "resolved" ], - [ "reject", "fail", w.Callbacks( "once memory" ), w.Callbacks( "once memory" ), 1, "rejected" ] - ], - r = "pending", - i = { - state: function () { - return r - }, - always: function () { - return o.done( arguments ).fail( arguments ), this - }, - "catch": function ( e ) { - return i.then( null, e ) - }, - pipe: function () { - var e = arguments; - return w.Deferred( function ( t ) { - w.each( n, function ( n, r ) { - var i = g( e[ r[ 4 ] ] ) && e[ r[ 4 ] ]; - o[ r[ 1 ] ]( function () { - var e = i && i.apply( this, arguments ); - e && g( e.promise ) ? e.promise().progress( t.notify ).done( t.resolve ).fail( t.reject ) : t[ r[ 0 ] + "With" ]( this, i ? [ e ] : arguments ) - } ) - } ), e = null - } ).promise() - }, - then: function ( t, r, i ) { - var o = 0; - - function a( t, n, r, i ) { - return function () { - var s = this, - u = arguments, - l = function () { - var e, l; - if ( !( t < o ) ) { - if ( ( e = r.apply( s, u ) ) === n.promise() ) throw new TypeError( "Thenable self-resolution" ); - l = e && ( "object" == typeof e || "function" == typeof e ) && e.then, g( l ) ? i ? l.call( e, a( o, n, I, i ), a( o, n, W, i ) ) : ( o++, l.call( e, a( o, n, I, i ), a( o, n, W, i ), a( o, n, I, n.notifyWith ) ) ) : ( r !== I && ( s = void 0, u = [ e ] ), ( i || n.resolveWith )( s, u ) ) - } - }, - c = i ? l : function () { - try { - l() - } catch ( e ) { - w.Deferred.exceptionHook && w.Deferred.exceptionHook( e, c.stackTrace ), t + 1 >= o && ( r !== W && ( s = void 0, u = [ e ] ), n.rejectWith( s, u ) ) - } - }; - t ? c() : ( w.Deferred.getStackHook && ( c.stackTrace = w.Deferred.getStackHook() ), e.setTimeout( c ) ) - } - } - return w.Deferred( function ( e ) { - n[ 0 ][ 3 ].add( a( 0, e, g( i ) ? i : I, e.notifyWith ) ), n[ 1 ][ 3 ].add( a( 0, e, g( t ) ? t : I ) ), n[ 2 ][ 3 ].add( a( 0, e, g( r ) ? r : W ) ) - } ).promise() - }, - promise: function ( e ) { - return null != e ? w.extend( e, i ) : i - } - }, - o = {}; - return w.each( n, function ( e, t ) { - var a = t[ 2 ], - s = t[ 5 ]; - i[ t[ 1 ] ] = a.add, s && a.add( function () { - r = s - }, n[ 3 - e ][ 2 ].disable, n[ 3 - e ][ 3 ].disable, n[ 0 ][ 2 ].lock, n[ 0 ][ 3 ].lock ), a.add( t[ 3 ].fire ), o[ t[ 0 ] ] = function () { - return o[ t[ 0 ] + "With" ]( this === o ? void 0 : this, arguments ), this - }, o[ t[ 0 ] + "With" ] = a.fireWith - } ), i.promise( o ), t && t.call( o, o ), o - }, - when: function ( e ) { - var t = arguments.length, - n = t, - r = Array( n ), - i = o.call( arguments ), - a = w.Deferred(), - s = function ( e ) { - return function ( n ) { - r[ e ] = this, i[ e ] = arguments.length > 1 ? o.call( arguments ) : n, --t || a.resolveWith( r, i ) - } - }; - if ( t <= 1 && ( $( e, a.done( s( n ) ).resolve, a.reject, !t ), "pending" === a.state() || g( i[ n ] && i[ n ].then ) ) ) return a.then(); - while ( n-- ) $( i[ n ], s( n ), a.reject ); - return a.promise() - } - } ); - var B = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; - w.Deferred.exceptionHook = function ( t, n ) { - e.console && e.console.warn && t && B.test( t.name ) && e.console.warn( "jQuery.Deferred exception: " + t.message, t.stack, n ) - }, w.readyException = function ( t ) { - e.setTimeout( function () { - throw t - } ) - }; - var F = w.Deferred(); - w.fn.ready = function ( e ) { - return F.then( e )[ "catch" ]( function ( e ) { - w.readyException( e ) - } ), this - }, w.extend( { - isReady: !1, - readyWait: 1, - ready: function ( e ) { - ( !0 === e ? --w.readyWait : w.isReady ) || ( w.isReady = !0, !0 !== e && --w.readyWait > 0 || F.resolveWith( r, [ w ] ) ) - } - } ), w.ready.then = F.then; - - function _() { - r.removeEventListener( "DOMContentLoaded", _ ), e.removeEventListener( "load", _ ), w.ready() - } - "complete" === r.readyState || "loading" !== r.readyState && !r.documentElement.doScroll ? e.setTimeout( w.ready ) : ( r.addEventListener( "DOMContentLoaded", _ ), e.addEventListener( "load", _ ) ); - var z = function ( e, t, n, r, i, o, a ) { - var s = 0, - u = e.length, - l = null == n; - if ( "object" === x( n ) ) { - i = !0; - for ( s in n ) z( e, t, s, n[ s ], !0, o, a ) - } else if ( void 0 !== r && ( i = !0, g( r ) || ( a = !0 ), l && ( a ? ( t.call( e, r ), t = null ) : ( l = t, t = function ( e, t, n ) { - return l.call( w( e ), n ) - } ) ), t ) ) - for ( ; s < u; s++ ) t( e[ s ], n, a ? r : r.call( e[ s ], s, t( e[ s ], n ) ) ); - return i ? e : l ? t.call( e ) : u ? t( e[ 0 ], n ) : o - }, - X = /^-ms-/, - U = /-([a-z])/g; - - function V( e, t ) { - return t.toUpperCase() - } - - function G( e ) { - return e.replace( X, "ms-" ).replace( U, V ) - } - var Y = function ( e ) { - return 1 === e.nodeType || 9 === e.nodeType || !+e.nodeType - }; - - function Q() { - this.expando = w.expando + Q.uid++ - } - Q.uid = 1, Q.prototype = { - cache: function ( e ) { - var t = e[ this.expando ]; - return t || ( t = {}, Y( e ) && ( e.nodeType ? e[ this.expando ] = t : Object.defineProperty( e, this.expando, { - value: t, - configurable: !0 - } ) ) ), t - }, - set: function ( e, t, n ) { - var r, i = this.cache( e ); - if ( "string" == typeof t ) i[ G( t ) ] = n; - else - for ( r in t ) i[ G( r ) ] = t[ r ]; - return i - }, - get: function ( e, t ) { - return void 0 === t ? this.cache( e ) : e[ this.expando ] && e[ this.expando ][ G( t ) ] - }, - access: function ( e, t, n ) { - return void 0 === t || t && "string" == typeof t && void 0 === n ? this.get( e, t ) : ( this.set( e, t, n ), void 0 !== n ? n : t ) - }, - remove: function ( e, t ) { - var n, r = e[ this.expando ]; - if ( void 0 !== r ) { - if ( void 0 !== t ) { - n = ( t = Array.isArray( t ) ? t.map( G ) : ( t = G( t ) ) in r ? [ t ] : t.match( M ) || [] ).length; - while ( n-- ) delete r[ t[ n ] ] - }( void 0 === t || w.isEmptyObject( r ) ) && ( e.nodeType ? e[ this.expando ] = void 0 : delete e[ this.expando ] ) - } - }, - hasData: function ( e ) { - var t = e[ this.expando ]; - return void 0 !== t && !w.isEmptyObject( t ) - } - }; - var J = new Q, - K = new Q, - Z = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - ee = /[A-Z]/g; - - function te( e ) { - return "true" === e || "false" !== e && ( "null" === e ? null : e === +e + "" ? +e : Z.test( e ) ? JSON.parse( e ) : e ) - } - - function ne( e, t, n ) { - var r; - if ( void 0 === n && 1 === e.nodeType ) - if ( r = "data-" + t.replace( ee, "-$&" ).toLowerCase(), "string" == typeof ( n = e.getAttribute( r ) ) ) { - try { - n = te( n ) - } catch ( e ) {} - K.set( e, t, n ) - } else n = void 0; - return n - } - w.extend( { - hasData: function ( e ) { - return K.hasData( e ) || J.hasData( e ) - }, - data: function ( e, t, n ) { - return K.access( e, t, n ) - }, - removeData: function ( e, t ) { - K.remove( e, t ) - }, - _data: function ( e, t, n ) { - return J.access( e, t, n ) - }, - _removeData: function ( e, t ) { - J.remove( e, t ) - } - } ), w.fn.extend( { - data: function ( e, t ) { - var n, r, i, o = this[ 0 ], - a = o && o.attributes; - if ( void 0 === e ) { - if ( this.length && ( i = K.get( o ), 1 === o.nodeType && !J.get( o, "hasDataAttrs" ) ) ) { - n = a.length; - while ( n-- ) a[ n ] && 0 === ( r = a[ n ].name ).indexOf( "data-" ) && ( r = G( r.slice( 5 ) ), ne( o, r, i[ r ] ) ); - J.set( o, "hasDataAttrs", !0 ) - } - return i - } - return "object" == typeof e ? this.each( function () { - K.set( this, e ) - } ) : z( this, function ( t ) { - var n; - if ( o && void 0 === t ) { - if ( void 0 !== ( n = K.get( o, e ) ) ) return n; - if ( void 0 !== ( n = ne( o, e ) ) ) return n - } else this.each( function () { - K.set( this, e, t ) - } ) - }, null, t, arguments.length > 1, null, !0 ) - }, - removeData: function ( e ) { - return this.each( function () { - K.remove( this, e ) - } ) - } - } ), w.extend( { - queue: function ( e, t, n ) { - var r; - if ( e ) return t = ( t || "fx" ) + "queue", r = J.get( e, t ), n && ( !r || Array.isArray( n ) ? r = J.access( e, t, w.makeArray( n ) ) : r.push( n ) ), r || [] - }, - dequeue: function ( e, t ) { - t = t || "fx"; - var n = w.queue( e, t ), - r = n.length, - i = n.shift(), - o = w._queueHooks( e, t ), - a = function () { - w.dequeue( e, t ) - }; - "inprogress" === i && ( i = n.shift(), r-- ), i && ( "fx" === t && n.unshift( "inprogress" ), delete o.stop, i.call( e, a, o ) ), !r && o && o.empty.fire() - }, - _queueHooks: function ( e, t ) { - var n = t + "queueHooks"; - return J.get( e, n ) || J.access( e, n, { - empty: w.Callbacks( "once memory" ).add( function () { - J.remove( e, [ t + "queue", n ] ) - } ) - } ) - } - } ), w.fn.extend( { - queue: function ( e, t ) { - var n = 2; - return "string" != typeof e && ( t = e, e = "fx", n-- ), arguments.length < n ? w.queue( this[ 0 ], e ) : void 0 === t ? this : this.each( function () { - var n = w.queue( this, e, t ); - w._queueHooks( this, e ), "fx" === e && "inprogress" !== n[ 0 ] && w.dequeue( this, e ) - } ) - }, - dequeue: function ( e ) { - return this.each( function () { - w.dequeue( this, e ) - } ) - }, - clearQueue: function ( e ) { - return this.queue( e || "fx", [] ) - }, - promise: function ( e, t ) { - var n, r = 1, - i = w.Deferred(), - o = this, - a = this.length, - s = function () { - --r || i.resolveWith( o, [ o ] ) - }; - "string" != typeof e && ( t = e, e = void 0 ), e = e || "fx"; - while ( a-- )( n = J.get( o[ a ], e + "queueHooks" ) ) && n.empty && ( r++, n.empty.add( s ) ); - return s(), i.promise( t ) - } - } ); - var re = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source, - ie = new RegExp( "^(?:([+-])=|)(" + re + ")([a-z%]*)$", "i" ), - oe = [ "Top", "Right", "Bottom", "Left" ], - ae = function ( e, t ) { - return "none" === ( e = t || e ).style.display || "" === e.style.display && w.contains( e.ownerDocument, e ) && "none" === w.css( e, "display" ) - }, - se = function ( e, t, n, r ) { - var i, o, a = {}; - for ( o in t ) a[ o ] = e.style[ o ], e.style[ o ] = t[ o ]; - i = n.apply( e, r || [] ); - for ( o in t ) e.style[ o ] = a[ o ]; - return i - }; - - function ue( e, t, n, r ) { - var i, o, a = 20, - s = r ? function () { - return r.cur() - } : function () { - return w.css( e, t, "" ) - }, - u = s(), - l = n && n[ 3 ] || ( w.cssNumber[ t ] ? "" : "px" ), - c = ( w.cssNumber[ t ] || "px" !== l && +u ) && ie.exec( w.css( e, t ) ); - if ( c && c[ 3 ] !== l ) { - u /= 2, l = l || c[ 3 ], c = +u || 1; - while ( a-- ) w.style( e, t, c + l ), ( 1 - o ) * ( 1 - ( o = s() / u || .5 ) ) <= 0 && ( a = 0 ), c /= o; - c *= 2, w.style( e, t, c + l ), n = n || [] - } - return n && ( c = +c || +u || 0, i = n[ 1 ] ? c + ( n[ 1 ] + 1 ) * n[ 2 ] : +n[ 2 ], r && ( r.unit = l, r.start = c, r.end = i ) ), i - } - var le = {}; - - function ce( e ) { - var t, n = e.ownerDocument, - r = e.nodeName, - i = le[ r ]; - return i || ( t = n.body.appendChild( n.createElement( r ) ), i = w.css( t, "display" ), t.parentNode.removeChild( t ), "none" === i && ( i = "block" ), le[ r ] = i, i ) - } - - function fe( e, t ) { - for ( var n, r, i = [], o = 0, a = e.length; o < a; o++ )( r = e[ o ] ).style && ( n = r.style.display, t ? ( "none" === n && ( i[ o ] = J.get( r, "display" ) || null, i[ o ] || ( r.style.display = "" ) ), "" === r.style.display && ae( r ) && ( i[ o ] = ce( r ) ) ) : "none" !== n && ( i[ o ] = "none", J.set( r, "display", n ) ) ); - for ( o = 0; o < a; o++ ) null != i[ o ] && ( e[ o ].style.display = i[ o ] ); - return e - } - w.fn.extend( { - show: function () { - return fe( this, !0 ) - }, - hide: function () { - return fe( this ) - }, - toggle: function ( e ) { - return "boolean" == typeof e ? e ? this.show() : this.hide() : this.each( function () { - ae( this ) ? w( this ).show() : w( this ).hide() - } ) - } - } ); - var pe = /^(?:checkbox|radio)$/i, - de = /<([a-z][^\/\0>\x20\t\r\n\f]+)/i, - he = /^$|^module$|\/(?:java|ecma)script/i, - ge = { - option: [ 1, "" ], - thead: [ 1, "", "
" ], - col: [ 2, "", "
" ], - tr: [ 2, "", "
" ], - td: [ 3, "", "
" ], - _default: [ 0, "", "" ] - }; - ge.optgroup = ge.option, ge.tbody = ge.tfoot = ge.colgroup = ge.caption = ge.thead, ge.th = ge.td; - - function ye( e, t ) { - var n; - return n = "undefined" != typeof e.getElementsByTagName ? e.getElementsByTagName( t || "*" ) : "undefined" != typeof e.querySelectorAll ? e.querySelectorAll( t || "*" ) : [], void 0 === t || t && N( e, t ) ? w.merge( [ e ], n ) : n - } - - function ve( e, t ) { - for ( var n = 0, r = e.length; n < r; n++ ) J.set( e[ n ], "globalEval", !t || J.get( t[ n ], "globalEval" ) ) - } - var me = /<|&#?\w+;/; - - function xe( e, t, n, r, i ) { - for ( var o, a, s, u, l, c, f = t.createDocumentFragment(), p = [], d = 0, h = e.length; d < h; d++ ) - if ( ( o = e[ d ] ) || 0 === o ) - if ( "object" === x( o ) ) w.merge( p, o.nodeType ? [ o ] : o ); - else if ( me.test( o ) ) { - a = a || f.appendChild( t.createElement( "div" ) ), s = ( de.exec( o ) || [ "", "" ] )[ 1 ].toLowerCase(), u = ge[ s ] || ge._default, a.innerHTML = u[ 1 ] + w.htmlPrefilter( o ) + u[ 2 ], c = u[ 0 ]; - while ( c-- ) a = a.lastChild; - w.merge( p, a.childNodes ), ( a = f.firstChild ).textContent = "" - } else p.push( t.createTextNode( o ) ); - f.textContent = "", d = 0; - while ( o = p[ d++ ] ) - if ( r && w.inArray( o, r ) > -1 ) i && i.push( o ); - else if ( l = w.contains( o.ownerDocument, o ), a = ye( f.appendChild( o ), "script" ), l && ve( a ), n ) { - c = 0; - while ( o = a[ c++ ] ) he.test( o.type || "" ) && n.push( o ) - } - return f - }! function () { - var e = r.createDocumentFragment().appendChild( r.createElement( "div" ) ), - t = r.createElement( "input" ); - t.setAttribute( "type", "radio" ), t.setAttribute( "checked", "checked" ), t.setAttribute( "name", "t" ), e.appendChild( t ), h.checkClone = e.cloneNode( !0 ).cloneNode( !0 ).lastChild.checked, e.innerHTML = "", h.noCloneChecked = !!e.cloneNode( !0 ).lastChild.defaultValue - }(); - var be = r.documentElement, - we = /^key/, - Te = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, - Ce = /^([^.]*)(?:\.(.+)|)/; - - function Ee() { - return !0 - } - - function ke() { - return !1 - } - - function Se() { - try { - return r.activeElement - } catch ( e ) {} - } - - function De( e, t, n, r, i, o ) { - var a, s; - if ( "object" == typeof t ) { - "string" != typeof n && ( r = r || n, n = void 0 ); - for ( s in t ) De( e, s, n, r, t[ s ], o ); - return e - } - if ( null == r && null == i ? ( i = n, r = n = void 0 ) : null == i && ( "string" == typeof n ? ( i = r, r = void 0 ) : ( i = r, r = n, n = void 0 ) ), !1 === i ) i = ke; - else if ( !i ) return e; - return 1 === o && ( a = i, ( i = function ( e ) { - return w().off( e ), a.apply( this, arguments ) - } ).guid = a.guid || ( a.guid = w.guid++ ) ), e.each( function () { - w.event.add( this, t, i, r, n ) - } ) - } - w.event = { - global: {}, - add: function ( e, t, n, r, i ) { - var o, a, s, u, l, c, f, p, d, h, g, y = J.get( e ); - if ( y ) { - n.handler && ( n = ( o = n ).handler, i = o.selector ), i && w.find.matchesSelector( be, i ), n.guid || ( n.guid = w.guid++ ), ( u = y.events ) || ( u = y.events = {} ), ( a = y.handle ) || ( a = y.handle = function ( t ) { - return "undefined" != typeof w && w.event.triggered !== t.type ? w.event.dispatch.apply( e, arguments ) : void 0 - } ), l = ( t = ( t || "" ).match( M ) || [ "" ] ).length; - while ( l-- ) d = g = ( s = Ce.exec( t[ l ] ) || [] )[ 1 ], h = ( s[ 2 ] || "" ).split( "." ).sort(), d && ( f = w.event.special[ d ] || {}, d = ( i ? f.delegateType : f.bindType ) || d, f = w.event.special[ d ] || {}, c = w.extend( { - type: d, - origType: g, - data: r, - handler: n, - guid: n.guid, - selector: i, - needsContext: i && w.expr.match.needsContext.test( i ), - namespace: h.join( "." ) - }, o ), ( p = u[ d ] ) || ( ( p = u[ d ] = [] ).delegateCount = 0, f.setup && !1 !== f.setup.call( e, r, h, a ) || e.addEventListener && e.addEventListener( d, a ) ), f.add && ( f.add.call( e, c ), c.handler.guid || ( c.handler.guid = n.guid ) ), i ? p.splice( p.delegateCount++, 0, c ) : p.push( c ), w.event.global[ d ] = !0 ) - } - }, - remove: function ( e, t, n, r, i ) { - var o, a, s, u, l, c, f, p, d, h, g, y = J.hasData( e ) && J.get( e ); - if ( y && ( u = y.events ) ) { - l = ( t = ( t || "" ).match( M ) || [ "" ] ).length; - while ( l-- ) - if ( s = Ce.exec( t[ l ] ) || [], d = g = s[ 1 ], h = ( s[ 2 ] || "" ).split( "." ).sort(), d ) { - f = w.event.special[ d ] || {}, p = u[ d = ( r ? f.delegateType : f.bindType ) || d ] || [], s = s[ 2 ] && new RegExp( "(^|\\.)" + h.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ), a = o = p.length; - while ( o-- ) c = p[ o ], !i && g !== c.origType || n && n.guid !== c.guid || s && !s.test( c.namespace ) || r && r !== c.selector && ( "**" !== r || !c.selector ) || ( p.splice( o, 1 ), c.selector && p.delegateCount--, f.remove && f.remove.call( e, c ) ); - a && !p.length && ( f.teardown && !1 !== f.teardown.call( e, h, y.handle ) || w.removeEvent( e, d, y.handle ), delete u[ d ] ) - } else - for ( d in u ) w.event.remove( e, d + t[ l ], n, r, !0 ); - w.isEmptyObject( u ) && J.remove( e, "handle events" ) - } - }, - dispatch: function ( e ) { - var t = w.event.fix( e ), - n, r, i, o, a, s, u = new Array( arguments.length ), - l = ( J.get( this, "events" ) || {} )[ t.type ] || [], - c = w.event.special[ t.type ] || {}; - for ( u[ 0 ] = t, n = 1; n < arguments.length; n++ ) u[ n ] = arguments[ n ]; - if ( t.delegateTarget = this, !c.preDispatch || !1 !== c.preDispatch.call( this, t ) ) { - s = w.event.handlers.call( this, t, l ), n = 0; - while ( ( o = s[ n++ ] ) && !t.isPropagationStopped() ) { - t.currentTarget = o.elem, r = 0; - while ( ( a = o.handlers[ r++ ] ) && !t.isImmediatePropagationStopped() ) t.rnamespace && !t.rnamespace.test( a.namespace ) || ( t.handleObj = a, t.data = a.data, void 0 !== ( i = ( ( w.event.special[ a.origType ] || {} ).handle || a.handler ).apply( o.elem, u ) ) && !1 === ( t.result = i ) && ( t.preventDefault(), t.stopPropagation() ) ) - } - return c.postDispatch && c.postDispatch.call( this, t ), t.result - } - }, - handlers: function ( e, t ) { - var n, r, i, o, a, s = [], - u = t.delegateCount, - l = e.target; - if ( u && l.nodeType && !( "click" === e.type && e.button >= 1 ) ) - for ( ; l !== this; l = l.parentNode || this ) - if ( 1 === l.nodeType && ( "click" !== e.type || !0 !== l.disabled ) ) { - for ( o = [], a = {}, n = 0; n < u; n++ ) void 0 === a[ i = ( r = t[ n ] ).selector + " " ] && ( a[ i ] = r.needsContext ? w( i, this ).index( l ) > -1 : w.find( i, this, null, [ l ] ).length ), a[ i ] && o.push( r ); - o.length && s.push( { - elem: l, - handlers: o - } ) - } return l = this, u < t.length && s.push( { - elem: l, - handlers: t.slice( u ) - } ), s - }, - addProp: function ( e, t ) { - Object.defineProperty( w.Event.prototype, e, { - enumerable: !0, - configurable: !0, - get: g( t ) ? function () { - if ( this.originalEvent ) return t( this.originalEvent ) - } : function () { - if ( this.originalEvent ) return this.originalEvent[ e ] - }, - set: function ( t ) { - Object.defineProperty( this, e, { - enumerable: !0, - configurable: !0, - writable: !0, - value: t - } ) - } - } ) - }, - fix: function ( e ) { - return e[ w.expando ] ? e : new w.Event( e ) - }, - special: { - load: { - noBubble: !0 - }, - focus: { - trigger: function () { - if ( this !== Se() && this.focus ) return this.focus(), !1 - }, - delegateType: "focusin" - }, - blur: { - trigger: function () { - if ( this === Se() && this.blur ) return this.blur(), !1 - }, - delegateType: "focusout" - }, - click: { - trigger: function () { - if ( "checkbox" === this.type && this.click && N( this, "input" ) ) return this.click(), !1 - }, - _default: function ( e ) { - return N( e.target, "a" ) - } - }, - beforeunload: { - postDispatch: function ( e ) { - void 0 !== e.result && e.originalEvent && ( e.originalEvent.returnValue = e.result ) - } - } - } - }, w.removeEvent = function ( e, t, n ) { - e.removeEventListener && e.removeEventListener( t, n ) - }, w.Event = function ( e, t ) { - if ( !( this instanceof w.Event ) ) return new w.Event( e, t ); - e && e.type ? ( this.originalEvent = e, this.type = e.type, this.isDefaultPrevented = e.defaultPrevented || void 0 === e.defaultPrevented && !1 === e.returnValue ? Ee : ke, this.target = e.target && 3 === e.target.nodeType ? e.target.parentNode : e.target, this.currentTarget = e.currentTarget, this.relatedTarget = e.relatedTarget ) : this.type = e, t && w.extend( this, t ), this.timeStamp = e && e.timeStamp || Date.now(), this[ w.expando ] = !0 - }, w.Event.prototype = { - constructor: w.Event, - isDefaultPrevented: ke, - isPropagationStopped: ke, - isImmediatePropagationStopped: ke, - isSimulated: !1, - preventDefault: function () { - var e = this.originalEvent; - this.isDefaultPrevented = Ee, e && !this.isSimulated && e.preventDefault() - }, - stopPropagation: function () { - var e = this.originalEvent; - this.isPropagationStopped = Ee, e && !this.isSimulated && e.stopPropagation() - }, - stopImmediatePropagation: function () { - var e = this.originalEvent; - this.isImmediatePropagationStopped = Ee, e && !this.isSimulated && e.stopImmediatePropagation(), this.stopPropagation() - } - }, w.each( { - altKey: !0, - bubbles: !0, - cancelable: !0, - changedTouches: !0, - ctrlKey: !0, - detail: !0, - eventPhase: !0, - metaKey: !0, - pageX: !0, - pageY: !0, - shiftKey: !0, - view: !0, - "char": !0, - charCode: !0, - key: !0, - keyCode: !0, - button: !0, - buttons: !0, - clientX: !0, - clientY: !0, - offsetX: !0, - offsetY: !0, - pointerId: !0, - pointerType: !0, - screenX: !0, - screenY: !0, - targetTouches: !0, - toElement: !0, - touches: !0, - which: function ( e ) { - var t = e.button; - return null == e.which && we.test( e.type ) ? null != e.charCode ? e.charCode : e.keyCode : !e.which && void 0 !== t && Te.test( e.type ) ? 1 & t ? 1 : 2 & t ? 3 : 4 & t ? 2 : 0 : e.which - } - }, w.event.addProp ), w.each( { - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" - }, function ( e, t ) { - w.event.special[ e ] = { - delegateType: t, - bindType: t, - handle: function ( e ) { - var n, r = this, - i = e.relatedTarget, - o = e.handleObj; - return i && ( i === r || w.contains( r, i ) ) || ( e.type = o.origType, n = o.handler.apply( this, arguments ), e.type = t ), n - } - } - } ), w.fn.extend( { - on: function ( e, t, n, r ) { - return De( this, e, t, n, r ) - }, - one: function ( e, t, n, r ) { - return De( this, e, t, n, r, 1 ) - }, - off: function ( e, t, n ) { - var r, i; - if ( e && e.preventDefault && e.handleObj ) return r = e.handleObj, w( e.delegateTarget ).off( r.namespace ? r.origType + "." + r.namespace : r.origType, r.selector, r.handler ), this; - if ( "object" == typeof e ) { - for ( i in e ) this.off( i, t, e[ i ] ); - return this - } - return !1 !== t && "function" != typeof t || ( n = t, t = void 0 ), !1 === n && ( n = ke ), this.each( function () { - w.event.remove( this, e, n, t ) - } ) - } - } ); - var Ne = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi, - Ae = /\s*$/g; - - function Le( e, t ) { - return N( e, "table" ) && N( 11 !== t.nodeType ? t : t.firstChild, "tr" ) ? w( e ).children( "tbody" )[ 0 ] || e : e - } - - function He( e ) { - return e.type = ( null !== e.getAttribute( "type" ) ) + "/" + e.type, e - } - - function Oe( e ) { - return "true/" === ( e.type || "" ).slice( 0, 5 ) ? e.type = e.type.slice( 5 ) : e.removeAttribute( "type" ), e - } - - function Pe( e, t ) { - var n, r, i, o, a, s, u, l; - if ( 1 === t.nodeType ) { - if ( J.hasData( e ) && ( o = J.access( e ), a = J.set( t, o ), l = o.events ) ) { - delete a.handle, a.events = {}; - for ( i in l ) - for ( n = 0, r = l[ i ].length; n < r; n++ ) w.event.add( t, i, l[ i ][ n ] ) - } - K.hasData( e ) && ( s = K.access( e ), u = w.extend( {}, s ), K.set( t, u ) ) - } - } - - function Me( e, t ) { - var n = t.nodeName.toLowerCase(); - "input" === n && pe.test( e.type ) ? t.checked = e.checked : "input" !== n && "textarea" !== n || ( t.defaultValue = e.defaultValue ) - } - - function Re( e, t, n, r ) { - t = a.apply( [], t ); - var i, o, s, u, l, c, f = 0, - p = e.length, - d = p - 1, - y = t[ 0 ], - v = g( y ); - if ( v || p > 1 && "string" == typeof y && !h.checkClone && je.test( y ) ) return e.each( function ( i ) { - var o = e.eq( i ); - v && ( t[ 0 ] = y.call( this, i, o.html() ) ), Re( o, t, n, r ) - } ); - if ( p && ( i = xe( t, e[ 0 ].ownerDocument, !1, e, r ), o = i.firstChild, 1 === i.childNodes.length && ( i = o ), o || r ) ) { - for ( u = ( s = w.map( ye( i, "script" ), He ) ).length; f < p; f++ ) l = i, f !== d && ( l = w.clone( l, !0, !0 ), u && w.merge( s, ye( l, "script" ) ) ), n.call( e[ f ], l, f ); - if ( u ) - for ( c = s[ s.length - 1 ].ownerDocument, w.map( s, Oe ), f = 0; f < u; f++ ) l = s[ f ], he.test( l.type || "" ) && !J.access( l, "globalEval" ) && w.contains( c, l ) && ( l.src && "module" !== ( l.type || "" ).toLowerCase() ? w._evalUrl && w._evalUrl( l.src ) : m( l.textContent.replace( qe, "" ), c, l ) ) - } - return e - } - - function Ie( e, t, n ) { - for ( var r, i = t ? w.filter( t, e ) : e, o = 0; null != ( r = i[ o ] ); o++ ) n || 1 !== r.nodeType || w.cleanData( ye( r ) ), r.parentNode && ( n && w.contains( r.ownerDocument, r ) && ve( ye( r, "script" ) ), r.parentNode.removeChild( r ) ); - return e - } - w.extend( { - htmlPrefilter: function ( e ) { - return e.replace( Ne, "<$1>" ) - }, - clone: function ( e, t, n ) { - var r, i, o, a, s = e.cloneNode( !0 ), - u = w.contains( e.ownerDocument, e ); - if ( !( h.noCloneChecked || 1 !== e.nodeType && 11 !== e.nodeType || w.isXMLDoc( e ) ) ) - for ( a = ye( s ), r = 0, i = ( o = ye( e ) ).length; r < i; r++ ) Me( o[ r ], a[ r ] ); - if ( t ) - if ( n ) - for ( o = o || ye( e ), a = a || ye( s ), r = 0, i = o.length; r < i; r++ ) Pe( o[ r ], a[ r ] ); - else Pe( e, s ); - return ( a = ye( s, "script" ) ).length > 0 && ve( a, !u && ye( e, "script" ) ), s - }, - cleanData: function ( e ) { - for ( var t, n, r, i = w.event.special, o = 0; void 0 !== ( n = e[ o ] ); o++ ) - if ( Y( n ) ) { - if ( t = n[ J.expando ] ) { - if ( t.events ) - for ( r in t.events ) i[ r ] ? w.event.remove( n, r ) : w.removeEvent( n, r, t.handle ); - n[ J.expando ] = void 0 - } - n[ K.expando ] && ( n[ K.expando ] = void 0 ) - } - } - } ), w.fn.extend( { - detach: function ( e ) { - return Ie( this, e, !0 ) - }, - remove: function ( e ) { - return Ie( this, e ) - }, - text: function ( e ) { - return z( this, function ( e ) { - return void 0 === e ? w.text( this ) : this.empty().each( function () { - 1 !== this.nodeType && 11 !== this.nodeType && 9 !== this.nodeType || ( this.textContent = e ) - } ) - }, null, e, arguments.length ) - }, - append: function () { - return Re( this, arguments, function ( e ) { - 1 !== this.nodeType && 11 !== this.nodeType && 9 !== this.nodeType || Le( this, e ).appendChild( e ) - } ) - }, - prepend: function () { - return Re( this, arguments, function ( e ) { - if ( 1 === this.nodeType || 11 === this.nodeType || 9 === this.nodeType ) { - var t = Le( this, e ); - t.insertBefore( e, t.firstChild ) - } - } ) - }, - before: function () { - return Re( this, arguments, function ( e ) { - this.parentNode && this.parentNode.insertBefore( e, this ) - } ) - }, - after: function () { - return Re( this, arguments, function ( e ) { - this.parentNode && this.parentNode.insertBefore( e, this.nextSibling ) - } ) - }, - empty: function () { - for ( var e, t = 0; null != ( e = this[ t ] ); t++ ) 1 === e.nodeType && ( w.cleanData( ye( e, !1 ) ), e.textContent = "" ); - return this - }, - clone: function ( e, t ) { - return e = null != e && e, t = null == t ? e : t, this.map( function () { - return w.clone( this, e, t ) - } ) - }, - html: function ( e ) { - return z( this, function ( e ) { - var t = this[ 0 ] || {}, - n = 0, - r = this.length; - if ( void 0 === e && 1 === t.nodeType ) return t.innerHTML; - if ( "string" == typeof e && !Ae.test( e ) && !ge[ ( de.exec( e ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - e = w.htmlPrefilter( e ); - try { - for ( ; n < r; n++ ) 1 === ( t = this[ n ] || {} ).nodeType && ( w.cleanData( ye( t, !1 ) ), t.innerHTML = e ); - t = 0 - } catch ( e ) {} - } - t && this.empty().append( e ) - }, null, e, arguments.length ) - }, - replaceWith: function () { - var e = []; - return Re( this, arguments, function ( t ) { - var n = this.parentNode; - w.inArray( this, e ) < 0 && ( w.cleanData( ye( this ) ), n && n.replaceChild( t, this ) ) - }, e ) - } - } ), w.each( { - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" - }, function ( e, t ) { - w.fn[ e ] = function ( e ) { - for ( var n, r = [], i = w( e ), o = i.length - 1, a = 0; a <= o; a++ ) n = a === o ? this : this.clone( !0 ), w( i[ a ] )[ t ]( n ), s.apply( r, n.get() ); - return this.pushStack( r ) - } - } ); - var We = new RegExp( "^(" + re + ")(?!px)[a-z%]+$", "i" ), - $e = function ( t ) { - var n = t.ownerDocument.defaultView; - return n && n.opener || ( n = e ), n.getComputedStyle( t ) - }, - Be = new RegExp( oe.join( "|" ), "i" ); - ! function () { - function t() { - if ( c ) { - l.style.cssText = "position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0", c.style.cssText = "position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%", be.appendChild( l ).appendChild( c ); - var t = e.getComputedStyle( c ); - i = "1%" !== t.top, u = 12 === n( t.marginLeft ), c.style.right = "60%", s = 36 === n( t.right ), o = 36 === n( t.width ), c.style.position = "absolute", a = 36 === c.offsetWidth || "absolute", be.removeChild( l ), c = null - } - } - - function n( e ) { - return Math.round( parseFloat( e ) ) - } - var i, o, a, s, u, l = r.createElement( "div" ), - c = r.createElement( "div" ); - c.style && ( c.style.backgroundClip = "content-box", c.cloneNode( !0 ).style.backgroundClip = "", h.clearCloneStyle = "content-box" === c.style.backgroundClip, w.extend( h, { - boxSizingReliable: function () { - return t(), o - }, - pixelBoxStyles: function () { - return t(), s - }, - pixelPosition: function () { - return t(), i - }, - reliableMarginLeft: function () { - return t(), u - }, - scrollboxSize: function () { - return t(), a - } - } ) ) - }(); - - function Fe( e, t, n ) { - var r, i, o, a, s = e.style; - return ( n = n || $e( e ) ) && ( "" !== ( a = n.getPropertyValue( t ) || n[ t ] ) || w.contains( e.ownerDocument, e ) || ( a = w.style( e, t ) ), !h.pixelBoxStyles() && We.test( a ) && Be.test( t ) && ( r = s.width, i = s.minWidth, o = s.maxWidth, s.minWidth = s.maxWidth = s.width = a, a = n.width, s.width = r, s.minWidth = i, s.maxWidth = o ) ), void 0 !== a ? a + "" : a - } - - function _e( e, t ) { - return { - get: function () { - if ( !e() ) return ( this.get = t ).apply( this, arguments ); - delete this.get - } - } - } - var ze = /^(none|table(?!-c[ea]).+)/, - Xe = /^--/, - Ue = { - position: "absolute", - visibility: "hidden", - display: "block" - }, - Ve = { - letterSpacing: "0", - fontWeight: "400" - }, - Ge = [ "Webkit", "Moz", "ms" ], - Ye = r.createElement( "div" ).style; - - function Qe( e ) { - if ( e in Ye ) return e; - var t = e[ 0 ].toUpperCase() + e.slice( 1 ), - n = Ge.length; - while ( n-- ) - if ( ( e = Ge[ n ] + t ) in Ye ) return e - } - - function Je( e ) { - var t = w.cssProps[ e ]; - return t || ( t = w.cssProps[ e ] = Qe( e ) || e ), t - } - - function Ke( e, t, n ) { - var r = ie.exec( t ); - return r ? Math.max( 0, r[ 2 ] - ( n || 0 ) ) + ( r[ 3 ] || "px" ) : t - } - - function Ze( e, t, n, r, i, o ) { - var a = "width" === t ? 1 : 0, - s = 0, - u = 0; - if ( n === ( r ? "border" : "content" ) ) return 0; - for ( ; a < 4; a += 2 ) "margin" === n && ( u += w.css( e, n + oe[ a ], !0, i ) ), r ? ( "content" === n && ( u -= w.css( e, "padding" + oe[ a ], !0, i ) ), "margin" !== n && ( u -= w.css( e, "border" + oe[ a ] + "Width", !0, i ) ) ) : ( u += w.css( e, "padding" + oe[ a ], !0, i ), "padding" !== n ? u += w.css( e, "border" + oe[ a ] + "Width", !0, i ) : s += w.css( e, "border" + oe[ a ] + "Width", !0, i ) ); - return !r && o >= 0 && ( u += Math.max( 0, Math.ceil( e[ "offset" + t[ 0 ].toUpperCase() + t.slice( 1 ) ] - o - u - s - .5 ) ) ), u - } - - function et( e, t, n ) { - var r = $e( e ), - i = Fe( e, t, r ), - o = "border-box" === w.css( e, "boxSizing", !1, r ), - a = o; - if ( We.test( i ) ) { - if ( !n ) return i; - i = "auto" - } - return a = a && ( h.boxSizingReliable() || i === e.style[ t ] ), ( "auto" === i || !parseFloat( i ) && "inline" === w.css( e, "display", !1, r ) ) && ( i = e[ "offset" + t[ 0 ].toUpperCase() + t.slice( 1 ) ], a = !0 ), ( i = parseFloat( i ) || 0 ) + Ze( e, t, n || ( o ? "border" : "content" ), a, r, i ) + "px" - } - w.extend( { - cssHooks: { - opacity: { - get: function ( e, t ) { - if ( t ) { - var n = Fe( e, "opacity" ); - return "" === n ? "1" : n - } - } - } - }, - cssNumber: { - animationIterationCount: !0, - columnCount: !0, - fillOpacity: !0, - flexGrow: !0, - flexShrink: !0, - fontWeight: !0, - lineHeight: !0, - opacity: !0, - order: !0, - orphans: !0, - widows: !0, - zIndex: !0, - zoom: !0 - }, - cssProps: {}, - style: function ( e, t, n, r ) { - if ( e && 3 !== e.nodeType && 8 !== e.nodeType && e.style ) { - var i, o, a, s = G( t ), - u = Xe.test( t ), - l = e.style; - if ( u || ( t = Je( s ) ), a = w.cssHooks[ t ] || w.cssHooks[ s ], void 0 === n ) return a && "get" in a && void 0 !== ( i = a.get( e, !1, r ) ) ? i : l[ t ]; - "string" == ( o = typeof n ) && ( i = ie.exec( n ) ) && i[ 1 ] && ( n = ue( e, t, i ), o = "number" ), null != n && n === n && ( "number" === o && ( n += i && i[ 3 ] || ( w.cssNumber[ s ] ? "" : "px" ) ), h.clearCloneStyle || "" !== n || 0 !== t.indexOf( "background" ) || ( l[ t ] = "inherit" ), a && "set" in a && void 0 === ( n = a.set( e, n, r ) ) || ( u ? l.setProperty( t, n ) : l[ t ] = n ) ) - } - }, - css: function ( e, t, n, r ) { - var i, o, a, s = G( t ); - return Xe.test( t ) || ( t = Je( s ) ), ( a = w.cssHooks[ t ] || w.cssHooks[ s ] ) && "get" in a && ( i = a.get( e, !0, n ) ), void 0 === i && ( i = Fe( e, t, r ) ), "normal" === i && t in Ve && ( i = Ve[ t ] ), "" === n || n ? ( o = parseFloat( i ), !0 === n || isFinite( o ) ? o || 0 : i ) : i - } - } ), w.each( [ "height", "width" ], function ( e, t ) { - w.cssHooks[ t ] = { - get: function ( e, n, r ) { - if ( n ) return !ze.test( w.css( e, "display" ) ) || e.getClientRects().length && e.getBoundingClientRect().width ? et( e, t, r ) : se( e, Ue, function () { - return et( e, t, r ) - } ) - }, - set: function ( e, n, r ) { - var i, o = $e( e ), - a = "border-box" === w.css( e, "boxSizing", !1, o ), - s = r && Ze( e, t, r, a, o ); - return a && h.scrollboxSize() === o.position && ( s -= Math.ceil( e[ "offset" + t[ 0 ].toUpperCase() + t.slice( 1 ) ] - parseFloat( o[ t ] ) - Ze( e, t, "border", !1, o ) - .5 ) ), s && ( i = ie.exec( n ) ) && "px" !== ( i[ 3 ] || "px" ) && ( e.style[ t ] = n, n = w.css( e, t ) ), Ke( e, n, s ) - } - } - } ), w.cssHooks.marginLeft = _e( h.reliableMarginLeft, function ( e, t ) { - if ( t ) return ( parseFloat( Fe( e, "marginLeft" ) ) || e.getBoundingClientRect().left - se( e, { - marginLeft: 0 - }, function () { - return e.getBoundingClientRect().left - } ) ) + "px" - } ), w.each( { - margin: "", - padding: "", - border: "Width" - }, function ( e, t ) { - w.cssHooks[ e + t ] = { - expand: function ( n ) { - for ( var r = 0, i = {}, o = "string" == typeof n ? n.split( " " ) : [ n ]; r < 4; r++ ) i[ e + oe[ r ] + t ] = o[ r ] || o[ r - 2 ] || o[ 0 ]; - return i - } - }, "margin" !== e && ( w.cssHooks[ e + t ].set = Ke ) - } ), w.fn.extend( { - css: function ( e, t ) { - return z( this, function ( e, t, n ) { - var r, i, o = {}, - a = 0; - if ( Array.isArray( t ) ) { - for ( r = $e( e ), i = t.length; a < i; a++ ) o[ t[ a ] ] = w.css( e, t[ a ], !1, r ); - return o - } - return void 0 !== n ? w.style( e, t, n ) : w.css( e, t ) - }, e, t, arguments.length > 1 ) - } - } ); - - function tt( e, t, n, r, i ) { - return new tt.prototype.init( e, t, n, r, i ) - } - w.Tween = tt, tt.prototype = { - constructor: tt, - init: function ( e, t, n, r, i, o ) { - this.elem = e, this.prop = n, this.easing = i || w.easing._default, this.options = t, this.start = this.now = this.cur(), this.end = r, this.unit = o || ( w.cssNumber[ n ] ? "" : "px" ) - }, - cur: function () { - var e = tt.propHooks[ this.prop ]; - return e && e.get ? e.get( this ) : tt.propHooks._default.get( this ) - }, - run: function ( e ) { - var t, n = tt.propHooks[ this.prop ]; - return this.options.duration ? this.pos = t = w.easing[ this.easing ]( e, this.options.duration * e, 0, 1, this.options.duration ) : this.pos = t = e, this.now = ( this.end - this.start ) * t + this.start, this.options.step && this.options.step.call( this.elem, this.now, this ), n && n.set ? n.set( this ) : tt.propHooks._default.set( this ), this - } - }, tt.prototype.init.prototype = tt.prototype, tt.propHooks = { - _default: { - get: function ( e ) { - var t; - return 1 !== e.elem.nodeType || null != e.elem[ e.prop ] && null == e.elem.style[ e.prop ] ? e.elem[ e.prop ] : ( t = w.css( e.elem, e.prop, "" ) ) && "auto" !== t ? t : 0 - }, - set: function ( e ) { - w.fx.step[ e.prop ] ? w.fx.step[ e.prop ]( e ) : 1 !== e.elem.nodeType || null == e.elem.style[ w.cssProps[ e.prop ] ] && !w.cssHooks[ e.prop ] ? e.elem[ e.prop ] = e.now : w.style( e.elem, e.prop, e.now + e.unit ) - } - } - }, tt.propHooks.scrollTop = tt.propHooks.scrollLeft = { - set: function ( e ) { - e.elem.nodeType && e.elem.parentNode && ( e.elem[ e.prop ] = e.now ) - } - }, w.easing = { - linear: function ( e ) { - return e - }, - swing: function ( e ) { - return .5 - Math.cos( e * Math.PI ) / 2 - }, - _default: "swing" - }, w.fx = tt.prototype.init, w.fx.step = {}; - var nt, rt, it = /^(?:toggle|show|hide)$/, - ot = /queueHooks$/; - - function at() { - rt && ( !1 === r.hidden && e.requestAnimationFrame ? e.requestAnimationFrame( at ) : e.setTimeout( at, w.fx.interval ), w.fx.tick() ) - } - - function st() { - return e.setTimeout( function () { - nt = void 0 - } ), nt = Date.now() - } - - function ut( e, t ) { - var n, r = 0, - i = { - height: e - }; - for ( t = t ? 1 : 0; r < 4; r += 2 - t ) i[ "margin" + ( n = oe[ r ] ) ] = i[ "padding" + n ] = e; - return t && ( i.opacity = i.width = e ), i - } - - function lt( e, t, n ) { - for ( var r, i = ( pt.tweeners[ t ] || [] ).concat( pt.tweeners[ "*" ] ), o = 0, a = i.length; o < a; o++ ) - if ( r = i[ o ].call( n, t, e ) ) return r - } - - function ct( e, t, n ) { - var r, i, o, a, s, u, l, c, f = "width" in t || "height" in t, - p = this, - d = {}, - h = e.style, - g = e.nodeType && ae( e ), - y = J.get( e, "fxshow" ); - n.queue || ( null == ( a = w._queueHooks( e, "fx" ) ).unqueued && ( a.unqueued = 0, s = a.empty.fire, a.empty.fire = function () { - a.unqueued || s() - } ), a.unqueued++, p.always( function () { - p.always( function () { - a.unqueued--, w.queue( e, "fx" ).length || a.empty.fire() - } ) - } ) ); - for ( r in t ) - if ( i = t[ r ], it.test( i ) ) { - if ( delete t[ r ], o = o || "toggle" === i, i === ( g ? "hide" : "show" ) ) { - if ( "show" !== i || !y || void 0 === y[ r ] ) continue; - g = !0 - } - d[ r ] = y && y[ r ] || w.style( e, r ) - } if ( ( u = !w.isEmptyObject( t ) ) || !w.isEmptyObject( d ) ) { - f && 1 === e.nodeType && ( n.overflow = [ h.overflow, h.overflowX, h.overflowY ], null == ( l = y && y.display ) && ( l = J.get( e, "display" ) ), "none" === ( c = w.css( e, "display" ) ) && ( l ? c = l : ( fe( [ e ], !0 ), l = e.style.display || l, c = w.css( e, "display" ), fe( [ e ] ) ) ), ( "inline" === c || "inline-block" === c && null != l ) && "none" === w.css( e, "float" ) && ( u || ( p.done( function () { - h.display = l - } ), null == l && ( c = h.display, l = "none" === c ? "" : c ) ), h.display = "inline-block" ) ), n.overflow && ( h.overflow = "hidden", p.always( function () { - h.overflow = n.overflow[ 0 ], h.overflowX = n.overflow[ 1 ], h.overflowY = n.overflow[ 2 ] - } ) ), u = !1; - for ( r in d ) u || ( y ? "hidden" in y && ( g = y.hidden ) : y = J.access( e, "fxshow", { - display: l - } ), o && ( y.hidden = !g ), g && fe( [ e ], !0 ), p.done( function () { - g || fe( [ e ] ), J.remove( e, "fxshow" ); - for ( r in d ) w.style( e, r, d[ r ] ) - } ) ), u = lt( g ? y[ r ] : 0, r, p ), r in y || ( y[ r ] = u.start, g && ( u.end = u.start, u.start = 0 ) ) - } - } - - function ft( e, t ) { - var n, r, i, o, a; - for ( n in e ) - if ( r = G( n ), i = t[ r ], o = e[ n ], Array.isArray( o ) && ( i = o[ 1 ], o = e[ n ] = o[ 0 ] ), n !== r && ( e[ r ] = o, delete e[ n ] ), ( a = w.cssHooks[ r ] ) && "expand" in a ) { - o = a.expand( o ), delete e[ r ]; - for ( n in o ) n in e || ( e[ n ] = o[ n ], t[ n ] = i ) - } else t[ r ] = i - } - - function pt( e, t, n ) { - var r, i, o = 0, - a = pt.prefilters.length, - s = w.Deferred().always( function () { - delete u.elem - } ), - u = function () { - if ( i ) return !1; - for ( var t = nt || st(), n = Math.max( 0, l.startTime + l.duration - t ), r = 1 - ( n / l.duration || 0 ), o = 0, a = l.tweens.length; o < a; o++ ) l.tweens[ o ].run( r ); - return s.notifyWith( e, [ l, r, n ] ), r < 1 && a ? n : ( a || s.notifyWith( e, [ l, 1, 0 ] ), s.resolveWith( e, [ l ] ), !1 ) - }, - l = s.promise( { - elem: e, - props: w.extend( {}, t ), - opts: w.extend( !0, { - specialEasing: {}, - easing: w.easing._default - }, n ), - originalProperties: t, - originalOptions: n, - startTime: nt || st(), - duration: n.duration, - tweens: [], - createTween: function ( t, n ) { - var r = w.Tween( e, l.opts, t, n, l.opts.specialEasing[ t ] || l.opts.easing ); - return l.tweens.push( r ), r - }, - stop: function ( t ) { - var n = 0, - r = t ? l.tweens.length : 0; - if ( i ) return this; - for ( i = !0; n < r; n++ ) l.tweens[ n ].run( 1 ); - return t ? ( s.notifyWith( e, [ l, 1, 0 ] ), s.resolveWith( e, [ l, t ] ) ) : s.rejectWith( e, [ l, t ] ), this - } - } ), - c = l.props; - for ( ft( c, l.opts.specialEasing ); o < a; o++ ) - if ( r = pt.prefilters[ o ].call( l, e, c, l.opts ) ) return g( r.stop ) && ( w._queueHooks( l.elem, l.opts.queue ).stop = r.stop.bind( r ) ), r; - return w.map( c, lt, l ), g( l.opts.start ) && l.opts.start.call( e, l ), l.progress( l.opts.progress ).done( l.opts.done, l.opts.complete ).fail( l.opts.fail ).always( l.opts.always ), w.fx.timer( w.extend( u, { - elem: e, - anim: l, - queue: l.opts.queue - } ) ), l - } - w.Animation = w.extend( pt, { - tweeners: { - "*": [ function ( e, t ) { - var n = this.createTween( e, t ); - return ue( n.elem, e, ie.exec( t ), n ), n - } ] - }, - tweener: function ( e, t ) { - g( e ) ? ( t = e, e = [ "*" ] ) : e = e.match( M ); - for ( var n, r = 0, i = e.length; r < i; r++ ) n = e[ r ], pt.tweeners[ n ] = pt.tweeners[ n ] || [], pt.tweeners[ n ].unshift( t ) - }, - prefilters: [ ct ], - prefilter: function ( e, t ) { - t ? pt.prefilters.unshift( e ) : pt.prefilters.push( e ) - } - } ), w.speed = function ( e, t, n ) { - var r = e && "object" == typeof e ? w.extend( {}, e ) : { - complete: n || !n && t || g( e ) && e, - duration: e, - easing: n && t || t && !g( t ) && t - }; - return w.fx.off ? r.duration = 0 : "number" != typeof r.duration && ( r.duration in w.fx.speeds ? r.duration = w.fx.speeds[ r.duration ] : r.duration = w.fx.speeds._default ), null != r.queue && !0 !== r.queue || ( r.queue = "fx" ), r.old = r.complete, r.complete = function () { - g( r.old ) && r.old.call( this ), r.queue && w.dequeue( this, r.queue ) - }, r - }, w.fn.extend( { - fadeTo: function ( e, t, n, r ) { - return this.filter( ae ).css( "opacity", 0 ).show().end().animate( { - opacity: t - }, e, n, r ) - }, - animate: function ( e, t, n, r ) { - var i = w.isEmptyObject( e ), - o = w.speed( t, n, r ), - a = function () { - var t = pt( this, w.extend( {}, e ), o ); - ( i || J.get( this, "finish" ) ) && t.stop( !0 ) - }; - return a.finish = a, i || !1 === o.queue ? this.each( a ) : this.queue( o.queue, a ) - }, - stop: function ( e, t, n ) { - var r = function ( e ) { - var t = e.stop; - delete e.stop, t( n ) - }; - return "string" != typeof e && ( n = t, t = e, e = void 0 ), t && !1 !== e && this.queue( e || "fx", [] ), this.each( function () { - var t = !0, - i = null != e && e + "queueHooks", - o = w.timers, - a = J.get( this ); - if ( i ) a[ i ] && a[ i ].stop && r( a[ i ] ); - else - for ( i in a ) a[ i ] && a[ i ].stop && ot.test( i ) && r( a[ i ] ); - for ( i = o.length; i--; ) o[ i ].elem !== this || null != e && o[ i ].queue !== e || ( o[ i ].anim.stop( n ), t = !1, o.splice( i, 1 ) ); - !t && n || w.dequeue( this, e ) - } ) - }, - finish: function ( e ) { - return !1 !== e && ( e = e || "fx" ), this.each( function () { - var t, n = J.get( this ), - r = n[ e + "queue" ], - i = n[ e + "queueHooks" ], - o = w.timers, - a = r ? r.length : 0; - for ( n.finish = !0, w.queue( this, e, [] ), i && i.stop && i.stop.call( this, !0 ), t = o.length; t--; ) o[ t ].elem === this && o[ t ].queue === e && ( o[ t ].anim.stop( !0 ), o.splice( t, 1 ) ); - for ( t = 0; t < a; t++ ) r[ t ] && r[ t ].finish && r[ t ].finish.call( this ); - delete n.finish - } ) - } - } ), w.each( [ "toggle", "show", "hide" ], function ( e, t ) { - var n = w.fn[ t ]; - w.fn[ t ] = function ( e, r, i ) { - return null == e || "boolean" == typeof e ? n.apply( this, arguments ) : this.animate( ut( t, !0 ), e, r, i ) - } - } ), w.each( { - slideDown: ut( "show" ), - slideUp: ut( "hide" ), - slideToggle: ut( "toggle" ), - fadeIn: { - opacity: "show" - }, - fadeOut: { - opacity: "hide" - }, - fadeToggle: { - opacity: "toggle" - } - }, function ( e, t ) { - w.fn[ e ] = function ( e, n, r ) { - return this.animate( t, e, n, r ) - } - } ), w.timers = [], w.fx.tick = function () { - var e, t = 0, - n = w.timers; - for ( nt = Date.now(); t < n.length; t++ )( e = n[ t ] )() || n[ t ] !== e || n.splice( t--, 1 ); - n.length || w.fx.stop(), nt = void 0 - }, w.fx.timer = function ( e ) { - w.timers.push( e ), w.fx.start() - }, w.fx.interval = 13, w.fx.start = function () { - rt || ( rt = !0, at() ) - }, w.fx.stop = function () { - rt = null - }, w.fx.speeds = { - slow: 600, - fast: 200, - _default: 400 - }, w.fn.delay = function ( t, n ) { - return t = w.fx ? w.fx.speeds[ t ] || t : t, n = n || "fx", this.queue( n, function ( n, r ) { - var i = e.setTimeout( n, t ); - r.stop = function () { - e.clearTimeout( i ) - } - } ) - }, - function () { - var e = r.createElement( "input" ), - t = r.createElement( "select" ).appendChild( r.createElement( "option" ) ); - e.type = "checkbox", h.checkOn = "" !== e.value, h.optSelected = t.selected, ( e = r.createElement( "input" ) ).value = "t", e.type = "radio", h.radioValue = "t" === e.value - }(); - var dt, ht = w.expr.attrHandle; - w.fn.extend( { - attr: function ( e, t ) { - return z( this, w.attr, e, t, arguments.length > 1 ) - }, - removeAttr: function ( e ) { - return this.each( function () { - w.removeAttr( this, e ) - } ) - } - } ), w.extend( { - attr: function ( e, t, n ) { - var r, i, o = e.nodeType; - if ( 3 !== o && 8 !== o && 2 !== o ) return "undefined" == typeof e.getAttribute ? w.prop( e, t, n ) : ( 1 === o && w.isXMLDoc( e ) || ( i = w.attrHooks[ t.toLowerCase() ] || ( w.expr.match.bool.test( t ) ? dt : void 0 ) ), void 0 !== n ? null === n ? void w.removeAttr( e, t ) : i && "set" in i && void 0 !== ( r = i.set( e, n, t ) ) ? r : ( e.setAttribute( t, n + "" ), n ) : i && "get" in i && null !== ( r = i.get( e, t ) ) ? r : null == ( r = w.find.attr( e, t ) ) ? void 0 : r ) - }, - attrHooks: { - type: { - set: function ( e, t ) { - if ( !h.radioValue && "radio" === t && N( e, "input" ) ) { - var n = e.value; - return e.setAttribute( "type", t ), n && ( e.value = n ), t - } - } - } - }, - removeAttr: function ( e, t ) { - var n, r = 0, - i = t && t.match( M ); - if ( i && 1 === e.nodeType ) - while ( n = i[ r++ ] ) e.removeAttribute( n ) - } - } ), dt = { - set: function ( e, t, n ) { - return !1 === t ? w.removeAttr( e, n ) : e.setAttribute( n, n ), n - } - }, w.each( w.expr.match.bool.source.match( /\w+/g ), function ( e, t ) { - var n = ht[ t ] || w.find.attr; - ht[ t ] = function ( e, t, r ) { - var i, o, a = t.toLowerCase(); - return r || ( o = ht[ a ], ht[ a ] = i, i = null != n( e, t, r ) ? a : null, ht[ a ] = o ), i - } - } ); - var gt = /^(?:input|select|textarea|button)$/i, - yt = /^(?:a|area)$/i; - w.fn.extend( { - prop: function ( e, t ) { - return z( this, w.prop, e, t, arguments.length > 1 ) - }, - removeProp: function ( e ) { - return this.each( function () { - delete this[ w.propFix[ e ] || e ] - } ) - } - } ), w.extend( { - prop: function ( e, t, n ) { - var r, i, o = e.nodeType; - if ( 3 !== o && 8 !== o && 2 !== o ) return 1 === o && w.isXMLDoc( e ) || ( t = w.propFix[ t ] || t, i = w.propHooks[ t ] ), void 0 !== n ? i && "set" in i && void 0 !== ( r = i.set( e, n, t ) ) ? r : e[ t ] = n : i && "get" in i && null !== ( r = i.get( e, t ) ) ? r : e[ t ] - }, - propHooks: { - tabIndex: { - get: function ( e ) { - var t = w.find.attr( e, "tabindex" ); - return t ? parseInt( t, 10 ) : gt.test( e.nodeName ) || yt.test( e.nodeName ) && e.href ? 0 : -1 - } - } - }, - propFix: { - "for": "htmlFor", - "class": "className" - } - } ), h.optSelected || ( w.propHooks.selected = { - get: function ( e ) { - var t = e.parentNode; - return t && t.parentNode && t.parentNode.selectedIndex, null - }, - set: function ( e ) { - var t = e.parentNode; - t && ( t.selectedIndex, t.parentNode && t.parentNode.selectedIndex ) - } - } ), w.each( [ "tabIndex", "readOnly", "maxLength", "cellSpacing", "cellPadding", "rowSpan", "colSpan", "useMap", "frameBorder", "contentEditable" ], function () { - w.propFix[ this.toLowerCase() ] = this - } ); - - function vt( e ) { - return ( e.match( M ) || [] ).join( " " ) - } - - function mt( e ) { - return e.getAttribute && e.getAttribute( "class" ) || "" - } - - function xt( e ) { - return Array.isArray( e ) ? e : "string" == typeof e ? e.match( M ) || [] : [] - } - w.fn.extend( { - addClass: function ( e ) { - var t, n, r, i, o, a, s, u = 0; - if ( g( e ) ) return this.each( function ( t ) { - w( this ).addClass( e.call( this, t, mt( this ) ) ) - } ); - if ( ( t = xt( e ) ).length ) - while ( n = this[ u++ ] ) - if ( i = mt( n ), r = 1 === n.nodeType && " " + vt( i ) + " " ) { - a = 0; - while ( o = t[ a++ ] ) r.indexOf( " " + o + " " ) < 0 && ( r += o + " " ); - i !== ( s = vt( r ) ) && n.setAttribute( "class", s ) - } return this - }, - removeClass: function ( e ) { - var t, n, r, i, o, a, s, u = 0; - if ( g( e ) ) return this.each( function ( t ) { - w( this ).removeClass( e.call( this, t, mt( this ) ) ) - } ); - if ( !arguments.length ) return this.attr( "class", "" ); - if ( ( t = xt( e ) ).length ) - while ( n = this[ u++ ] ) - if ( i = mt( n ), r = 1 === n.nodeType && " " + vt( i ) + " " ) { - a = 0; - while ( o = t[ a++ ] ) - while ( r.indexOf( " " + o + " " ) > -1 ) r = r.replace( " " + o + " ", " " ); - i !== ( s = vt( r ) ) && n.setAttribute( "class", s ) - } return this - }, - toggleClass: function ( e, t ) { - var n = typeof e, - r = "string" === n || Array.isArray( e ); - return "boolean" == typeof t && r ? t ? this.addClass( e ) : this.removeClass( e ) : g( e ) ? this.each( function ( n ) { - w( this ).toggleClass( e.call( this, n, mt( this ), t ), t ) - } ) : this.each( function () { - var t, i, o, a; - if ( r ) { - i = 0, o = w( this ), a = xt( e ); - while ( t = a[ i++ ] ) o.hasClass( t ) ? o.removeClass( t ) : o.addClass( t ) - } else void 0 !== e && "boolean" !== n || ( ( t = mt( this ) ) && J.set( this, "__className__", t ), this.setAttribute && this.setAttribute( "class", t || !1 === e ? "" : J.get( this, "__className__" ) || "" ) ) - } ) - }, - hasClass: function ( e ) { - var t, n, r = 0; - t = " " + e + " "; - while ( n = this[ r++ ] ) - if ( 1 === n.nodeType && ( " " + vt( mt( n ) ) + " " ).indexOf( t ) > -1 ) return !0; - return !1 - } - } ); - var bt = /\r/g; - w.fn.extend( { - val: function ( e ) { - var t, n, r, i = this[ 0 ]; { - if ( arguments.length ) return r = g( e ), this.each( function ( n ) { - var i; - 1 === this.nodeType && ( null == ( i = r ? e.call( this, n, w( this ).val() ) : e ) ? i = "" : "number" == typeof i ? i += "" : Array.isArray( i ) && ( i = w.map( i, function ( e ) { - return null == e ? "" : e + "" - } ) ), ( t = w.valHooks[ this.type ] || w.valHooks[ this.nodeName.toLowerCase() ] ) && "set" in t && void 0 !== t.set( this, i, "value" ) || ( this.value = i ) ) - } ); - if ( i ) return ( t = w.valHooks[ i.type ] || w.valHooks[ i.nodeName.toLowerCase() ] ) && "get" in t && void 0 !== ( n = t.get( i, "value" ) ) ? n : "string" == typeof ( n = i.value ) ? n.replace( bt, "" ) : null == n ? "" : n - } - } - } ), w.extend( { - valHooks: { - option: { - get: function ( e ) { - var t = w.find.attr( e, "value" ); - return null != t ? t : vt( w.text( e ) ) - } - }, - select: { - get: function ( e ) { - var t, n, r, i = e.options, - o = e.selectedIndex, - a = "select-one" === e.type, - s = a ? null : [], - u = a ? o + 1 : i.length; - for ( r = o < 0 ? u : a ? o : 0; r < u; r++ ) - if ( ( ( n = i[ r ] ).selected || r === o ) && !n.disabled && ( !n.parentNode.disabled || !N( n.parentNode, "optgroup" ) ) ) { - if ( t = w( n ).val(), a ) return t; - s.push( t ) - } return s - }, - set: function ( e, t ) { - var n, r, i = e.options, - o = w.makeArray( t ), - a = i.length; - while ( a-- )( ( r = i[ a ] ).selected = w.inArray( w.valHooks.option.get( r ), o ) > -1 ) && ( n = !0 ); - return n || ( e.selectedIndex = -1 ), o - } - } - } - } ), w.each( [ "radio", "checkbox" ], function () { - w.valHooks[ this ] = { - set: function ( e, t ) { - if ( Array.isArray( t ) ) return e.checked = w.inArray( w( e ).val(), t ) > -1 - } - }, h.checkOn || ( w.valHooks[ this ].get = function ( e ) { - return null === e.getAttribute( "value" ) ? "on" : e.value - } ) - } ), h.focusin = "onfocusin" in e; - var wt = /^(?:focusinfocus|focusoutblur)$/, - Tt = function ( e ) { - e.stopPropagation() - }; - w.extend( w.event, { - trigger: function ( t, n, i, o ) { - var a, s, u, l, c, p, d, h, v = [ i || r ], - m = f.call( t, "type" ) ? t.type : t, - x = f.call( t, "namespace" ) ? t.namespace.split( "." ) : []; - if ( s = h = u = i = i || r, 3 !== i.nodeType && 8 !== i.nodeType && !wt.test( m + w.event.triggered ) && ( m.indexOf( "." ) > -1 && ( m = ( x = m.split( "." ) ).shift(), x.sort() ), c = m.indexOf( ":" ) < 0 && "on" + m, t = t[ w.expando ] ? t : new w.Event( m, "object" == typeof t && t ), t.isTrigger = o ? 2 : 3, t.namespace = x.join( "." ), t.rnamespace = t.namespace ? new RegExp( "(^|\\.)" + x.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : null, t.result = void 0, t.target || ( t.target = i ), n = null == n ? [ t ] : w.makeArray( n, [ t ] ), d = w.event.special[ m ] || {}, o || !d.trigger || !1 !== d.trigger.apply( i, n ) ) ) { - if ( !o && !d.noBubble && !y( i ) ) { - for ( l = d.delegateType || m, wt.test( l + m ) || ( s = s.parentNode ); s; s = s.parentNode ) v.push( s ), u = s; - u === ( i.ownerDocument || r ) && v.push( u.defaultView || u.parentWindow || e ) - } - a = 0; - while ( ( s = v[ a++ ] ) && !t.isPropagationStopped() ) h = s, t.type = a > 1 ? l : d.bindType || m, ( p = ( J.get( s, "events" ) || {} )[ t.type ] && J.get( s, "handle" ) ) && p.apply( s, n ), ( p = c && s[ c ] ) && p.apply && Y( s ) && ( t.result = p.apply( s, n ), !1 === t.result && t.preventDefault() ); - return t.type = m, o || t.isDefaultPrevented() || d._default && !1 !== d._default.apply( v.pop(), n ) || !Y( i ) || c && g( i[ m ] ) && !y( i ) && ( ( u = i[ c ] ) && ( i[ c ] = null ), w.event.triggered = m, t.isPropagationStopped() && h.addEventListener( m, Tt ), i[ m ](), t.isPropagationStopped() && h.removeEventListener( m, Tt ), w.event.triggered = void 0, u && ( i[ c ] = u ) ), t.result - } - }, - simulate: function ( e, t, n ) { - var r = w.extend( new w.Event, n, { - type: e, - isSimulated: !0 - } ); - w.event.trigger( r, null, t ) - } - } ), w.fn.extend( { - trigger: function ( e, t ) { - return this.each( function () { - w.event.trigger( e, t, this ) - } ) - }, - triggerHandler: function ( e, t ) { - var n = this[ 0 ]; - if ( n ) return w.event.trigger( e, t, n, !0 ) - } - } ), h.focusin || w.each( { - focus: "focusin", - blur: "focusout" - }, function ( e, t ) { - var n = function ( e ) { - w.event.simulate( t, e.target, w.event.fix( e ) ) - }; - w.event.special[ t ] = { - setup: function () { - var r = this.ownerDocument || this, - i = J.access( r, t ); - i || r.addEventListener( e, n, !0 ), J.access( r, t, ( i || 0 ) + 1 ) - }, - teardown: function () { - var r = this.ownerDocument || this, - i = J.access( r, t ) - 1; - i ? J.access( r, t, i ) : ( r.removeEventListener( e, n, !0 ), J.remove( r, t ) ) - } - } - } ); - var Ct = e.location, - Et = Date.now(), - kt = /\?/; - w.parseXML = function ( t ) { - var n; - if ( !t || "string" != typeof t ) return null; - try { - n = ( new e.DOMParser ).parseFromString( t, "text/xml" ) - } catch ( e ) { - n = void 0 - } - return n && !n.getElementsByTagName( "parsererror" ).length || w.error( "Invalid XML: " + t ), n - }; - var St = /\[\]$/, - Dt = /\r?\n/g, - Nt = /^(?:submit|button|image|reset|file)$/i, - At = /^(?:input|select|textarea|keygen)/i; - - function jt( e, t, n, r ) { - var i; - if ( Array.isArray( t ) ) w.each( t, function ( t, i ) { - n || St.test( e ) ? r( e, i ) : jt( e + "[" + ( "object" == typeof i && null != i ? t : "" ) + "]", i, n, r ) - } ); - else if ( n || "object" !== x( t ) ) r( e, t ); - else - for ( i in t ) jt( e + "[" + i + "]", t[ i ], n, r ) - } - w.param = function ( e, t ) { - var n, r = [], - i = function ( e, t ) { - var n = g( t ) ? t() : t; - r[ r.length ] = encodeURIComponent( e ) + "=" + encodeURIComponent( null == n ? "" : n ) - }; - if ( Array.isArray( e ) || e.jquery && !w.isPlainObject( e ) ) w.each( e, function () { - i( this.name, this.value ) - } ); - else - for ( n in e ) jt( n, e[ n ], t, i ); - return r.join( "&" ) - }, w.fn.extend( { - serialize: function () { - return w.param( this.serializeArray() ) - }, - serializeArray: function () { - return this.map( function () { - var e = w.prop( this, "elements" ); - return e ? w.makeArray( e ) : this - } ).filter( function () { - var e = this.type; - return this.name && !w( this ).is( ":disabled" ) && At.test( this.nodeName ) && !Nt.test( e ) && ( this.checked || !pe.test( e ) ) - } ).map( function ( e, t ) { - var n = w( this ).val(); - return null == n ? null : Array.isArray( n ) ? w.map( n, function ( e ) { - return { - name: t.name, - value: e.replace( Dt, "\r\n" ) - } - } ) : { - name: t.name, - value: n.replace( Dt, "\r\n" ) - } - } ).get() - } - } ); - var qt = /%20/g, - Lt = /#.*$/, - Ht = /([?&])_=[^&]*/, - Ot = /^(.*?):[ \t]*([^\r\n]*)$/gm, - Pt = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, - Mt = /^(?:GET|HEAD)$/, - Rt = /^\/\//, - It = {}, - Wt = {}, - $t = "*/".concat( "*" ), - Bt = r.createElement( "a" ); - Bt.href = Ct.href; - - function Ft( e ) { - return function ( t, n ) { - "string" != typeof t && ( n = t, t = "*" ); - var r, i = 0, - o = t.toLowerCase().match( M ) || []; - if ( g( n ) ) - while ( r = o[ i++ ] ) "+" === r[ 0 ] ? ( r = r.slice( 1 ) || "*", ( e[ r ] = e[ r ] || [] ).unshift( n ) ) : ( e[ r ] = e[ r ] || [] ).push( n ) - } - } - - function _t( e, t, n, r ) { - var i = {}, - o = e === Wt; - - function a( s ) { - var u; - return i[ s ] = !0, w.each( e[ s ] || [], function ( e, s ) { - var l = s( t, n, r ); - return "string" != typeof l || o || i[ l ] ? o ? !( u = l ) : void 0 : ( t.dataTypes.unshift( l ), a( l ), !1 ) - } ), u - } - return a( t.dataTypes[ 0 ] ) || !i[ "*" ] && a( "*" ) - } - - function zt( e, t ) { - var n, r, i = w.ajaxSettings.flatOptions || {}; - for ( n in t ) void 0 !== t[ n ] && ( ( i[ n ] ? e : r || ( r = {} ) )[ n ] = t[ n ] ); - return r && w.extend( !0, e, r ), e - } - - function Xt( e, t, n ) { - var r, i, o, a, s = e.contents, - u = e.dataTypes; - while ( "*" === u[ 0 ] ) u.shift(), void 0 === r && ( r = e.mimeType || t.getResponseHeader( "Content-Type" ) ); - if ( r ) - for ( i in s ) - if ( s[ i ] && s[ i ].test( r ) ) { - u.unshift( i ); - break - } if ( u[ 0 ] in n ) o = u[ 0 ]; - else { - for ( i in n ) { - if ( !u[ 0 ] || e.converters[ i + " " + u[ 0 ] ] ) { - o = i; - break - } - a || ( a = i ) - } - o = o || a - } - if ( o ) return o !== u[ 0 ] && u.unshift( o ), n[ o ] - } - - function Ut( e, t, n, r ) { - var i, o, a, s, u, l = {}, - c = e.dataTypes.slice(); - if ( c[ 1 ] ) - for ( a in e.converters ) l[ a.toLowerCase() ] = e.converters[ a ]; - o = c.shift(); - while ( o ) - if ( e.responseFields[ o ] && ( n[ e.responseFields[ o ] ] = t ), !u && r && e.dataFilter && ( t = e.dataFilter( t, e.dataType ) ), u = o, o = c.shift() ) - if ( "*" === o ) o = u; - else if ( "*" !== u && u !== o ) { - if ( !( a = l[ u + " " + o ] || l[ "* " + o ] ) ) - for ( i in l ) - if ( ( s = i.split( " " ) )[ 1 ] === o && ( a = l[ u + " " + s[ 0 ] ] || l[ "* " + s[ 0 ] ] ) ) { - !0 === a ? a = l[ i ] : !0 !== l[ i ] && ( o = s[ 0 ], c.unshift( s[ 1 ] ) ); - break - } if ( !0 !== a ) - if ( a && e[ "throws" ] ) t = a( t ); - else try { - t = a( t ) - } catch ( e ) { - return { - state: "parsererror", - error: a ? e : "No conversion from " + u + " to " + o - } - } - } - return { - state: "success", - data: t - } - } - w.extend( { - active: 0, - lastModified: {}, - etag: {}, - ajaxSettings: { - url: Ct.href, - type: "GET", - isLocal: Pt.test( Ct.protocol ), - global: !0, - processData: !0, - async: !0, - contentType: "application/x-www-form-urlencoded; charset=UTF-8", - accepts: { - "*": $t, - text: "text/plain", - html: "text/html", - xml: "application/xml, text/xml", - json: "application/json, text/javascript" - }, - contents: { - xml: /\bxml\b/, - html: /\bhtml/, - json: /\bjson\b/ - }, - responseFields: { - xml: "responseXML", - text: "responseText", - json: "responseJSON" - }, - converters: { - "* text": String, - "text html": !0, - "text json": JSON.parse, - "text xml": w.parseXML - }, - flatOptions: { - url: !0, - context: !0 - } - }, - ajaxSetup: function ( e, t ) { - return t ? zt( zt( e, w.ajaxSettings ), t ) : zt( w.ajaxSettings, e ) - }, - ajaxPrefilter: Ft( It ), - ajaxTransport: Ft( Wt ), - ajax: function ( t, n ) { - "object" == typeof t && ( n = t, t = void 0 ), n = n || {}; - var i, o, a, s, u, l, c, f, p, d, h = w.ajaxSetup( {}, n ), - g = h.context || h, - y = h.context && ( g.nodeType || g.jquery ) ? w( g ) : w.event, - v = w.Deferred(), - m = w.Callbacks( "once memory" ), - x = h.statusCode || {}, - b = {}, - T = {}, - C = "canceled", - E = { - readyState: 0, - getResponseHeader: function ( e ) { - var t; - if ( c ) { - if ( !s ) { - s = {}; - while ( t = Ot.exec( a ) ) s[ t[ 1 ].toLowerCase() ] = t[ 2 ] - } - t = s[ e.toLowerCase() ] - } - return null == t ? null : t - }, - getAllResponseHeaders: function () { - return c ? a : null - }, - setRequestHeader: function ( e, t ) { - return null == c && ( e = T[ e.toLowerCase() ] = T[ e.toLowerCase() ] || e, b[ e ] = t ), this - }, - overrideMimeType: function ( e ) { - return null == c && ( h.mimeType = e ), this - }, - statusCode: function ( e ) { - var t; - if ( e ) - if ( c ) E.always( e[ E.status ] ); - else - for ( t in e ) x[ t ] = [ x[ t ], e[ t ] ]; - return this - }, - abort: function ( e ) { - var t = e || C; - return i && i.abort( t ), k( 0, t ), this - } - }; - if ( v.promise( E ), h.url = ( ( t || h.url || Ct.href ) + "" ).replace( Rt, Ct.protocol + "//" ), h.type = n.method || n.type || h.method || h.type, h.dataTypes = ( h.dataType || "*" ).toLowerCase().match( M ) || [ "" ], null == h.crossDomain ) { - l = r.createElement( "a" ); - try { - l.href = h.url, l.href = l.href, h.crossDomain = Bt.protocol + "//" + Bt.host != l.protocol + "//" + l.host - } catch ( e ) { - h.crossDomain = !0 - } - } - if ( h.data && h.processData && "string" != typeof h.data && ( h.data = w.param( h.data, h.traditional ) ), _t( It, h, n, E ), c ) return E; - ( f = w.event && h.global ) && 0 == w.active++ && w.event.trigger( "ajaxStart" ), h.type = h.type.toUpperCase(), h.hasContent = !Mt.test( h.type ), o = h.url.replace( Lt, "" ), h.hasContent ? h.data && h.processData && 0 === ( h.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) && ( h.data = h.data.replace( qt, "+" ) ) : ( d = h.url.slice( o.length ), h.data && ( h.processData || "string" == typeof h.data ) && ( o += ( kt.test( o ) ? "&" : "?" ) + h.data, delete h.data ), !1 === h.cache && ( o = o.replace( Ht, "$1" ), d = ( kt.test( o ) ? "&" : "?" ) + "_=" + Et++ + d ), h.url = o + d ), h.ifModified && ( w.lastModified[ o ] && E.setRequestHeader( "If-Modified-Since", w.lastModified[ o ] ), w.etag[ o ] && E.setRequestHeader( "If-None-Match", w.etag[ o ] ) ), ( h.data && h.hasContent && !1 !== h.contentType || n.contentType ) && E.setRequestHeader( "Content-Type", h.contentType ), E.setRequestHeader( "Accept", h.dataTypes[ 0 ] && h.accepts[ h.dataTypes[ 0 ] ] ? h.accepts[ h.dataTypes[ 0 ] ] + ( "*" !== h.dataTypes[ 0 ] ? ", " + $t + "; q=0.01" : "" ) : h.accepts[ "*" ] ); - for ( p in h.headers ) E.setRequestHeader( p, h.headers[ p ] ); - if ( h.beforeSend && ( !1 === h.beforeSend.call( g, E, h ) || c ) ) return E.abort(); - if ( C = "abort", m.add( h.complete ), E.done( h.success ), E.fail( h.error ), i = _t( Wt, h, n, E ) ) { - if ( E.readyState = 1, f && y.trigger( "ajaxSend", [ E, h ] ), c ) return E; - h.async && h.timeout > 0 && ( u = e.setTimeout( function () { - E.abort( "timeout" ) - }, h.timeout ) ); - try { - c = !1, i.send( b, k ) - } catch ( e ) { - if ( c ) throw e; - k( -1, e ) - } - } else k( -1, "No Transport" ); - - function k( t, n, r, s ) { - var l, p, d, b, T, C = n; - c || ( c = !0, u && e.clearTimeout( u ), i = void 0, a = s || "", E.readyState = t > 0 ? 4 : 0, l = t >= 200 && t < 300 || 304 === t, r && ( b = Xt( h, E, r ) ), b = Ut( h, b, E, l ), l ? ( h.ifModified && ( ( T = E.getResponseHeader( "Last-Modified" ) ) && ( w.lastModified[ o ] = T ), ( T = E.getResponseHeader( "etag" ) ) && ( w.etag[ o ] = T ) ), 204 === t || "HEAD" === h.type ? C = "nocontent" : 304 === t ? C = "notmodified" : ( C = b.state, p = b.data, l = !( d = b.error ) ) ) : ( d = C, !t && C || ( C = "error", t < 0 && ( t = 0 ) ) ), E.status = t, E.statusText = ( n || C ) + "", l ? v.resolveWith( g, [ p, C, E ] ) : v.rejectWith( g, [ E, C, d ] ), E.statusCode( x ), x = void 0, f && y.trigger( l ? "ajaxSuccess" : "ajaxError", [ E, h, l ? p : d ] ), m.fireWith( g, [ E, C ] ), f && ( y.trigger( "ajaxComplete", [ E, h ] ), --w.active || w.event.trigger( "ajaxStop" ) ) ) - } - return E - }, - getJSON: function ( e, t, n ) { - return w.get( e, t, n, "json" ) - }, - getScript: function ( e, t ) { - return w.get( e, void 0, t, "script" ) - } - } ), w.each( [ "get", "post" ], function ( e, t ) { - w[ t ] = function ( e, n, r, i ) { - return g( n ) && ( i = i || r, r = n, n = void 0 ), w.ajax( w.extend( { - url: e, - type: t, - dataType: i, - data: n, - success: r - }, w.isPlainObject( e ) && e ) ) - } - } ), w._evalUrl = function ( e ) { - return w.ajax( { - url: e, - type: "GET", - dataType: "script", - cache: !0, - async: !1, - global: !1, - "throws": !0 - } ) - }, w.fn.extend( { - wrapAll: function ( e ) { - var t; - return this[ 0 ] && ( g( e ) && ( e = e.call( this[ 0 ] ) ), t = w( e, this[ 0 ].ownerDocument ).eq( 0 ).clone( !0 ), this[ 0 ].parentNode && t.insertBefore( this[ 0 ] ), t.map( function () { - var e = this; - while ( e.firstElementChild ) e = e.firstElementChild; - return e - } ).append( this ) ), this - }, - wrapInner: function ( e ) { - return g( e ) ? this.each( function ( t ) { - w( this ).wrapInner( e.call( this, t ) ) - } ) : this.each( function () { - var t = w( this ), - n = t.contents(); - n.length ? n.wrapAll( e ) : t.append( e ) - } ) - }, - wrap: function ( e ) { - var t = g( e ); - return this.each( function ( n ) { - w( this ).wrapAll( t ? e.call( this, n ) : e ) - } ) - }, - unwrap: function ( e ) { - return this.parent( e ).not( "body" ).each( function () { - w( this ).replaceWith( this.childNodes ) - } ), this - } - } ), w.expr.pseudos.hidden = function ( e ) { - return !w.expr.pseudos.visible( e ) - }, w.expr.pseudos.visible = function ( e ) { - return !!( e.offsetWidth || e.offsetHeight || e.getClientRects().length ) - }, w.ajaxSettings.xhr = function () { - try { - return new e.XMLHttpRequest - } catch ( e ) {} - }; - var Vt = { - 0: 200, - 1223: 204 - }, - Gt = w.ajaxSettings.xhr(); - h.cors = !!Gt && "withCredentials" in Gt, h.ajax = Gt = !!Gt, w.ajaxTransport( function ( t ) { - var n, r; - if ( h.cors || Gt && !t.crossDomain ) return { - send: function ( i, o ) { - var a, s = t.xhr(); - if ( s.open( t.type, t.url, t.async, t.username, t.password ), t.xhrFields ) - for ( a in t.xhrFields ) s[ a ] = t.xhrFields[ a ]; - t.mimeType && s.overrideMimeType && s.overrideMimeType( t.mimeType ), t.crossDomain || i[ "X-Requested-With" ] || ( i[ "X-Requested-With" ] = "XMLHttpRequest" ); - for ( a in i ) s.setRequestHeader( a, i[ a ] ); - n = function ( e ) { - return function () { - n && ( n = r = s.onload = s.onerror = s.onabort = s.ontimeout = s.onreadystatechange = null, "abort" === e ? s.abort() : "error" === e ? "number" != typeof s.status ? o( 0, "error" ) : o( s.status, s.statusText ) : o( Vt[ s.status ] || s.status, s.statusText, "text" !== ( s.responseType || "text" ) || "string" != typeof s.responseText ? { - binary: s.response - } : { - text: s.responseText - }, s.getAllResponseHeaders() ) ) - } - }, s.onload = n(), r = s.onerror = s.ontimeout = n( "error" ), void 0 !== s.onabort ? s.onabort = r : s.onreadystatechange = function () { - 4 === s.readyState && e.setTimeout( function () { - n && r() - } ) - }, n = n( "abort" ); - try { - s.send( t.hasContent && t.data || null ) - } catch ( e ) { - if ( n ) throw e - } - }, - abort: function () { - n && n() - } - } - } ), w.ajaxPrefilter( function ( e ) { - e.crossDomain && ( e.contents.script = !1 ) - } ), w.ajaxSetup( { - accepts: { - script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript" - }, - contents: { - script: /\b(?:java|ecma)script\b/ - }, - converters: { - "text script": function ( e ) { - return w.globalEval( e ), e - } - } - } ), w.ajaxPrefilter( "script", function ( e ) { - void 0 === e.cache && ( e.cache = !1 ), e.crossDomain && ( e.type = "GET" ) - } ), w.ajaxTransport( "script", function ( e ) { - if ( e.crossDomain ) { - var t, n; - return { - send: function ( i, o ) { - t = w( " - - - - - - - - - diff --git a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/main-style.css b/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/main-style.css deleted file mode 100644 index 9af5451..0000000 --- a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/main-style.css +++ /dev/null @@ -1,53 +0,0 @@ -@media (prefers-color-scheme: dark) { - img { - opacity: .75; - transition: opacity .5s ease-in-out; - } - img:hover { - opacity: 1; - } -} -html { - --text-color-normal: #0a244d; - --text-color-light: #8cabd9; -} - -html[data-theme='dark'] { - --text-color-normal: hsl(210, 10%, 62%); - --text-color-light: hsl(210, 15%, 35%); - --text-color-richer: hsl(210, 50%, 72%); - --text-color-highlight: hsl(25, 70%, 45%); -} -body { - background-color: black; - color: white; -} -@media screen and (prefers-color-scheme: light) { - body { - background-color: white; - color: black; - } -} -:root { - --body-bg: #fafafa; - --body-color: #555; - --link-color: #222; - --link-color-hover: #000; -} -@media (prefers-color-scheme: dark) { - :root { - --body-bg: #212529; - --body-color: #6c757d; - --link-color: #dee2e6; - --link-color-hover: #fff; - } -} -@media (prefers-color-scheme: dark) { - img { - opacity: .75; - transition: opacity .5s ease-in-out; - } - img:hover { - opacity: 1; - } -} diff --git a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/prefix-suffix-lines.html b/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/prefix-suffix-lines.html deleted file mode 100644 index 0431322..0000000 --- a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/prefix-suffix-lines.html +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - - - - - - Add Prefix/Suffix to Text Lines - - - - - - - - - - - -
- - - - - - -
- - - - -
-

Add Prefix/Suffix to Each Line

-

First, paste your text in the input box below. Select if you want to add a - prefix (in the beginning of each line) or a suffix (at the end of each line).

-

Write the text you want to add. Finally, click the "Add Prefix/Suffix" - button. -

- -
- -
-
-
- -
- - - - - -
- - - -
-
-
-
-
- -
- - - - - - - - - - - - - - - - - - - diff --git a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/replace-line-breaks.html b/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/replace-line-breaks.html deleted file mode 100644 index e5752e9..0000000 --- a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/replace-line-breaks.html +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - - - - - Replace Line Breaks - - - - - - - - - - - -
- - - - - - -
- - - - -
-

Replace Line Breaks

-

First, paste your text in the input box below. Write in the box what do you want the - line breaks to be replaced with.

-

Finally, click the "Replace Line Breaks" button. -

- -
- -
-
-
- -
- - - -
- - - -
-
-
-
-
- -
- - - - - - - - - - - - - - - - - - - diff --git a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/right.html b/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/right.html deleted file mode 100644 index 5559173..0000000 --- a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/right.html +++ /dev/null @@ -1,552 +0,0 @@ - - - - - -TexTools-master - - - Stable - - - - - - - - - - - - -
Folders
<Go Back> backup-s...build css js sandbox
-
- - - - - -
FileFileFileFileFileFileFileFile
main-style.css duplicat....html index.html prefix-s....html right.html sort-tex....html whitespa....html README.md 
compare-....html find-rep....html letter-c....html replace-....html 
- -

-Folders: 5
-Files: 12
-Size of all files: 76239 KB

- - - \ No newline at end of file diff --git a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/sandbox/bootstrap-jquery-simple-sidebar.html b/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/sandbox/bootstrap-jquery-simple-sidebar.html deleted file mode 100644 index 453ed64..0000000 --- a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/sandbox/bootstrap-jquery-simple-sidebar.html +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - - Simple Sidebar - Start Bootstrap Template - - - - - - - - - - - - -
- - - - - - -
- - - -
-

Simple Sidebar

-

The starting state of the menu will appear collapsed on smaller screens, and will appear non-collapsed on - larger screens. When toggled using the button below, the menu will change.

-

Make sure to keep all page content within the #page-content-wrapper. The top navbar is - optional, and just for demonstration. Just create an element with the #menu-toggle ID which - will toggle the menu when clicked.

-
-
- - -
- - - - - - - - - - - - diff --git a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/sandbox/right.html b/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/sandbox/right.html deleted file mode 100644 index 1a32a82..0000000 --- a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/sandbox/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -sandbox - - - Stable - - - - - - - - - - - - -
Folders
<Go Back>
-
- - - - -
FileFileFileFileFileFileFileFile
bootstra....html right.html 
- -

-Folders: 1
-Files: 2
-Size of all files: 19525 KB

- - - \ No newline at end of file diff --git a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/sort-text-lines.html b/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/sort-text-lines.html deleted file mode 100644 index 0357203..0000000 --- a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/sort-text-lines.html +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - - - - - Sort Text Lines - - - - - - - - - - - -
- - - - - -
- - - - -
-

Sort Text Lines

-

First, paste your text in the input box below. You can choose how you want the - text to be sorted. Finally, click on the "Sort" - button.

-

Please note: At the moment the data is only sorted in - alphabetical - order. So you might have trouble sorted multiple numbers.

- -
- -
-
- - - - - - - -
-
-
-
-
- -
- - - - - - - - - - - - - - - - - - - diff --git a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/whitespace-remover.html b/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/whitespace-remover.html deleted file mode 100644 index 120e0f2..0000000 --- a/_Resources/node_modules/web-dev-utils/TexTools/TexTools-master/whitespace-remover.html +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - - Whitespace Remover - - - - - - - - - - - -
- - - - - - -
- - - - -
-

Whitespace Remover

-

Removes all the whitespace in your text, including space.

-

First, paste your text in the input box below. Then, click on the Remove - whitespace button.

- - -
- -
-
- - - -
-
-
-
-
- -
- - - - - - - - - - - - - - - - - - - diff --git a/_Resources/node_modules/web-dev-utils/TexTools/right.html b/_Resources/node_modules/web-dev-utils/TexTools/right.html deleted file mode 100644 index c93f525..0000000 --- a/_Resources/node_modules/web-dev-utils/TexTools/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -TexTools - - - Stable - - - - - - - - - - - - -
Folders
<Go Back> TexTools-master
-
- - - - -
FileFileFileFileFileFileFileFile
right.html 
- -

-Folders: 2
-Files: 1
-Size of all files: 13747 KB

- - - \ No newline at end of file diff --git a/_Resources/node_modules/web-dev-utils/bootstrap-4.3.1-dist/css/bootstrap-grid.css b/_Resources/node_modules/web-dev-utils/bootstrap-4.3.1-dist/css/bootstrap-grid.css deleted file mode 100644 index 68b84f8..0000000 --- a/_Resources/node_modules/web-dev-utils/bootstrap-4.3.1-dist/css/bootstrap-grid.css +++ /dev/null @@ -1,3719 +0,0 @@ -/*! - * Bootstrap Grid v4.3.1 (https://getbootstrap.com/) - * Copyright 2011-2019 The Bootstrap Authors - * Copyright 2011-2019 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ -html { - box-sizing: border-box; - -ms-overflow-style: scrollbar; -} - -*, -*::before, -*::after { - box-sizing: inherit; -} - -.container { - width: 100%; - padding-right: 15px; - padding-left: 15px; - margin-right: auto; - margin-left: auto; -} - -@media (min-width: 576px) { - .container { - max-width: 540px; - } -} - -@media (min-width: 768px) { - .container { - max-width: 720px; - } -} - -@media (min-width: 992px) { - .container { - max-width: 960px; - } -} - -@media (min-width: 1200px) { - .container { - max-width: 1140px; - } -} - -.container-fluid { - width: 100%; - padding-right: 15px; - padding-left: 15px; - margin-right: auto; - margin-left: auto; -} - -.row { - display: -ms-flexbox; - display: flex; - -ms-flex-wrap: wrap; - flex-wrap: wrap; - margin-right: -15px; - margin-left: -15px; -} - -.no-gutters { - margin-right: 0; - margin-left: 0; -} - -.no-gutters > .col, -.no-gutters > [class*="col-"] { - padding-right: 0; - padding-left: 0; -} - -.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col, -.col-auto, .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, .col-sm, -.col-sm-auto, .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, .col-md, -.col-md-auto, .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, .col-lg, -.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl, -.col-xl-auto { - position: relative; - width: 100%; - padding-right: 15px; - padding-left: 15px; -} - -.col { - -ms-flex-preferred-size: 0; - flex-basis: 0; - -ms-flex-positive: 1; - flex-grow: 1; - max-width: 100%; -} - -.col-auto { - -ms-flex: 0 0 auto; - flex: 0 0 auto; - width: auto; - max-width: 100%; -} - -.col-1 { - -ms-flex: 0 0 8.333333%; - flex: 0 0 8.333333%; - max-width: 8.333333%; -} - -.col-2 { - -ms-flex: 0 0 16.666667%; - flex: 0 0 16.666667%; - max-width: 16.666667%; -} - -.col-3 { - -ms-flex: 0 0 25%; - flex: 0 0 25%; - max-width: 25%; -} - -.col-4 { - -ms-flex: 0 0 33.333333%; - flex: 0 0 33.333333%; - max-width: 33.333333%; -} - -.col-5 { - -ms-flex: 0 0 41.666667%; - flex: 0 0 41.666667%; - max-width: 41.666667%; -} - -.col-6 { - -ms-flex: 0 0 50%; - flex: 0 0 50%; - max-width: 50%; -} - -.col-7 { - -ms-flex: 0 0 58.333333%; - flex: 0 0 58.333333%; - max-width: 58.333333%; -} - -.col-8 { - -ms-flex: 0 0 66.666667%; - flex: 0 0 66.666667%; - max-width: 66.666667%; -} - -.col-9 { - -ms-flex: 0 0 75%; - flex: 0 0 75%; - max-width: 75%; -} - -.col-10 { - -ms-flex: 0 0 83.333333%; - flex: 0 0 83.333333%; - max-width: 83.333333%; -} - -.col-11 { - -ms-flex: 0 0 91.666667%; - flex: 0 0 91.666667%; - max-width: 91.666667%; -} - -.col-12 { - -ms-flex: 0 0 100%; - flex: 0 0 100%; - max-width: 100%; -} - -.order-first { - -ms-flex-order: -1; - order: -1; -} - -.order-last { - -ms-flex-order: 13; - order: 13; -} - -.order-0 { - -ms-flex-order: 0; - order: 0; -} - -.order-1 { - -ms-flex-order: 1; - order: 1; -} - -.order-2 { - -ms-flex-order: 2; - order: 2; -} - -.order-3 { - -ms-flex-order: 3; - order: 3; -} - -.order-4 { - -ms-flex-order: 4; - order: 4; -} - -.order-5 { - -ms-flex-order: 5; - order: 5; -} - -.order-6 { - -ms-flex-order: 6; - order: 6; -} - -.order-7 { - -ms-flex-order: 7; - order: 7; -} - -.order-8 { - -ms-flex-order: 8; - order: 8; -} - -.order-9 { - -ms-flex-order: 9; - order: 9; -} - -.order-10 { - -ms-flex-order: 10; - order: 10; -} - -.order-11 { - -ms-flex-order: 11; - order: 11; -} - -.order-12 { - -ms-flex-order: 12; - order: 12; -} - -.offset-1 { - margin-left: 8.333333%; -} - -.offset-2 { - margin-left: 16.666667%; -} - -.offset-3 { - margin-left: 25%; -} - -.offset-4 { - margin-left: 33.333333%; -} - -.offset-5 { - margin-left: 41.666667%; -} - -.offset-6 { - margin-left: 50%; -} - -.offset-7 { - margin-left: 58.333333%; -} - -.offset-8 { - margin-left: 66.666667%; -} - -.offset-9 { - margin-left: 75%; -} - -.offset-10 { - margin-left: 83.333333%; -} - -.offset-11 { - margin-left: 91.666667%; -} - -@media (min-width: 576px) { - .col-sm { - -ms-flex-preferred-size: 0; - flex-basis: 0; - -ms-flex-positive: 1; - flex-grow: 1; - max-width: 100%; - } - .col-sm-auto { - -ms-flex: 0 0 auto; - flex: 0 0 auto; - width: auto; - max-width: 100%; - } - .col-sm-1 { - -ms-flex: 0 0 8.333333%; - flex: 0 0 8.333333%; - max-width: 8.333333%; - } - .col-sm-2 { - -ms-flex: 0 0 16.666667%; - flex: 0 0 16.666667%; - max-width: 16.666667%; - } - .col-sm-3 { - -ms-flex: 0 0 25%; - flex: 0 0 25%; - max-width: 25%; - } - .col-sm-4 { - -ms-flex: 0 0 33.333333%; - flex: 0 0 33.333333%; - max-width: 33.333333%; - } - .col-sm-5 { - -ms-flex: 0 0 41.666667%; - flex: 0 0 41.666667%; - max-width: 41.666667%; - } - .col-sm-6 { - -ms-flex: 0 0 50%; - flex: 0 0 50%; - max-width: 50%; - } - .col-sm-7 { - -ms-flex: 0 0 58.333333%; - flex: 0 0 58.333333%; - max-width: 58.333333%; - } - .col-sm-8 { - -ms-flex: 0 0 66.666667%; - flex: 0 0 66.666667%; - max-width: 66.666667%; - } - .col-sm-9 { - -ms-flex: 0 0 75%; - flex: 0 0 75%; - max-width: 75%; - } - .col-sm-10 { - -ms-flex: 0 0 83.333333%; - flex: 0 0 83.333333%; - max-width: 83.333333%; - } - .col-sm-11 { - -ms-flex: 0 0 91.666667%; - flex: 0 0 91.666667%; - max-width: 91.666667%; - } - .col-sm-12 { - -ms-flex: 0 0 100%; - flex: 0 0 100%; - max-width: 100%; - } - .order-sm-first { - -ms-flex-order: -1; - order: -1; - } - .order-sm-last { - -ms-flex-order: 13; - order: 13; - } - .order-sm-0 { - -ms-flex-order: 0; - order: 0; - } - .order-sm-1 { - -ms-flex-order: 1; - order: 1; - } - .order-sm-2 { - -ms-flex-order: 2; - order: 2; - } - .order-sm-3 { - -ms-flex-order: 3; - order: 3; - } - .order-sm-4 { - -ms-flex-order: 4; - order: 4; - } - .order-sm-5 { - -ms-flex-order: 5; - order: 5; - } - .order-sm-6 { - -ms-flex-order: 6; - order: 6; - } - .order-sm-7 { - -ms-flex-order: 7; - order: 7; - } - .order-sm-8 { - -ms-flex-order: 8; - order: 8; - } - .order-sm-9 { - -ms-flex-order: 9; - order: 9; - } - .order-sm-10 { - -ms-flex-order: 10; - order: 10; - } - .order-sm-11 { - -ms-flex-order: 11; - order: 11; - } - .order-sm-12 { - -ms-flex-order: 12; - order: 12; - } - .offset-sm-0 { - margin-left: 0; - } - .offset-sm-1 { - margin-left: 8.333333%; - } - .offset-sm-2 { - margin-left: 16.666667%; - } - .offset-sm-3 { - margin-left: 25%; - } - .offset-sm-4 { - margin-left: 33.333333%; - } - .offset-sm-5 { - margin-left: 41.666667%; - } - .offset-sm-6 { - margin-left: 50%; - } - .offset-sm-7 { - margin-left: 58.333333%; - } - .offset-sm-8 { - margin-left: 66.666667%; - } - .offset-sm-9 { - margin-left: 75%; - } - .offset-sm-10 { - margin-left: 83.333333%; - } - .offset-sm-11 { - margin-left: 91.666667%; - } -} - -@media (min-width: 768px) { - .col-md { - -ms-flex-preferred-size: 0; - flex-basis: 0; - -ms-flex-positive: 1; - flex-grow: 1; - max-width: 100%; - } - .col-md-auto { - -ms-flex: 0 0 auto; - flex: 0 0 auto; - width: auto; - max-width: 100%; - } - .col-md-1 { - -ms-flex: 0 0 8.333333%; - flex: 0 0 8.333333%; - max-width: 8.333333%; - } - .col-md-2 { - -ms-flex: 0 0 16.666667%; - flex: 0 0 16.666667%; - max-width: 16.666667%; - } - .col-md-3 { - -ms-flex: 0 0 25%; - flex: 0 0 25%; - max-width: 25%; - } - .col-md-4 { - -ms-flex: 0 0 33.333333%; - flex: 0 0 33.333333%; - max-width: 33.333333%; - } - .col-md-5 { - -ms-flex: 0 0 41.666667%; - flex: 0 0 41.666667%; - max-width: 41.666667%; - } - .col-md-6 { - -ms-flex: 0 0 50%; - flex: 0 0 50%; - max-width: 50%; - } - .col-md-7 { - -ms-flex: 0 0 58.333333%; - flex: 0 0 58.333333%; - max-width: 58.333333%; - } - .col-md-8 { - -ms-flex: 0 0 66.666667%; - flex: 0 0 66.666667%; - max-width: 66.666667%; - } - .col-md-9 { - -ms-flex: 0 0 75%; - flex: 0 0 75%; - max-width: 75%; - } - .col-md-10 { - -ms-flex: 0 0 83.333333%; - flex: 0 0 83.333333%; - max-width: 83.333333%; - } - .col-md-11 { - -ms-flex: 0 0 91.666667%; - flex: 0 0 91.666667%; - max-width: 91.666667%; - } - .col-md-12 { - -ms-flex: 0 0 100%; - flex: 0 0 100%; - max-width: 100%; - } - .order-md-first { - -ms-flex-order: -1; - order: -1; - } - .order-md-last { - -ms-flex-order: 13; - order: 13; - } - .order-md-0 { - -ms-flex-order: 0; - order: 0; - } - .order-md-1 { - -ms-flex-order: 1; - order: 1; - } - .order-md-2 { - -ms-flex-order: 2; - order: 2; - } - .order-md-3 { - -ms-flex-order: 3; - order: 3; - } - .order-md-4 { - -ms-flex-order: 4; - order: 4; - } - .order-md-5 { - -ms-flex-order: 5; - order: 5; - } - .order-md-6 { - -ms-flex-order: 6; - order: 6; - } - .order-md-7 { - -ms-flex-order: 7; - order: 7; - } - .order-md-8 { - -ms-flex-order: 8; - order: 8; - } - .order-md-9 { - -ms-flex-order: 9; - order: 9; - } - .order-md-10 { - -ms-flex-order: 10; - order: 10; - } - .order-md-11 { - -ms-flex-order: 11; - order: 11; - } - .order-md-12 { - -ms-flex-order: 12; - order: 12; - } - .offset-md-0 { - margin-left: 0; - } - .offset-md-1 { - margin-left: 8.333333%; - } - .offset-md-2 { - margin-left: 16.666667%; - } - .offset-md-3 { - margin-left: 25%; - } - .offset-md-4 { - margin-left: 33.333333%; - } - .offset-md-5 { - margin-left: 41.666667%; - } - .offset-md-6 { - margin-left: 50%; - } - .offset-md-7 { - margin-left: 58.333333%; - } - .offset-md-8 { - margin-left: 66.666667%; - } - .offset-md-9 { - margin-left: 75%; - } - .offset-md-10 { - margin-left: 83.333333%; - } - .offset-md-11 { - margin-left: 91.666667%; - } -} - -@media (min-width: 992px) { - .col-lg { - -ms-flex-preferred-size: 0; - flex-basis: 0; - -ms-flex-positive: 1; - flex-grow: 1; - max-width: 100%; - } - .col-lg-auto { - -ms-flex: 0 0 auto; - flex: 0 0 auto; - width: auto; - max-width: 100%; - } - .col-lg-1 { - -ms-flex: 0 0 8.333333%; - flex: 0 0 8.333333%; - max-width: 8.333333%; - } - .col-lg-2 { - -ms-flex: 0 0 16.666667%; - flex: 0 0 16.666667%; - max-width: 16.666667%; - } - .col-lg-3 { - -ms-flex: 0 0 25%; - flex: 0 0 25%; - max-width: 25%; - } - .col-lg-4 { - -ms-flex: 0 0 33.333333%; - flex: 0 0 33.333333%; - max-width: 33.333333%; - } - .col-lg-5 { - -ms-flex: 0 0 41.666667%; - flex: 0 0 41.666667%; - max-width: 41.666667%; - } - .col-lg-6 { - -ms-flex: 0 0 50%; - flex: 0 0 50%; - max-width: 50%; - } - .col-lg-7 { - -ms-flex: 0 0 58.333333%; - flex: 0 0 58.333333%; - max-width: 58.333333%; - } - .col-lg-8 { - -ms-flex: 0 0 66.666667%; - flex: 0 0 66.666667%; - max-width: 66.666667%; - } - .col-lg-9 { - -ms-flex: 0 0 75%; - flex: 0 0 75%; - max-width: 75%; - } - .col-lg-10 { - -ms-flex: 0 0 83.333333%; - flex: 0 0 83.333333%; - max-width: 83.333333%; - } - .col-lg-11 { - -ms-flex: 0 0 91.666667%; - flex: 0 0 91.666667%; - max-width: 91.666667%; - } - .col-lg-12 { - -ms-flex: 0 0 100%; - flex: 0 0 100%; - max-width: 100%; - } - .order-lg-first { - -ms-flex-order: -1; - order: -1; - } - .order-lg-last { - -ms-flex-order: 13; - order: 13; - } - .order-lg-0 { - -ms-flex-order: 0; - order: 0; - } - .order-lg-1 { - -ms-flex-order: 1; - order: 1; - } - .order-lg-2 { - -ms-flex-order: 2; - order: 2; - } - .order-lg-3 { - -ms-flex-order: 3; - order: 3; - } - .order-lg-4 { - -ms-flex-order: 4; - order: 4; - } - .order-lg-5 { - -ms-flex-order: 5; - order: 5; - } - .order-lg-6 { - -ms-flex-order: 6; - order: 6; - } - .order-lg-7 { - -ms-flex-order: 7; - order: 7; - } - .order-lg-8 { - -ms-flex-order: 8; - order: 8; - } - .order-lg-9 { - -ms-flex-order: 9; - order: 9; - } - .order-lg-10 { - -ms-flex-order: 10; - order: 10; - } - .order-lg-11 { - -ms-flex-order: 11; - order: 11; - } - .order-lg-12 { - -ms-flex-order: 12; - order: 12; - } - .offset-lg-0 { - margin-left: 0; - } - .offset-lg-1 { - margin-left: 8.333333%; - } - .offset-lg-2 { - margin-left: 16.666667%; - } - .offset-lg-3 { - margin-left: 25%; - } - .offset-lg-4 { - margin-left: 33.333333%; - } - .offset-lg-5 { - margin-left: 41.666667%; - } - .offset-lg-6 { - margin-left: 50%; - } - .offset-lg-7 { - margin-left: 58.333333%; - } - .offset-lg-8 { - margin-left: 66.666667%; - } - .offset-lg-9 { - margin-left: 75%; - } - .offset-lg-10 { - margin-left: 83.333333%; - } - .offset-lg-11 { - margin-left: 91.666667%; - } -} - -@media (min-width: 1200px) { - .col-xl { - -ms-flex-preferred-size: 0; - flex-basis: 0; - -ms-flex-positive: 1; - flex-grow: 1; - max-width: 100%; - } - .col-xl-auto { - -ms-flex: 0 0 auto; - flex: 0 0 auto; - width: auto; - max-width: 100%; - } - .col-xl-1 { - -ms-flex: 0 0 8.333333%; - flex: 0 0 8.333333%; - max-width: 8.333333%; - } - .col-xl-2 { - -ms-flex: 0 0 16.666667%; - flex: 0 0 16.666667%; - max-width: 16.666667%; - } - .col-xl-3 { - -ms-flex: 0 0 25%; - flex: 0 0 25%; - max-width: 25%; - } - .col-xl-4 { - -ms-flex: 0 0 33.333333%; - flex: 0 0 33.333333%; - max-width: 33.333333%; - } - .col-xl-5 { - -ms-flex: 0 0 41.666667%; - flex: 0 0 41.666667%; - max-width: 41.666667%; - } - .col-xl-6 { - -ms-flex: 0 0 50%; - flex: 0 0 50%; - max-width: 50%; - } - .col-xl-7 { - -ms-flex: 0 0 58.333333%; - flex: 0 0 58.333333%; - max-width: 58.333333%; - } - .col-xl-8 { - -ms-flex: 0 0 66.666667%; - flex: 0 0 66.666667%; - max-width: 66.666667%; - } - .col-xl-9 { - -ms-flex: 0 0 75%; - flex: 0 0 75%; - max-width: 75%; - } - .col-xl-10 { - -ms-flex: 0 0 83.333333%; - flex: 0 0 83.333333%; - max-width: 83.333333%; - } - .col-xl-11 { - -ms-flex: 0 0 91.666667%; - flex: 0 0 91.666667%; - max-width: 91.666667%; - } - .col-xl-12 { - -ms-flex: 0 0 100%; - flex: 0 0 100%; - max-width: 100%; - } - .order-xl-first { - -ms-flex-order: -1; - order: -1; - } - .order-xl-last { - -ms-flex-order: 13; - order: 13; - } - .order-xl-0 { - -ms-flex-order: 0; - order: 0; - } - .order-xl-1 { - -ms-flex-order: 1; - order: 1; - } - .order-xl-2 { - -ms-flex-order: 2; - order: 2; - } - .order-xl-3 { - -ms-flex-order: 3; - order: 3; - } - .order-xl-4 { - -ms-flex-order: 4; - order: 4; - } - .order-xl-5 { - -ms-flex-order: 5; - order: 5; - } - .order-xl-6 { - -ms-flex-order: 6; - order: 6; - } - .order-xl-7 { - -ms-flex-order: 7; - order: 7; - } - .order-xl-8 { - -ms-flex-order: 8; - order: 8; - } - .order-xl-9 { - -ms-flex-order: 9; - order: 9; - } - .order-xl-10 { - -ms-flex-order: 10; - order: 10; - } - .order-xl-11 { - -ms-flex-order: 11; - order: 11; - } - .order-xl-12 { - -ms-flex-order: 12; - order: 12; - } - .offset-xl-0 { - margin-left: 0; - } - .offset-xl-1 { - margin-left: 8.333333%; - } - .offset-xl-2 { - margin-left: 16.666667%; - } - .offset-xl-3 { - margin-left: 25%; - } - .offset-xl-4 { - margin-left: 33.333333%; - } - .offset-xl-5 { - margin-left: 41.666667%; - } - .offset-xl-6 { - margin-left: 50%; - } - .offset-xl-7 { - margin-left: 58.333333%; - } - .offset-xl-8 { - margin-left: 66.666667%; - } - .offset-xl-9 { - margin-left: 75%; - } - .offset-xl-10 { - margin-left: 83.333333%; - } - .offset-xl-11 { - margin-left: 91.666667%; - } -} - -.d-none { - display: none !important; -} - -.d-inline { - display: inline !important; -} - -.d-inline-block { - display: inline-block !important; -} - -.d-block { - display: block !important; -} - -.d-table { - display: table !important; -} - -.d-table-row { - display: table-row !important; -} - -.d-table-cell { - display: table-cell !important; -} - -.d-flex { - display: -ms-flexbox !important; - display: flex !important; -} - -.d-inline-flex { - display: -ms-inline-flexbox !important; - display: inline-flex !important; -} - -@media (min-width: 576px) { - .d-sm-none { - display: none !important; - } - .d-sm-inline { - display: inline !important; - } - .d-sm-inline-block { - display: inline-block !important; - } - .d-sm-block { - display: block !important; - } - .d-sm-table { - display: table !important; - } - .d-sm-table-row { - display: table-row !important; - } - .d-sm-table-cell { - display: table-cell !important; - } - .d-sm-flex { - display: -ms-flexbox !important; - display: flex !important; - } - .d-sm-inline-flex { - display: -ms-inline-flexbox !important; - display: inline-flex !important; - } -} - -@media (min-width: 768px) { - .d-md-none { - display: none !important; - } - .d-md-inline { - display: inline !important; - } - .d-md-inline-block { - display: inline-block !important; - } - .d-md-block { - display: block !important; - } - .d-md-table { - display: table !important; - } - .d-md-table-row { - display: table-row !important; - } - .d-md-table-cell { - display: table-cell !important; - } - .d-md-flex { - display: -ms-flexbox !important; - display: flex !important; - } - .d-md-inline-flex { - display: -ms-inline-flexbox !important; - display: inline-flex !important; - } -} - -@media (min-width: 992px) { - .d-lg-none { - display: none !important; - } - .d-lg-inline { - display: inline !important; - } - .d-lg-inline-block { - display: inline-block !important; - } - .d-lg-block { - display: block !important; - } - .d-lg-table { - display: table !important; - } - .d-lg-table-row { - display: table-row !important; - } - .d-lg-table-cell { - display: table-cell !important; - } - .d-lg-flex { - display: -ms-flexbox !important; - display: flex !important; - } - .d-lg-inline-flex { - display: -ms-inline-flexbox !important; - display: inline-flex !important; - } -} - -@media (min-width: 1200px) { - .d-xl-none { - display: none !important; - } - .d-xl-inline { - display: inline !important; - } - .d-xl-inline-block { - display: inline-block !important; - } - .d-xl-block { - display: block !important; - } - .d-xl-table { - display: table !important; - } - .d-xl-table-row { - display: table-row !important; - } - .d-xl-table-cell { - display: table-cell !important; - } - .d-xl-flex { - display: -ms-flexbox !important; - display: flex !important; - } - .d-xl-inline-flex { - display: -ms-inline-flexbox !important; - display: inline-flex !important; - } -} - -@media print { - .d-print-none { - display: none !important; - } - .d-print-inline { - display: inline !important; - } - .d-print-inline-block { - display: inline-block !important; - } - .d-print-block { - display: block !important; - } - .d-print-table { - display: table !important; - } - .d-print-table-row { - display: table-row !important; - } - .d-print-table-cell { - display: table-cell !important; - } - .d-print-flex { - display: -ms-flexbox !important; - display: flex !important; - } - .d-print-inline-flex { - display: -ms-inline-flexbox !important; - display: inline-flex !important; - } -} - -.flex-row { - -ms-flex-direction: row !important; - flex-direction: row !important; -} - -.flex-column { - -ms-flex-direction: column !important; - flex-direction: column !important; -} - -.flex-row-reverse { - -ms-flex-direction: row-reverse !important; - flex-direction: row-reverse !important; -} - -.flex-column-reverse { - -ms-flex-direction: column-reverse !important; - flex-direction: column-reverse !important; -} - -.flex-wrap { - -ms-flex-wrap: wrap !important; - flex-wrap: wrap !important; -} - -.flex-nowrap { - -ms-flex-wrap: nowrap !important; - flex-wrap: nowrap !important; -} - -.flex-wrap-reverse { - -ms-flex-wrap: wrap-reverse !important; - flex-wrap: wrap-reverse !important; -} - -.flex-fill { - -ms-flex: 1 1 auto !important; - flex: 1 1 auto !important; -} - -.flex-grow-0 { - -ms-flex-positive: 0 !important; - flex-grow: 0 !important; -} - -.flex-grow-1 { - -ms-flex-positive: 1 !important; - flex-grow: 1 !important; -} - -.flex-shrink-0 { - -ms-flex-negative: 0 !important; - flex-shrink: 0 !important; -} - -.flex-shrink-1 { - -ms-flex-negative: 1 !important; - flex-shrink: 1 !important; -} - -.justify-content-start { - -ms-flex-pack: start !important; - justify-content: flex-start !important; -} - -.justify-content-end { - -ms-flex-pack: end !important; - justify-content: flex-end !important; -} - -.justify-content-center { - -ms-flex-pack: center !important; - justify-content: center !important; -} - -.justify-content-between { - -ms-flex-pack: justify !important; - justify-content: space-between !important; -} - -.justify-content-around { - -ms-flex-pack: distribute !important; - justify-content: space-around !important; -} - -.align-items-start { - -ms-flex-align: start !important; - align-items: flex-start !important; -} - -.align-items-end { - -ms-flex-align: end !important; - align-items: flex-end !important; -} - -.align-items-center { - -ms-flex-align: center !important; - align-items: center !important; -} - -.align-items-baseline { - -ms-flex-align: baseline !important; - align-items: baseline !important; -} - -.align-items-stretch { - -ms-flex-align: stretch !important; - align-items: stretch !important; -} - -.align-content-start { - -ms-flex-line-pack: start !important; - align-content: flex-start !important; -} - -.align-content-end { - -ms-flex-line-pack: end !important; - align-content: flex-end !important; -} - -.align-content-center { - -ms-flex-line-pack: center !important; - align-content: center !important; -} - -.align-content-between { - -ms-flex-line-pack: justify !important; - align-content: space-between !important; -} - -.align-content-around { - -ms-flex-line-pack: distribute !important; - align-content: space-around !important; -} - -.align-content-stretch { - -ms-flex-line-pack: stretch !important; - align-content: stretch !important; -} - -.align-self-auto { - -ms-flex-item-align: auto !important; - align-self: auto !important; -} - -.align-self-start { - -ms-flex-item-align: start !important; - align-self: flex-start !important; -} - -.align-self-end { - -ms-flex-item-align: end !important; - align-self: flex-end !important; -} - -.align-self-center { - -ms-flex-item-align: center !important; - align-self: center !important; -} - -.align-self-baseline { - -ms-flex-item-align: baseline !important; - align-self: baseline !important; -} - -.align-self-stretch { - -ms-flex-item-align: stretch !important; - align-self: stretch !important; -} - -@media (min-width: 576px) { - .flex-sm-row { - -ms-flex-direction: row !important; - flex-direction: row !important; - } - .flex-sm-column { - -ms-flex-direction: column !important; - flex-direction: column !important; - } - .flex-sm-row-reverse { - -ms-flex-direction: row-reverse !important; - flex-direction: row-reverse !important; - } - .flex-sm-column-reverse { - -ms-flex-direction: column-reverse !important; - flex-direction: column-reverse !important; - } - .flex-sm-wrap { - -ms-flex-wrap: wrap !important; - flex-wrap: wrap !important; - } - .flex-sm-nowrap { - -ms-flex-wrap: nowrap !important; - flex-wrap: nowrap !important; - } - .flex-sm-wrap-reverse { - -ms-flex-wrap: wrap-reverse !important; - flex-wrap: wrap-reverse !important; - } - .flex-sm-fill { - -ms-flex: 1 1 auto !important; - flex: 1 1 auto !important; - } - .flex-sm-grow-0 { - -ms-flex-positive: 0 !important; - flex-grow: 0 !important; - } - .flex-sm-grow-1 { - -ms-flex-positive: 1 !important; - flex-grow: 1 !important; - } - .flex-sm-shrink-0 { - -ms-flex-negative: 0 !important; - flex-shrink: 0 !important; - } - .flex-sm-shrink-1 { - -ms-flex-negative: 1 !important; - flex-shrink: 1 !important; - } - .justify-content-sm-start { - -ms-flex-pack: start !important; - justify-content: flex-start !important; - } - .justify-content-sm-end { - -ms-flex-pack: end !important; - justify-content: flex-end !important; - } - .justify-content-sm-center { - -ms-flex-pack: center !important; - justify-content: center !important; - } - .justify-content-sm-between { - -ms-flex-pack: justify !important; - justify-content: space-between !important; - } - .justify-content-sm-around { - -ms-flex-pack: distribute !important; - justify-content: space-around !important; - } - .align-items-sm-start { - -ms-flex-align: start !important; - align-items: flex-start !important; - } - .align-items-sm-end { - -ms-flex-align: end !important; - align-items: flex-end !important; - } - .align-items-sm-center { - -ms-flex-align: center !important; - align-items: center !important; - } - .align-items-sm-baseline { - -ms-flex-align: baseline !important; - align-items: baseline !important; - } - .align-items-sm-stretch { - -ms-flex-align: stretch !important; - align-items: stretch !important; - } - .align-content-sm-start { - -ms-flex-line-pack: start !important; - align-content: flex-start !important; - } - .align-content-sm-end { - -ms-flex-line-pack: end !important; - align-content: flex-end !important; - } - .align-content-sm-center { - -ms-flex-line-pack: center !important; - align-content: center !important; - } - .align-content-sm-between { - -ms-flex-line-pack: justify !important; - align-content: space-between !important; - } - .align-content-sm-around { - -ms-flex-line-pack: distribute !important; - align-content: space-around !important; - } - .align-content-sm-stretch { - -ms-flex-line-pack: stretch !important; - align-content: stretch !important; - } - .align-self-sm-auto { - -ms-flex-item-align: auto !important; - align-self: auto !important; - } - .align-self-sm-start { - -ms-flex-item-align: start !important; - align-self: flex-start !important; - } - .align-self-sm-end { - -ms-flex-item-align: end !important; - align-self: flex-end !important; - } - .align-self-sm-center { - -ms-flex-item-align: center !important; - align-self: center !important; - } - .align-self-sm-baseline { - -ms-flex-item-align: baseline !important; - align-self: baseline !important; - } - .align-self-sm-stretch { - -ms-flex-item-align: stretch !important; - align-self: stretch !important; - } -} - -@media (min-width: 768px) { - .flex-md-row { - -ms-flex-direction: row !important; - flex-direction: row !important; - } - .flex-md-column { - -ms-flex-direction: column !important; - flex-direction: column !important; - } - .flex-md-row-reverse { - -ms-flex-direction: row-reverse !important; - flex-direction: row-reverse !important; - } - .flex-md-column-reverse { - -ms-flex-direction: column-reverse !important; - flex-direction: column-reverse !important; - } - .flex-md-wrap { - -ms-flex-wrap: wrap !important; - flex-wrap: wrap !important; - } - .flex-md-nowrap { - -ms-flex-wrap: nowrap !important; - flex-wrap: nowrap !important; - } - .flex-md-wrap-reverse { - -ms-flex-wrap: wrap-reverse !important; - flex-wrap: wrap-reverse !important; - } - .flex-md-fill { - -ms-flex: 1 1 auto !important; - flex: 1 1 auto !important; - } - .flex-md-grow-0 { - -ms-flex-positive: 0 !important; - flex-grow: 0 !important; - } - .flex-md-grow-1 { - -ms-flex-positive: 1 !important; - flex-grow: 1 !important; - } - .flex-md-shrink-0 { - -ms-flex-negative: 0 !important; - flex-shrink: 0 !important; - } - .flex-md-shrink-1 { - -ms-flex-negative: 1 !important; - flex-shrink: 1 !important; - } - .justify-content-md-start { - -ms-flex-pack: start !important; - justify-content: flex-start !important; - } - .justify-content-md-end { - -ms-flex-pack: end !important; - justify-content: flex-end !important; - } - .justify-content-md-center { - -ms-flex-pack: center !important; - justify-content: center !important; - } - .justify-content-md-between { - -ms-flex-pack: justify !important; - justify-content: space-between !important; - } - .justify-content-md-around { - -ms-flex-pack: distribute !important; - justify-content: space-around !important; - } - .align-items-md-start { - -ms-flex-align: start !important; - align-items: flex-start !important; - } - .align-items-md-end { - -ms-flex-align: end !important; - align-items: flex-end !important; - } - .align-items-md-center { - -ms-flex-align: center !important; - align-items: center !important; - } - .align-items-md-baseline { - -ms-flex-align: baseline !important; - align-items: baseline !important; - } - .align-items-md-stretch { - -ms-flex-align: stretch !important; - align-items: stretch !important; - } - .align-content-md-start { - -ms-flex-line-pack: start !important; - align-content: flex-start !important; - } - .align-content-md-end { - -ms-flex-line-pack: end !important; - align-content: flex-end !important; - } - .align-content-md-center { - -ms-flex-line-pack: center !important; - align-content: center !important; - } - .align-content-md-between { - -ms-flex-line-pack: justify !important; - align-content: space-between !important; - } - .align-content-md-around { - -ms-flex-line-pack: distribute !important; - align-content: space-around !important; - } - .align-content-md-stretch { - -ms-flex-line-pack: stretch !important; - align-content: stretch !important; - } - .align-self-md-auto { - -ms-flex-item-align: auto !important; - align-self: auto !important; - } - .align-self-md-start { - -ms-flex-item-align: start !important; - align-self: flex-start !important; - } - .align-self-md-end { - -ms-flex-item-align: end !important; - align-self: flex-end !important; - } - .align-self-md-center { - -ms-flex-item-align: center !important; - align-self: center !important; - } - .align-self-md-baseline { - -ms-flex-item-align: baseline !important; - align-self: baseline !important; - } - .align-self-md-stretch { - -ms-flex-item-align: stretch !important; - align-self: stretch !important; - } -} - -@media (min-width: 992px) { - .flex-lg-row { - -ms-flex-direction: row !important; - flex-direction: row !important; - } - .flex-lg-column { - -ms-flex-direction: column !important; - flex-direction: column !important; - } - .flex-lg-row-reverse { - -ms-flex-direction: row-reverse !important; - flex-direction: row-reverse !important; - } - .flex-lg-column-reverse { - -ms-flex-direction: column-reverse !important; - flex-direction: column-reverse !important; - } - .flex-lg-wrap { - -ms-flex-wrap: wrap !important; - flex-wrap: wrap !important; - } - .flex-lg-nowrap { - -ms-flex-wrap: nowrap !important; - flex-wrap: nowrap !important; - } - .flex-lg-wrap-reverse { - -ms-flex-wrap: wrap-reverse !important; - flex-wrap: wrap-reverse !important; - } - .flex-lg-fill { - -ms-flex: 1 1 auto !important; - flex: 1 1 auto !important; - } - .flex-lg-grow-0 { - -ms-flex-positive: 0 !important; - flex-grow: 0 !important; - } - .flex-lg-grow-1 { - -ms-flex-positive: 1 !important; - flex-grow: 1 !important; - } - .flex-lg-shrink-0 { - -ms-flex-negative: 0 !important; - flex-shrink: 0 !important; - } - .flex-lg-shrink-1 { - -ms-flex-negative: 1 !important; - flex-shrink: 1 !important; - } - .justify-content-lg-start { - -ms-flex-pack: start !important; - justify-content: flex-start !important; - } - .justify-content-lg-end { - -ms-flex-pack: end !important; - justify-content: flex-end !important; - } - .justify-content-lg-center { - -ms-flex-pack: center !important; - justify-content: center !important; - } - .justify-content-lg-between { - -ms-flex-pack: justify !important; - justify-content: space-between !important; - } - .justify-content-lg-around { - -ms-flex-pack: distribute !important; - justify-content: space-around !important; - } - .align-items-lg-start { - -ms-flex-align: start !important; - align-items: flex-start !important; - } - .align-items-lg-end { - -ms-flex-align: end !important; - align-items: flex-end !important; - } - .align-items-lg-center { - -ms-flex-align: center !important; - align-items: center !important; - } - .align-items-lg-baseline { - -ms-flex-align: baseline !important; - align-items: baseline !important; - } - .align-items-lg-stretch { - -ms-flex-align: stretch !important; - align-items: stretch !important; - } - .align-content-lg-start { - -ms-flex-line-pack: start !important; - align-content: flex-start !important; - } - .align-content-lg-end { - -ms-flex-line-pack: end !important; - align-content: flex-end !important; - } - .align-content-lg-center { - -ms-flex-line-pack: center !important; - align-content: center !important; - } - .align-content-lg-between { - -ms-flex-line-pack: justify !important; - align-content: space-between !important; - } - .align-content-lg-around { - -ms-flex-line-pack: distribute !important; - align-content: space-around !important; - } - .align-content-lg-stretch { - -ms-flex-line-pack: stretch !important; - align-content: stretch !important; - } - .align-self-lg-auto { - -ms-flex-item-align: auto !important; - align-self: auto !important; - } - .align-self-lg-start { - -ms-flex-item-align: start !important; - align-self: flex-start !important; - } - .align-self-lg-end { - -ms-flex-item-align: end !important; - align-self: flex-end !important; - } - .align-self-lg-center { - -ms-flex-item-align: center !important; - align-self: center !important; - } - .align-self-lg-baseline { - -ms-flex-item-align: baseline !important; - align-self: baseline !important; - } - .align-self-lg-stretch { - -ms-flex-item-align: stretch !important; - align-self: stretch !important; - } -} - -@media (min-width: 1200px) { - .flex-xl-row { - -ms-flex-direction: row !important; - flex-direction: row !important; - } - .flex-xl-column { - -ms-flex-direction: column !important; - flex-direction: column !important; - } - .flex-xl-row-reverse { - -ms-flex-direction: row-reverse !important; - flex-direction: row-reverse !important; - } - .flex-xl-column-reverse { - -ms-flex-direction: column-reverse !important; - flex-direction: column-reverse !important; - } - .flex-xl-wrap { - -ms-flex-wrap: wrap !important; - flex-wrap: wrap !important; - } - .flex-xl-nowrap { - -ms-flex-wrap: nowrap !important; - flex-wrap: nowrap !important; - } - .flex-xl-wrap-reverse { - -ms-flex-wrap: wrap-reverse !important; - flex-wrap: wrap-reverse !important; - } - .flex-xl-fill { - -ms-flex: 1 1 auto !important; - flex: 1 1 auto !important; - } - .flex-xl-grow-0 { - -ms-flex-positive: 0 !important; - flex-grow: 0 !important; - } - .flex-xl-grow-1 { - -ms-flex-positive: 1 !important; - flex-grow: 1 !important; - } - .flex-xl-shrink-0 { - -ms-flex-negative: 0 !important; - flex-shrink: 0 !important; - } - .flex-xl-shrink-1 { - -ms-flex-negative: 1 !important; - flex-shrink: 1 !important; - } - .justify-content-xl-start { - -ms-flex-pack: start !important; - justify-content: flex-start !important; - } - .justify-content-xl-end { - -ms-flex-pack: end !important; - justify-content: flex-end !important; - } - .justify-content-xl-center { - -ms-flex-pack: center !important; - justify-content: center !important; - } - .justify-content-xl-between { - -ms-flex-pack: justify !important; - justify-content: space-between !important; - } - .justify-content-xl-around { - -ms-flex-pack: distribute !important; - justify-content: space-around !important; - } - .align-items-xl-start { - -ms-flex-align: start !important; - align-items: flex-start !important; - } - .align-items-xl-end { - -ms-flex-align: end !important; - align-items: flex-end !important; - } - .align-items-xl-center { - -ms-flex-align: center !important; - align-items: center !important; - } - .align-items-xl-baseline { - -ms-flex-align: baseline !important; - align-items: baseline !important; - } - .align-items-xl-stretch { - -ms-flex-align: stretch !important; - align-items: stretch !important; - } - .align-content-xl-start { - -ms-flex-line-pack: start !important; - align-content: flex-start !important; - } - .align-content-xl-end { - -ms-flex-line-pack: end !important; - align-content: flex-end !important; - } - .align-content-xl-center { - -ms-flex-line-pack: center !important; - align-content: center !important; - } - .align-content-xl-between { - -ms-flex-line-pack: justify !important; - align-content: space-between !important; - } - .align-content-xl-around { - -ms-flex-line-pack: distribute !important; - align-content: space-around !important; - } - .align-content-xl-stretch { - -ms-flex-line-pack: stretch !important; - align-content: stretch !important; - } - .align-self-xl-auto { - -ms-flex-item-align: auto !important; - align-self: auto !important; - } - .align-self-xl-start { - -ms-flex-item-align: start !important; - align-self: flex-start !important; - } - .align-self-xl-end { - -ms-flex-item-align: end !important; - align-self: flex-end !important; - } - .align-self-xl-center { - -ms-flex-item-align: center !important; - align-self: center !important; - } - .align-self-xl-baseline { - -ms-flex-item-align: baseline !important; - align-self: baseline !important; - } - .align-self-xl-stretch { - -ms-flex-item-align: stretch !important; - align-self: stretch !important; - } -} - -.m-0 { - margin: 0 !important; -} - -.mt-0, -.my-0 { - margin-top: 0 !important; -} - -.mr-0, -.mx-0 { - margin-right: 0 !important; -} - -.mb-0, -.my-0 { - margin-bottom: 0 !important; -} - -.ml-0, -.mx-0 { - margin-left: 0 !important; -} - -.m-1 { - margin: 0.25rem !important; -} - -.mt-1, -.my-1 { - margin-top: 0.25rem !important; -} - -.mr-1, -.mx-1 { - margin-right: 0.25rem !important; -} - -.mb-1, -.my-1 { - margin-bottom: 0.25rem !important; -} - -.ml-1, -.mx-1 { - margin-left: 0.25rem !important; -} - -.m-2 { - margin: 0.5rem !important; -} - -.mt-2, -.my-2 { - margin-top: 0.5rem !important; -} - -.mr-2, -.mx-2 { - margin-right: 0.5rem !important; -} - -.mb-2, -.my-2 { - margin-bottom: 0.5rem !important; -} - -.ml-2, -.mx-2 { - margin-left: 0.5rem !important; -} - -.m-3 { - margin: 1rem !important; -} - -.mt-3, -.my-3 { - margin-top: 1rem !important; -} - -.mr-3, -.mx-3 { - margin-right: 1rem !important; -} - -.mb-3, -.my-3 { - margin-bottom: 1rem !important; -} - -.ml-3, -.mx-3 { - margin-left: 1rem !important; -} - -.m-4 { - margin: 1.5rem !important; -} - -.mt-4, -.my-4 { - margin-top: 1.5rem !important; -} - -.mr-4, -.mx-4 { - margin-right: 1.5rem !important; -} - -.mb-4, -.my-4 { - margin-bottom: 1.5rem !important; -} - -.ml-4, -.mx-4 { - margin-left: 1.5rem !important; -} - -.m-5 { - margin: 3rem !important; -} - -.mt-5, -.my-5 { - margin-top: 3rem !important; -} - -.mr-5, -.mx-5 { - margin-right: 3rem !important; -} - -.mb-5, -.my-5 { - margin-bottom: 3rem !important; -} - -.ml-5, -.mx-5 { - margin-left: 3rem !important; -} - -.p-0 { - padding: 0 !important; -} - -.pt-0, -.py-0 { - padding-top: 0 !important; -} - -.pr-0, -.px-0 { - padding-right: 0 !important; -} - -.pb-0, -.py-0 { - padding-bottom: 0 !important; -} - -.pl-0, -.px-0 { - padding-left: 0 !important; -} - -.p-1 { - padding: 0.25rem !important; -} - -.pt-1, -.py-1 { - padding-top: 0.25rem !important; -} - -.pr-1, -.px-1 { - padding-right: 0.25rem !important; -} - -.pb-1, -.py-1 { - padding-bottom: 0.25rem !important; -} - -.pl-1, -.px-1 { - padding-left: 0.25rem !important; -} - -.p-2 { - padding: 0.5rem !important; -} - -.pt-2, -.py-2 { - padding-top: 0.5rem !important; -} - -.pr-2, -.px-2 { - padding-right: 0.5rem !important; -} - -.pb-2, -.py-2 { - padding-bottom: 0.5rem !important; -} - -.pl-2, -.px-2 { - padding-left: 0.5rem !important; -} - -.p-3 { - padding: 1rem !important; -} - -.pt-3, -.py-3 { - padding-top: 1rem !important; -} - -.pr-3, -.px-3 { - padding-right: 1rem !important; -} - -.pb-3, -.py-3 { - padding-bottom: 1rem !important; -} - -.pl-3, -.px-3 { - padding-left: 1rem !important; -} - -.p-4 { - padding: 1.5rem !important; -} - -.pt-4, -.py-4 { - padding-top: 1.5rem !important; -} - -.pr-4, -.px-4 { - padding-right: 1.5rem !important; -} - -.pb-4, -.py-4 { - padding-bottom: 1.5rem !important; -} - -.pl-4, -.px-4 { - padding-left: 1.5rem !important; -} - -.p-5 { - padding: 3rem !important; -} - -.pt-5, -.py-5 { - padding-top: 3rem !important; -} - -.pr-5, -.px-5 { - padding-right: 3rem !important; -} - -.pb-5, -.py-5 { - padding-bottom: 3rem !important; -} - -.pl-5, -.px-5 { - padding-left: 3rem !important; -} - -.m-n1 { - margin: -0.25rem !important; -} - -.mt-n1, -.my-n1 { - margin-top: -0.25rem !important; -} - -.mr-n1, -.mx-n1 { - margin-right: -0.25rem !important; -} - -.mb-n1, -.my-n1 { - margin-bottom: -0.25rem !important; -} - -.ml-n1, -.mx-n1 { - margin-left: -0.25rem !important; -} - -.m-n2 { - margin: -0.5rem !important; -} - -.mt-n2, -.my-n2 { - margin-top: -0.5rem !important; -} - -.mr-n2, -.mx-n2 { - margin-right: -0.5rem !important; -} - -.mb-n2, -.my-n2 { - margin-bottom: -0.5rem !important; -} - -.ml-n2, -.mx-n2 { - margin-left: -0.5rem !important; -} - -.m-n3 { - margin: -1rem !important; -} - -.mt-n3, -.my-n3 { - margin-top: -1rem !important; -} - -.mr-n3, -.mx-n3 { - margin-right: -1rem !important; -} - -.mb-n3, -.my-n3 { - margin-bottom: -1rem !important; -} - -.ml-n3, -.mx-n3 { - margin-left: -1rem !important; -} - -.m-n4 { - margin: -1.5rem !important; -} - -.mt-n4, -.my-n4 { - margin-top: -1.5rem !important; -} - -.mr-n4, -.mx-n4 { - margin-right: -1.5rem !important; -} - -.mb-n4, -.my-n4 { - margin-bottom: -1.5rem !important; -} - -.ml-n4, -.mx-n4 { - margin-left: -1.5rem !important; -} - -.m-n5 { - margin: -3rem !important; -} - -.mt-n5, -.my-n5 { - margin-top: -3rem !important; -} - -.mr-n5, -.mx-n5 { - margin-right: -3rem !important; -} - -.mb-n5, -.my-n5 { - margin-bottom: -3rem !important; -} - -.ml-n5, -.mx-n5 { - margin-left: -3rem !important; -} - -.m-auto { - margin: auto !important; -} - -.mt-auto, -.my-auto { - margin-top: auto !important; -} - -.mr-auto, -.mx-auto { - margin-right: auto !important; -} - -.mb-auto, -.my-auto { - margin-bottom: auto !important; -} - -.ml-auto, -.mx-auto { - margin-left: auto !important; -} - -@media (min-width: 576px) { - .m-sm-0 { - margin: 0 !important; - } - .mt-sm-0, - .my-sm-0 { - margin-top: 0 !important; - } - .mr-sm-0, - .mx-sm-0 { - margin-right: 0 !important; - } - .mb-sm-0, - .my-sm-0 { - margin-bottom: 0 !important; - } - .ml-sm-0, - .mx-sm-0 { - margin-left: 0 !important; - } - .m-sm-1 { - margin: 0.25rem !important; - } - .mt-sm-1, - .my-sm-1 { - margin-top: 0.25rem !important; - } - .mr-sm-1, - .mx-sm-1 { - margin-right: 0.25rem !important; - } - .mb-sm-1, - .my-sm-1 { - margin-bottom: 0.25rem !important; - } - .ml-sm-1, - .mx-sm-1 { - margin-left: 0.25rem !important; - } - .m-sm-2 { - margin: 0.5rem !important; - } - .mt-sm-2, - .my-sm-2 { - margin-top: 0.5rem !important; - } - .mr-sm-2, - .mx-sm-2 { - margin-right: 0.5rem !important; - } - .mb-sm-2, - .my-sm-2 { - margin-bottom: 0.5rem !important; - } - .ml-sm-2, - .mx-sm-2 { - margin-left: 0.5rem !important; - } - .m-sm-3 { - margin: 1rem !important; - } - .mt-sm-3, - .my-sm-3 { - margin-top: 1rem !important; - } - .mr-sm-3, - .mx-sm-3 { - margin-right: 1rem !important; - } - .mb-sm-3, - .my-sm-3 { - margin-bottom: 1rem !important; - } - .ml-sm-3, - .mx-sm-3 { - margin-left: 1rem !important; - } - .m-sm-4 { - margin: 1.5rem !important; - } - .mt-sm-4, - .my-sm-4 { - margin-top: 1.5rem !important; - } - .mr-sm-4, - .mx-sm-4 { - margin-right: 1.5rem !important; - } - .mb-sm-4, - .my-sm-4 { - margin-bottom: 1.5rem !important; - } - .ml-sm-4, - .mx-sm-4 { - margin-left: 1.5rem !important; - } - .m-sm-5 { - margin: 3rem !important; - } - .mt-sm-5, - .my-sm-5 { - margin-top: 3rem !important; - } - .mr-sm-5, - .mx-sm-5 { - margin-right: 3rem !important; - } - .mb-sm-5, - .my-sm-5 { - margin-bottom: 3rem !important; - } - .ml-sm-5, - .mx-sm-5 { - margin-left: 3rem !important; - } - .p-sm-0 { - padding: 0 !important; - } - .pt-sm-0, - .py-sm-0 { - padding-top: 0 !important; - } - .pr-sm-0, - .px-sm-0 { - padding-right: 0 !important; - } - .pb-sm-0, - .py-sm-0 { - padding-bottom: 0 !important; - } - .pl-sm-0, - .px-sm-0 { - padding-left: 0 !important; - } - .p-sm-1 { - padding: 0.25rem !important; - } - .pt-sm-1, - .py-sm-1 { - padding-top: 0.25rem !important; - } - .pr-sm-1, - .px-sm-1 { - padding-right: 0.25rem !important; - } - .pb-sm-1, - .py-sm-1 { - padding-bottom: 0.25rem !important; - } - .pl-sm-1, - .px-sm-1 { - padding-left: 0.25rem !important; - } - .p-sm-2 { - padding: 0.5rem !important; - } - .pt-sm-2, - .py-sm-2 { - padding-top: 0.5rem !important; - } - .pr-sm-2, - .px-sm-2 { - padding-right: 0.5rem !important; - } - .pb-sm-2, - .py-sm-2 { - padding-bottom: 0.5rem !important; - } - .pl-sm-2, - .px-sm-2 { - padding-left: 0.5rem !important; - } - .p-sm-3 { - padding: 1rem !important; - } - .pt-sm-3, - .py-sm-3 { - padding-top: 1rem !important; - } - .pr-sm-3, - .px-sm-3 { - padding-right: 1rem !important; - } - .pb-sm-3, - .py-sm-3 { - padding-bottom: 1rem !important; - } - .pl-sm-3, - .px-sm-3 { - padding-left: 1rem !important; - } - .p-sm-4 { - padding: 1.5rem !important; - } - .pt-sm-4, - .py-sm-4 { - padding-top: 1.5rem !important; - } - .pr-sm-4, - .px-sm-4 { - padding-right: 1.5rem !important; - } - .pb-sm-4, - .py-sm-4 { - padding-bottom: 1.5rem !important; - } - .pl-sm-4, - .px-sm-4 { - padding-left: 1.5rem !important; - } - .p-sm-5 { - padding: 3rem !important; - } - .pt-sm-5, - .py-sm-5 { - padding-top: 3rem !important; - } - .pr-sm-5, - .px-sm-5 { - padding-right: 3rem !important; - } - .pb-sm-5, - .py-sm-5 { - padding-bottom: 3rem !important; - } - .pl-sm-5, - .px-sm-5 { - padding-left: 3rem !important; - } - .m-sm-n1 { - margin: -0.25rem !important; - } - .mt-sm-n1, - .my-sm-n1 { - margin-top: -0.25rem !important; - } - .mr-sm-n1, - .mx-sm-n1 { - margin-right: -0.25rem !important; - } - .mb-sm-n1, - .my-sm-n1 { - margin-bottom: -0.25rem !important; - } - .ml-sm-n1, - .mx-sm-n1 { - margin-left: -0.25rem !important; - } - .m-sm-n2 { - margin: -0.5rem !important; - } - .mt-sm-n2, - .my-sm-n2 { - margin-top: -0.5rem !important; - } - .mr-sm-n2, - .mx-sm-n2 { - margin-right: -0.5rem !important; - } - .mb-sm-n2, - .my-sm-n2 { - margin-bottom: -0.5rem !important; - } - .ml-sm-n2, - .mx-sm-n2 { - margin-left: -0.5rem !important; - } - .m-sm-n3 { - margin: -1rem !important; - } - .mt-sm-n3, - .my-sm-n3 { - margin-top: -1rem !important; - } - .mr-sm-n3, - .mx-sm-n3 { - margin-right: -1rem !important; - } - .mb-sm-n3, - .my-sm-n3 { - margin-bottom: -1rem !important; - } - .ml-sm-n3, - .mx-sm-n3 { - margin-left: -1rem !important; - } - .m-sm-n4 { - margin: -1.5rem !important; - } - .mt-sm-n4, - .my-sm-n4 { - margin-top: -1.5rem !important; - } - .mr-sm-n4, - .mx-sm-n4 { - margin-right: -1.5rem !important; - } - .mb-sm-n4, - .my-sm-n4 { - margin-bottom: -1.5rem !important; - } - .ml-sm-n4, - .mx-sm-n4 { - margin-left: -1.5rem !important; - } - .m-sm-n5 { - margin: -3rem !important; - } - .mt-sm-n5, - .my-sm-n5 { - margin-top: -3rem !important; - } - .mr-sm-n5, - .mx-sm-n5 { - margin-right: -3rem !important; - } - .mb-sm-n5, - .my-sm-n5 { - margin-bottom: -3rem !important; - } - .ml-sm-n5, - .mx-sm-n5 { - margin-left: -3rem !important; - } - .m-sm-auto { - margin: auto !important; - } - .mt-sm-auto, - .my-sm-auto { - margin-top: auto !important; - } - .mr-sm-auto, - .mx-sm-auto { - margin-right: auto !important; - } - .mb-sm-auto, - .my-sm-auto { - margin-bottom: auto !important; - } - .ml-sm-auto, - .mx-sm-auto { - margin-left: auto !important; - } -} - -@media (min-width: 768px) { - .m-md-0 { - margin: 0 !important; - } - .mt-md-0, - .my-md-0 { - margin-top: 0 !important; - } - .mr-md-0, - .mx-md-0 { - margin-right: 0 !important; - } - .mb-md-0, - .my-md-0 { - margin-bottom: 0 !important; - } - .ml-md-0, - .mx-md-0 { - margin-left: 0 !important; - } - .m-md-1 { - margin: 0.25rem !important; - } - .mt-md-1, - .my-md-1 { - margin-top: 0.25rem !important; - } - .mr-md-1, - .mx-md-1 { - margin-right: 0.25rem !important; - } - .mb-md-1, - .my-md-1 { - margin-bottom: 0.25rem !important; - } - .ml-md-1, - .mx-md-1 { - margin-left: 0.25rem !important; - } - .m-md-2 { - margin: 0.5rem !important; - } - .mt-md-2, - .my-md-2 { - margin-top: 0.5rem !important; - } - .mr-md-2, - .mx-md-2 { - margin-right: 0.5rem !important; - } - .mb-md-2, - .my-md-2 { - margin-bottom: 0.5rem !important; - } - .ml-md-2, - .mx-md-2 { - margin-left: 0.5rem !important; - } - .m-md-3 { - margin: 1rem !important; - } - .mt-md-3, - .my-md-3 { - margin-top: 1rem !important; - } - .mr-md-3, - .mx-md-3 { - margin-right: 1rem !important; - } - .mb-md-3, - .my-md-3 { - margin-bottom: 1rem !important; - } - .ml-md-3, - .mx-md-3 { - margin-left: 1rem !important; - } - .m-md-4 { - margin: 1.5rem !important; - } - .mt-md-4, - .my-md-4 { - margin-top: 1.5rem !important; - } - .mr-md-4, - .mx-md-4 { - margin-right: 1.5rem !important; - } - .mb-md-4, - .my-md-4 { - margin-bottom: 1.5rem !important; - } - .ml-md-4, - .mx-md-4 { - margin-left: 1.5rem !important; - } - .m-md-5 { - margin: 3rem !important; - } - .mt-md-5, - .my-md-5 { - margin-top: 3rem !important; - } - .mr-md-5, - .mx-md-5 { - margin-right: 3rem !important; - } - .mb-md-5, - .my-md-5 { - margin-bottom: 3rem !important; - } - .ml-md-5, - .mx-md-5 { - margin-left: 3rem !important; - } - .p-md-0 { - padding: 0 !important; - } - .pt-md-0, - .py-md-0 { - padding-top: 0 !important; - } - .pr-md-0, - .px-md-0 { - padding-right: 0 !important; - } - .pb-md-0, - .py-md-0 { - padding-bottom: 0 !important; - } - .pl-md-0, - .px-md-0 { - padding-left: 0 !important; - } - .p-md-1 { - padding: 0.25rem !important; - } - .pt-md-1, - .py-md-1 { - padding-top: 0.25rem !important; - } - .pr-md-1, - .px-md-1 { - padding-right: 0.25rem !important; - } - .pb-md-1, - .py-md-1 { - padding-bottom: 0.25rem !important; - } - .pl-md-1, - .px-md-1 { - padding-left: 0.25rem !important; - } - .p-md-2 { - padding: 0.5rem !important; - } - .pt-md-2, - .py-md-2 { - padding-top: 0.5rem !important; - } - .pr-md-2, - .px-md-2 { - padding-right: 0.5rem !important; - } - .pb-md-2, - .py-md-2 { - padding-bottom: 0.5rem !important; - } - .pl-md-2, - .px-md-2 { - padding-left: 0.5rem !important; - } - .p-md-3 { - padding: 1rem !important; - } - .pt-md-3, - .py-md-3 { - padding-top: 1rem !important; - } - .pr-md-3, - .px-md-3 { - padding-right: 1rem !important; - } - .pb-md-3, - .py-md-3 { - padding-bottom: 1rem !important; - } - .pl-md-3, - .px-md-3 { - padding-left: 1rem !important; - } - .p-md-4 { - padding: 1.5rem !important; - } - .pt-md-4, - .py-md-4 { - padding-top: 1.5rem !important; - } - .pr-md-4, - .px-md-4 { - padding-right: 1.5rem !important; - } - .pb-md-4, - .py-md-4 { - padding-bottom: 1.5rem !important; - } - .pl-md-4, - .px-md-4 { - padding-left: 1.5rem !important; - } - .p-md-5 { - padding: 3rem !important; - } - .pt-md-5, - .py-md-5 { - padding-top: 3rem !important; - } - .pr-md-5, - .px-md-5 { - padding-right: 3rem !important; - } - .pb-md-5, - .py-md-5 { - padding-bottom: 3rem !important; - } - .pl-md-5, - .px-md-5 { - padding-left: 3rem !important; - } - .m-md-n1 { - margin: -0.25rem !important; - } - .mt-md-n1, - .my-md-n1 { - margin-top: -0.25rem !important; - } - .mr-md-n1, - .mx-md-n1 { - margin-right: -0.25rem !important; - } - .mb-md-n1, - .my-md-n1 { - margin-bottom: -0.25rem !important; - } - .ml-md-n1, - .mx-md-n1 { - margin-left: -0.25rem !important; - } - .m-md-n2 { - margin: -0.5rem !important; - } - .mt-md-n2, - .my-md-n2 { - margin-top: -0.5rem !important; - } - .mr-md-n2, - .mx-md-n2 { - margin-right: -0.5rem !important; - } - .mb-md-n2, - .my-md-n2 { - margin-bottom: -0.5rem !important; - } - .ml-md-n2, - .mx-md-n2 { - margin-left: -0.5rem !important; - } - .m-md-n3 { - margin: -1rem !important; - } - .mt-md-n3, - .my-md-n3 { - margin-top: -1rem !important; - } - .mr-md-n3, - .mx-md-n3 { - margin-right: -1rem !important; - } - .mb-md-n3, - .my-md-n3 { - margin-bottom: -1rem !important; - } - .ml-md-n3, - .mx-md-n3 { - margin-left: -1rem !important; - } - .m-md-n4 { - margin: -1.5rem !important; - } - .mt-md-n4, - .my-md-n4 { - margin-top: -1.5rem !important; - } - .mr-md-n4, - .mx-md-n4 { - margin-right: -1.5rem !important; - } - .mb-md-n4, - .my-md-n4 { - margin-bottom: -1.5rem !important; - } - .ml-md-n4, - .mx-md-n4 { - margin-left: -1.5rem !important; - } - .m-md-n5 { - margin: -3rem !important; - } - .mt-md-n5, - .my-md-n5 { - margin-top: -3rem !important; - } - .mr-md-n5, - .mx-md-n5 { - margin-right: -3rem !important; - } - .mb-md-n5, - .my-md-n5 { - margin-bottom: -3rem !important; - } - .ml-md-n5, - .mx-md-n5 { - margin-left: -3rem !important; - } - .m-md-auto { - margin: auto !important; - } - .mt-md-auto, - .my-md-auto { - margin-top: auto !important; - } - .mr-md-auto, - .mx-md-auto { - margin-right: auto !important; - } - .mb-md-auto, - .my-md-auto { - margin-bottom: auto !important; - } - .ml-md-auto, - .mx-md-auto { - margin-left: auto !important; - } -} - -@media (min-width: 992px) { - .m-lg-0 { - margin: 0 !important; - } - .mt-lg-0, - .my-lg-0 { - margin-top: 0 !important; - } - .mr-lg-0, - .mx-lg-0 { - margin-right: 0 !important; - } - .mb-lg-0, - .my-lg-0 { - margin-bottom: 0 !important; - } - .ml-lg-0, - .mx-lg-0 { - margin-left: 0 !important; - } - .m-lg-1 { - margin: 0.25rem !important; - } - .mt-lg-1, - .my-lg-1 { - margin-top: 0.25rem !important; - } - .mr-lg-1, - .mx-lg-1 { - margin-right: 0.25rem !important; - } - .mb-lg-1, - .my-lg-1 { - margin-bottom: 0.25rem !important; - } - .ml-lg-1, - .mx-lg-1 { - margin-left: 0.25rem !important; - } - .m-lg-2 { - margin: 0.5rem !important; - } - .mt-lg-2, - .my-lg-2 { - margin-top: 0.5rem !important; - } - .mr-lg-2, - .mx-lg-2 { - margin-right: 0.5rem !important; - } - .mb-lg-2, - .my-lg-2 { - margin-bottom: 0.5rem !important; - } - .ml-lg-2, - .mx-lg-2 { - margin-left: 0.5rem !important; - } - .m-lg-3 { - margin: 1rem !important; - } - .mt-lg-3, - .my-lg-3 { - margin-top: 1rem !important; - } - .mr-lg-3, - .mx-lg-3 { - margin-right: 1rem !important; - } - .mb-lg-3, - .my-lg-3 { - margin-bottom: 1rem !important; - } - .ml-lg-3, - .mx-lg-3 { - margin-left: 1rem !important; - } - .m-lg-4 { - margin: 1.5rem !important; - } - .mt-lg-4, - .my-lg-4 { - margin-top: 1.5rem !important; - } - .mr-lg-4, - .mx-lg-4 { - margin-right: 1.5rem !important; - } - .mb-lg-4, - .my-lg-4 { - margin-bottom: 1.5rem !important; - } - .ml-lg-4, - .mx-lg-4 { - margin-left: 1.5rem !important; - } - .m-lg-5 { - margin: 3rem !important; - } - .mt-lg-5, - .my-lg-5 { - margin-top: 3rem !important; - } - .mr-lg-5, - .mx-lg-5 { - margin-right: 3rem !important; - } - .mb-lg-5, - .my-lg-5 { - margin-bottom: 3rem !important; - } - .ml-lg-5, - .mx-lg-5 { - margin-left: 3rem !important; - } - .p-lg-0 { - padding: 0 !important; - } - .pt-lg-0, - .py-lg-0 { - padding-top: 0 !important; - } - .pr-lg-0, - .px-lg-0 { - padding-right: 0 !important; - } - .pb-lg-0, - .py-lg-0 { - padding-bottom: 0 !important; - } - .pl-lg-0, - .px-lg-0 { - padding-left: 0 !important; - } - .p-lg-1 { - padding: 0.25rem !important; - } - .pt-lg-1, - .py-lg-1 { - padding-top: 0.25rem !important; - } - .pr-lg-1, - .px-lg-1 { - padding-right: 0.25rem !important; - } - .pb-lg-1, - .py-lg-1 { - padding-bottom: 0.25rem !important; - } - .pl-lg-1, - .px-lg-1 { - padding-left: 0.25rem !important; - } - .p-lg-2 { - padding: 0.5rem !important; - } - .pt-lg-2, - .py-lg-2 { - padding-top: 0.5rem !important; - } - .pr-lg-2, - .px-lg-2 { - padding-right: 0.5rem !important; - } - .pb-lg-2, - .py-lg-2 { - padding-bottom: 0.5rem !important; - } - .pl-lg-2, - .px-lg-2 { - padding-left: 0.5rem !important; - } - .p-lg-3 { - padding: 1rem !important; - } - .pt-lg-3, - .py-lg-3 { - padding-top: 1rem !important; - } - .pr-lg-3, - .px-lg-3 { - padding-right: 1rem !important; - } - .pb-lg-3, - .py-lg-3 { - padding-bottom: 1rem !important; - } - .pl-lg-3, - .px-lg-3 { - padding-left: 1rem !important; - } - .p-lg-4 { - padding: 1.5rem !important; - } - .pt-lg-4, - .py-lg-4 { - padding-top: 1.5rem !important; - } - .pr-lg-4, - .px-lg-4 { - padding-right: 1.5rem !important; - } - .pb-lg-4, - .py-lg-4 { - padding-bottom: 1.5rem !important; - } - .pl-lg-4, - .px-lg-4 { - padding-left: 1.5rem !important; - } - .p-lg-5 { - padding: 3rem !important; - } - .pt-lg-5, - .py-lg-5 { - padding-top: 3rem !important; - } - .pr-lg-5, - .px-lg-5 { - padding-right: 3rem !important; - } - .pb-lg-5, - .py-lg-5 { - padding-bottom: 3rem !important; - } - .pl-lg-5, - .px-lg-5 { - padding-left: 3rem !important; - } - .m-lg-n1 { - margin: -0.25rem !important; - } - .mt-lg-n1, - .my-lg-n1 { - margin-top: -0.25rem !important; - } - .mr-lg-n1, - .mx-lg-n1 { - margin-right: -0.25rem !important; - } - .mb-lg-n1, - .my-lg-n1 { - margin-bottom: -0.25rem !important; - } - .ml-lg-n1, - .mx-lg-n1 { - margin-left: -0.25rem !important; - } - .m-lg-n2 { - margin: -0.5rem !important; - } - .mt-lg-n2, - .my-lg-n2 { - margin-top: -0.5rem !important; - } - .mr-lg-n2, - .mx-lg-n2 { - margin-right: -0.5rem !important; - } - .mb-lg-n2, - .my-lg-n2 { - margin-bottom: -0.5rem !important; - } - .ml-lg-n2, - .mx-lg-n2 { - margin-left: -0.5rem !important; - } - .m-lg-n3 { - margin: -1rem !important; - } - .mt-lg-n3, - .my-lg-n3 { - margin-top: -1rem !important; - } - .mr-lg-n3, - .mx-lg-n3 { - margin-right: -1rem !important; - } - .mb-lg-n3, - .my-lg-n3 { - margin-bottom: -1rem !important; - } - .ml-lg-n3, - .mx-lg-n3 { - margin-left: -1rem !important; - } - .m-lg-n4 { - margin: -1.5rem !important; - } - .mt-lg-n4, - .my-lg-n4 { - margin-top: -1.5rem !important; - } - .mr-lg-n4, - .mx-lg-n4 { - margin-right: -1.5rem !important; - } - .mb-lg-n4, - .my-lg-n4 { - margin-bottom: -1.5rem !important; - } - .ml-lg-n4, - .mx-lg-n4 { - margin-left: -1.5rem !important; - } - .m-lg-n5 { - margin: -3rem !important; - } - .mt-lg-n5, - .my-lg-n5 { - margin-top: -3rem !important; - } - .mr-lg-n5, - .mx-lg-n5 { - margin-right: -3rem !important; - } - .mb-lg-n5, - .my-lg-n5 { - margin-bottom: -3rem !important; - } - .ml-lg-n5, - .mx-lg-n5 { - margin-left: -3rem !important; - } - .m-lg-auto { - margin: auto !important; - } - .mt-lg-auto, - .my-lg-auto { - margin-top: auto !important; - } - .mr-lg-auto, - .mx-lg-auto { - margin-right: auto !important; - } - .mb-lg-auto, - .my-lg-auto { - margin-bottom: auto !important; - } - .ml-lg-auto, - .mx-lg-auto { - margin-left: auto !important; - } -} - -@media (min-width: 1200px) { - .m-xl-0 { - margin: 0 !important; - } - .mt-xl-0, - .my-xl-0 { - margin-top: 0 !important; - } - .mr-xl-0, - .mx-xl-0 { - margin-right: 0 !important; - } - .mb-xl-0, - .my-xl-0 { - margin-bottom: 0 !important; - } - .ml-xl-0, - .mx-xl-0 { - margin-left: 0 !important; - } - .m-xl-1 { - margin: 0.25rem !important; - } - .mt-xl-1, - .my-xl-1 { - margin-top: 0.25rem !important; - } - .mr-xl-1, - .mx-xl-1 { - margin-right: 0.25rem !important; - } - .mb-xl-1, - .my-xl-1 { - margin-bottom: 0.25rem !important; - } - .ml-xl-1, - .mx-xl-1 { - margin-left: 0.25rem !important; - } - .m-xl-2 { - margin: 0.5rem !important; - } - .mt-xl-2, - .my-xl-2 { - margin-top: 0.5rem !important; - } - .mr-xl-2, - .mx-xl-2 { - margin-right: 0.5rem !important; - } - .mb-xl-2, - .my-xl-2 { - margin-bottom: 0.5rem !important; - } - .ml-xl-2, - .mx-xl-2 { - margin-left: 0.5rem !important; - } - .m-xl-3 { - margin: 1rem !important; - } - .mt-xl-3, - .my-xl-3 { - margin-top: 1rem !important; - } - .mr-xl-3, - .mx-xl-3 { - margin-right: 1rem !important; - } - .mb-xl-3, - .my-xl-3 { - margin-bottom: 1rem !important; - } - .ml-xl-3, - .mx-xl-3 { - margin-left: 1rem !important; - } - .m-xl-4 { - margin: 1.5rem !important; - } - .mt-xl-4, - .my-xl-4 { - margin-top: 1.5rem !important; - } - .mr-xl-4, - .mx-xl-4 { - margin-right: 1.5rem !important; - } - .mb-xl-4, - .my-xl-4 { - margin-bottom: 1.5rem !important; - } - .ml-xl-4, - .mx-xl-4 { - margin-left: 1.5rem !important; - } - .m-xl-5 { - margin: 3rem !important; - } - .mt-xl-5, - .my-xl-5 { - margin-top: 3rem !important; - } - .mr-xl-5, - .mx-xl-5 { - margin-right: 3rem !important; - } - .mb-xl-5, - .my-xl-5 { - margin-bottom: 3rem !important; - } - .ml-xl-5, - .mx-xl-5 { - margin-left: 3rem !important; - } - .p-xl-0 { - padding: 0 !important; - } - .pt-xl-0, - .py-xl-0 { - padding-top: 0 !important; - } - .pr-xl-0, - .px-xl-0 { - padding-right: 0 !important; - } - .pb-xl-0, - .py-xl-0 { - padding-bottom: 0 !important; - } - .pl-xl-0, - .px-xl-0 { - padding-left: 0 !important; - } - .p-xl-1 { - padding: 0.25rem !important; - } - .pt-xl-1, - .py-xl-1 { - padding-top: 0.25rem !important; - } - .pr-xl-1, - .px-xl-1 { - padding-right: 0.25rem !important; - } - .pb-xl-1, - .py-xl-1 { - padding-bottom: 0.25rem !important; - } - .pl-xl-1, - .px-xl-1 { - padding-left: 0.25rem !important; - } - .p-xl-2 { - padding: 0.5rem !important; - } - .pt-xl-2, - .py-xl-2 { - padding-top: 0.5rem !important; - } - .pr-xl-2, - .px-xl-2 { - padding-right: 0.5rem !important; - } - .pb-xl-2, - .py-xl-2 { - padding-bottom: 0.5rem !important; - } - .pl-xl-2, - .px-xl-2 { - padding-left: 0.5rem !important; - } - .p-xl-3 { - padding: 1rem !important; - } - .pt-xl-3, - .py-xl-3 { - padding-top: 1rem !important; - } - .pr-xl-3, - .px-xl-3 { - padding-right: 1rem !important; - } - .pb-xl-3, - .py-xl-3 { - padding-bottom: 1rem !important; - } - .pl-xl-3, - .px-xl-3 { - padding-left: 1rem !important; - } - .p-xl-4 { - padding: 1.5rem !important; - } - .pt-xl-4, - .py-xl-4 { - padding-top: 1.5rem !important; - } - .pr-xl-4, - .px-xl-4 { - padding-right: 1.5rem !important; - } - .pb-xl-4, - .py-xl-4 { - padding-bottom: 1.5rem !important; - } - .pl-xl-4, - .px-xl-4 { - padding-left: 1.5rem !important; - } - .p-xl-5 { - padding: 3rem !important; - } - .pt-xl-5, - .py-xl-5 { - padding-top: 3rem !important; - } - .pr-xl-5, - .px-xl-5 { - padding-right: 3rem !important; - } - .pb-xl-5, - .py-xl-5 { - padding-bottom: 3rem !important; - } - .pl-xl-5, - .px-xl-5 { - padding-left: 3rem !important; - } - .m-xl-n1 { - margin: -0.25rem !important; - } - .mt-xl-n1, - .my-xl-n1 { - margin-top: -0.25rem !important; - } - .mr-xl-n1, - .mx-xl-n1 { - margin-right: -0.25rem !important; - } - .mb-xl-n1, - .my-xl-n1 { - margin-bottom: -0.25rem !important; - } - .ml-xl-n1, - .mx-xl-n1 { - margin-left: -0.25rem !important; - } - .m-xl-n2 { - margin: -0.5rem !important; - } - .mt-xl-n2, - .my-xl-n2 { - margin-top: -0.5rem !important; - } - .mr-xl-n2, - .mx-xl-n2 { - margin-right: -0.5rem !important; - } - .mb-xl-n2, - .my-xl-n2 { - margin-bottom: -0.5rem !important; - } - .ml-xl-n2, - .mx-xl-n2 { - margin-left: -0.5rem !important; - } - .m-xl-n3 { - margin: -1rem !important; - } - .mt-xl-n3, - .my-xl-n3 { - margin-top: -1rem !important; - } - .mr-xl-n3, - .mx-xl-n3 { - margin-right: -1rem !important; - } - .mb-xl-n3, - .my-xl-n3 { - margin-bottom: -1rem !important; - } - .ml-xl-n3, - .mx-xl-n3 { - margin-left: -1rem !important; - } - .m-xl-n4 { - margin: -1.5rem !important; - } - .mt-xl-n4, - .my-xl-n4 { - margin-top: -1.5rem !important; - } - .mr-xl-n4, - .mx-xl-n4 { - margin-right: -1.5rem !important; - } - .mb-xl-n4, - .my-xl-n4 { - margin-bottom: -1.5rem !important; - } - .ml-xl-n4, - .mx-xl-n4 { - margin-left: -1.5rem !important; - } - .m-xl-n5 { - margin: -3rem !important; - } - .mt-xl-n5, - .my-xl-n5 { - margin-top: -3rem !important; - } - .mr-xl-n5, - .mx-xl-n5 { - margin-right: -3rem !important; - } - .mb-xl-n5, - .my-xl-n5 { - margin-bottom: -3rem !important; - } - .ml-xl-n5, - .mx-xl-n5 { - margin-left: -3rem !important; - } - .m-xl-auto { - margin: auto !important; - } - .mt-xl-auto, - .my-xl-auto { - margin-top: auto !important; - } - .mr-xl-auto, - .mx-xl-auto { - margin-right: auto !important; - } - .mb-xl-auto, - .my-xl-auto { - margin-bottom: auto !important; - } - .ml-xl-auto, - .mx-xl-auto { - margin-left: auto !important; - } -} -/*# sourceMappingURL=bootstrap-grid.css.map */ \ No newline at end of file diff --git a/_Resources/node_modules/web-dev-utils/bootstrap-4.3.1-dist/css/bootstrap-grid.css.map b/_Resources/node_modules/web-dev-utils/bootstrap-4.3.1-dist/css/bootstrap-grid.css.map deleted file mode 100644 index db62f2f..0000000 --- a/_Resources/node_modules/web-dev-utils/bootstrap-4.3.1-dist/css/bootstrap-grid.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../../scss/bootstrap-grid.scss","bootstrap-grid.css","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_breakpoints.scss","../../scss/_variables.scss","../../scss/mixins/_grid-framework.scss","../../scss/utilities/_display.scss","../../scss/utilities/_flex.scss","../../scss/utilities/_spacing.scss"],"names":[],"mappings":"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vBQ;IHTR,gBAA8C;EF4vB9C;EKnvBQ;IHTR,uBAA8C;EF+vB9C;EKtvBQ;IHTR,uBAA8C;EFkwB9C;EKzvBQ;IHTR,gBAA8C;EFqwB9C;EK5vBQ;IHTR,uBAA8C;EFwwB9C;EK/vBQ;IHTR,uBAA8C;EF2wB9C;AACF;;AMlzBM;EAAwB,wBAA0B;ANszBxD;;AMtzBM;EAAwB,0BAA0B;AN0zBxD;;AM1zBM;EAAwB,gCAA0B;AN8zBxD;;AM9zBM;EAAwB,yBAA0B;ANk0BxD;;AMl0BM;EAAwB,yBAA0B;ANs0BxD;;AMt0BM;EAAwB,6BAA0B;AN00BxD;;AM10BM;EAAwB,8BAA0B;AN80BxD;;AM90BM;EAAwB,+BAA0B;EAA1B,wBAA0B;ANk1BxD;;AMl1BM;EAAwB,sCAA0B;EAA1B,+BAA0B;ANs1BxD;;AGryBI;EGjDE;IAAwB,wBAA0B;EN21BtD;EM31BI;IAAwB,0BAA0B;EN81BtD;EM91BI;IAAwB,gCAA0B;ENi2BtD;EMj2BI;IAAwB,yBAA0B;ENo2BtD;EMp2BI;IAAwB,yBAA0B;ENu2BtD;EMv2BI;IAAwB,6BAA0B;EN02BtD;EM12BI;IAAwB,8BAA0B;EN62BtD;EM72BI;IAAwB,+BAA0B;IAA1B,wBAA0B;ENg3BtD;EMh3BI;IAAwB,sCAA0B;IAA1B,+BAA0B;ENm3BtD;AACF;;AGn0BI;EGjDE;IAAwB,wBAA0B;ENy3BtD;EMz3BI;IAAwB,0BAA0B;EN43BtD;EM53BI;IAAwB,gCAA0B;EN+3BtD;EM/3BI;IAAwB,yBAA0B;ENk4BtD;EMl4BI;IAAwB,yBAA0B;ENq4BtD;EMr4BI;IAAwB,6BAA0B;ENw4BtD;EMx4BI;IAAwB,8BAA0B;EN24BtD;EM34BI;IAAwB,+BAA0B;IAA1B,wBAA0B;EN84BtD;EM94BI;IAAwB,sCAA0B;IAA1B,+BAA0B;ENi5BtD;AACF;;AGj2BI;EGjDE;IAAwB,wBAA0B;ENu5BtD;EMv5BI;IAAwB,0BAA0B;EN05BtD;EM15BI;IAAwB,gCAA0B;EN65BtD;EM75BI;IAAwB,yBAA0B;ENg6BtD;EMh6BI;IAAwB,yBAA0B;ENm6BtD;EMn6BI;IAAwB,6BAA0B;EN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AEE,+BAAwC;ARgoDlD;;AQ9nDQ;;EAEE,gCAA0C;ARioDpD;;AQ/nDQ;;EAEE,8BAAsC;ARkoDhD;;AQjpDQ;EAAgC,uBAA4B;ARqpDpE;;AQppDQ;;EAEE,2BAAoC;ARupD9C;;AQrpDQ;;EAEE,6BAAwC;ARwpDlD;;AQtpDQ;;EAEE,8BAA0C;ARypDpD;;AQvpDQ;;EAEE,4BAAsC;AR0pDhD;;AQzqDQ;EAAgC,qBAA4B;AR6qDpE;;AQ5qDQ;;EAEE,yBAAoC;AR+qD9C;;AQ7qDQ;;EAEE,2BAAwC;ARgrDlD;;AQ9qDQ;;EAEE,4BAA0C;ARirDpD;;AQ/qDQ;;EAEE,0BAAsC;ARkrDhD;;AQjsDQ;EAAgC,2BAA4B;ARqsDpE;;AQpsDQ;;EAEE,+BAAoC;ARusD9C;;AQrsDQ;;EAEE,iCAAwC;ARwsDlD;;AQtsDQ;;EAEE,kCAA0C;ARysDpD;;AQvsDQ;;EAEE,gCAAsC;AR0sDhD;;AQztDQ;EAAgC,0BAA4B;AR6tDpE;;AQ5tDQ;;EAEE,8BAAoC;AR+tD9C;;AQ7tDQ;;EAEE,gCAAwC;ARguDlD;;AQ9tDQ;;EAEE,iCAA0C;ARiuDpD;;AQ/tDQ;;EAEE,+BAAsC;ARkuDhD;;AQjvDQ;EAAgC,wBAA4B;ARqvDpE;;AQpvDQ;;EAEE,4BAAoC;ARuvD9C;;AQrvDQ;;EAEE,8BAAwC;ARwvDlD;;AQtvDQ;;EAEE,+BAA0C;ARyvDpD;;AQvvDQ;;EAEE,6BAAsC;AR0vDhD;;AQzwDQ;EAAgC,0BAA4B;AR6wDpE;;AQ5wDQ;;EAEE,8BAAoC;AR+wD9C;;AQ7wDQ;;EAEE,gCAAwC;ARgxDlD;;AQ9wDQ;;EAEE,iCAA0C;ARixDpD;;AQ/wDQ;;EAEE,+BAAsC;ARkxDhD;;AQjyDQ;EAAgC,wBAA4B;ARqyDpE;;AQpyDQ;;EAEE,4BAAoC;ARuyD9C;;AQryDQ;;EAEE,8BAAwC;ARwyDlD;;AQtyDQ;;EAEE,+BAA0C;ARyyDpD;;AQvyDQ;;EAEE,6BAAsC;AR0yDhD;;AQlyDQ;EAAwB,2BAA2B;ARsyD3D;;AQryDQ;;EAEE,+BAA+B;ARwyDzC;;AQtyDQ;;EAEE,iCAAiC;ARyyD3C;;AQvyDQ;;EAEE,kCAAkC;AR0yD5C;;AQxyDQ;;EAEE,gCAAgC;AR2yD1C;;AQ1zDQ;EAAwB,0BAA2B;AR8zD3D;;AQ7zDQ;;EAEE,8BAA+B;ARg0DzC;;AQ9zDQ;;EAEE,gCAAiC;ARi0D3C;;AQ/zDQ;;EAEE,iCAAkC;ARk0D5C;;AQh0DQ;;EAEE,+BAAgC;ARm0D1C;;AQl1DQ;EAAwB,wBAA2B;ARs1D3D;;AQr1DQ;;EAEE,4BAA+B;ARw1DzC;;AQt1DQ;;EAEE,8BAAiC;ARy1D3C;;AQv1DQ;;EAEE,+BAAkC;AR01D5C;;AQx1DQ;;EAEE,6BAAgC;AR21D1C;;AQ12DQ;EAAwB,0BAA2B;AR82D3D;;AQ72DQ;;EAEE,8BAA+B;ARg3DzC;;AQ92DQ;;EAEE,gCAAiC;ARi3D3C;;AQ/2DQ;;EAEE,iCAAkC;ARk3D5C;;AQh3DQ;;EAEE,+BAAgC;ARm3D1C;;AQl4DQ;EAAwB,wBAA2B;ARs4D3D;;AQr4DQ;;EAEE,4BAA+B;ARw4DzC;;AQt4DQ;;EAEE,8BAAiC;ARy4D3C;;AQv4DQ;;EAEE,+BAAkC;AR04D5C;;AQx4DQ;;EAEE,6BAAgC;AR24D1C;;AQr4DI;EAAmB,uBAAuB;ARy4D9C;;AQx4DI;;EAEE,2BAA2B;AR24DjC;;AQz4DI;;EAEE,6BAA6B;AR44DnC;;AQ14DI;;EAEE,8BAA8B;AR64DpC;;AQ34DI;;EAEE,4BAA4B;AR84DlC;;AGv5DI;EKlDI;IAAgC,oBAA4B;ER88DlE;EQ78DM;;IAEE,wBAAoC;ER+8D5C;EQ78DM;;IAEE,0BAAwC;ER+8DhD;EQ78DM;;IAEE,2BAA0C;ER+8DlD;EQ78DM;;IAEE,yBAAsC;ER+8D9C;EQ99DM;IAAgC,0BAA4B;ERi+DlE;EQh+DM;;IAEE,8BAAoC;ERk+D5C;EQh+DM;;IAEE,gCAAwC;ERk+DhD;EQh+DM;;IAEE,iCAA0C;ERk+DlD;EQh+DM;;IAEE,+BAAsC;ERk+D9C;EQj/DM;IAAgC,yBAA4B;ERo/DlE;EQn/DM;;IAEE,6BAAoC;ERq/D5C;EQn/DM;;IAEE,+BAAwC;ERq/DhD;EQn/DM;;IAEE,gCAA0C;ERq/DlD;EQn/DM;;IAEE,8BAAsC;ERq/D9C;EQpgEM;IAAgC,uBAA4B;ERugElE;EQtgEM;;IAEE,2BAAoC;ERwgE5C;EQtgEM;;IAEE,6BAAwC;ERwgEhD;EQtgEM;;IAEE,8BAA0C;ERwgElD;EQtgEM;;IAEE,4BAAsC;ERwgE9C;EQvhEM;IAAgC,yBAA4B;ER0hElE;EQzhEM;;IAEE,6BAAoC;ER2hE5C;EQzhEM;;IAEE,+BAAwC;ER2hEhD;EQzhEM;;IAEE,gCAA0C;ER2hElD;EQzhEM;;IAEE,8BAAsC;ER2hE9C;EQ1iEM;IAAgC,uBAA4B;ER6iElE;EQ5iEM;;IAEE,2BAAoC;ER8iE5C;EQ5iEM;;IAEE,6BAAwC;ER8iEhD;EQ5iEM;;IAEE,8BAA0C;ER8iElD;EQ5iEM;;IAEE,4BAAsC;ER8iE9C;EQ7jEM;IAAgC,qBAA4B;ERgkElE;EQ/jEM;;IAEE,yBAAoC;ERikE5C;EQ/jEM;;IAEE,2BAAwC;ERikEhD;EQ/jEM;;IAEE,4BAA0C;ERikElD;EQ/jEM;;IAEE,0BAAsC;ERikE9C;EQhlEM;IAAgC,2BAA4B;ERmlElE;EQllEM;;IAEE,+BAAoC;ERolE5C;EQllEM;;IAEE,iCAAwC;ERolEhD;EQllEM;;IAEE,kCAA0C;ERolElD;EQllEM;;IAEE,gCAAsC;ERolE9C;EQnmEM;IAAgC,0BAA4B;ERsmElE;EQrmEM;;IAEE,8BAAoC;ERumE5C;EQrmEM;;IAEE,gCAAwC;ERumEhD;EQrmEM;;IAEE,iCAA0C;ERumElD;EQrmEM;;IAEE,+BAAsC;ERumE9C;EQtnEM;IAAgC,wBAA4B;ERynElE;EQxnEM;;IAEE,4BAAoC;ER0nE5C;EQxnEM;;IAEE,8BAAwC;ER0nEhD;EQxnEM;;IAEE,+BAA0C;ER0nElD;EQxnEM;;IAEE,6BAAsC;ER0nE9C;EQzoEM;IAAgC,0BAA4B;ER4oElE;EQ3oEM;;IAEE,8BAAoC;ER6oE5C;EQ3oEM;;IAEE,gCAAwC;ER6oEhD;EQ3oEM;;IAEE,iCAA0C;ER6oElD;EQ3oEM;;IAEE,+BAAsC;ER6oE9C;EQ5pEM;IAAgC,wBAA4B;ER+pElE;EQ9pEM;;IAEE,4BAAoC;ERgqE5C;EQ9pEM;;IAEE,8BAAwC;ERgqEhD;EQ9pEM;;IAEE,+BAA0C;ERgqElD;EQ9pEM;;IAEE,6BAAsC;ERgqE9C;EQxpEM;IAAwB,2BAA2B;ER2pEzD;EQ1pEM;;IAEE,+BAA+B;ER4pEvC;EQ1pEM;;IAEE,iCAAiC;ER4pEzC;EQ1pEM;;IAEE,kCAAkC;ER4pE1C;EQ1pEM;;IAEE,gCAAgC;ER4pExC;EQ3qEM;IAAwB,0BAA2B;ER8qEzD;EQ7qEM;;IAEE,8BAA+B;ER+qEvC;EQ7qEM;;IAEE,gCAAiC;ER+qEzC;EQ7qEM;;IAEE,iCAAkC;ER+qE1C;EQ7qEM;;IAEE,+BAAgC;ER+qExC;EQ9rEM;IAAwB,wBAA2B;ERisEzD;EQhsEM;;IAEE,4BAA+B;ERksEvC;EQhsEM;;IAEE,8BAAiC;ERksEzC;EQhsEM;;IAEE,+BAAkC;ERksE1C;EQhsEM;;IAEE,6BAAgC;ERksExC;EQjtEM;IAAwB,0BAA2B;ERotEzD;EQntEM;;IAEE,8BAA+B;ERqtEvC;EQntEM;;IAEE,gCAAiC;ERqtEzC;EQntEM;;IAEE,iCAAkC;ERqtE1C;EQntEM;;IAEE,+BAAgC;ERqtExC;EQpuEM;IAAwB,wBAA2B;ERuuEzD;EQtuEM;;IAEE,4BAA+B;ERwuEvC;EQtuEM;;IAEE,8BAAiC;ERwuEzC;EQtuEM;;IAEE,+BAAkC;ERwuE1C;EQtuEM;;IAEE,6BAAgC;ERwuExC;EQluEE;IAAmB,uBAAuB;ERquE5C;EQpuEE;;IAEE,2BAA2B;ERsuE/B;EQpuEE;;IAEE,6BAA6B;ERsuEjC;EQpuEE;;IAEE,8BAA8B;ERsuElC;EQpuEE;;IAEE,4BAA4B;ERsuEhC;AACF;;AGhvEI;EKlDI;IAAgC,oBAA4B;ERuyElE;EQtyEM;;IAEE,wBAAoC;ERwyE5C;EQtyEM;;IAEE,0BAAwC;ERwyEhD;EQtyEM;;IAEE,2BAA0C;ERwyElD;EQtyEM;;IAEE,yBAAsC;ERwyE9C;EQvzEM;IAAgC,0BAA4B;ER0zElE;EQzzEM;;IAEE,8BAAoC;ER2zE5C;EQzzEM;;IAEE,gCAAwC;ER2zEhD;EQzzEM;;IAEE,iCAA0C;ER2zElD;EQzzEM;;IAEE,+BAAsC;ER2zE9C;EQ10EM;IAAgC,yBAA4B;ER60ElE;EQ50EM;;IAEE,6BAAoC;ER80E5C;EQ50EM;;IAEE,+BAAwC;ER80EhD;EQ50EM;;IAEE,gCAA0C;ER80ElD;EQ50EM;;IAEE,8BAAsC;ER80E9C;EQ71EM;IAAgC,uBAA4B;ERg2ElE;EQ/1EM;;IAEE,2BAAoC;ERi2E5C;EQ/1EM;;IAEE,6BAAwC;ERi2EhD;EQ/1EM;;IAEE,8BAA0C;ERi2ElD;EQ/1EM;;IAEE,4BAAsC;ERi2E9C;EQh3EM;IAAgC,yBAA4B;ERm3ElE;EQl3EM;;IAEE,6BAAoC;ERo3E5C;EQl3EM;;IAEE,+BAAwC;ERo3EhD;EQl3EM;;IAEE,gCAA0C;ERo3ElD;EQl3EM;;IAEE,8BAAsC;ERo3E9C;EQn4EM;IAAgC,uBAA4B;ERs4ElE;EQr4EM;;IAEE,2BAAoC;ERu4E5C;EQr4EM;;IAEE,6BAAwC;ERu4EhD;EQr4EM;;IAEE,8BAA0C;ERu4ElD;EQr4EM;;IAEE,4BAAsC;ERu4E9C;EQt5EM;IAAgC,qBAA4B;ERy5ElE;EQx5EM;;IAEE,yBAAoC;ER05E5C;EQx5EM;;IAEE,2BAAwC;ER05EhD;EQx5EM;;IAEE,4BAA0C;ER05ElD;EQx5EM;;IAEE,0BAAsC;ER05E9C;EQz6EM;IAAgC,2BAA4B;ER46ElE;EQ36EM;;IAEE,+BAAoC;ER66E5C;EQ36EM;;IAEE,iCAAwC;ER66EhD;EQ36EM;;IAEE,kCAA0C;ER66ElD;EQ36EM;;IAEE,gCAAsC;ER66E9C;EQ57EM;IAAgC,0BAA4B;ER+7ElE;EQ97EM;;IAEE,8BAAoC;ERg8E5C;EQ97EM;;IAEE,gCAAwC;ERg8EhD;EQ97EM;;IAEE,iCAA0C;ERg8ElD;EQ97EM;;IAEE,+BAAsC;ERg8E9C;EQ/8EM;IAAgC,wBAA4B;ERk9ElE;EQj9EM;;IAEE,4BAAoC;ERm9E5C;EQj9EM;;IAEE,8BAAwC;ERm9EhD;EQj9EM;;IAEE,+BAA0C;ERm9ElD;EQj9EM;;IAEE,6BAAsC;ERm9E9C;EQl+EM;IAAgC,0BAA4B;ERq+ElE;EQp+EM;;IAEE,8BAAoC;ERs+E5C;EQp+EM;;IAEE,gCAAwC;ERs+EhD;EQp+EM;;IAEE,iCAA0C;ERs+ElD;EQp+EM;;IAEE,+BAAsC;ERs+E9C;EQr/EM;IAAgC,wBAA4B;ERw/ElE;EQv/EM;;IAEE,4BAAoC;ERy/E5C;EQv/EM;;IAEE,8BAAwC;ERy/EhD;EQv/EM;;IAEE,+BAA0C;ERy/ElD;EQv/EM;;IAEE,6BAAsC;ERy/E9C;EQj/EM;IAAwB,2BAA2B;ERo/EzD;EQn/EM;;IAEE,+BAA+B;ERq/EvC;EQn/EM;;IAEE,iCAAiC;ERq/EzC;EQn/EM;;IAEE,kCAAkC;ERq/E1C;EQn/EM;;IAEE,gCAAgC;ERq/ExC;EQpgFM;IAAwB,0BAA2B;ERugFzD;EQtgFM;;IAEE,8BAA+B;ERwgFvC;EQtgFM;;IAEE,gCAAiC;ERwgFzC;EQtgFM;;IAEE,iCAAkC;ERwgF1C;EQtgFM;;IAEE,+BAAgC;ERwgFxC;EQvhFM;IAAwB,wBAA2B;ER0hFzD;EQzhFM;;IAEE,4BAA+B;ER2hFvC;EQzhFM;;IAEE,8BAAiC;ER2hFzC;EQzhFM;;IAEE,+BAAkC;ER2hF1C;EQzhFM;;IAEE,6BAAgC;ER2hFxC;EQ1iFM;IAAwB,0BAA2B;ER6iFzD;EQ5iFM;;IAEE,8BAA+B;ER8iFvC;EQ5iFM;;IAEE,gCAAiC;ER8iFzC;EQ5iFM;;IAEE,iCAAkC;ER8iF1C;EQ5iFM;;IAEE,+BAAgC;ER8iFxC;EQ7jFM;IAAwB,wBAA2B;ERgkFzD;EQ/jFM;;IAEE,4BAA+B;ERikFvC;EQ/jFM;;IAEE,8BAAiC;ERikFzC;EQ/jFM;;IAEE,+BAAkC;ERikF1C;EQ/jFM;;IAEE,6BAAgC;ERikFxC;EQ3jFE;IAAmB,uBAAuB;ER8jF5C;EQ7jFE;;IAEE,2BAA2B;ER+jF/B;EQ7jFE;;IAEE,6BAA6B;ER+jFjC;EQ7jFE;;IAEE,8BAA8B;ER+jFlC;EQ7jFE;;IAEE,4BAA4B;ER+jFhC;AACF;;AGzkFI;EKlDI;IAAgC,oBAA4B;ERgoFlE;EQ/nFM;;IAEE,wBAAoC;ERioF5C;EQ/nFM;;IAEE,0BAAwC;ERioFhD;EQ/nFM;;IAEE,2BAA0C;ERioFlD;EQ/nFM;;IAEE,yBAAsC;ERioF9C;EQhpFM;IAAgC,0BAA4B;ERmpFlE;EQlpFM;;IAEE,8BAAoC;ERopF5C;EQlpFM;;IAEE,gCAAwC;ERopFhD;EQlpFM;;IAEE,iCAA0C;ERopFlD;EQlpFM;;IAEE,+BAAsC;ERopF9C;EQnqFM;IAAgC,yBAA4B;ERsqFlE;EQrqFM;;IAEE,6BAAoC;ERuqF5C;EQrqFM;;IAEE,+BAAwC;ERuqFhD;EQrqFM;;IAEE,gCAA0C;ERuqFlD;EQrqFM;;IAEE,8BAAsC;ERuqF9C;EQtrFM;IAAgC,uBAA4B;ERyrFlE;EQxrFM;;IAEE,2BAAoC;ER0rF5C;EQxrFM;;IAEE,6BAAwC;ER0rFhD;EQxrFM;;IAEE,8BAA0C;ER0rFlD;EQxrFM;;IAEE,4BAAsC;ER0rF9C;EQzsFM;IAAgC,yBAA4B;ER4sFlE;EQ3sFM;;IAEE,6BAAoC;ER6sF5C;EQ3sFM;;IAEE,+BAAwC;ER6sFhD;EQ3sFM;;IAEE,gCAA0C;ER6sFlD;EQ3sFM;;IAEE,8BAAsC;ER6sF9C;EQ5tFM;IAAgC,uBAA4B;ER+tFlE;EQ9tFM;;IAEE,2BAAoC;ERguF5C;EQ9tFM;;IAEE,6BAAwC;ERguFhD;EQ9tFM;;IAEE,8BAA0C;ERguFlD;EQ9tFM;;IAEE,4BAAsC;ERguF9C;EQ/uFM;IAAgC,qBAA4B;ERkvFlE;EQjvFM;;IAEE,yBAAoC;ERmvF5C;EQjvFM;;IAEE,2BAAwC;ERmvFhD;EQjvFM;;IAEE,4BAA0C;ERmvFlD;EQjvFM;;IAEE,0BAAsC;ERmvF9C;EQlwFM;IAAgC,2BAA4B;ERqwFlE;EQpwFM;;IAEE,+BAAoC;ERswF5C;EQpwFM;;IAEE,iCAAwC;ERswFhD;EQpwFM;;IAEE,kCAA0C;ERswFlD;EQpwFM;;IAEE,gCAAsC;ERswF9C;EQrxFM;IAAgC,0BAA4B;ERwxFlE;EQvxFM;;IAEE,8BAAoC;ERyxF5C;EQvxFM;;IAEE,gCAAwC;ERyxFhD;EQvxFM;;IAEE,iCAA0C;ERyxFlD;EQvxFM;;IAEE,+BAAsC;ERyxF9C;EQxyFM;IAAgC,wBAA4B;ER2yFlE;EQ1yFM;;IAEE,4BAAoC;ER4yF5C;EQ1yFM;;IAEE,8BAAwC;ER4yFhD;EQ1yFM;;IAEE,+BAA0C;ER4yFlD;EQ1yFM;;IAEE,6BAAsC;ER4yF9C;EQ3zFM;IAAgC,0BAA4B;ER8zFlE;EQ7zFM;;IAEE,8BAAoC;ER+zF5C;EQ7zFM;;IAEE,gCAAwC;ER+zFhD;EQ7zFM;;IAEE,iCAA0C;ER+zFlD;EQ7zFM;;IAEE,+BAAsC;ER+zF9C;EQ90FM;IAAgC,wBAA4B;ERi1FlE;EQh1FM;;IAEE,4BAAoC;ERk1F5C;EQh1FM;;IAEE,8BAAwC;ERk1FhD;EQh1FM;;IAEE,+BAA0C;ERk1FlD;EQh1FM;;IAEE,6BAAsC;ERk1F9C;EQ10FM;IAAwB,2BAA2B;ER60FzD;EQ50FM;;IAEE,+BAA+B;ER80FvC;EQ50FM;;IAEE,iCAAiC;ER80FzC;EQ50FM;;IAEE,kCAAkC;ER80F1C;EQ50FM;;IAEE,gCAAgC;ER80FxC;EQ71FM;IAAwB,0BAA2B;ERg2FzD;EQ/1FM;;IAEE,8BAA+B;ERi2FvC;EQ/1FM;;IAEE,gCAAiC;ERi2FzC;EQ/1FM;;IAEE,iCAAkC;ERi2F1C;EQ/1FM;;IAEE,+BAAgC;ERi2FxC;EQh3FM;IAAwB,wBAA2B;ERm3FzD;EQl3FM;;IAEE,4BAA+B;ERo3FvC;EQl3FM;;IAEE,8BAAiC;ERo3FzC;EQl3FM;;IAEE,+BAAkC;ERo3F1C;EQl3FM;;IAEE,6BAAgC;ERo3FxC;EQn4FM;IAAwB,0BAA2B;ERs4FzD;EQr4FM;;IAEE,8BAA+B;ERu4FvC;EQr4FM;;IAEE,gCAAiC;ERu4FzC;EQr4FM;;IAEE,iCAAkC;ERu4F1C;EQr4FM;;IAEE,+BAAgC;ERu4FxC;EQt5FM;IAAwB,wBAA2B;ERy5FzD;EQx5FM;;IAEE,4BAA+B;ER05FvC;EQx5FM;;IAEE,8BAAiC;ER05FzC;EQx5FM;;IAEE,+BAAkC;ER05F1C;EQx5FM;;IAEE,6BAAgC;ER05FxC;EQp5FE;IAAmB,uBAAuB;ERu5F5C;EQt5FE;;IAEE,2BAA2B;ERw5F/B;EQt5FE;;IAEE,6BAA6B;ERw5FjC;EQt5FE;;IAEE,8BAA8B;ERw5FlC;EQt5FE;;IAEE,4BAA4B;ERw5FhC;AACF;;AGl6FI;EKlDI;IAAgC,oBAA4B;ERy9FlE;EQx9FM;;IAEE,wBAAoC;ER09F5C;EQx9FM;;IAEE,0BAAwC;ER09FhD;EQx9FM;;IAEE,2BAA0C;ER09FlD;EQx9FM;;IAEE,yBAAsC;ER09F9C;EQz+FM;IAAgC,0BAA4B;ER4+FlE;EQ3+FM;;IAEE,8BAAoC;ER6+F5C;EQ3+FM;;IAEE,gCAAwC;ER6+FhD;EQ3+FM;;IAEE,iCAA0C;ER6+FlD;EQ3+FM;;IAEE,+BAAsC;ER6+F9C;EQ5/FM;IAAgC,yBAA4B;ER+/FlE;EQ9/FM;;IAEE,6BAAoC;ERggG5C;EQ9/FM;;IAEE,+BAAwC;ERggGhD;EQ9/FM;;IAEE,gCAA0C;ERggGlD;EQ9/FM;;IAEE,8BAAsC;ERggG9C;EQ/gGM;IAAgC,uBAA4B;ERkhGlE;EQjhGM;;IAEE,2BAAoC;ERmhG5C;EQjhGM;;IAEE,6BAAwC;ERmhGhD;EQjhGM;;IAEE,8BAA0C;ERmhGlD;EQjhGM;;IAEE,4BAAsC;ERmhG9C;EQliGM;IAAgC,yBAA4B;ERqiGlE;EQpiGM;;IAEE,6BAAoC;ERsiG5C;EQpiGM;;IAEE,+BAAwC;ERsiGhD;EQpiGM;;IAEE,gCAA0C;ERsiGlD;EQpiGM;;IAEE,8BAAsC;ERsiG9C;EQrjGM;IAAgC,uBAA4B;ERwjGlE;EQvjGM;;IAEE,2BAAoC;ERyjG5C;EQvjGM;;IAEE,6BAAwC;ERyjGhD;EQvjGM;;IAEE,8BAA0C;ERyjGlD;EQvjGM;;IAEE,4BAAsC;ERyjG9C;EQxkGM;IAAgC,qBAA4B;ER2kGlE;EQ1kGM;;IAEE,yBAAoC;ER4kG5C;EQ1kGM;;IAEE,2BAAwC;ER4kGhD;EQ1kGM;;IAEE,4BAA0C;ER4kGlD;EQ1kGM;;IAEE,0BAAsC;ER4kG9C;EQ3lGM;IAAgC,2BAA4B;ER8lGlE;EQ7lGM;;IAEE,+BAAoC;ER+lG5C;EQ7lGM;;IAEE,iCAAwC;ER+lGhD;EQ7lGM;;IAEE,kCAA0C;ER+lGlD;EQ7lGM;;IAEE,gCAAsC;ER+lG9C;EQ9mGM;IAAgC,0BAA4B;ERinGlE;EQhnGM;;IAEE,8BAAoC;ERknG5C;EQhnGM;;IAEE,gCAAwC;ERknGhD;EQhnGM;;IAEE,iCAA0C;ERknGlD;EQhnGM;;IAEE,+BAAsC;ERknG9C;EQjoGM;IAAgC,wBAA4B;ERooGlE;EQnoGM;;IAEE,4BAAoC;ERqoG5C;EQnoGM;;IAEE,8BAAwC;ERqoGhD;EQnoGM;;IAEE,+BAA0C;ERqoGlD;EQnoGM;;IAEE,6BAAsC;ERqoG9C;EQppGM;IAAgC,0BAA4B;ERupGlE;EQtpGM;;IAEE,8BAAoC;ERwpG5C;EQtpGM;;IAEE,gCAAwC;ERwpGhD;EQtpGM;;IAEE,iCAA0C;ERwpGlD;EQtpGM;;IAEE,+BAAsC;ERwpG9C;EQvqGM;IAAgC,wBAA4B;ER0qGlE;EQzqGM;;IAEE,4BAAoC;ER2qG5C;EQzqGM;;IAEE,8BAAwC;ER2qGhD;EQzqGM;;IAEE,+BAA0C;ER2qGlD;EQzqGM;;IAEE,6BAAsC;ER2qG9C;EQnqGM;IAAwB,2BAA2B;ERsqGzD;EQrqGM;;IAEE,+BAA+B;ERuqGvC;EQrqGM;;IAEE,iCAAiC;ERuqGzC;EQrqGM;;IAEE,kCAAkC;ERuqG1C;EQrqGM;;IAEE,gCAAgC;ERuqGxC;EQtrGM;IAAwB,0BAA2B;ERyrGzD;EQxrGM;;IAEE,8BAA+B;ER0rGvC;EQxrGM;;IAEE,gCAAiC;ER0rGzC;EQxrGM;;IAEE,iCAAkC;ER0rG1C;EQxrGM;;IAEE,+BAAgC;ER0rGxC;EQzsGM;IAAwB,wBAA2B;ER4sGzD;EQ3sGM;;IAEE,4BAA+B;ER6sGvC;EQ3sGM;;IAEE,8BAAiC;ER6sGzC;EQ3sGM;;IAEE,+BAAkC;ER6sG1C;EQ3sGM;;IAEE,6BAAgC;ER6sGxC;EQ5tGM;IAAwB,0BAA2B;ER+tGzD;EQ9tGM;;IAEE,8BAA+B;ERguGvC;EQ9tGM;;IAEE,gCAAiC;ERguGzC;EQ9tGM;;IAEE,iCAAkC;ERguG1C;EQ9tGM;;IAEE,+BAAgC;ERguGxC;EQ/uGM;IAAwB,wBAA2B;ERkvGzD;EQjvGM;;IAEE,4BAA+B;ERmvGvC;EQjvGM;;IAEE,8BAAiC;ERmvGzC;EQjvGM;;IAEE,+BAAkC;ERmvG1C;EQjvGM;;IAEE,6BAAgC;ERmvGxC;EQ7uGE;IAAmB,uBAAuB;ERgvG5C;EQ/uGE;;IAEE,2BAA2B;ERivG/B;EQ/uGE;;IAEE,6BAA6B;ERivGjC;EQ/uGE;;IAEE,8BAA8B;ERivGlC;EQ/uGE;;IAEE,4BAA4B;ERivGhC;AACF","file":"bootstrap-grid.css","sourcesContent":["/*!\n * Bootstrap Grid v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\nhtml {\n box-sizing: border-box;\n -ms-overflow-style: scrollbar;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit;\n}\n\n@import \"functions\";\n@import \"variables\";\n\n@import \"mixins/breakpoints\";\n@import \"mixins/grid-framework\";\n@import \"mixins/grid\";\n\n@import \"grid\";\n@import \"utilities/display\";\n@import \"utilities/flex\";\n@import \"utilities/spacing\";\n","/*!\n * Bootstrap Grid v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\nhtml {\n box-sizing: border-box;\n -ms-overflow-style: scrollbar;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit;\n}\n\n.container {\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 576px) {\n .container {\n max-width: 540px;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n max-width: 720px;\n }\n}\n\n@media (min-width: 992px) {\n .container {\n max-width: 960px;\n }\n}\n\n@media (min-width: 1200px) {\n .container {\n max-width: 1140px;\n }\n}\n\n.container-fluid {\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n\n.row {\n display: flex;\n flex-wrap: wrap;\n margin-right: -15px;\n margin-left: -15px;\n}\n\n.no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .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, .col-sm,\n.col-sm-auto, .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, .col-md,\n.col-md-auto, .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, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto {\n position: relative;\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n}\n\n.col {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n}\n\n.col-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n}\n\n.col-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n}\n\n.col-3 {\n flex: 0 0 25%;\n max-width: 25%;\n}\n\n.col-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n}\n\n.col-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n}\n\n.col-6 {\n flex: 0 0 50%;\n max-width: 50%;\n}\n\n.col-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n}\n\n.col-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n}\n\n.col-9 {\n flex: 0 0 75%;\n max-width: 75%;\n}\n\n.col-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n}\n\n.col-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n}\n\n.col-12 {\n flex: 0 0 100%;\n max-width: 100%;\n}\n\n.order-first {\n order: -1;\n}\n\n.order-last {\n order: 13;\n}\n\n.order-0 {\n order: 0;\n}\n\n.order-1 {\n order: 1;\n}\n\n.order-2 {\n order: 2;\n}\n\n.order-3 {\n order: 3;\n}\n\n.order-4 {\n order: 4;\n}\n\n.order-5 {\n order: 5;\n}\n\n.order-6 {\n order: 6;\n}\n\n.order-7 {\n order: 7;\n}\n\n.order-8 {\n order: 8;\n}\n\n.order-9 {\n order: 9;\n}\n\n.order-10 {\n order: 10;\n}\n\n.order-11 {\n order: 11;\n}\n\n.order-12 {\n order: 12;\n}\n\n.offset-1 {\n margin-left: 8.333333%;\n}\n\n.offset-2 {\n margin-left: 16.666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.333333%;\n}\n\n.offset-5 {\n margin-left: 41.666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.333333%;\n}\n\n.offset-8 {\n margin-left: 66.666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.333333%;\n}\n\n.offset-11 {\n margin-left: 91.666667%;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-sm-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-sm-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-sm-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-sm-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-sm-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-sm-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-sm-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-sm-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-sm-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-sm-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-sm-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-sm-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-sm-first {\n order: -1;\n }\n .order-sm-last {\n order: 13;\n }\n .order-sm-0 {\n order: 0;\n }\n .order-sm-1 {\n order: 1;\n }\n .order-sm-2 {\n order: 2;\n }\n .order-sm-3 {\n order: 3;\n }\n .order-sm-4 {\n order: 4;\n }\n .order-sm-5 {\n order: 5;\n }\n .order-sm-6 {\n order: 6;\n }\n .order-sm-7 {\n order: 7;\n }\n .order-sm-8 {\n order: 8;\n }\n .order-sm-9 {\n order: 9;\n }\n .order-sm-10 {\n order: 10;\n }\n .order-sm-11 {\n order: 11;\n }\n .order-sm-12 {\n order: 12;\n }\n .offset-sm-0 {\n margin-left: 0;\n }\n .offset-sm-1 {\n margin-left: 8.333333%;\n }\n .offset-sm-2 {\n margin-left: 16.666667%;\n }\n .offset-sm-3 {\n margin-left: 25%;\n }\n .offset-sm-4 {\n margin-left: 33.333333%;\n }\n .offset-sm-5 {\n margin-left: 41.666667%;\n }\n .offset-sm-6 {\n margin-left: 50%;\n }\n .offset-sm-7 {\n margin-left: 58.333333%;\n }\n .offset-sm-8 {\n margin-left: 66.666667%;\n }\n .offset-sm-9 {\n margin-left: 75%;\n }\n .offset-sm-10 {\n margin-left: 83.333333%;\n }\n .offset-sm-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 768px) {\n .col-md {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-md-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-md-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-md-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-md-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-md-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-md-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-md-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-md-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-md-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-md-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-md-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-md-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-md-first {\n order: -1;\n }\n .order-md-last {\n order: 13;\n }\n .order-md-0 {\n order: 0;\n }\n .order-md-1 {\n order: 1;\n }\n .order-md-2 {\n order: 2;\n }\n .order-md-3 {\n order: 3;\n }\n .order-md-4 {\n order: 4;\n }\n .order-md-5 {\n order: 5;\n }\n .order-md-6 {\n order: 6;\n }\n .order-md-7 {\n order: 7;\n }\n .order-md-8 {\n order: 8;\n }\n .order-md-9 {\n order: 9;\n }\n .order-md-10 {\n order: 10;\n }\n .order-md-11 {\n order: 11;\n }\n .order-md-12 {\n order: 12;\n }\n .offset-md-0 {\n margin-left: 0;\n }\n .offset-md-1 {\n margin-left: 8.333333%;\n }\n .offset-md-2 {\n margin-left: 16.666667%;\n }\n .offset-md-3 {\n margin-left: 25%;\n }\n .offset-md-4 {\n margin-left: 33.333333%;\n }\n .offset-md-5 {\n margin-left: 41.666667%;\n }\n .offset-md-6 {\n margin-left: 50%;\n }\n .offset-md-7 {\n margin-left: 58.333333%;\n }\n .offset-md-8 {\n margin-left: 66.666667%;\n }\n .offset-md-9 {\n margin-left: 75%;\n }\n .offset-md-10 {\n margin-left: 83.333333%;\n }\n .offset-md-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 992px) {\n .col-lg {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-lg-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-lg-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-lg-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-lg-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-lg-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-lg-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-lg-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-lg-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-lg-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-lg-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-lg-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-lg-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-lg-first {\n order: -1;\n }\n .order-lg-last {\n order: 13;\n }\n .order-lg-0 {\n order: 0;\n }\n .order-lg-1 {\n order: 1;\n }\n .order-lg-2 {\n order: 2;\n }\n .order-lg-3 {\n order: 3;\n }\n .order-lg-4 {\n order: 4;\n }\n .order-lg-5 {\n order: 5;\n }\n .order-lg-6 {\n order: 6;\n }\n .order-lg-7 {\n order: 7;\n }\n .order-lg-8 {\n order: 8;\n }\n .order-lg-9 {\n order: 9;\n }\n .order-lg-10 {\n order: 10;\n }\n .order-lg-11 {\n order: 11;\n }\n .order-lg-12 {\n order: 12;\n }\n .offset-lg-0 {\n margin-left: 0;\n }\n .offset-lg-1 {\n margin-left: 8.333333%;\n }\n .offset-lg-2 {\n margin-left: 16.666667%;\n }\n .offset-lg-3 {\n margin-left: 25%;\n }\n .offset-lg-4 {\n margin-left: 33.333333%;\n }\n .offset-lg-5 {\n margin-left: 41.666667%;\n }\n .offset-lg-6 {\n margin-left: 50%;\n }\n .offset-lg-7 {\n margin-left: 58.333333%;\n }\n .offset-lg-8 {\n margin-left: 66.666667%;\n }\n .offset-lg-9 {\n margin-left: 75%;\n }\n .offset-lg-10 {\n margin-left: 83.333333%;\n }\n .offset-lg-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 1200px) {\n .col-xl {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-xl-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-xl-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xl-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-xl-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-xl-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-xl-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-xl-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-xl-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-xl-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-xl-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-xl-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-xl-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-xl-first {\n order: -1;\n }\n .order-xl-last {\n order: 13;\n }\n .order-xl-0 {\n order: 0;\n }\n .order-xl-1 {\n order: 1;\n }\n .order-xl-2 {\n order: 2;\n }\n .order-xl-3 {\n order: 3;\n }\n .order-xl-4 {\n order: 4;\n }\n .order-xl-5 {\n order: 5;\n }\n .order-xl-6 {\n order: 6;\n }\n .order-xl-7 {\n order: 7;\n }\n .order-xl-8 {\n order: 8;\n }\n .order-xl-9 {\n order: 9;\n }\n .order-xl-10 {\n order: 10;\n }\n .order-xl-11 {\n order: 11;\n }\n .order-xl-12 {\n order: 12;\n }\n .offset-xl-0 {\n margin-left: 0;\n }\n .offset-xl-1 {\n margin-left: 8.333333%;\n }\n .offset-xl-2 {\n margin-left: 16.666667%;\n }\n .offset-xl-3 {\n margin-left: 25%;\n }\n .offset-xl-4 {\n margin-left: 33.333333%;\n }\n .offset-xl-5 {\n margin-left: 41.666667%;\n }\n .offset-xl-6 {\n margin-left: 50%;\n }\n .offset-xl-7 {\n margin-left: 58.333333%;\n }\n .offset-xl-8 {\n margin-left: 66.666667%;\n }\n .offset-xl-9 {\n margin-left: 75%;\n }\n .offset-xl-10 {\n margin-left: 83.333333%;\n }\n .offset-xl-11 {\n margin-left: 91.666667%;\n }\n}\n\n.d-none {\n display: none !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline-flex {\n display: inline-flex !important;\n}\n\n@media (min-width: 576px) {\n .d-sm-none {\n display: none !important;\n }\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 768px) {\n .d-md-none {\n display: none !important;\n }\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: flex !important;\n }\n .d-md-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 992px) {\n .d-lg-none {\n display: none !important;\n }\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 1200px) {\n .d-xl-none {\n display: none !important;\n }\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media print {\n .d-print-none {\n display: none !important;\n }\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: flex !important;\n }\n .d-print-inline-flex {\n display: inline-flex !important;\n }\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.flex-fill {\n flex: 1 1 auto !important;\n}\n\n.flex-grow-0 {\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n flex-shrink: 1 !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n@media (min-width: 576px) {\n .flex-sm-row {\n flex-direction: row !important;\n }\n .flex-sm-column {\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-sm-fill {\n flex: 1 1 auto !important;\n }\n .flex-sm-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n justify-content: center !important;\n }\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n align-items: center !important;\n }\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n align-content: center !important;\n }\n .align-content-sm-between {\n align-content: space-between !important;\n }\n .align-content-sm-around {\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n align-self: auto !important;\n }\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n align-self: center !important;\n }\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 768px) {\n .flex-md-row {\n flex-direction: row !important;\n }\n .flex-md-column {\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-md-fill {\n flex: 1 1 auto !important;\n }\n .flex-md-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n justify-content: center !important;\n }\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n .align-items-md-start {\n align-items: flex-start !important;\n }\n .align-items-md-end {\n align-items: flex-end !important;\n }\n .align-items-md-center {\n align-items: center !important;\n }\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n .align-content-md-start {\n align-content: flex-start !important;\n }\n .align-content-md-end {\n align-content: flex-end !important;\n }\n .align-content-md-center {\n align-content: center !important;\n }\n .align-content-md-between {\n align-content: space-between !important;\n }\n .align-content-md-around {\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n .align-self-md-auto {\n align-self: auto !important;\n }\n .align-self-md-start {\n align-self: flex-start !important;\n }\n .align-self-md-end {\n align-self: flex-end !important;\n }\n .align-self-md-center {\n align-self: center !important;\n }\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 992px) {\n .flex-lg-row {\n flex-direction: row !important;\n }\n .flex-lg-column {\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-lg-fill {\n flex: 1 1 auto !important;\n }\n .flex-lg-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n justify-content: center !important;\n }\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n align-items: center !important;\n }\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n align-content: center !important;\n }\n .align-content-lg-between {\n align-content: space-between !important;\n }\n .align-content-lg-around {\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n align-self: auto !important;\n }\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n align-self: center !important;\n }\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1200px) {\n .flex-xl-row {\n flex-direction: row !important;\n }\n .flex-xl-column {\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-xl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n justify-content: center !important;\n }\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n align-items: center !important;\n }\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n align-content: center !important;\n }\n .align-content-xl-between {\n align-content: space-between !important;\n }\n .align-content-xl-around {\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n align-self: auto !important;\n }\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n align-self: center !important;\n }\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.mt-0,\n.my-0 {\n margin-top: 0 !important;\n}\n\n.mr-0,\n.mx-0 {\n margin-right: 0 !important;\n}\n\n.mb-0,\n.my-0 {\n margin-bottom: 0 !important;\n}\n\n.ml-0,\n.mx-0 {\n margin-left: 0 !important;\n}\n\n.m-1 {\n margin: 0.25rem !important;\n}\n\n.mt-1,\n.my-1 {\n margin-top: 0.25rem !important;\n}\n\n.mr-1,\n.mx-1 {\n margin-right: 0.25rem !important;\n}\n\n.mb-1,\n.my-1 {\n margin-bottom: 0.25rem !important;\n}\n\n.ml-1,\n.mx-1 {\n margin-left: 0.25rem !important;\n}\n\n.m-2 {\n margin: 0.5rem !important;\n}\n\n.mt-2,\n.my-2 {\n margin-top: 0.5rem !important;\n}\n\n.mr-2,\n.mx-2 {\n margin-right: 0.5rem !important;\n}\n\n.mb-2,\n.my-2 {\n margin-bottom: 0.5rem !important;\n}\n\n.ml-2,\n.mx-2 {\n margin-left: 0.5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.mt-3,\n.my-3 {\n margin-top: 1rem !important;\n}\n\n.mr-3,\n.mx-3 {\n margin-right: 1rem !important;\n}\n\n.mb-3,\n.my-3 {\n margin-bottom: 1rem !important;\n}\n\n.ml-3,\n.mx-3 {\n margin-left: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.mt-4,\n.my-4 {\n margin-top: 1.5rem !important;\n}\n\n.mr-4,\n.mx-4 {\n margin-right: 1.5rem !important;\n}\n\n.mb-4,\n.my-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.ml-4,\n.mx-4 {\n margin-left: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.mt-5,\n.my-5 {\n margin-top: 3rem !important;\n}\n\n.mr-5,\n.mx-5 {\n margin-right: 3rem !important;\n}\n\n.mb-5,\n.my-5 {\n margin-bottom: 3rem !important;\n}\n\n.ml-5,\n.mx-5 {\n margin-left: 3rem !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.pt-0,\n.py-0 {\n padding-top: 0 !important;\n}\n\n.pr-0,\n.px-0 {\n padding-right: 0 !important;\n}\n\n.pb-0,\n.py-0 {\n padding-bottom: 0 !important;\n}\n\n.pl-0,\n.px-0 {\n padding-left: 0 !important;\n}\n\n.p-1 {\n padding: 0.25rem !important;\n}\n\n.pt-1,\n.py-1 {\n padding-top: 0.25rem !important;\n}\n\n.pr-1,\n.px-1 {\n padding-right: 0.25rem !important;\n}\n\n.pb-1,\n.py-1 {\n padding-bottom: 0.25rem !important;\n}\n\n.pl-1,\n.px-1 {\n padding-left: 0.25rem !important;\n}\n\n.p-2 {\n padding: 0.5rem !important;\n}\n\n.pt-2,\n.py-2 {\n padding-top: 0.5rem !important;\n}\n\n.pr-2,\n.px-2 {\n padding-right: 0.5rem !important;\n}\n\n.pb-2,\n.py-2 {\n padding-bottom: 0.5rem !important;\n}\n\n.pl-2,\n.px-2 {\n padding-left: 0.5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.pt-3,\n.py-3 {\n padding-top: 1rem !important;\n}\n\n.pr-3,\n.px-3 {\n padding-right: 1rem !important;\n}\n\n.pb-3,\n.py-3 {\n padding-bottom: 1rem !important;\n}\n\n.pl-3,\n.px-3 {\n padding-left: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.pt-4,\n.py-4 {\n padding-top: 1.5rem !important;\n}\n\n.pr-4,\n.px-4 {\n padding-right: 1.5rem !important;\n}\n\n.pb-4,\n.py-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pl-4,\n.px-4 {\n padding-left: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.pt-5,\n.py-5 {\n padding-top: 3rem !important;\n}\n\n.pr-5,\n.px-5 {\n padding-right: 3rem !important;\n}\n\n.pb-5,\n.py-5 {\n padding-bottom: 3rem !important;\n}\n\n.pl-5,\n.px-5 {\n padding-left: 3rem !important;\n}\n\n.m-n1 {\n margin: -0.25rem !important;\n}\n\n.mt-n1,\n.my-n1 {\n margin-top: -0.25rem !important;\n}\n\n.mr-n1,\n.mx-n1 {\n margin-right: -0.25rem !important;\n}\n\n.mb-n1,\n.my-n1 {\n margin-bottom: -0.25rem !important;\n}\n\n.ml-n1,\n.mx-n1 {\n margin-left: -0.25rem !important;\n}\n\n.m-n2 {\n margin: -0.5rem !important;\n}\n\n.mt-n2,\n.my-n2 {\n margin-top: -0.5rem !important;\n}\n\n.mr-n2,\n.mx-n2 {\n margin-right: -0.5rem !important;\n}\n\n.mb-n2,\n.my-n2 {\n margin-bottom: -0.5rem !important;\n}\n\n.ml-n2,\n.mx-n2 {\n margin-left: -0.5rem !important;\n}\n\n.m-n3 {\n margin: -1rem !important;\n}\n\n.mt-n3,\n.my-n3 {\n margin-top: -1rem !important;\n}\n\n.mr-n3,\n.mx-n3 {\n margin-right: -1rem !important;\n}\n\n.mb-n3,\n.my-n3 {\n margin-bottom: -1rem !important;\n}\n\n.ml-n3,\n.mx-n3 {\n margin-left: -1rem !important;\n}\n\n.m-n4 {\n margin: -1.5rem !important;\n}\n\n.mt-n4,\n.my-n4 {\n margin-top: -1.5rem !important;\n}\n\n.mr-n4,\n.mx-n4 {\n margin-right: -1.5rem !important;\n}\n\n.mb-n4,\n.my-n4 {\n margin-bottom: -1.5rem !important;\n}\n\n.ml-n4,\n.mx-n4 {\n margin-left: -1.5rem !important;\n}\n\n.m-n5 {\n margin: -3rem !important;\n}\n\n.mt-n5,\n.my-n5 {\n margin-top: -3rem !important;\n}\n\n.mr-n5,\n.mx-n5 {\n margin-right: -3rem !important;\n}\n\n.mb-n5,\n.my-n5 {\n margin-bottom: -3rem !important;\n}\n\n.ml-n5,\n.mx-n5 {\n margin-left: -3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mt-auto,\n.my-auto {\n margin-top: auto !important;\n}\n\n.mr-auto,\n.mx-auto {\n margin-right: auto !important;\n}\n\n.mb-auto,\n.my-auto {\n margin-bottom: auto !important;\n}\n\n.ml-auto,\n.mx-auto {\n margin-left: auto !important;\n}\n\n@media (min-width: 576px) {\n .m-sm-0 {\n margin: 0 !important;\n }\n .mt-sm-0,\n .my-sm-0 {\n margin-top: 0 !important;\n }\n .mr-sm-0,\n .mx-sm-0 {\n margin-right: 0 !important;\n }\n .mb-sm-0,\n .my-sm-0 {\n margin-bottom: 0 !important;\n }\n .ml-sm-0,\n .mx-sm-0 {\n margin-left: 0 !important;\n }\n .m-sm-1 {\n margin: 0.25rem !important;\n }\n .mt-sm-1,\n .my-sm-1 {\n margin-top: 0.25rem !important;\n }\n .mr-sm-1,\n .mx-sm-1 {\n margin-right: 0.25rem !important;\n }\n .mb-sm-1,\n .my-sm-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-sm-1,\n .mx-sm-1 {\n margin-left: 0.25rem !important;\n }\n .m-sm-2 {\n margin: 0.5rem !important;\n }\n .mt-sm-2,\n .my-sm-2 {\n margin-top: 0.5rem !important;\n }\n .mr-sm-2,\n .mx-sm-2 {\n margin-right: 0.5rem !important;\n }\n .mb-sm-2,\n .my-sm-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-sm-2,\n .mx-sm-2 {\n margin-left: 0.5rem !important;\n }\n .m-sm-3 {\n margin: 1rem !important;\n }\n .mt-sm-3,\n .my-sm-3 {\n margin-top: 1rem !important;\n }\n .mr-sm-3,\n .mx-sm-3 {\n margin-right: 1rem !important;\n }\n .mb-sm-3,\n .my-sm-3 {\n margin-bottom: 1rem !important;\n }\n .ml-sm-3,\n .mx-sm-3 {\n margin-left: 1rem !important;\n }\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n .mt-sm-4,\n .my-sm-4 {\n margin-top: 1.5rem !important;\n }\n .mr-sm-4,\n .mx-sm-4 {\n margin-right: 1.5rem !important;\n }\n .mb-sm-4,\n .my-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-sm-4,\n .mx-sm-4 {\n margin-left: 1.5rem !important;\n }\n .m-sm-5 {\n margin: 3rem !important;\n }\n .mt-sm-5,\n .my-sm-5 {\n margin-top: 3rem !important;\n }\n .mr-sm-5,\n .mx-sm-5 {\n margin-right: 3rem !important;\n }\n .mb-sm-5,\n .my-sm-5 {\n margin-bottom: 3rem !important;\n }\n .ml-sm-5,\n .mx-sm-5 {\n margin-left: 3rem !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .pt-sm-0,\n .py-sm-0 {\n padding-top: 0 !important;\n }\n .pr-sm-0,\n .px-sm-0 {\n padding-right: 0 !important;\n }\n .pb-sm-0,\n .py-sm-0 {\n padding-bottom: 0 !important;\n }\n .pl-sm-0,\n .px-sm-0 {\n padding-left: 0 !important;\n }\n .p-sm-1 {\n padding: 0.25rem !important;\n }\n .pt-sm-1,\n .py-sm-1 {\n padding-top: 0.25rem !important;\n }\n .pr-sm-1,\n .px-sm-1 {\n padding-right: 0.25rem !important;\n }\n .pb-sm-1,\n .py-sm-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-sm-1,\n .px-sm-1 {\n padding-left: 0.25rem !important;\n }\n .p-sm-2 {\n padding: 0.5rem !important;\n }\n .pt-sm-2,\n .py-sm-2 {\n padding-top: 0.5rem !important;\n }\n .pr-sm-2,\n .px-sm-2 {\n padding-right: 0.5rem !important;\n }\n .pb-sm-2,\n .py-sm-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-sm-2,\n .px-sm-2 {\n padding-left: 0.5rem !important;\n }\n .p-sm-3 {\n padding: 1rem !important;\n }\n .pt-sm-3,\n .py-sm-3 {\n padding-top: 1rem !important;\n }\n .pr-sm-3,\n .px-sm-3 {\n padding-right: 1rem !important;\n }\n .pb-sm-3,\n .py-sm-3 {\n padding-bottom: 1rem !important;\n }\n .pl-sm-3,\n .px-sm-3 {\n padding-left: 1rem !important;\n }\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n .pt-sm-4,\n .py-sm-4 {\n padding-top: 1.5rem !important;\n }\n .pr-sm-4,\n .px-sm-4 {\n padding-right: 1.5rem !important;\n }\n .pb-sm-4,\n .py-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-sm-4,\n .px-sm-4 {\n padding-left: 1.5rem !important;\n }\n .p-sm-5 {\n padding: 3rem !important;\n }\n .pt-sm-5,\n .py-sm-5 {\n padding-top: 3rem !important;\n }\n .pr-sm-5,\n .px-sm-5 {\n padding-right: 3rem !important;\n }\n .pb-sm-5,\n .py-sm-5 {\n padding-bottom: 3rem !important;\n }\n .pl-sm-5,\n .px-sm-5 {\n padding-left: 3rem !important;\n }\n .m-sm-n1 {\n margin: -0.25rem !important;\n }\n .mt-sm-n1,\n .my-sm-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-sm-n1,\n .mx-sm-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-sm-n1,\n .my-sm-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-sm-n1,\n .mx-sm-n1 {\n margin-left: -0.25rem !important;\n }\n .m-sm-n2 {\n margin: -0.5rem !important;\n }\n .mt-sm-n2,\n .my-sm-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-sm-n2,\n .mx-sm-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-sm-n2,\n .my-sm-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-sm-n2,\n .mx-sm-n2 {\n margin-left: -0.5rem !important;\n }\n .m-sm-n3 {\n margin: -1rem !important;\n }\n .mt-sm-n3,\n .my-sm-n3 {\n margin-top: -1rem !important;\n }\n .mr-sm-n3,\n .mx-sm-n3 {\n margin-right: -1rem !important;\n }\n .mb-sm-n3,\n .my-sm-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-sm-n3,\n .mx-sm-n3 {\n margin-left: -1rem !important;\n }\n .m-sm-n4 {\n margin: -1.5rem !important;\n }\n .mt-sm-n4,\n .my-sm-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-sm-n4,\n .mx-sm-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-sm-n4,\n .my-sm-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-sm-n4,\n .mx-sm-n4 {\n margin-left: -1.5rem !important;\n }\n .m-sm-n5 {\n margin: -3rem !important;\n }\n .mt-sm-n5,\n .my-sm-n5 {\n margin-top: -3rem !important;\n }\n .mr-sm-n5,\n .mx-sm-n5 {\n margin-right: -3rem !important;\n }\n .mb-sm-n5,\n .my-sm-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-sm-n5,\n .mx-sm-n5 {\n margin-left: -3rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mt-sm-auto,\n .my-sm-auto {\n margin-top: auto !important;\n }\n .mr-sm-auto,\n .mx-sm-auto {\n margin-right: auto !important;\n }\n .mb-sm-auto,\n .my-sm-auto {\n margin-bottom: auto !important;\n }\n .ml-sm-auto,\n .mx-sm-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 768px) {\n .m-md-0 {\n margin: 0 !important;\n }\n .mt-md-0,\n .my-md-0 {\n margin-top: 0 !important;\n }\n .mr-md-0,\n .mx-md-0 {\n margin-right: 0 !important;\n }\n .mb-md-0,\n .my-md-0 {\n margin-bottom: 0 !important;\n }\n .ml-md-0,\n .mx-md-0 {\n margin-left: 0 !important;\n }\n .m-md-1 {\n margin: 0.25rem !important;\n }\n .mt-md-1,\n .my-md-1 {\n margin-top: 0.25rem !important;\n }\n .mr-md-1,\n .mx-md-1 {\n margin-right: 0.25rem !important;\n }\n .mb-md-1,\n .my-md-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-md-1,\n .mx-md-1 {\n margin-left: 0.25rem !important;\n }\n .m-md-2 {\n margin: 0.5rem !important;\n }\n .mt-md-2,\n .my-md-2 {\n margin-top: 0.5rem !important;\n }\n .mr-md-2,\n .mx-md-2 {\n margin-right: 0.5rem !important;\n }\n .mb-md-2,\n .my-md-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-md-2,\n .mx-md-2 {\n margin-left: 0.5rem !important;\n }\n .m-md-3 {\n margin: 1rem !important;\n }\n .mt-md-3,\n .my-md-3 {\n margin-top: 1rem !important;\n }\n .mr-md-3,\n .mx-md-3 {\n margin-right: 1rem !important;\n }\n .mb-md-3,\n .my-md-3 {\n margin-bottom: 1rem !important;\n }\n .ml-md-3,\n .mx-md-3 {\n margin-left: 1rem !important;\n }\n .m-md-4 {\n margin: 1.5rem !important;\n }\n .mt-md-4,\n .my-md-4 {\n margin-top: 1.5rem !important;\n }\n .mr-md-4,\n .mx-md-4 {\n margin-right: 1.5rem !important;\n }\n .mb-md-4,\n .my-md-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-md-4,\n .mx-md-4 {\n margin-left: 1.5rem !important;\n }\n .m-md-5 {\n margin: 3rem !important;\n }\n .mt-md-5,\n .my-md-5 {\n margin-top: 3rem !important;\n }\n .mr-md-5,\n .mx-md-5 {\n margin-right: 3rem !important;\n }\n .mb-md-5,\n .my-md-5 {\n margin-bottom: 3rem !important;\n }\n .ml-md-5,\n .mx-md-5 {\n margin-left: 3rem !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .pt-md-0,\n .py-md-0 {\n padding-top: 0 !important;\n }\n .pr-md-0,\n .px-md-0 {\n padding-right: 0 !important;\n }\n .pb-md-0,\n .py-md-0 {\n padding-bottom: 0 !important;\n }\n .pl-md-0,\n .px-md-0 {\n padding-left: 0 !important;\n }\n .p-md-1 {\n padding: 0.25rem !important;\n }\n .pt-md-1,\n .py-md-1 {\n padding-top: 0.25rem !important;\n }\n .pr-md-1,\n .px-md-1 {\n padding-right: 0.25rem !important;\n }\n .pb-md-1,\n .py-md-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-md-1,\n .px-md-1 {\n padding-left: 0.25rem !important;\n }\n .p-md-2 {\n padding: 0.5rem !important;\n }\n .pt-md-2,\n .py-md-2 {\n padding-top: 0.5rem !important;\n }\n .pr-md-2,\n .px-md-2 {\n padding-right: 0.5rem !important;\n }\n .pb-md-2,\n .py-md-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-md-2,\n .px-md-2 {\n padding-left: 0.5rem !important;\n }\n .p-md-3 {\n padding: 1rem !important;\n }\n .pt-md-3,\n .py-md-3 {\n padding-top: 1rem !important;\n }\n .pr-md-3,\n .px-md-3 {\n padding-right: 1rem !important;\n }\n .pb-md-3,\n .py-md-3 {\n padding-bottom: 1rem !important;\n }\n .pl-md-3,\n .px-md-3 {\n padding-left: 1rem !important;\n }\n .p-md-4 {\n padding: 1.5rem !important;\n }\n .pt-md-4,\n .py-md-4 {\n padding-top: 1.5rem !important;\n }\n .pr-md-4,\n .px-md-4 {\n padding-right: 1.5rem !important;\n }\n .pb-md-4,\n .py-md-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-md-4,\n .px-md-4 {\n padding-left: 1.5rem !important;\n }\n .p-md-5 {\n padding: 3rem !important;\n }\n .pt-md-5,\n .py-md-5 {\n padding-top: 3rem !important;\n }\n .pr-md-5,\n .px-md-5 {\n padding-right: 3rem !important;\n }\n .pb-md-5,\n .py-md-5 {\n padding-bottom: 3rem !important;\n }\n .pl-md-5,\n .px-md-5 {\n padding-left: 3rem !important;\n }\n .m-md-n1 {\n margin: -0.25rem !important;\n }\n .mt-md-n1,\n .my-md-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-md-n1,\n .mx-md-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-md-n1,\n .my-md-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-md-n1,\n .mx-md-n1 {\n margin-left: -0.25rem !important;\n }\n .m-md-n2 {\n margin: -0.5rem !important;\n }\n .mt-md-n2,\n .my-md-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-md-n2,\n .mx-md-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-md-n2,\n .my-md-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-md-n2,\n .mx-md-n2 {\n margin-left: -0.5rem !important;\n }\n .m-md-n3 {\n margin: -1rem !important;\n }\n .mt-md-n3,\n .my-md-n3 {\n margin-top: -1rem !important;\n }\n .mr-md-n3,\n .mx-md-n3 {\n margin-right: -1rem !important;\n }\n .mb-md-n3,\n .my-md-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-md-n3,\n .mx-md-n3 {\n margin-left: -1rem !important;\n }\n .m-md-n4 {\n margin: -1.5rem !important;\n }\n .mt-md-n4,\n .my-md-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-md-n4,\n .mx-md-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-md-n4,\n .my-md-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-md-n4,\n .mx-md-n4 {\n margin-left: -1.5rem !important;\n }\n .m-md-n5 {\n margin: -3rem !important;\n }\n .mt-md-n5,\n .my-md-n5 {\n margin-top: -3rem !important;\n }\n .mr-md-n5,\n .mx-md-n5 {\n margin-right: -3rem !important;\n }\n .mb-md-n5,\n .my-md-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-md-n5,\n .mx-md-n5 {\n margin-left: -3rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mt-md-auto,\n .my-md-auto {\n margin-top: auto !important;\n }\n .mr-md-auto,\n .mx-md-auto {\n margin-right: auto !important;\n }\n .mb-md-auto,\n .my-md-auto {\n margin-bottom: auto !important;\n }\n .ml-md-auto,\n .mx-md-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 992px) {\n .m-lg-0 {\n margin: 0 !important;\n }\n .mt-lg-0,\n .my-lg-0 {\n margin-top: 0 !important;\n }\n .mr-lg-0,\n .mx-lg-0 {\n margin-right: 0 !important;\n }\n .mb-lg-0,\n .my-lg-0 {\n margin-bottom: 0 !important;\n }\n .ml-lg-0,\n .mx-lg-0 {\n margin-left: 0 !important;\n }\n .m-lg-1 {\n margin: 0.25rem !important;\n }\n .mt-lg-1,\n .my-lg-1 {\n margin-top: 0.25rem !important;\n }\n .mr-lg-1,\n .mx-lg-1 {\n margin-right: 0.25rem !important;\n }\n .mb-lg-1,\n .my-lg-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-lg-1,\n .mx-lg-1 {\n margin-left: 0.25rem !important;\n }\n .m-lg-2 {\n margin: 0.5rem !important;\n }\n .mt-lg-2,\n .my-lg-2 {\n margin-top: 0.5rem !important;\n }\n .mr-lg-2,\n .mx-lg-2 {\n margin-right: 0.5rem !important;\n }\n .mb-lg-2,\n .my-lg-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-lg-2,\n .mx-lg-2 {\n margin-left: 0.5rem !important;\n }\n .m-lg-3 {\n margin: 1rem !important;\n }\n .mt-lg-3,\n .my-lg-3 {\n margin-top: 1rem !important;\n }\n .mr-lg-3,\n .mx-lg-3 {\n margin-right: 1rem !important;\n }\n .mb-lg-3,\n .my-lg-3 {\n margin-bottom: 1rem !important;\n }\n .ml-lg-3,\n .mx-lg-3 {\n margin-left: 1rem !important;\n }\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n .mt-lg-4,\n .my-lg-4 {\n margin-top: 1.5rem !important;\n }\n .mr-lg-4,\n .mx-lg-4 {\n margin-right: 1.5rem !important;\n }\n .mb-lg-4,\n .my-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-lg-4,\n .mx-lg-4 {\n margin-left: 1.5rem !important;\n }\n .m-lg-5 {\n margin: 3rem !important;\n }\n .mt-lg-5,\n .my-lg-5 {\n margin-top: 3rem !important;\n }\n .mr-lg-5,\n .mx-lg-5 {\n margin-right: 3rem !important;\n }\n .mb-lg-5,\n .my-lg-5 {\n margin-bottom: 3rem !important;\n }\n .ml-lg-5,\n .mx-lg-5 {\n margin-left: 3rem !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .pt-lg-0,\n .py-lg-0 {\n padding-top: 0 !important;\n }\n .pr-lg-0,\n .px-lg-0 {\n padding-right: 0 !important;\n }\n .pb-lg-0,\n .py-lg-0 {\n padding-bottom: 0 !important;\n }\n .pl-lg-0,\n .px-lg-0 {\n padding-left: 0 !important;\n }\n .p-lg-1 {\n padding: 0.25rem !important;\n }\n .pt-lg-1,\n .py-lg-1 {\n padding-top: 0.25rem !important;\n }\n .pr-lg-1,\n .px-lg-1 {\n padding-right: 0.25rem !important;\n }\n .pb-lg-1,\n .py-lg-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-lg-1,\n .px-lg-1 {\n padding-left: 0.25rem !important;\n }\n .p-lg-2 {\n padding: 0.5rem !important;\n }\n .pt-lg-2,\n .py-lg-2 {\n padding-top: 0.5rem !important;\n }\n .pr-lg-2,\n .px-lg-2 {\n padding-right: 0.5rem !important;\n }\n .pb-lg-2,\n .py-lg-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-lg-2,\n .px-lg-2 {\n padding-left: 0.5rem !important;\n }\n .p-lg-3 {\n padding: 1rem !important;\n }\n .pt-lg-3,\n .py-lg-3 {\n padding-top: 1rem !important;\n }\n .pr-lg-3,\n .px-lg-3 {\n padding-right: 1rem !important;\n }\n .pb-lg-3,\n .py-lg-3 {\n padding-bottom: 1rem !important;\n }\n .pl-lg-3,\n .px-lg-3 {\n padding-left: 1rem !important;\n }\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n .pt-lg-4,\n .py-lg-4 {\n padding-top: 1.5rem !important;\n }\n .pr-lg-4,\n .px-lg-4 {\n padding-right: 1.5rem !important;\n }\n .pb-lg-4,\n .py-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-lg-4,\n .px-lg-4 {\n padding-left: 1.5rem !important;\n }\n .p-lg-5 {\n padding: 3rem !important;\n }\n .pt-lg-5,\n .py-lg-5 {\n padding-top: 3rem !important;\n }\n .pr-lg-5,\n .px-lg-5 {\n padding-right: 3rem !important;\n }\n .pb-lg-5,\n .py-lg-5 {\n padding-bottom: 3rem !important;\n }\n .pl-lg-5,\n .px-lg-5 {\n padding-left: 3rem !important;\n }\n .m-lg-n1 {\n margin: -0.25rem !important;\n }\n .mt-lg-n1,\n .my-lg-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-lg-n1,\n .mx-lg-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-lg-n1,\n .my-lg-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-lg-n1,\n .mx-lg-n1 {\n margin-left: -0.25rem !important;\n }\n .m-lg-n2 {\n margin: -0.5rem !important;\n }\n .mt-lg-n2,\n .my-lg-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-lg-n2,\n .mx-lg-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-lg-n2,\n .my-lg-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-lg-n2,\n .mx-lg-n2 {\n margin-left: -0.5rem !important;\n }\n .m-lg-n3 {\n margin: -1rem !important;\n }\n .mt-lg-n3,\n .my-lg-n3 {\n margin-top: -1rem !important;\n }\n .mr-lg-n3,\n .mx-lg-n3 {\n margin-right: -1rem !important;\n }\n .mb-lg-n3,\n .my-lg-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-lg-n3,\n .mx-lg-n3 {\n margin-left: -1rem !important;\n }\n .m-lg-n4 {\n margin: -1.5rem !important;\n }\n .mt-lg-n4,\n .my-lg-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-lg-n4,\n .mx-lg-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-lg-n4,\n .my-lg-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-lg-n4,\n .mx-lg-n4 {\n margin-left: -1.5rem !important;\n }\n .m-lg-n5 {\n margin: -3rem !important;\n }\n .mt-lg-n5,\n .my-lg-n5 {\n margin-top: -3rem !important;\n }\n .mr-lg-n5,\n .mx-lg-n5 {\n margin-right: -3rem !important;\n }\n .mb-lg-n5,\n .my-lg-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-lg-n5,\n .mx-lg-n5 {\n margin-left: -3rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mt-lg-auto,\n .my-lg-auto {\n margin-top: auto !important;\n }\n .mr-lg-auto,\n .mx-lg-auto {\n margin-right: auto !important;\n }\n .mb-lg-auto,\n .my-lg-auto {\n margin-bottom: auto !important;\n }\n .ml-lg-auto,\n .mx-lg-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 1200px) {\n .m-xl-0 {\n margin: 0 !important;\n }\n .mt-xl-0,\n .my-xl-0 {\n margin-top: 0 !important;\n }\n .mr-xl-0,\n .mx-xl-0 {\n margin-right: 0 !important;\n }\n .mb-xl-0,\n .my-xl-0 {\n margin-bottom: 0 !important;\n }\n .ml-xl-0,\n .mx-xl-0 {\n margin-left: 0 !important;\n }\n .m-xl-1 {\n margin: 0.25rem !important;\n }\n .mt-xl-1,\n .my-xl-1 {\n margin-top: 0.25rem !important;\n }\n .mr-xl-1,\n .mx-xl-1 {\n margin-right: 0.25rem !important;\n }\n .mb-xl-1,\n .my-xl-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-xl-1,\n .mx-xl-1 {\n margin-left: 0.25rem !important;\n }\n .m-xl-2 {\n margin: 0.5rem !important;\n }\n .mt-xl-2,\n .my-xl-2 {\n margin-top: 0.5rem !important;\n }\n .mr-xl-2,\n .mx-xl-2 {\n margin-right: 0.5rem !important;\n }\n .mb-xl-2,\n .my-xl-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-xl-2,\n .mx-xl-2 {\n margin-left: 0.5rem !important;\n }\n .m-xl-3 {\n margin: 1rem !important;\n }\n .mt-xl-3,\n .my-xl-3 {\n margin-top: 1rem !important;\n }\n .mr-xl-3,\n .mx-xl-3 {\n margin-right: 1rem !important;\n }\n .mb-xl-3,\n .my-xl-3 {\n margin-bottom: 1rem !important;\n }\n .ml-xl-3,\n .mx-xl-3 {\n margin-left: 1rem !important;\n }\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n .mt-xl-4,\n .my-xl-4 {\n margin-top: 1.5rem !important;\n }\n .mr-xl-4,\n .mx-xl-4 {\n margin-right: 1.5rem !important;\n }\n .mb-xl-4,\n .my-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-xl-4,\n .mx-xl-4 {\n margin-left: 1.5rem !important;\n }\n .m-xl-5 {\n margin: 3rem !important;\n }\n .mt-xl-5,\n .my-xl-5 {\n margin-top: 3rem !important;\n }\n .mr-xl-5,\n .mx-xl-5 {\n margin-right: 3rem !important;\n }\n .mb-xl-5,\n .my-xl-5 {\n margin-bottom: 3rem !important;\n }\n .ml-xl-5,\n .mx-xl-5 {\n margin-left: 3rem !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .pt-xl-0,\n .py-xl-0 {\n padding-top: 0 !important;\n }\n .pr-xl-0,\n .px-xl-0 {\n padding-right: 0 !important;\n }\n .pb-xl-0,\n .py-xl-0 {\n padding-bottom: 0 !important;\n }\n .pl-xl-0,\n .px-xl-0 {\n padding-left: 0 !important;\n }\n .p-xl-1 {\n padding: 0.25rem !important;\n }\n .pt-xl-1,\n .py-xl-1 {\n padding-top: 0.25rem !important;\n }\n .pr-xl-1,\n .px-xl-1 {\n padding-right: 0.25rem !important;\n }\n .pb-xl-1,\n .py-xl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-xl-1,\n .px-xl-1 {\n padding-left: 0.25rem !important;\n }\n .p-xl-2 {\n padding: 0.5rem !important;\n }\n .pt-xl-2,\n .py-xl-2 {\n padding-top: 0.5rem !important;\n }\n .pr-xl-2,\n .px-xl-2 {\n padding-right: 0.5rem !important;\n }\n .pb-xl-2,\n .py-xl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-xl-2,\n .px-xl-2 {\n padding-left: 0.5rem !important;\n }\n .p-xl-3 {\n padding: 1rem !important;\n }\n .pt-xl-3,\n .py-xl-3 {\n padding-top: 1rem !important;\n }\n .pr-xl-3,\n .px-xl-3 {\n padding-right: 1rem !important;\n }\n .pb-xl-3,\n .py-xl-3 {\n padding-bottom: 1rem !important;\n }\n .pl-xl-3,\n .px-xl-3 {\n padding-left: 1rem !important;\n }\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n .pt-xl-4,\n .py-xl-4 {\n padding-top: 1.5rem !important;\n }\n .pr-xl-4,\n .px-xl-4 {\n padding-right: 1.5rem !important;\n }\n .pb-xl-4,\n .py-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-xl-4,\n .px-xl-4 {\n padding-left: 1.5rem !important;\n }\n .p-xl-5 {\n padding: 3rem !important;\n }\n .pt-xl-5,\n .py-xl-5 {\n padding-top: 3rem !important;\n }\n .pr-xl-5,\n .px-xl-5 {\n padding-right: 3rem !important;\n }\n .pb-xl-5,\n .py-xl-5 {\n padding-bottom: 3rem !important;\n }\n .pl-xl-5,\n .px-xl-5 {\n padding-left: 3rem !important;\n }\n .m-xl-n1 {\n margin: -0.25rem !important;\n }\n .mt-xl-n1,\n .my-xl-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-xl-n1,\n .mx-xl-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-xl-n1,\n .my-xl-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-xl-n1,\n .mx-xl-n1 {\n margin-left: -0.25rem !important;\n }\n .m-xl-n2 {\n margin: -0.5rem !important;\n }\n .mt-xl-n2,\n .my-xl-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-xl-n2,\n .mx-xl-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-xl-n2,\n .my-xl-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-xl-n2,\n .mx-xl-n2 {\n margin-left: -0.5rem !important;\n }\n .m-xl-n3 {\n margin: -1rem !important;\n }\n .mt-xl-n3,\n .my-xl-n3 {\n margin-top: -1rem !important;\n }\n .mr-xl-n3,\n .mx-xl-n3 {\n margin-right: -1rem !important;\n }\n .mb-xl-n3,\n .my-xl-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-xl-n3,\n .mx-xl-n3 {\n margin-left: -1rem !important;\n }\n .m-xl-n4 {\n margin: -1.5rem !important;\n }\n .mt-xl-n4,\n .my-xl-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-xl-n4,\n .mx-xl-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-xl-n4,\n .my-xl-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-xl-n4,\n .mx-xl-n4 {\n margin-left: -1.5rem !important;\n }\n .m-xl-n5 {\n margin: -3rem !important;\n }\n .mt-xl-n5,\n .my-xl-n5 {\n margin-top: -3rem !important;\n }\n .mr-xl-n5,\n .mx-xl-n5 {\n margin-right: -3rem !important;\n }\n .mb-xl-n5,\n .my-xl-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-xl-n5,\n .mx-xl-n5 {\n margin-left: -3rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mt-xl-auto,\n .my-xl-auto {\n margin-top: auto !important;\n }\n .mr-xl-auto,\n .mx-xl-auto {\n margin-right: auto !important;\n }\n .mb-xl-auto,\n .my-xl-auto {\n margin-bottom: auto !important;\n }\n .ml-xl-auto,\n .mx-xl-auto {\n margin-left: auto !important;\n }\n}\n\n/*# sourceMappingURL=bootstrap-grid.css.map */","// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-grid-classes {\n .container {\n @include make-container();\n @include make-container-max-widths();\n }\n}\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but with 100% width for\n// fluid, full width layouts.\n\n@if $enable-grid-classes {\n .container-fluid {\n @include make-container();\n }\n}\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n@if $enable-grid-classes {\n .row {\n @include make-row();\n }\n\n // Remove the negative margin from default .row, then the horizontal padding\n // from all immediate children columns (to prevent runaway style inheritance).\n .no-gutters {\n margin-right: 0;\n margin-left: 0;\n\n > .col,\n > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n }\n }\n}\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n @include make-grid-columns();\n}\n","/// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-container($gutter: $grid-gutter-width) {\n width: 100%;\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n margin-right: auto;\n margin-left: auto;\n}\n\n\n// For each breakpoint, define the maximum width of the container in a media query\n@mixin make-container-max-widths($max-widths: $container-max-widths, $breakpoints: $grid-breakpoints) {\n @each $breakpoint, $container-max-width in $max-widths {\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n max-width: $container-max-width;\n }\n }\n}\n\n@mixin make-row($gutter: $grid-gutter-width) {\n display: flex;\n flex-wrap: wrap;\n margin-right: -$gutter / 2;\n margin-left: -$gutter / 2;\n}\n\n@mixin make-col-ready($gutter: $grid-gutter-width) {\n position: relative;\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we use `flex` values\n // later on to override this initial width.\n width: 100%;\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n}\n\n@mixin make-col($size, $columns: $grid-columns) {\n flex: 0 0 percentage($size / $columns);\n // Add a `max-width` to ensure content within each column does not blow out\n // the width of the column. Applies to IE10+ and Firefox. Chrome and Safari\n // do not appear to require this.\n max-width: percentage($size / $columns);\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: $size / $columns;\n margin-left: if($num == 0, 0, percentage($num));\n}\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @return if($n != null and $n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width. Null for the largest (last) breakpoint.\n// The maximum value is calculated as the minimum of the next one less 0.02px\n// to work around the limitations of `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $next: breakpoint-next($name, $breakpoints);\n @return if($next, breakpoint-min($next, $breakpoints) - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $max: breakpoint-max($name, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($name, $breakpoints) {\n @content;\n }\n }\n}\n","// Variables\n//\n// Variables should follow the `$component-state-property-size` formula for\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\n\n// Color system\n\n$white: #fff !default;\n$gray-100: #f8f9fa !default;\n$gray-200: #e9ecef !default;\n$gray-300: #dee2e6 !default;\n$gray-400: #ced4da !default;\n$gray-500: #adb5bd !default;\n$gray-600: #6c757d !default;\n$gray-700: #495057 !default;\n$gray-800: #343a40 !default;\n$gray-900: #212529 !default;\n$black: #000 !default;\n\n$grays: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$grays: map-merge(\n (\n \"100\": $gray-100,\n \"200\": $gray-200,\n \"300\": $gray-300,\n \"400\": $gray-400,\n \"500\": $gray-500,\n \"600\": $gray-600,\n \"700\": $gray-700,\n \"800\": $gray-800,\n \"900\": $gray-900\n ),\n $grays\n);\n\n$blue: #007bff !default;\n$indigo: #6610f2 !default;\n$purple: #6f42c1 !default;\n$pink: #e83e8c !default;\n$red: #dc3545 !default;\n$orange: #fd7e14 !default;\n$yellow: #ffc107 !default;\n$green: #28a745 !default;\n$teal: #20c997 !default;\n$cyan: #17a2b8 !default;\n\n$colors: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$colors: map-merge(\n (\n \"blue\": $blue,\n \"indigo\": $indigo,\n \"purple\": $purple,\n \"pink\": $pink,\n \"red\": $red,\n \"orange\": $orange,\n \"yellow\": $yellow,\n \"green\": $green,\n \"teal\": $teal,\n \"cyan\": $cyan,\n \"white\": $white,\n \"gray\": $gray-600,\n \"gray-dark\": $gray-800\n ),\n $colors\n);\n\n$primary: $blue !default;\n$secondary: $gray-600 !default;\n$success: $green !default;\n$info: $cyan !default;\n$warning: $yellow !default;\n$danger: $red !default;\n$light: $gray-100 !default;\n$dark: $gray-800 !default;\n\n$theme-colors: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$theme-colors: map-merge(\n (\n \"primary\": $primary,\n \"secondary\": $secondary,\n \"success\": $success,\n \"info\": $info,\n \"warning\": $warning,\n \"danger\": $danger,\n \"light\": $light,\n \"dark\": $dark\n ),\n $theme-colors\n);\n\n// Set a specific jump point for requesting color jumps\n$theme-color-interval: 8% !default;\n\n// The yiq lightness value that determines when the lightness of color changes from \"dark\" to \"light\". Acceptable values are between 0 and 255.\n$yiq-contrasted-threshold: 150 !default;\n\n// Customize the light and dark text colors for use in our YIQ color contrast function.\n$yiq-text-dark: $gray-900 !default;\n$yiq-text-light: $white !default;\n\n\n// Options\n//\n// Quickly modify global styling by enabling or disabling optional features.\n\n$enable-caret: true !default;\n$enable-rounded: true !default;\n$enable-shadows: false !default;\n$enable-gradients: false !default;\n$enable-transitions: true !default;\n$enable-prefers-reduced-motion-media-query: true !default;\n$enable-hover-media-query: false !default; // Deprecated, no longer affects any compiled CSS\n$enable-grid-classes: true !default;\n$enable-pointer-cursor-for-buttons: true !default;\n$enable-print-styles: true !default;\n$enable-responsive-font-sizes: false !default;\n$enable-validation-icons: true !default;\n$enable-deprecation-messages: true !default;\n\n\n// Spacing\n//\n// Control the default styling of most Bootstrap elements by modifying these\n// variables. Mostly focused on spacing.\n// You can add more entries to the $spacers map, should you need more variation.\n\n$spacer: 1rem !default;\n$spacers: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$spacers: map-merge(\n (\n 0: 0,\n 1: ($spacer * .25),\n 2: ($spacer * .5),\n 3: $spacer,\n 4: ($spacer * 1.5),\n 5: ($spacer * 3)\n ),\n $spacers\n);\n\n// This variable affects the `.h-*` and `.w-*` classes.\n$sizes: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$sizes: map-merge(\n (\n 25: 25%,\n 50: 50%,\n 75: 75%,\n 100: 100%,\n auto: auto\n ),\n $sizes\n);\n\n\n// Body\n//\n// Settings for the `` element.\n\n$body-bg: $white !default;\n$body-color: $gray-900 !default;\n\n\n// Links\n//\n// Style anchor elements.\n\n$link-color: theme-color(\"primary\") !default;\n$link-decoration: none !default;\n$link-hover-color: darken($link-color, 15%) !default;\n$link-hover-decoration: underline !default;\n// Darken percentage for links with `.text-*` class (e.g. `.text-success`)\n$emphasized-link-hover-darken-percentage: 15% !default;\n\n// Paragraphs\n//\n// Style p element.\n\n$paragraph-margin-bottom: 1rem !default;\n\n\n// Grid breakpoints\n//\n// Define the minimum dimensions at which your layout will change,\n// adapting to different screen sizes, for use in media queries.\n\n$grid-breakpoints: (\n xs: 0,\n sm: 576px,\n md: 768px,\n lg: 992px,\n xl: 1200px\n) !default;\n\n@include _assert-ascending($grid-breakpoints, \"$grid-breakpoints\");\n@include _assert-starts-at-zero($grid-breakpoints, \"$grid-breakpoints\");\n\n\n// Grid containers\n//\n// Define the maximum width of `.container` for different screen sizes.\n\n$container-max-widths: (\n sm: 540px,\n md: 720px,\n lg: 960px,\n xl: 1140px\n) !default;\n\n@include _assert-ascending($container-max-widths, \"$container-max-widths\");\n\n\n// Grid columns\n//\n// Set the number of columns and specify the width of the gutters.\n\n$grid-columns: 12 !default;\n$grid-gutter-width: 30px !default;\n\n\n// Components\n//\n// Define common padding and border radius sizes and more.\n\n$line-height-lg: 1.5 !default;\n$line-height-sm: 1.5 !default;\n\n$border-width: 1px !default;\n$border-color: $gray-300 !default;\n\n$border-radius: .25rem !default;\n$border-radius-lg: .3rem !default;\n$border-radius-sm: .2rem !default;\n\n$rounded-pill: 50rem !default;\n\n$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;\n$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;\n$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;\n\n$component-active-color: $white !default;\n$component-active-bg: theme-color(\"primary\") !default;\n\n$caret-width: .3em !default;\n$caret-vertical-align: $caret-width * .85 !default;\n$caret-spacing: $caret-width * .85 !default;\n\n$transition-base: all .2s ease-in-out !default;\n$transition-fade: opacity .15s linear !default;\n$transition-collapse: height .35s ease !default;\n\n$embed-responsive-aspect-ratios: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$embed-responsive-aspect-ratios: join(\n (\n (21 9),\n (16 9),\n (4 3),\n (1 1),\n ),\n $embed-responsive-aspect-ratios\n);\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// stylelint-disable value-keyword-case\n$font-family-sans-serif: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\" !default;\n$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !default;\n$font-family-base: $font-family-sans-serif !default;\n// stylelint-enable value-keyword-case\n\n$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`\n$font-size-lg: $font-size-base * 1.25 !default;\n$font-size-sm: $font-size-base * .875 !default;\n\n$font-weight-lighter: lighter !default;\n$font-weight-light: 300 !default;\n$font-weight-normal: 400 !default;\n$font-weight-bold: 700 !default;\n$font-weight-bolder: bolder !default;\n\n$font-weight-base: $font-weight-normal !default;\n$line-height-base: 1.5 !default;\n\n$h1-font-size: $font-size-base * 2.5 !default;\n$h2-font-size: $font-size-base * 2 !default;\n$h3-font-size: $font-size-base * 1.75 !default;\n$h4-font-size: $font-size-base * 1.5 !default;\n$h5-font-size: $font-size-base * 1.25 !default;\n$h6-font-size: $font-size-base !default;\n\n$headings-margin-bottom: $spacer / 2 !default;\n$headings-font-family: null !default;\n$headings-font-weight: 500 !default;\n$headings-line-height: 1.2 !default;\n$headings-color: null !default;\n\n$display1-size: 6rem !default;\n$display2-size: 5.5rem !default;\n$display3-size: 4.5rem !default;\n$display4-size: 3.5rem !default;\n\n$display1-weight: 300 !default;\n$display2-weight: 300 !default;\n$display3-weight: 300 !default;\n$display4-weight: 300 !default;\n$display-line-height: $headings-line-height !default;\n\n$lead-font-size: $font-size-base * 1.25 !default;\n$lead-font-weight: 300 !default;\n\n$small-font-size: 80% !default;\n\n$text-muted: $gray-600 !default;\n\n$blockquote-small-color: $gray-600 !default;\n$blockquote-small-font-size: $small-font-size !default;\n$blockquote-font-size: $font-size-base * 1.25 !default;\n\n$hr-border-color: rgba($black, .1) !default;\n$hr-border-width: $border-width !default;\n\n$mark-padding: .2em !default;\n\n$dt-font-weight: $font-weight-bold !default;\n\n$kbd-box-shadow: inset 0 -.1rem 0 rgba($black, .25) !default;\n$nested-kbd-font-weight: $font-weight-bold !default;\n\n$list-inline-padding: .5rem !default;\n\n$mark-bg: #fcf8e3 !default;\n\n$hr-margin-y: $spacer !default;\n\n\n// Tables\n//\n// Customizes the `.table` component with basic values, each used across all table variations.\n\n$table-cell-padding: .75rem !default;\n$table-cell-padding-sm: .3rem !default;\n\n$table-color: $body-color !default;\n$table-bg: null !default;\n$table-accent-bg: rgba($black, .05) !default;\n$table-hover-color: $table-color !default;\n$table-hover-bg: rgba($black, .075) !default;\n$table-active-bg: $table-hover-bg !default;\n\n$table-border-width: $border-width !default;\n$table-border-color: $border-color !default;\n\n$table-head-bg: $gray-200 !default;\n$table-head-color: $gray-700 !default;\n\n$table-dark-color: $white !default;\n$table-dark-bg: $gray-800 !default;\n$table-dark-accent-bg: rgba($white, .05) !default;\n$table-dark-hover-color: $table-dark-color !default;\n$table-dark-hover-bg: rgba($white, .075) !default;\n$table-dark-border-color: lighten($table-dark-bg, 7.5%) !default;\n$table-dark-color: $white !default;\n\n$table-striped-order: odd !default;\n\n$table-caption-color: $text-muted !default;\n\n$table-bg-level: -9 !default;\n$table-border-level: -6 !default;\n\n\n// Buttons + Forms\n//\n// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.\n\n$input-btn-padding-y: .375rem !default;\n$input-btn-padding-x: .75rem !default;\n$input-btn-font-family: null !default;\n$input-btn-font-size: $font-size-base !default;\n$input-btn-line-height: $line-height-base !default;\n\n$input-btn-focus-width: .2rem !default;\n$input-btn-focus-color: rgba($component-active-bg, .25) !default;\n$input-btn-focus-box-shadow: 0 0 0 $input-btn-focus-width $input-btn-focus-color !default;\n\n$input-btn-padding-y-sm: .25rem !default;\n$input-btn-padding-x-sm: .5rem !default;\n$input-btn-font-size-sm: $font-size-sm !default;\n$input-btn-line-height-sm: $line-height-sm !default;\n\n$input-btn-padding-y-lg: .5rem !default;\n$input-btn-padding-x-lg: 1rem !default;\n$input-btn-font-size-lg: $font-size-lg !default;\n$input-btn-line-height-lg: $line-height-lg !default;\n\n$input-btn-border-width: $border-width !default;\n\n\n// Buttons\n//\n// For each of Bootstrap's buttons, define text, background, and border color.\n\n$btn-padding-y: $input-btn-padding-y !default;\n$btn-padding-x: $input-btn-padding-x !default;\n$btn-font-family: $input-btn-font-family !default;\n$btn-font-size: $input-btn-font-size !default;\n$btn-line-height: $input-btn-line-height !default;\n\n$btn-padding-y-sm: $input-btn-padding-y-sm !default;\n$btn-padding-x-sm: $input-btn-padding-x-sm !default;\n$btn-font-size-sm: $input-btn-font-size-sm !default;\n$btn-line-height-sm: $input-btn-line-height-sm !default;\n\n$btn-padding-y-lg: $input-btn-padding-y-lg !default;\n$btn-padding-x-lg: $input-btn-padding-x-lg !default;\n$btn-font-size-lg: $input-btn-font-size-lg !default;\n$btn-line-height-lg: $input-btn-line-height-lg !default;\n\n$btn-border-width: $input-btn-border-width !default;\n\n$btn-font-weight: $font-weight-normal !default;\n$btn-box-shadow: inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default;\n$btn-focus-width: $input-btn-focus-width !default;\n$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$btn-disabled-opacity: .65 !default;\n$btn-active-box-shadow: inset 0 3px 5px rgba($black, .125) !default;\n\n$btn-link-disabled-color: $gray-600 !default;\n\n$btn-block-spacing-y: .5rem !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius: $border-radius !default;\n$btn-border-radius-lg: $border-radius-lg !default;\n$btn-border-radius-sm: $border-radius-sm !default;\n\n$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n\n// Forms\n\n$label-margin-bottom: .5rem !default;\n\n$input-padding-y: $input-btn-padding-y !default;\n$input-padding-x: $input-btn-padding-x !default;\n$input-font-family: $input-btn-font-family !default;\n$input-font-size: $input-btn-font-size !default;\n$input-font-weight: $font-weight-base !default;\n$input-line-height: $input-btn-line-height !default;\n\n$input-padding-y-sm: $input-btn-padding-y-sm !default;\n$input-padding-x-sm: $input-btn-padding-x-sm !default;\n$input-font-size-sm: $input-btn-font-size-sm !default;\n$input-line-height-sm: $input-btn-line-height-sm !default;\n\n$input-padding-y-lg: $input-btn-padding-y-lg !default;\n$input-padding-x-lg: $input-btn-padding-x-lg !default;\n$input-font-size-lg: $input-btn-font-size-lg !default;\n$input-line-height-lg: $input-btn-line-height-lg !default;\n\n$input-bg: $white !default;\n$input-disabled-bg: $gray-200 !default;\n\n$input-color: $gray-700 !default;\n$input-border-color: $gray-400 !default;\n$input-border-width: $input-btn-border-width !default;\n$input-box-shadow: inset 0 1px 1px rgba($black, .075) !default;\n\n$input-border-radius: $border-radius !default;\n$input-border-radius-lg: $border-radius-lg !default;\n$input-border-radius-sm: $border-radius-sm !default;\n\n$input-focus-bg: $input-bg !default;\n$input-focus-border-color: lighten($component-active-bg, 25%) !default;\n$input-focus-color: $input-color !default;\n$input-focus-width: $input-btn-focus-width !default;\n$input-focus-box-shadow: $input-btn-focus-box-shadow !default;\n\n$input-placeholder-color: $gray-600 !default;\n$input-plaintext-color: $body-color !default;\n\n$input-height-border: $input-border-width * 2 !default;\n\n$input-height-inner: calc(#{$input-line-height * 1em} + #{$input-padding-y * 2}) !default;\n$input-height-inner-half: calc(#{$input-line-height * .5em} + #{$input-padding-y}) !default;\n$input-height-inner-quarter: calc(#{$input-line-height * .25em} + #{$input-padding-y / 2}) !default;\n\n$input-height: calc(#{$input-line-height * 1em} + #{$input-padding-y * 2} + #{$input-height-border}) !default;\n$input-height-sm: calc(#{$input-line-height-sm * 1em} + #{$input-btn-padding-y-sm * 2} + #{$input-height-border}) !default;\n$input-height-lg: calc(#{$input-line-height-lg * 1em} + #{$input-btn-padding-y-lg * 2} + #{$input-height-border}) !default;\n\n$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$form-text-margin-top: .25rem !default;\n\n$form-check-input-gutter: 1.25rem !default;\n$form-check-input-margin-y: .3rem !default;\n$form-check-input-margin-x: .25rem !default;\n\n$form-check-inline-margin-x: .75rem !default;\n$form-check-inline-input-margin-x: .3125rem !default;\n\n$form-grid-gutter-width: 10px !default;\n$form-group-margin-bottom: 1rem !default;\n\n$input-group-addon-color: $input-color !default;\n$input-group-addon-bg: $gray-200 !default;\n$input-group-addon-border-color: $input-border-color !default;\n\n$custom-forms-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$custom-control-gutter: .5rem !default;\n$custom-control-spacer-x: 1rem !default;\n\n$custom-control-indicator-size: 1rem !default;\n$custom-control-indicator-bg: $input-bg !default;\n\n$custom-control-indicator-bg-size: 50% 50% !default;\n$custom-control-indicator-box-shadow: $input-box-shadow !default;\n$custom-control-indicator-border-color: $gray-500 !default;\n$custom-control-indicator-border-width: $input-border-width !default;\n\n$custom-control-indicator-disabled-bg: $input-disabled-bg !default;\n$custom-control-label-disabled-color: $gray-600 !default;\n\n$custom-control-indicator-checked-color: $component-active-color !default;\n$custom-control-indicator-checked-bg: $component-active-bg !default;\n$custom-control-indicator-checked-disabled-bg: rgba(theme-color(\"primary\"), .5) !default;\n$custom-control-indicator-checked-box-shadow: none !default;\n$custom-control-indicator-checked-border-color: $custom-control-indicator-checked-bg !default;\n\n$custom-control-indicator-focus-box-shadow: $input-focus-box-shadow !default;\n$custom-control-indicator-focus-border-color: $input-focus-border-color !default;\n\n$custom-control-indicator-active-color: $component-active-color !default;\n$custom-control-indicator-active-bg: lighten($component-active-bg, 35%) !default;\n$custom-control-indicator-active-box-shadow: none !default;\n$custom-control-indicator-active-border-color: $custom-control-indicator-active-bg !default;\n\n$custom-checkbox-indicator-border-radius: $border-radius !default;\n$custom-checkbox-indicator-icon-checked: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='#{$custom-control-indicator-checked-color}' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n\n$custom-checkbox-indicator-indeterminate-bg: $component-active-bg !default;\n$custom-checkbox-indicator-indeterminate-color: $custom-control-indicator-checked-color !default;\n$custom-checkbox-indicator-icon-indeterminate: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='#{$custom-checkbox-indicator-indeterminate-color}' d='M0 2h4'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$custom-checkbox-indicator-indeterminate-box-shadow: none !default;\n$custom-checkbox-indicator-indeterminate-border-color: $custom-checkbox-indicator-indeterminate-bg !default;\n\n$custom-radio-indicator-border-radius: 50% !default;\n$custom-radio-indicator-icon-checked: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='#{$custom-control-indicator-checked-color}'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n\n$custom-switch-width: $custom-control-indicator-size * 1.75 !default;\n$custom-switch-indicator-border-radius: $custom-control-indicator-size / 2 !default;\n$custom-switch-indicator-size: calc(#{$custom-control-indicator-size} - #{$custom-control-indicator-border-width * 4}) !default;\n\n$custom-select-padding-y: $input-padding-y !default;\n$custom-select-padding-x: $input-padding-x !default;\n$custom-select-font-family: $input-font-family !default;\n$custom-select-font-size: $input-font-size !default;\n$custom-select-height: $input-height !default;\n$custom-select-indicator-padding: 1rem !default; // Extra padding to account for the presence of the background-image based indicator\n$custom-select-font-weight: $input-font-weight !default;\n$custom-select-line-height: $input-line-height !default;\n$custom-select-color: $input-color !default;\n$custom-select-disabled-color: $gray-600 !default;\n$custom-select-bg: $input-bg !default;\n$custom-select-disabled-bg: $gray-200 !default;\n$custom-select-bg-size: 8px 10px !default; // In pixels because image dimensions\n$custom-select-indicator-color: $gray-800 !default;\n$custom-select-indicator: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='#{$custom-select-indicator-color}' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$custom-select-background: $custom-select-indicator no-repeat right $custom-select-padding-x center / $custom-select-bg-size !default; // Used so we can have multiple background elements (e.g., arrow and feedback icon)\n\n$custom-select-feedback-icon-padding-right: calc((1em + #{2 * $custom-select-padding-y}) * 3 / 4 + #{$custom-select-padding-x + $custom-select-indicator-padding}) !default;\n$custom-select-feedback-icon-position: center right ($custom-select-padding-x + $custom-select-indicator-padding) !default;\n$custom-select-feedback-icon-size: $input-height-inner-half $input-height-inner-half !default;\n\n$custom-select-border-width: $input-border-width !default;\n$custom-select-border-color: $input-border-color !default;\n$custom-select-border-radius: $border-radius !default;\n$custom-select-box-shadow: inset 0 1px 2px rgba($black, .075) !default;\n\n$custom-select-focus-border-color: $input-focus-border-color !default;\n$custom-select-focus-width: $input-focus-width !default;\n$custom-select-focus-box-shadow: 0 0 0 $custom-select-focus-width $input-btn-focus-color !default;\n\n$custom-select-padding-y-sm: $input-padding-y-sm !default;\n$custom-select-padding-x-sm: $input-padding-x-sm !default;\n$custom-select-font-size-sm: $input-font-size-sm !default;\n$custom-select-height-sm: $input-height-sm !default;\n\n$custom-select-padding-y-lg: $input-padding-y-lg !default;\n$custom-select-padding-x-lg: $input-padding-x-lg !default;\n$custom-select-font-size-lg: $input-font-size-lg !default;\n$custom-select-height-lg: $input-height-lg !default;\n\n$custom-range-track-width: 100% !default;\n$custom-range-track-height: .5rem !default;\n$custom-range-track-cursor: pointer !default;\n$custom-range-track-bg: $gray-300 !default;\n$custom-range-track-border-radius: 1rem !default;\n$custom-range-track-box-shadow: inset 0 .25rem .25rem rgba($black, .1) !default;\n\n$custom-range-thumb-width: 1rem !default;\n$custom-range-thumb-height: $custom-range-thumb-width !default;\n$custom-range-thumb-bg: $component-active-bg !default;\n$custom-range-thumb-border: 0 !default;\n$custom-range-thumb-border-radius: 1rem !default;\n$custom-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;\n$custom-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, $input-focus-box-shadow !default;\n$custom-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in IE/Edge\n$custom-range-thumb-active-bg: lighten($component-active-bg, 35%) !default;\n$custom-range-thumb-disabled-bg: $gray-500 !default;\n\n$custom-file-height: $input-height !default;\n$custom-file-height-inner: $input-height-inner !default;\n$custom-file-focus-border-color: $input-focus-border-color !default;\n$custom-file-focus-box-shadow: $input-focus-box-shadow !default;\n$custom-file-disabled-bg: $input-disabled-bg !default;\n\n$custom-file-padding-y: $input-padding-y !default;\n$custom-file-padding-x: $input-padding-x !default;\n$custom-file-line-height: $input-line-height !default;\n$custom-file-font-family: $input-font-family !default;\n$custom-file-font-weight: $input-font-weight !default;\n$custom-file-color: $input-color !default;\n$custom-file-bg: $input-bg !default;\n$custom-file-border-width: $input-border-width !default;\n$custom-file-border-color: $input-border-color !default;\n$custom-file-border-radius: $input-border-radius !default;\n$custom-file-box-shadow: $input-box-shadow !default;\n$custom-file-button-color: $custom-file-color !default;\n$custom-file-button-bg: $input-group-addon-bg !default;\n$custom-file-text: (\n en: \"Browse\"\n) !default;\n\n\n// Form validation\n\n$form-feedback-margin-top: $form-text-margin-top !default;\n$form-feedback-font-size: $small-font-size !default;\n$form-feedback-valid-color: theme-color(\"success\") !default;\n$form-feedback-invalid-color: theme-color(\"danger\") !default;\n\n$form-feedback-icon-valid-color: $form-feedback-valid-color !default;\n$form-feedback-icon-valid: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='#{$form-feedback-icon-valid-color}' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$form-feedback-icon-invalid-color: $form-feedback-invalid-color !default;\n$form-feedback-icon-invalid: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$form-feedback-icon-invalid-color}' viewBox='-2 -2 7 7'%3e%3cpath stroke='#{$form-feedback-icon-invalid-color}' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\"), \"#\", \"%23\") !default;\n\n$form-validation-states: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$form-validation-states: map-merge(\n (\n \"valid\": (\n \"color\": $form-feedback-valid-color,\n \"icon\": $form-feedback-icon-valid\n ),\n \"invalid\": (\n \"color\": $form-feedback-invalid-color,\n \"icon\": $form-feedback-icon-invalid\n ),\n ),\n $form-validation-states\n);\n\n// Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n\n$zindex-dropdown: 1000 !default;\n$zindex-sticky: 1020 !default;\n$zindex-fixed: 1030 !default;\n$zindex-modal-backdrop: 1040 !default;\n$zindex-modal: 1050 !default;\n$zindex-popover: 1060 !default;\n$zindex-tooltip: 1070 !default;\n\n\n// Navs\n\n$nav-link-padding-y: .5rem !default;\n$nav-link-padding-x: 1rem !default;\n$nav-link-disabled-color: $gray-600 !default;\n\n$nav-tabs-border-color: $gray-300 !default;\n$nav-tabs-border-width: $border-width !default;\n$nav-tabs-border-radius: $border-radius !default;\n$nav-tabs-link-hover-border-color: $gray-200 $gray-200 $nav-tabs-border-color !default;\n$nav-tabs-link-active-color: $gray-700 !default;\n$nav-tabs-link-active-bg: $body-bg !default;\n$nav-tabs-link-active-border-color: $gray-300 $gray-300 $nav-tabs-link-active-bg !default;\n\n$nav-pills-border-radius: $border-radius !default;\n$nav-pills-link-active-color: $component-active-color !default;\n$nav-pills-link-active-bg: $component-active-bg !default;\n\n$nav-divider-color: $gray-200 !default;\n$nav-divider-margin-y: $spacer / 2 !default;\n\n\n// Navbar\n\n$navbar-padding-y: $spacer / 2 !default;\n$navbar-padding-x: $spacer !default;\n\n$navbar-nav-link-padding-x: .5rem !default;\n\n$navbar-brand-font-size: $font-size-lg !default;\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\n$nav-link-height: $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default;\n$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default;\n$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) / 2 !default;\n\n$navbar-toggler-padding-y: .25rem !default;\n$navbar-toggler-padding-x: .75rem !default;\n$navbar-toggler-font-size: $font-size-lg !default;\n$navbar-toggler-border-radius: $btn-border-radius !default;\n\n$navbar-dark-color: rgba($white, .5) !default;\n$navbar-dark-hover-color: rgba($white, .75) !default;\n$navbar-dark-active-color: $white !default;\n$navbar-dark-disabled-color: rgba($white, .25) !default;\n$navbar-dark-toggler-icon-bg: str-replace(url(\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='#{$navbar-dark-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$navbar-dark-toggler-border-color: rgba($white, .1) !default;\n\n$navbar-light-color: rgba($black, .5) !default;\n$navbar-light-hover-color: rgba($black, .7) !default;\n$navbar-light-active-color: rgba($black, .9) !default;\n$navbar-light-disabled-color: rgba($black, .3) !default;\n$navbar-light-toggler-icon-bg: str-replace(url(\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='#{$navbar-light-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$navbar-light-toggler-border-color: rgba($black, .1) !default;\n\n$navbar-light-brand-color: $navbar-light-active-color !default;\n$navbar-light-brand-hover-color: $navbar-light-active-color !default;\n$navbar-dark-brand-color: $navbar-dark-active-color !default;\n$navbar-dark-brand-hover-color: $navbar-dark-active-color !default;\n\n\n// Dropdowns\n//\n// Dropdown menu container and contents.\n\n$dropdown-min-width: 10rem !default;\n$dropdown-padding-y: .5rem !default;\n$dropdown-spacer: .125rem !default;\n$dropdown-font-size: $font-size-base !default;\n$dropdown-color: $body-color !default;\n$dropdown-bg: $white !default;\n$dropdown-border-color: rgba($black, .15) !default;\n$dropdown-border-radius: $border-radius !default;\n$dropdown-border-width: $border-width !default;\n$dropdown-inner-border-radius: calc(#{$dropdown-border-radius} - #{$dropdown-border-width}) !default;\n$dropdown-divider-bg: $gray-200 !default;\n$dropdown-divider-margin-y: $nav-divider-margin-y !default;\n$dropdown-box-shadow: 0 .5rem 1rem rgba($black, .175) !default;\n\n$dropdown-link-color: $gray-900 !default;\n$dropdown-link-hover-color: darken($gray-900, 5%) !default;\n$dropdown-link-hover-bg: $gray-100 !default;\n\n$dropdown-link-active-color: $component-active-color !default;\n$dropdown-link-active-bg: $component-active-bg !default;\n\n$dropdown-link-disabled-color: $gray-600 !default;\n\n$dropdown-item-padding-y: .25rem !default;\n$dropdown-item-padding-x: 1.5rem !default;\n\n$dropdown-header-color: $gray-600 !default;\n\n\n// Pagination\n\n$pagination-padding-y: .5rem !default;\n$pagination-padding-x: .75rem !default;\n$pagination-padding-y-sm: .25rem !default;\n$pagination-padding-x-sm: .5rem !default;\n$pagination-padding-y-lg: .75rem !default;\n$pagination-padding-x-lg: 1.5rem !default;\n$pagination-line-height: 1.25 !default;\n\n$pagination-color: $link-color !default;\n$pagination-bg: $white !default;\n$pagination-border-width: $border-width !default;\n$pagination-border-color: $gray-300 !default;\n\n$pagination-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$pagination-focus-outline: 0 !default;\n\n$pagination-hover-color: $link-hover-color !default;\n$pagination-hover-bg: $gray-200 !default;\n$pagination-hover-border-color: $gray-300 !default;\n\n$pagination-active-color: $component-active-color !default;\n$pagination-active-bg: $component-active-bg !default;\n$pagination-active-border-color: $pagination-active-bg !default;\n\n$pagination-disabled-color: $gray-600 !default;\n$pagination-disabled-bg: $white !default;\n$pagination-disabled-border-color: $gray-300 !default;\n\n\n// Jumbotron\n\n$jumbotron-padding: 2rem !default;\n$jumbotron-color: null !default;\n$jumbotron-bg: $gray-200 !default;\n\n\n// Cards\n\n$card-spacer-y: .75rem !default;\n$card-spacer-x: 1.25rem !default;\n$card-border-width: $border-width !default;\n$card-border-radius: $border-radius !default;\n$card-border-color: rgba($black, .125) !default;\n$card-inner-border-radius: calc(#{$card-border-radius} - #{$card-border-width}) !default;\n$card-cap-bg: rgba($black, .03) !default;\n$card-cap-color: null !default;\n$card-color: null !default;\n$card-bg: $white !default;\n\n$card-img-overlay-padding: 1.25rem !default;\n\n$card-group-margin: $grid-gutter-width / 2 !default;\n$card-deck-margin: $card-group-margin !default;\n\n$card-columns-count: 3 !default;\n$card-columns-gap: 1.25rem !default;\n$card-columns-margin: $card-spacer-y !default;\n\n\n// Tooltips\n\n$tooltip-font-size: $font-size-sm !default;\n$tooltip-max-width: 200px !default;\n$tooltip-color: $white !default;\n$tooltip-bg: $black !default;\n$tooltip-border-radius: $border-radius !default;\n$tooltip-opacity: .9 !default;\n$tooltip-padding-y: .25rem !default;\n$tooltip-padding-x: .5rem !default;\n$tooltip-margin: 0 !default;\n\n$tooltip-arrow-width: .8rem !default;\n$tooltip-arrow-height: .4rem !default;\n$tooltip-arrow-color: $tooltip-bg !default;\n\n// Form tooltips must come after regular tooltips\n$form-feedback-tooltip-padding-y: $tooltip-padding-y !default;\n$form-feedback-tooltip-padding-x: $tooltip-padding-x !default;\n$form-feedback-tooltip-font-size: $tooltip-font-size !default;\n$form-feedback-tooltip-line-height: $line-height-base !default;\n$form-feedback-tooltip-opacity: $tooltip-opacity !default;\n$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;\n\n\n// Popovers\n\n$popover-font-size: $font-size-sm !default;\n$popover-bg: $white !default;\n$popover-max-width: 276px !default;\n$popover-border-width: $border-width !default;\n$popover-border-color: rgba($black, .2) !default;\n$popover-border-radius: $border-radius-lg !default;\n$popover-box-shadow: 0 .25rem .5rem rgba($black, .2) !default;\n\n$popover-header-bg: darken($popover-bg, 3%) !default;\n$popover-header-color: $headings-color !default;\n$popover-header-padding-y: .5rem !default;\n$popover-header-padding-x: .75rem !default;\n\n$popover-body-color: $body-color !default;\n$popover-body-padding-y: $popover-header-padding-y !default;\n$popover-body-padding-x: $popover-header-padding-x !default;\n\n$popover-arrow-width: 1rem !default;\n$popover-arrow-height: .5rem !default;\n$popover-arrow-color: $popover-bg !default;\n\n$popover-arrow-outer-color: fade-in($popover-border-color, .05) !default;\n\n\n// Toasts\n\n$toast-max-width: 350px !default;\n$toast-padding-x: .75rem !default;\n$toast-padding-y: .25rem !default;\n$toast-font-size: .875rem !default;\n$toast-color: null !default;\n$toast-background-color: rgba($white, .85) !default;\n$toast-border-width: 1px !default;\n$toast-border-color: rgba(0, 0, 0, .1) !default;\n$toast-border-radius: .25rem !default;\n$toast-box-shadow: 0 .25rem .75rem rgba($black, .1) !default;\n\n$toast-header-color: $gray-600 !default;\n$toast-header-background-color: rgba($white, .85) !default;\n$toast-header-border-color: rgba(0, 0, 0, .05) !default;\n\n\n// Badges\n\n$badge-font-size: 75% !default;\n$badge-font-weight: $font-weight-bold !default;\n$badge-padding-y: .25em !default;\n$badge-padding-x: .4em !default;\n$badge-border-radius: $border-radius !default;\n\n$badge-transition: $btn-transition !default;\n$badge-focus-width: $input-btn-focus-width !default;\n\n$badge-pill-padding-x: .6em !default;\n// Use a higher than normal value to ensure completely rounded edges when\n// customizing padding or font-size on labels.\n$badge-pill-border-radius: 10rem !default;\n\n\n// Modals\n\n// Padding applied to the modal body\n$modal-inner-padding: 1rem !default;\n\n$modal-dialog-margin: .5rem !default;\n$modal-dialog-margin-y-sm-up: 1.75rem !default;\n\n$modal-title-line-height: $line-height-base !default;\n\n$modal-content-color: null !default;\n$modal-content-bg: $white !default;\n$modal-content-border-color: rgba($black, .2) !default;\n$modal-content-border-width: $border-width !default;\n$modal-content-border-radius: $border-radius-lg !default;\n$modal-content-box-shadow-xs: 0 .25rem .5rem rgba($black, .5) !default;\n$modal-content-box-shadow-sm-up: 0 .5rem 1rem rgba($black, .5) !default;\n\n$modal-backdrop-bg: $black !default;\n$modal-backdrop-opacity: .5 !default;\n$modal-header-border-color: $border-color !default;\n$modal-footer-border-color: $modal-header-border-color !default;\n$modal-header-border-width: $modal-content-border-width !default;\n$modal-footer-border-width: $modal-header-border-width !default;\n$modal-header-padding-y: 1rem !default;\n$modal-header-padding-x: 1rem !default;\n$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility\n\n$modal-xl: 1140px !default;\n$modal-lg: 800px !default;\n$modal-md: 500px !default;\n$modal-sm: 300px !default;\n\n$modal-fade-transform: translate(0, -50px) !default;\n$modal-show-transform: none !default;\n$modal-transition: transform .3s ease-out !default;\n\n\n// Alerts\n//\n// Define alert colors, border radius, and padding.\n\n$alert-padding-y: .75rem !default;\n$alert-padding-x: 1.25rem !default;\n$alert-margin-bottom: 1rem !default;\n$alert-border-radius: $border-radius !default;\n$alert-link-font-weight: $font-weight-bold !default;\n$alert-border-width: $border-width !default;\n\n$alert-bg-level: -10 !default;\n$alert-border-level: -9 !default;\n$alert-color-level: 6 !default;\n\n\n// Progress bars\n\n$progress-height: 1rem !default;\n$progress-font-size: $font-size-base * .75 !default;\n$progress-bg: $gray-200 !default;\n$progress-border-radius: $border-radius !default;\n$progress-box-shadow: inset 0 .1rem .1rem rgba($black, .1) !default;\n$progress-bar-color: $white !default;\n$progress-bar-bg: theme-color(\"primary\") !default;\n$progress-bar-animation-timing: 1s linear infinite !default;\n$progress-bar-transition: width .6s ease !default;\n\n\n// List group\n\n$list-group-color: null !default;\n$list-group-bg: $white !default;\n$list-group-border-color: rgba($black, .125) !default;\n$list-group-border-width: $border-width !default;\n$list-group-border-radius: $border-radius !default;\n\n$list-group-item-padding-y: .75rem !default;\n$list-group-item-padding-x: 1.25rem !default;\n\n$list-group-hover-bg: $gray-100 !default;\n$list-group-active-color: $component-active-color !default;\n$list-group-active-bg: $component-active-bg !default;\n$list-group-active-border-color: $list-group-active-bg !default;\n\n$list-group-disabled-color: $gray-600 !default;\n$list-group-disabled-bg: $list-group-bg !default;\n\n$list-group-action-color: $gray-700 !default;\n$list-group-action-hover-color: $list-group-action-color !default;\n\n$list-group-action-active-color: $body-color !default;\n$list-group-action-active-bg: $gray-200 !default;\n\n\n// Image thumbnails\n\n$thumbnail-padding: .25rem !default;\n$thumbnail-bg: $body-bg !default;\n$thumbnail-border-width: $border-width !default;\n$thumbnail-border-color: $gray-300 !default;\n$thumbnail-border-radius: $border-radius !default;\n$thumbnail-box-shadow: 0 1px 2px rgba($black, .075) !default;\n\n\n// Figures\n\n$figure-caption-font-size: 90% !default;\n$figure-caption-color: $gray-600 !default;\n\n\n// Breadcrumbs\n\n$breadcrumb-padding-y: .75rem !default;\n$breadcrumb-padding-x: 1rem !default;\n$breadcrumb-item-padding: .5rem !default;\n\n$breadcrumb-margin-bottom: 1rem !default;\n\n$breadcrumb-bg: $gray-200 !default;\n$breadcrumb-divider-color: $gray-600 !default;\n$breadcrumb-active-color: $gray-600 !default;\n$breadcrumb-divider: quote(\"/\") !default;\n\n$breadcrumb-border-radius: $border-radius !default;\n\n\n// Carousel\n\n$carousel-control-color: $white !default;\n$carousel-control-width: 15% !default;\n$carousel-control-opacity: .5 !default;\n$carousel-control-hover-opacity: .9 !default;\n$carousel-control-transition: opacity .15s ease !default;\n\n$carousel-indicator-width: 30px !default;\n$carousel-indicator-height: 3px !default;\n$carousel-indicator-hit-area-height: 10px !default;\n$carousel-indicator-spacer: 3px !default;\n$carousel-indicator-active-bg: $white !default;\n$carousel-indicator-transition: opacity .6s ease !default;\n\n$carousel-caption-width: 70% !default;\n$carousel-caption-color: $white !default;\n\n$carousel-control-icon-width: 20px !default;\n\n$carousel-control-prev-icon-bg: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$carousel-control-next-icon-bg: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n\n$carousel-transition-duration: .6s !default;\n$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)\n\n\n// Spinners\n\n$spinner-width: 2rem !default;\n$spinner-height: $spinner-width !default;\n$spinner-border-width: .25em !default;\n\n$spinner-width-sm: 1rem !default;\n$spinner-height-sm: $spinner-width-sm !default;\n$spinner-border-width-sm: .2em !default;\n\n\n// Close\n\n$close-font-size: $font-size-base * 1.5 !default;\n$close-font-weight: $font-weight-bold !default;\n$close-color: $black !default;\n$close-text-shadow: 0 1px 0 $white !default;\n\n\n// Code\n\n$code-font-size: 87.5% !default;\n$code-color: $pink !default;\n\n$kbd-padding-y: .2rem !default;\n$kbd-padding-x: .4rem !default;\n$kbd-font-size: $code-font-size !default;\n$kbd-color: $white !default;\n$kbd-bg: $gray-900 !default;\n\n$pre-color: $gray-900 !default;\n$pre-scrollable-max-height: 340px !default;\n\n\n// Utilities\n\n$displays: none, inline, inline-block, block, table, table-row, table-cell, flex, inline-flex !default;\n$overflows: auto, hidden !default;\n$positions: static, relative, absolute, fixed, sticky !default;\n\n\n// Printing\n\n$print-page-size: a3 !default;\n$print-body-min-width: map-get($grid-breakpoints, \"lg\") !default;\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n // Common properties for all breakpoints\n %grid-column {\n position: relative;\n width: 100%;\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n }\n\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n // Allow columns to stretch full width below their breakpoints\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @extend %grid-column;\n }\n }\n .col#{$infix},\n .col#{$infix}-auto {\n @extend %grid-column;\n }\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col#{$infix}-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%; // Reset earlier grid tiers\n }\n\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n .order#{$infix}-first { order: -1; }\n\n .order#{$infix}-last { order: $columns + 1; }\n\n @for $i from 0 through $columns {\n .order#{$infix}-#{$i} { order: $i; }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n }\n}\n","// stylelint-disable declaration-no-important\n\n//\n// Utilities for common `display` values\n//\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @each $value in $displays {\n .d#{$infix}-#{$value} { display: $value !important; }\n }\n }\n}\n\n\n//\n// Utilities for toggling `display` in print\n//\n\n@media print {\n @each $value in $displays {\n .d-print-#{$value} { display: $value !important; }\n }\n}\n","// stylelint-disable declaration-no-important\n\n// Flex variation\n//\n// Custom styles for additional flex alignment options.\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .flex#{$infix}-row { flex-direction: row !important; }\n .flex#{$infix}-column { flex-direction: column !important; }\n .flex#{$infix}-row-reverse { flex-direction: row-reverse !important; }\n .flex#{$infix}-column-reverse { flex-direction: column-reverse !important; }\n\n .flex#{$infix}-wrap { flex-wrap: wrap !important; }\n .flex#{$infix}-nowrap { flex-wrap: nowrap !important; }\n .flex#{$infix}-wrap-reverse { flex-wrap: wrap-reverse !important; }\n .flex#{$infix}-fill { flex: 1 1 auto !important; }\n .flex#{$infix}-grow-0 { flex-grow: 0 !important; }\n .flex#{$infix}-grow-1 { flex-grow: 1 !important; }\n .flex#{$infix}-shrink-0 { flex-shrink: 0 !important; }\n .flex#{$infix}-shrink-1 { flex-shrink: 1 !important; }\n\n .justify-content#{$infix}-start { justify-content: flex-start !important; }\n .justify-content#{$infix}-end { justify-content: flex-end !important; }\n .justify-content#{$infix}-center { justify-content: center !important; }\n .justify-content#{$infix}-between { justify-content: space-between !important; }\n .justify-content#{$infix}-around { justify-content: space-around !important; }\n\n .align-items#{$infix}-start { align-items: flex-start !important; }\n .align-items#{$infix}-end { align-items: flex-end !important; }\n .align-items#{$infix}-center { align-items: center !important; }\n .align-items#{$infix}-baseline { align-items: baseline !important; }\n .align-items#{$infix}-stretch { align-items: stretch !important; }\n\n .align-content#{$infix}-start { align-content: flex-start !important; }\n .align-content#{$infix}-end { align-content: flex-end !important; }\n .align-content#{$infix}-center { align-content: center !important; }\n .align-content#{$infix}-between { align-content: space-between !important; }\n .align-content#{$infix}-around { align-content: space-around !important; }\n .align-content#{$infix}-stretch { align-content: stretch !important; }\n\n .align-self#{$infix}-auto { align-self: auto !important; }\n .align-self#{$infix}-start { align-self: flex-start !important; }\n .align-self#{$infix}-end { align-self: flex-end !important; }\n .align-self#{$infix}-center { align-self: center !important; }\n .align-self#{$infix}-baseline { align-self: baseline !important; }\n .align-self#{$infix}-stretch { align-self: stretch !important; }\n }\n}\n","// stylelint-disable declaration-no-important\n\n// Margin and Padding\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @each $prop, $abbrev in (margin: m, padding: p) {\n @each $size, $length in $spacers {\n .#{$abbrev}#{$infix}-#{$size} { #{$prop}: $length !important; }\n .#{$abbrev}t#{$infix}-#{$size},\n .#{$abbrev}y#{$infix}-#{$size} {\n #{$prop}-top: $length !important;\n }\n .#{$abbrev}r#{$infix}-#{$size},\n .#{$abbrev}x#{$infix}-#{$size} {\n #{$prop}-right: $length !important;\n }\n .#{$abbrev}b#{$infix}-#{$size},\n .#{$abbrev}y#{$infix}-#{$size} {\n #{$prop}-bottom: $length !important;\n }\n .#{$abbrev}l#{$infix}-#{$size},\n .#{$abbrev}x#{$infix}-#{$size} {\n #{$prop}-left: $length !important;\n }\n }\n }\n\n // Negative margins (e.g., where `.mb-n1` is negative version of `.mb-1`)\n @each $size, $length in $spacers {\n @if $size != 0 {\n .m#{$infix}-n#{$size} { margin: -$length !important; }\n .mt#{$infix}-n#{$size},\n .my#{$infix}-n#{$size} {\n margin-top: -$length !important;\n }\n .mr#{$infix}-n#{$size},\n .mx#{$infix}-n#{$size} {\n margin-right: -$length !important;\n }\n .mb#{$infix}-n#{$size},\n .my#{$infix}-n#{$size} {\n margin-bottom: -$length !important;\n }\n .ml#{$infix}-n#{$size},\n .mx#{$infix}-n#{$size} {\n margin-left: -$length !important;\n }\n }\n }\n\n // Some special margin utils\n .m#{$infix}-auto { margin: auto !important; }\n .mt#{$infix}-auto,\n .my#{$infix}-auto {\n margin-top: auto !important;\n }\n .mr#{$infix}-auto,\n .mx#{$infix}-auto {\n margin-right: auto !important;\n }\n .mb#{$infix}-auto,\n .my#{$infix}-auto {\n margin-bottom: auto !important;\n }\n .ml#{$infix}-auto,\n .mx#{$infix}-auto {\n margin-left: auto !important;\n }\n }\n}\n"]} \ No newline at end of file diff --git a/_Resources/node_modules/web-dev-utils/bootstrap-4.3.1-dist/css/bootstrap-grid.min.css b/_Resources/node_modules/web-dev-utils/bootstrap-4.3.1-dist/css/bootstrap-grid.min.css deleted file mode 100644 index e5e74f7..0000000 --- a/_Resources/node_modules/web-dev-utils/bootstrap-4.3.1-dist/css/bootstrap-grid.min.css +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap Grid v4.3.1 (https://getbootstrap.com/) - * Copyright 2011-2019 The Bootstrap Authors - * Copyright 2011-2019 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */html{box-sizing:border-box;-ms-overflow-style:scrollbar}*,::after,::before{box-sizing:inherit}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.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-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.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-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.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-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}} -/*# sourceMappingURL=bootstrap-grid.min.css.map */ \ No newline at end of file diff --git a/_Resources/node_modules/web-dev-utils/bootstrap-4.3.1-dist/css/bootstrap-grid.min.css.map b/_Resources/node_modules/web-dev-utils/bootstrap-4.3.1-dist/css/bootstrap-grid.min.css.map deleted file mode 100644 index 13e33db..0000000 --- a/_Resources/node_modules/web-dev-utils/bootstrap-4.3.1-dist/css/bootstrap-grid.min.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../../scss/bootstrap-grid.scss","dist/css/bootstrap-grid.css","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_breakpoints.scss","../../scss/mixins/_grid-framework.scss","../../scss/utilities/_display.scss","../../scss/utilities/_flex.scss","../../scss/utilities/_spacing.scss"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Bootstrap Grid v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\nhtml {\n box-sizing: border-box;\n -ms-overflow-style: scrollbar;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit;\n}\n\n@import \"functions\";\n@import \"variables\";\n\n@import \"mixins/breakpoints\";\n@import \"mixins/grid-framework\";\n@import \"mixins/grid\";\n\n@import \"grid\";\n@import \"utilities/display\";\n@import \"utilities/flex\";\n@import \"utilities/spacing\";\n","/*!\n * Bootstrap Grid v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\nhtml {\n box-sizing: border-box;\n -ms-overflow-style: scrollbar;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit;\n}\n\n.container {\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 576px) {\n .container {\n max-width: 540px;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n max-width: 720px;\n }\n}\n\n@media (min-width: 992px) {\n .container {\n max-width: 960px;\n }\n}\n\n@media (min-width: 1200px) {\n .container {\n max-width: 1140px;\n }\n}\n\n.container-fluid {\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n\n.row {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n margin-right: -15px;\n margin-left: -15px;\n}\n\n.no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .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, .col-sm,\n.col-sm-auto, .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, .col-md,\n.col-md-auto, .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, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto {\n position: relative;\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n}\n\n.col {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n}\n\n.col-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n}\n\n.col-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n}\n\n.col-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n}\n\n.col-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n}\n\n.col-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n}\n\n.col-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n}\n\n.col-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n}\n\n.col-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n}\n\n.col-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n}\n\n.col-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n}\n\n.col-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n}\n\n.col-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n}\n\n.col-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n}\n\n.order-first {\n -ms-flex-order: -1;\n order: -1;\n}\n\n.order-last {\n -ms-flex-order: 13;\n order: 13;\n}\n\n.order-0 {\n -ms-flex-order: 0;\n order: 0;\n}\n\n.order-1 {\n -ms-flex-order: 1;\n order: 1;\n}\n\n.order-2 {\n -ms-flex-order: 2;\n order: 2;\n}\n\n.order-3 {\n -ms-flex-order: 3;\n order: 3;\n}\n\n.order-4 {\n -ms-flex-order: 4;\n order: 4;\n}\n\n.order-5 {\n -ms-flex-order: 5;\n order: 5;\n}\n\n.order-6 {\n -ms-flex-order: 6;\n order: 6;\n}\n\n.order-7 {\n -ms-flex-order: 7;\n order: 7;\n}\n\n.order-8 {\n -ms-flex-order: 8;\n order: 8;\n}\n\n.order-9 {\n -ms-flex-order: 9;\n order: 9;\n}\n\n.order-10 {\n -ms-flex-order: 10;\n order: 10;\n}\n\n.order-11 {\n -ms-flex-order: 11;\n order: 11;\n}\n\n.order-12 {\n -ms-flex-order: 12;\n order: 12;\n}\n\n.offset-1 {\n margin-left: 8.333333%;\n}\n\n.offset-2 {\n margin-left: 16.666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.333333%;\n}\n\n.offset-5 {\n margin-left: 41.666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.333333%;\n}\n\n.offset-8 {\n margin-left: 66.666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.333333%;\n}\n\n.offset-11 {\n margin-left: 91.666667%;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-sm-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-sm-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-sm-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-sm-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-sm-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-sm-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-sm-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-sm-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-sm-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-sm-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-sm-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-sm-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-sm-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-sm-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-sm-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-sm-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-sm-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-sm-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-sm-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-sm-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-sm-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-sm-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-sm-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-sm-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-sm-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-sm-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-sm-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-sm-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-sm-0 {\n margin-left: 0;\n }\n .offset-sm-1 {\n margin-left: 8.333333%;\n }\n .offset-sm-2 {\n margin-left: 16.666667%;\n }\n .offset-sm-3 {\n margin-left: 25%;\n }\n .offset-sm-4 {\n margin-left: 33.333333%;\n }\n .offset-sm-5 {\n margin-left: 41.666667%;\n }\n .offset-sm-6 {\n margin-left: 50%;\n }\n .offset-sm-7 {\n margin-left: 58.333333%;\n }\n .offset-sm-8 {\n margin-left: 66.666667%;\n }\n .offset-sm-9 {\n margin-left: 75%;\n }\n .offset-sm-10 {\n margin-left: 83.333333%;\n }\n .offset-sm-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 768px) {\n .col-md {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-md-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-md-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-md-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-md-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-md-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-md-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-md-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-md-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-md-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-md-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-md-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-md-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-md-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-md-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-md-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-md-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-md-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-md-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-md-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-md-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-md-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-md-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-md-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-md-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-md-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-md-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-md-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-md-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-md-0 {\n margin-left: 0;\n }\n .offset-md-1 {\n margin-left: 8.333333%;\n }\n .offset-md-2 {\n margin-left: 16.666667%;\n }\n .offset-md-3 {\n margin-left: 25%;\n }\n .offset-md-4 {\n margin-left: 33.333333%;\n }\n .offset-md-5 {\n margin-left: 41.666667%;\n }\n .offset-md-6 {\n margin-left: 50%;\n }\n .offset-md-7 {\n margin-left: 58.333333%;\n }\n .offset-md-8 {\n margin-left: 66.666667%;\n }\n .offset-md-9 {\n margin-left: 75%;\n }\n .offset-md-10 {\n margin-left: 83.333333%;\n }\n .offset-md-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 992px) {\n .col-lg {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-lg-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-lg-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-lg-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-lg-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-lg-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-lg-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-lg-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-lg-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-lg-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-lg-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-lg-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-lg-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-lg-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-lg-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-lg-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-lg-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-lg-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-lg-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-lg-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-lg-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-lg-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-lg-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-lg-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-lg-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-lg-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-lg-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-lg-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-lg-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-lg-0 {\n margin-left: 0;\n }\n .offset-lg-1 {\n margin-left: 8.333333%;\n }\n .offset-lg-2 {\n margin-left: 16.666667%;\n }\n .offset-lg-3 {\n margin-left: 25%;\n }\n .offset-lg-4 {\n margin-left: 33.333333%;\n }\n .offset-lg-5 {\n margin-left: 41.666667%;\n }\n .offset-lg-6 {\n margin-left: 50%;\n }\n .offset-lg-7 {\n margin-left: 58.333333%;\n }\n .offset-lg-8 {\n margin-left: 66.666667%;\n }\n .offset-lg-9 {\n margin-left: 75%;\n }\n .offset-lg-10 {\n margin-left: 83.333333%;\n }\n .offset-lg-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 1200px) {\n .col-xl {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-xl-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-xl-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-xl-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xl-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-xl-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-xl-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-xl-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-xl-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-xl-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-xl-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-xl-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-xl-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-xl-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-xl-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-xl-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-xl-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-xl-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-xl-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-xl-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-xl-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-xl-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-xl-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-xl-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-xl-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-xl-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-xl-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-xl-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-xl-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-xl-0 {\n margin-left: 0;\n }\n .offset-xl-1 {\n margin-left: 8.333333%;\n }\n .offset-xl-2 {\n margin-left: 16.666667%;\n }\n .offset-xl-3 {\n margin-left: 25%;\n }\n .offset-xl-4 {\n margin-left: 33.333333%;\n }\n .offset-xl-5 {\n margin-left: 41.666667%;\n }\n .offset-xl-6 {\n margin-left: 50%;\n }\n .offset-xl-7 {\n margin-left: 58.333333%;\n }\n .offset-xl-8 {\n margin-left: 66.666667%;\n }\n .offset-xl-9 {\n margin-left: 75%;\n }\n .offset-xl-10 {\n margin-left: 83.333333%;\n }\n .offset-xl-11 {\n margin-left: 91.666667%;\n }\n}\n\n.d-none {\n display: none !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n}\n\n.d-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n}\n\n@media (min-width: 576px) {\n .d-sm-none {\n display: none !important;\n }\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 768px) {\n .d-md-none {\n display: none !important;\n }\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-md-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 992px) {\n .d-lg-none {\n display: none !important;\n }\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 1200px) {\n .d-xl-none {\n display: none !important;\n }\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media print {\n .d-print-none {\n display: none !important;\n }\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-print-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n.flex-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n}\n\n.flex-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n}\n\n.flex-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n}\n\n.flex-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n}\n\n.justify-content-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n}\n\n.justify-content-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n}\n\n.align-items-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n}\n\n.align-items-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n}\n\n.align-items-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n}\n\n.align-items-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n}\n\n.align-content-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n}\n\n.align-content-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n}\n\n.align-content-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n}\n\n.align-content-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n}\n\n.align-content-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n}\n\n.align-self-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n}\n\n.align-self-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n}\n\n.align-self-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n}\n\n.align-self-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n}\n\n.align-self-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n}\n\n@media (min-width: 576px) {\n .flex-sm-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-sm-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-sm-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-sm-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-sm-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-sm-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-sm-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-sm-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-sm-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-sm-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-sm-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-sm-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-sm-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-sm-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 768px) {\n .flex-md-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-md-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-md-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-md-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-md-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-md-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-md-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-md-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-md-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-md-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-md-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-md-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-md-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-md-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-md-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-md-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-md-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-md-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-md-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-md-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-md-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 992px) {\n .flex-lg-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-lg-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-lg-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-lg-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-lg-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-lg-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-lg-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-lg-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-lg-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-lg-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-lg-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-lg-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-lg-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-lg-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1200px) {\n .flex-xl-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-xl-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-xl-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-xl-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-xl-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-xl-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-xl-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-xl-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-xl-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-xl-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-xl-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-xl-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-xl-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-xl-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.mt-0,\n.my-0 {\n margin-top: 0 !important;\n}\n\n.mr-0,\n.mx-0 {\n margin-right: 0 !important;\n}\n\n.mb-0,\n.my-0 {\n margin-bottom: 0 !important;\n}\n\n.ml-0,\n.mx-0 {\n margin-left: 0 !important;\n}\n\n.m-1 {\n margin: 0.25rem !important;\n}\n\n.mt-1,\n.my-1 {\n margin-top: 0.25rem !important;\n}\n\n.mr-1,\n.mx-1 {\n margin-right: 0.25rem !important;\n}\n\n.mb-1,\n.my-1 {\n margin-bottom: 0.25rem !important;\n}\n\n.ml-1,\n.mx-1 {\n margin-left: 0.25rem !important;\n}\n\n.m-2 {\n margin: 0.5rem !important;\n}\n\n.mt-2,\n.my-2 {\n margin-top: 0.5rem !important;\n}\n\n.mr-2,\n.mx-2 {\n margin-right: 0.5rem !important;\n}\n\n.mb-2,\n.my-2 {\n margin-bottom: 0.5rem !important;\n}\n\n.ml-2,\n.mx-2 {\n margin-left: 0.5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.mt-3,\n.my-3 {\n margin-top: 1rem !important;\n}\n\n.mr-3,\n.mx-3 {\n margin-right: 1rem !important;\n}\n\n.mb-3,\n.my-3 {\n margin-bottom: 1rem !important;\n}\n\n.ml-3,\n.mx-3 {\n margin-left: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.mt-4,\n.my-4 {\n margin-top: 1.5rem !important;\n}\n\n.mr-4,\n.mx-4 {\n margin-right: 1.5rem !important;\n}\n\n.mb-4,\n.my-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.ml-4,\n.mx-4 {\n margin-left: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.mt-5,\n.my-5 {\n margin-top: 3rem !important;\n}\n\n.mr-5,\n.mx-5 {\n margin-right: 3rem !important;\n}\n\n.mb-5,\n.my-5 {\n margin-bottom: 3rem !important;\n}\n\n.ml-5,\n.mx-5 {\n margin-left: 3rem !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.pt-0,\n.py-0 {\n padding-top: 0 !important;\n}\n\n.pr-0,\n.px-0 {\n padding-right: 0 !important;\n}\n\n.pb-0,\n.py-0 {\n padding-bottom: 0 !important;\n}\n\n.pl-0,\n.px-0 {\n padding-left: 0 !important;\n}\n\n.p-1 {\n padding: 0.25rem !important;\n}\n\n.pt-1,\n.py-1 {\n padding-top: 0.25rem !important;\n}\n\n.pr-1,\n.px-1 {\n padding-right: 0.25rem !important;\n}\n\n.pb-1,\n.py-1 {\n padding-bottom: 0.25rem !important;\n}\n\n.pl-1,\n.px-1 {\n padding-left: 0.25rem !important;\n}\n\n.p-2 {\n padding: 0.5rem !important;\n}\n\n.pt-2,\n.py-2 {\n padding-top: 0.5rem !important;\n}\n\n.pr-2,\n.px-2 {\n padding-right: 0.5rem !important;\n}\n\n.pb-2,\n.py-2 {\n padding-bottom: 0.5rem !important;\n}\n\n.pl-2,\n.px-2 {\n padding-left: 0.5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.pt-3,\n.py-3 {\n padding-top: 1rem !important;\n}\n\n.pr-3,\n.px-3 {\n padding-right: 1rem !important;\n}\n\n.pb-3,\n.py-3 {\n padding-bottom: 1rem !important;\n}\n\n.pl-3,\n.px-3 {\n padding-left: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.pt-4,\n.py-4 {\n padding-top: 1.5rem !important;\n}\n\n.pr-4,\n.px-4 {\n padding-right: 1.5rem !important;\n}\n\n.pb-4,\n.py-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pl-4,\n.px-4 {\n padding-left: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.pt-5,\n.py-5 {\n padding-top: 3rem !important;\n}\n\n.pr-5,\n.px-5 {\n padding-right: 3rem !important;\n}\n\n.pb-5,\n.py-5 {\n padding-bottom: 3rem !important;\n}\n\n.pl-5,\n.px-5 {\n padding-left: 3rem !important;\n}\n\n.m-n1 {\n margin: -0.25rem !important;\n}\n\n.mt-n1,\n.my-n1 {\n margin-top: -0.25rem !important;\n}\n\n.mr-n1,\n.mx-n1 {\n margin-right: -0.25rem !important;\n}\n\n.mb-n1,\n.my-n1 {\n margin-bottom: -0.25rem !important;\n}\n\n.ml-n1,\n.mx-n1 {\n margin-left: -0.25rem !important;\n}\n\n.m-n2 {\n margin: -0.5rem !important;\n}\n\n.mt-n2,\n.my-n2 {\n margin-top: -0.5rem !important;\n}\n\n.mr-n2,\n.mx-n2 {\n margin-right: -0.5rem !important;\n}\n\n.mb-n2,\n.my-n2 {\n margin-bottom: -0.5rem !important;\n}\n\n.ml-n2,\n.mx-n2 {\n margin-left: -0.5rem !important;\n}\n\n.m-n3 {\n margin: -1rem !important;\n}\n\n.mt-n3,\n.my-n3 {\n margin-top: -1rem !important;\n}\n\n.mr-n3,\n.mx-n3 {\n margin-right: -1rem !important;\n}\n\n.mb-n3,\n.my-n3 {\n margin-bottom: -1rem !important;\n}\n\n.ml-n3,\n.mx-n3 {\n margin-left: -1rem !important;\n}\n\n.m-n4 {\n margin: -1.5rem !important;\n}\n\n.mt-n4,\n.my-n4 {\n margin-top: -1.5rem !important;\n}\n\n.mr-n4,\n.mx-n4 {\n margin-right: -1.5rem !important;\n}\n\n.mb-n4,\n.my-n4 {\n margin-bottom: -1.5rem !important;\n}\n\n.ml-n4,\n.mx-n4 {\n margin-left: -1.5rem !important;\n}\n\n.m-n5 {\n margin: -3rem !important;\n}\n\n.mt-n5,\n.my-n5 {\n margin-top: -3rem !important;\n}\n\n.mr-n5,\n.mx-n5 {\n margin-right: -3rem !important;\n}\n\n.mb-n5,\n.my-n5 {\n margin-bottom: -3rem !important;\n}\n\n.ml-n5,\n.mx-n5 {\n margin-left: -3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mt-auto,\n.my-auto {\n margin-top: auto !important;\n}\n\n.mr-auto,\n.mx-auto {\n margin-right: auto !important;\n}\n\n.mb-auto,\n.my-auto {\n margin-bottom: auto !important;\n}\n\n.ml-auto,\n.mx-auto {\n margin-left: auto !important;\n}\n\n@media (min-width: 576px) {\n .m-sm-0 {\n margin: 0 !important;\n }\n .mt-sm-0,\n .my-sm-0 {\n margin-top: 0 !important;\n }\n .mr-sm-0,\n .mx-sm-0 {\n margin-right: 0 !important;\n }\n .mb-sm-0,\n .my-sm-0 {\n margin-bottom: 0 !important;\n }\n .ml-sm-0,\n .mx-sm-0 {\n margin-left: 0 !important;\n }\n .m-sm-1 {\n margin: 0.25rem !important;\n }\n .mt-sm-1,\n .my-sm-1 {\n margin-top: 0.25rem !important;\n }\n .mr-sm-1,\n .mx-sm-1 {\n margin-right: 0.25rem !important;\n }\n .mb-sm-1,\n .my-sm-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-sm-1,\n .mx-sm-1 {\n margin-left: 0.25rem !important;\n }\n .m-sm-2 {\n margin: 0.5rem !important;\n }\n .mt-sm-2,\n .my-sm-2 {\n margin-top: 0.5rem !important;\n }\n .mr-sm-2,\n .mx-sm-2 {\n margin-right: 0.5rem !important;\n }\n .mb-sm-2,\n .my-sm-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-sm-2,\n .mx-sm-2 {\n margin-left: 0.5rem !important;\n }\n .m-sm-3 {\n margin: 1rem !important;\n }\n .mt-sm-3,\n .my-sm-3 {\n margin-top: 1rem !important;\n }\n .mr-sm-3,\n .mx-sm-3 {\n margin-right: 1rem !important;\n }\n .mb-sm-3,\n .my-sm-3 {\n margin-bottom: 1rem !important;\n }\n .ml-sm-3,\n .mx-sm-3 {\n margin-left: 1rem !important;\n }\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n .mt-sm-4,\n .my-sm-4 {\n margin-top: 1.5rem !important;\n }\n .mr-sm-4,\n .mx-sm-4 {\n margin-right: 1.5rem !important;\n }\n .mb-sm-4,\n .my-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-sm-4,\n .mx-sm-4 {\n margin-left: 1.5rem !important;\n }\n .m-sm-5 {\n margin: 3rem !important;\n }\n .mt-sm-5,\n .my-sm-5 {\n margin-top: 3rem !important;\n }\n .mr-sm-5,\n .mx-sm-5 {\n margin-right: 3rem !important;\n }\n .mb-sm-5,\n .my-sm-5 {\n margin-bottom: 3rem !important;\n }\n .ml-sm-5,\n .mx-sm-5 {\n margin-left: 3rem !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .pt-sm-0,\n .py-sm-0 {\n padding-top: 0 !important;\n }\n .pr-sm-0,\n .px-sm-0 {\n padding-right: 0 !important;\n }\n .pb-sm-0,\n .py-sm-0 {\n padding-bottom: 0 !important;\n }\n .pl-sm-0,\n .px-sm-0 {\n padding-left: 0 !important;\n }\n .p-sm-1 {\n padding: 0.25rem !important;\n }\n .pt-sm-1,\n .py-sm-1 {\n padding-top: 0.25rem !important;\n }\n .pr-sm-1,\n .px-sm-1 {\n padding-right: 0.25rem !important;\n }\n .pb-sm-1,\n .py-sm-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-sm-1,\n .px-sm-1 {\n padding-left: 0.25rem !important;\n }\n .p-sm-2 {\n padding: 0.5rem !important;\n }\n .pt-sm-2,\n .py-sm-2 {\n padding-top: 0.5rem !important;\n }\n .pr-sm-2,\n .px-sm-2 {\n padding-right: 0.5rem !important;\n }\n .pb-sm-2,\n .py-sm-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-sm-2,\n .px-sm-2 {\n padding-left: 0.5rem !important;\n }\n .p-sm-3 {\n padding: 1rem !important;\n }\n .pt-sm-3,\n .py-sm-3 {\n padding-top: 1rem !important;\n }\n .pr-sm-3,\n .px-sm-3 {\n padding-right: 1rem !important;\n }\n .pb-sm-3,\n .py-sm-3 {\n padding-bottom: 1rem !important;\n }\n .pl-sm-3,\n .px-sm-3 {\n padding-left: 1rem !important;\n }\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n .pt-sm-4,\n .py-sm-4 {\n padding-top: 1.5rem !important;\n }\n .pr-sm-4,\n .px-sm-4 {\n padding-right: 1.5rem !important;\n }\n .pb-sm-4,\n .py-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-sm-4,\n .px-sm-4 {\n padding-left: 1.5rem !important;\n }\n .p-sm-5 {\n padding: 3rem !important;\n }\n .pt-sm-5,\n .py-sm-5 {\n padding-top: 3rem !important;\n }\n .pr-sm-5,\n .px-sm-5 {\n padding-right: 3rem !important;\n }\n .pb-sm-5,\n .py-sm-5 {\n padding-bottom: 3rem !important;\n }\n .pl-sm-5,\n .px-sm-5 {\n padding-left: 3rem !important;\n }\n .m-sm-n1 {\n margin: -0.25rem !important;\n }\n .mt-sm-n1,\n .my-sm-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-sm-n1,\n .mx-sm-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-sm-n1,\n .my-sm-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-sm-n1,\n .mx-sm-n1 {\n margin-left: -0.25rem !important;\n }\n .m-sm-n2 {\n margin: -0.5rem !important;\n }\n .mt-sm-n2,\n .my-sm-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-sm-n2,\n .mx-sm-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-sm-n2,\n .my-sm-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-sm-n2,\n .mx-sm-n2 {\n margin-left: -0.5rem !important;\n }\n .m-sm-n3 {\n margin: -1rem !important;\n }\n .mt-sm-n3,\n .my-sm-n3 {\n margin-top: -1rem !important;\n }\n .mr-sm-n3,\n .mx-sm-n3 {\n margin-right: -1rem !important;\n }\n .mb-sm-n3,\n .my-sm-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-sm-n3,\n .mx-sm-n3 {\n margin-left: -1rem !important;\n }\n .m-sm-n4 {\n margin: -1.5rem !important;\n }\n .mt-sm-n4,\n .my-sm-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-sm-n4,\n .mx-sm-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-sm-n4,\n .my-sm-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-sm-n4,\n .mx-sm-n4 {\n margin-left: -1.5rem !important;\n }\n .m-sm-n5 {\n margin: -3rem !important;\n }\n .mt-sm-n5,\n .my-sm-n5 {\n margin-top: -3rem !important;\n }\n .mr-sm-n5,\n .mx-sm-n5 {\n margin-right: -3rem !important;\n }\n .mb-sm-n5,\n .my-sm-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-sm-n5,\n .mx-sm-n5 {\n margin-left: -3rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mt-sm-auto,\n .my-sm-auto {\n margin-top: auto !important;\n }\n .mr-sm-auto,\n .mx-sm-auto {\n margin-right: auto !important;\n }\n .mb-sm-auto,\n .my-sm-auto {\n margin-bottom: auto !important;\n }\n .ml-sm-auto,\n .mx-sm-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 768px) {\n .m-md-0 {\n margin: 0 !important;\n }\n .mt-md-0,\n .my-md-0 {\n margin-top: 0 !important;\n }\n .mr-md-0,\n .mx-md-0 {\n margin-right: 0 !important;\n }\n .mb-md-0,\n .my-md-0 {\n margin-bottom: 0 !important;\n }\n .ml-md-0,\n .mx-md-0 {\n margin-left: 0 !important;\n }\n .m-md-1 {\n margin: 0.25rem !important;\n }\n .mt-md-1,\n .my-md-1 {\n margin-top: 0.25rem !important;\n }\n .mr-md-1,\n .mx-md-1 {\n margin-right: 0.25rem !important;\n }\n .mb-md-1,\n .my-md-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-md-1,\n .mx-md-1 {\n margin-left: 0.25rem !important;\n }\n .m-md-2 {\n margin: 0.5rem !important;\n }\n .mt-md-2,\n .my-md-2 {\n margin-top: 0.5rem !important;\n }\n .mr-md-2,\n .mx-md-2 {\n margin-right: 0.5rem !important;\n }\n .mb-md-2,\n .my-md-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-md-2,\n .mx-md-2 {\n margin-left: 0.5rem !important;\n }\n .m-md-3 {\n margin: 1rem !important;\n }\n .mt-md-3,\n .my-md-3 {\n margin-top: 1rem !important;\n }\n .mr-md-3,\n .mx-md-3 {\n margin-right: 1rem !important;\n }\n .mb-md-3,\n .my-md-3 {\n margin-bottom: 1rem !important;\n }\n .ml-md-3,\n .mx-md-3 {\n margin-left: 1rem !important;\n }\n .m-md-4 {\n margin: 1.5rem !important;\n }\n .mt-md-4,\n .my-md-4 {\n margin-top: 1.5rem !important;\n }\n .mr-md-4,\n .mx-md-4 {\n margin-right: 1.5rem !important;\n }\n .mb-md-4,\n .my-md-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-md-4,\n .mx-md-4 {\n margin-left: 1.5rem !important;\n }\n .m-md-5 {\n margin: 3rem !important;\n }\n .mt-md-5,\n .my-md-5 {\n margin-top: 3rem !important;\n }\n .mr-md-5,\n .mx-md-5 {\n margin-right: 3rem !important;\n }\n .mb-md-5,\n .my-md-5 {\n margin-bottom: 3rem !important;\n }\n .ml-md-5,\n .mx-md-5 {\n margin-left: 3rem !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .pt-md-0,\n .py-md-0 {\n padding-top: 0 !important;\n }\n .pr-md-0,\n .px-md-0 {\n padding-right: 0 !important;\n }\n .pb-md-0,\n .py-md-0 {\n padding-bottom: 0 !important;\n }\n .pl-md-0,\n .px-md-0 {\n padding-left: 0 !important;\n }\n .p-md-1 {\n padding: 0.25rem !important;\n }\n .pt-md-1,\n .py-md-1 {\n padding-top: 0.25rem !important;\n }\n .pr-md-1,\n .px-md-1 {\n padding-right: 0.25rem !important;\n }\n .pb-md-1,\n .py-md-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-md-1,\n .px-md-1 {\n padding-left: 0.25rem !important;\n }\n .p-md-2 {\n padding: 0.5rem !important;\n }\n .pt-md-2,\n .py-md-2 {\n padding-top: 0.5rem !important;\n }\n .pr-md-2,\n .px-md-2 {\n padding-right: 0.5rem !important;\n }\n .pb-md-2,\n .py-md-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-md-2,\n .px-md-2 {\n padding-left: 0.5rem !important;\n }\n .p-md-3 {\n padding: 1rem !important;\n }\n .pt-md-3,\n .py-md-3 {\n padding-top: 1rem !important;\n }\n .pr-md-3,\n .px-md-3 {\n padding-right: 1rem !important;\n }\n .pb-md-3,\n .py-md-3 {\n padding-bottom: 1rem !important;\n }\n .pl-md-3,\n .px-md-3 {\n padding-left: 1rem !important;\n }\n .p-md-4 {\n padding: 1.5rem !important;\n }\n .pt-md-4,\n .py-md-4 {\n padding-top: 1.5rem !important;\n }\n .pr-md-4,\n .px-md-4 {\n padding-right: 1.5rem !important;\n }\n .pb-md-4,\n .py-md-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-md-4,\n .px-md-4 {\n padding-left: 1.5rem !important;\n }\n .p-md-5 {\n padding: 3rem !important;\n }\n .pt-md-5,\n .py-md-5 {\n padding-top: 3rem !important;\n }\n .pr-md-5,\n .px-md-5 {\n padding-right: 3rem !important;\n }\n .pb-md-5,\n .py-md-5 {\n padding-bottom: 3rem !important;\n }\n .pl-md-5,\n .px-md-5 {\n padding-left: 3rem !important;\n }\n .m-md-n1 {\n margin: -0.25rem !important;\n }\n .mt-md-n1,\n .my-md-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-md-n1,\n .mx-md-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-md-n1,\n .my-md-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-md-n1,\n .mx-md-n1 {\n margin-left: -0.25rem !important;\n }\n .m-md-n2 {\n margin: -0.5rem !important;\n }\n .mt-md-n2,\n .my-md-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-md-n2,\n .mx-md-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-md-n2,\n .my-md-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-md-n2,\n .mx-md-n2 {\n margin-left: -0.5rem !important;\n }\n .m-md-n3 {\n margin: -1rem !important;\n }\n .mt-md-n3,\n .my-md-n3 {\n margin-top: -1rem !important;\n }\n .mr-md-n3,\n .mx-md-n3 {\n margin-right: -1rem !important;\n }\n .mb-md-n3,\n .my-md-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-md-n3,\n .mx-md-n3 {\n margin-left: -1rem !important;\n }\n .m-md-n4 {\n margin: -1.5rem !important;\n }\n .mt-md-n4,\n .my-md-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-md-n4,\n .mx-md-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-md-n4,\n .my-md-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-md-n4,\n .mx-md-n4 {\n margin-left: -1.5rem !important;\n }\n .m-md-n5 {\n margin: -3rem !important;\n }\n .mt-md-n5,\n .my-md-n5 {\n margin-top: -3rem !important;\n }\n .mr-md-n5,\n .mx-md-n5 {\n margin-right: -3rem !important;\n }\n .mb-md-n5,\n .my-md-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-md-n5,\n .mx-md-n5 {\n margin-left: -3rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mt-md-auto,\n .my-md-auto {\n margin-top: auto !important;\n }\n .mr-md-auto,\n .mx-md-auto {\n margin-right: auto !important;\n }\n .mb-md-auto,\n .my-md-auto {\n margin-bottom: auto !important;\n }\n .ml-md-auto,\n .mx-md-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 992px) {\n .m-lg-0 {\n margin: 0 !important;\n }\n .mt-lg-0,\n .my-lg-0 {\n margin-top: 0 !important;\n }\n .mr-lg-0,\n .mx-lg-0 {\n margin-right: 0 !important;\n }\n .mb-lg-0,\n .my-lg-0 {\n margin-bottom: 0 !important;\n }\n .ml-lg-0,\n .mx-lg-0 {\n margin-left: 0 !important;\n }\n .m-lg-1 {\n margin: 0.25rem !important;\n }\n .mt-lg-1,\n .my-lg-1 {\n margin-top: 0.25rem !important;\n }\n .mr-lg-1,\n .mx-lg-1 {\n margin-right: 0.25rem !important;\n }\n .mb-lg-1,\n .my-lg-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-lg-1,\n .mx-lg-1 {\n margin-left: 0.25rem !important;\n }\n .m-lg-2 {\n margin: 0.5rem !important;\n }\n .mt-lg-2,\n .my-lg-2 {\n margin-top: 0.5rem !important;\n }\n .mr-lg-2,\n .mx-lg-2 {\n margin-right: 0.5rem !important;\n }\n .mb-lg-2,\n .my-lg-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-lg-2,\n .mx-lg-2 {\n margin-left: 0.5rem !important;\n }\n .m-lg-3 {\n margin: 1rem !important;\n }\n .mt-lg-3,\n .my-lg-3 {\n margin-top: 1rem !important;\n }\n .mr-lg-3,\n .mx-lg-3 {\n margin-right: 1rem !important;\n }\n .mb-lg-3,\n .my-lg-3 {\n margin-bottom: 1rem !important;\n }\n .ml-lg-3,\n .mx-lg-3 {\n margin-left: 1rem !important;\n }\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n .mt-lg-4,\n .my-lg-4 {\n margin-top: 1.5rem !important;\n }\n .mr-lg-4,\n .mx-lg-4 {\n margin-right: 1.5rem !important;\n }\n .mb-lg-4,\n .my-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-lg-4,\n .mx-lg-4 {\n margin-left: 1.5rem !important;\n }\n .m-lg-5 {\n margin: 3rem !important;\n }\n .mt-lg-5,\n .my-lg-5 {\n margin-top: 3rem !important;\n }\n .mr-lg-5,\n .mx-lg-5 {\n margin-right: 3rem !important;\n }\n .mb-lg-5,\n .my-lg-5 {\n margin-bottom: 3rem !important;\n }\n .ml-lg-5,\n .mx-lg-5 {\n margin-left: 3rem !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .pt-lg-0,\n .py-lg-0 {\n padding-top: 0 !important;\n }\n .pr-lg-0,\n .px-lg-0 {\n padding-right: 0 !important;\n }\n .pb-lg-0,\n .py-lg-0 {\n padding-bottom: 0 !important;\n }\n .pl-lg-0,\n .px-lg-0 {\n padding-left: 0 !important;\n }\n .p-lg-1 {\n padding: 0.25rem !important;\n }\n .pt-lg-1,\n .py-lg-1 {\n padding-top: 0.25rem !important;\n }\n .pr-lg-1,\n .px-lg-1 {\n padding-right: 0.25rem !important;\n }\n .pb-lg-1,\n .py-lg-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-lg-1,\n .px-lg-1 {\n padding-left: 0.25rem !important;\n }\n .p-lg-2 {\n padding: 0.5rem !important;\n }\n .pt-lg-2,\n .py-lg-2 {\n padding-top: 0.5rem !important;\n }\n .pr-lg-2,\n .px-lg-2 {\n padding-right: 0.5rem !important;\n }\n .pb-lg-2,\n .py-lg-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-lg-2,\n .px-lg-2 {\n padding-left: 0.5rem !important;\n }\n .p-lg-3 {\n padding: 1rem !important;\n }\n .pt-lg-3,\n .py-lg-3 {\n padding-top: 1rem !important;\n }\n .pr-lg-3,\n .px-lg-3 {\n padding-right: 1rem !important;\n }\n .pb-lg-3,\n .py-lg-3 {\n padding-bottom: 1rem !important;\n }\n .pl-lg-3,\n .px-lg-3 {\n padding-left: 1rem !important;\n }\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n .pt-lg-4,\n .py-lg-4 {\n padding-top: 1.5rem !important;\n }\n .pr-lg-4,\n .px-lg-4 {\n padding-right: 1.5rem !important;\n }\n .pb-lg-4,\n .py-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-lg-4,\n .px-lg-4 {\n padding-left: 1.5rem !important;\n }\n .p-lg-5 {\n padding: 3rem !important;\n }\n .pt-lg-5,\n .py-lg-5 {\n padding-top: 3rem !important;\n }\n .pr-lg-5,\n .px-lg-5 {\n padding-right: 3rem !important;\n }\n .pb-lg-5,\n .py-lg-5 {\n padding-bottom: 3rem !important;\n }\n .pl-lg-5,\n .px-lg-5 {\n padding-left: 3rem !important;\n }\n .m-lg-n1 {\n margin: -0.25rem !important;\n }\n .mt-lg-n1,\n .my-lg-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-lg-n1,\n .mx-lg-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-lg-n1,\n .my-lg-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-lg-n1,\n .mx-lg-n1 {\n margin-left: -0.25rem !important;\n }\n .m-lg-n2 {\n margin: -0.5rem !important;\n }\n .mt-lg-n2,\n .my-lg-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-lg-n2,\n .mx-lg-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-lg-n2,\n .my-lg-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-lg-n2,\n .mx-lg-n2 {\n margin-left: -0.5rem !important;\n }\n .m-lg-n3 {\n margin: -1rem !important;\n }\n .mt-lg-n3,\n .my-lg-n3 {\n margin-top: -1rem !important;\n }\n .mr-lg-n3,\n .mx-lg-n3 {\n margin-right: -1rem !important;\n }\n .mb-lg-n3,\n .my-lg-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-lg-n3,\n .mx-lg-n3 {\n margin-left: -1rem !important;\n }\n .m-lg-n4 {\n margin: -1.5rem !important;\n }\n .mt-lg-n4,\n .my-lg-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-lg-n4,\n .mx-lg-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-lg-n4,\n .my-lg-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-lg-n4,\n .mx-lg-n4 {\n margin-left: -1.5rem !important;\n }\n .m-lg-n5 {\n margin: -3rem !important;\n }\n .mt-lg-n5,\n .my-lg-n5 {\n margin-top: -3rem !important;\n }\n .mr-lg-n5,\n .mx-lg-n5 {\n margin-right: -3rem !important;\n }\n .mb-lg-n5,\n .my-lg-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-lg-n5,\n .mx-lg-n5 {\n margin-left: -3rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mt-lg-auto,\n .my-lg-auto {\n margin-top: auto !important;\n }\n .mr-lg-auto,\n .mx-lg-auto {\n margin-right: auto !important;\n }\n .mb-lg-auto,\n .my-lg-auto {\n margin-bottom: auto !important;\n }\n .ml-lg-auto,\n .mx-lg-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 1200px) {\n .m-xl-0 {\n margin: 0 !important;\n }\n .mt-xl-0,\n .my-xl-0 {\n margin-top: 0 !important;\n }\n .mr-xl-0,\n .mx-xl-0 {\n margin-right: 0 !important;\n }\n .mb-xl-0,\n .my-xl-0 {\n margin-bottom: 0 !important;\n }\n .ml-xl-0,\n .mx-xl-0 {\n margin-left: 0 !important;\n }\n .m-xl-1 {\n margin: 0.25rem !important;\n }\n .mt-xl-1,\n .my-xl-1 {\n margin-top: 0.25rem !important;\n }\n .mr-xl-1,\n .mx-xl-1 {\n margin-right: 0.25rem !important;\n }\n .mb-xl-1,\n .my-xl-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-xl-1,\n .mx-xl-1 {\n margin-left: 0.25rem !important;\n }\n .m-xl-2 {\n margin: 0.5rem !important;\n }\n .mt-xl-2,\n .my-xl-2 {\n margin-top: 0.5rem !important;\n }\n .mr-xl-2,\n .mx-xl-2 {\n margin-right: 0.5rem !important;\n }\n .mb-xl-2,\n .my-xl-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-xl-2,\n .mx-xl-2 {\n margin-left: 0.5rem !important;\n }\n .m-xl-3 {\n margin: 1rem !important;\n }\n .mt-xl-3,\n .my-xl-3 {\n margin-top: 1rem !important;\n }\n .mr-xl-3,\n .mx-xl-3 {\n margin-right: 1rem !important;\n }\n .mb-xl-3,\n .my-xl-3 {\n margin-bottom: 1rem !important;\n }\n .ml-xl-3,\n .mx-xl-3 {\n margin-left: 1rem !important;\n }\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n .mt-xl-4,\n .my-xl-4 {\n margin-top: 1.5rem !important;\n }\n .mr-xl-4,\n .mx-xl-4 {\n margin-right: 1.5rem !important;\n }\n .mb-xl-4,\n .my-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-xl-4,\n .mx-xl-4 {\n margin-left: 1.5rem !important;\n }\n .m-xl-5 {\n margin: 3rem !important;\n }\n .mt-xl-5,\n .my-xl-5 {\n margin-top: 3rem !important;\n }\n .mr-xl-5,\n .mx-xl-5 {\n margin-right: 3rem !important;\n }\n .mb-xl-5,\n .my-xl-5 {\n margin-bottom: 3rem !important;\n }\n .ml-xl-5,\n .mx-xl-5 {\n margin-left: 3rem !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .pt-xl-0,\n .py-xl-0 {\n padding-top: 0 !important;\n }\n .pr-xl-0,\n .px-xl-0 {\n padding-right: 0 !important;\n }\n .pb-xl-0,\n .py-xl-0 {\n padding-bottom: 0 !important;\n }\n .pl-xl-0,\n .px-xl-0 {\n padding-left: 0 !important;\n }\n .p-xl-1 {\n padding: 0.25rem !important;\n }\n .pt-xl-1,\n .py-xl-1 {\n padding-top: 0.25rem !important;\n }\n .pr-xl-1,\n .px-xl-1 {\n padding-right: 0.25rem !important;\n }\n .pb-xl-1,\n .py-xl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-xl-1,\n .px-xl-1 {\n padding-left: 0.25rem !important;\n }\n .p-xl-2 {\n padding: 0.5rem !important;\n }\n .pt-xl-2,\n .py-xl-2 {\n padding-top: 0.5rem !important;\n }\n .pr-xl-2,\n .px-xl-2 {\n padding-right: 0.5rem !important;\n }\n .pb-xl-2,\n .py-xl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-xl-2,\n .px-xl-2 {\n padding-left: 0.5rem !important;\n }\n .p-xl-3 {\n padding: 1rem !important;\n }\n .pt-xl-3,\n .py-xl-3 {\n padding-top: 1rem !important;\n }\n .pr-xl-3,\n .px-xl-3 {\n padding-right: 1rem !important;\n }\n .pb-xl-3,\n .py-xl-3 {\n padding-bottom: 1rem !important;\n }\n .pl-xl-3,\n .px-xl-3 {\n padding-left: 1rem !important;\n }\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n .pt-xl-4,\n .py-xl-4 {\n padding-top: 1.5rem !important;\n }\n .pr-xl-4,\n .px-xl-4 {\n padding-right: 1.5rem !important;\n }\n .pb-xl-4,\n .py-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-xl-4,\n .px-xl-4 {\n padding-left: 1.5rem !important;\n }\n .p-xl-5 {\n padding: 3rem !important;\n }\n .pt-xl-5,\n .py-xl-5 {\n padding-top: 3rem !important;\n }\n .pr-xl-5,\n .px-xl-5 {\n padding-right: 3rem !important;\n }\n .pb-xl-5,\n .py-xl-5 {\n padding-bottom: 3rem !important;\n }\n .pl-xl-5,\n .px-xl-5 {\n padding-left: 3rem !important;\n }\n .m-xl-n1 {\n margin: -0.25rem !important;\n }\n .mt-xl-n1,\n .my-xl-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-xl-n1,\n .mx-xl-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-xl-n1,\n .my-xl-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-xl-n1,\n .mx-xl-n1 {\n margin-left: -0.25rem !important;\n }\n .m-xl-n2 {\n margin: -0.5rem !important;\n }\n .mt-xl-n2,\n .my-xl-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-xl-n2,\n .mx-xl-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-xl-n2,\n .my-xl-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-xl-n2,\n .mx-xl-n2 {\n margin-left: -0.5rem !important;\n }\n .m-xl-n3 {\n margin: -1rem !important;\n }\n .mt-xl-n3,\n .my-xl-n3 {\n margin-top: -1rem !important;\n }\n .mr-xl-n3,\n .mx-xl-n3 {\n margin-right: -1rem !important;\n }\n .mb-xl-n3,\n .my-xl-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-xl-n3,\n .mx-xl-n3 {\n margin-left: -1rem !important;\n }\n .m-xl-n4 {\n margin: -1.5rem !important;\n }\n .mt-xl-n4,\n .my-xl-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-xl-n4,\n .mx-xl-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-xl-n4,\n .my-xl-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-xl-n4,\n .mx-xl-n4 {\n margin-left: -1.5rem !important;\n }\n .m-xl-n5 {\n margin: -3rem !important;\n }\n .mt-xl-n5,\n .my-xl-n5 {\n margin-top: -3rem !important;\n }\n .mr-xl-n5,\n .mx-xl-n5 {\n margin-right: -3rem !important;\n }\n .mb-xl-n5,\n .my-xl-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-xl-n5,\n .mx-xl-n5 {\n margin-left: -3rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mt-xl-auto,\n .my-xl-auto {\n margin-top: auto !important;\n }\n .mr-xl-auto,\n .mx-xl-auto {\n margin-right: auto !important;\n }\n .mb-xl-auto,\n .my-xl-auto {\n margin-bottom: auto !important;\n }\n .ml-xl-auto,\n .mx-xl-auto {\n margin-left: auto !important;\n }\n}\n/*# sourceMappingURL=bootstrap-grid.css.map */","// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-grid-classes {\n .container {\n @include make-container();\n @include make-container-max-widths();\n }\n}\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but with 100% width for\n// fluid, full width layouts.\n\n@if $enable-grid-classes {\n .container-fluid {\n @include make-container();\n }\n}\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n@if $enable-grid-classes {\n .row {\n @include make-row();\n }\n\n // Remove the negative margin from default .row, then the horizontal padding\n // from all immediate children columns (to prevent runaway style inheritance).\n .no-gutters {\n margin-right: 0;\n margin-left: 0;\n\n > .col,\n > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n }\n }\n}\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n @include make-grid-columns();\n}\n","/// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-container($gutter: $grid-gutter-width) {\n width: 100%;\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n margin-right: auto;\n margin-left: auto;\n}\n\n\n// For each breakpoint, define the maximum width of the container in a media query\n@mixin make-container-max-widths($max-widths: $container-max-widths, $breakpoints: $grid-breakpoints) {\n @each $breakpoint, $container-max-width in $max-widths {\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n max-width: $container-max-width;\n }\n }\n}\n\n@mixin make-row($gutter: $grid-gutter-width) {\n display: flex;\n flex-wrap: wrap;\n margin-right: -$gutter / 2;\n margin-left: -$gutter / 2;\n}\n\n@mixin make-col-ready($gutter: $grid-gutter-width) {\n position: relative;\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we use `flex` values\n // later on to override this initial width.\n width: 100%;\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n}\n\n@mixin make-col($size, $columns: $grid-columns) {\n flex: 0 0 percentage($size / $columns);\n // Add a `max-width` to ensure content within each column does not blow out\n // the width of the column. Applies to IE10+ and Firefox. Chrome and Safari\n // do not appear to require this.\n max-width: percentage($size / $columns);\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: $size / $columns;\n margin-left: if($num == 0, 0, percentage($num));\n}\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @return if($n != null and $n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width. Null for the largest (last) breakpoint.\n// The maximum value is calculated as the minimum of the next one less 0.02px\n// to work around the limitations of `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $next: breakpoint-next($name, $breakpoints);\n @return if($next, breakpoint-min($next, $breakpoints) - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $max: breakpoint-max($name, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($name, $breakpoints) {\n @content;\n }\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n // Common properties for all breakpoints\n %grid-column {\n position: relative;\n width: 100%;\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n }\n\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n // Allow columns to stretch full width below their breakpoints\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @extend %grid-column;\n }\n }\n .col#{$infix},\n .col#{$infix}-auto {\n @extend %grid-column;\n }\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col#{$infix}-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%; // Reset earlier grid tiers\n }\n\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n .order#{$infix}-first { order: -1; }\n\n .order#{$infix}-last { order: $columns + 1; }\n\n @for $i from 0 through $columns {\n .order#{$infix}-#{$i} { order: $i; }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n }\n}\n","// stylelint-disable declaration-no-important\n\n//\n// Utilities for common `display` values\n//\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @each $value in $displays {\n .d#{$infix}-#{$value} { display: $value !important; }\n }\n }\n}\n\n\n//\n// Utilities for toggling `display` in print\n//\n\n@media print {\n @each $value in $displays {\n .d-print-#{$value} { display: $value !important; }\n }\n}\n","// stylelint-disable declaration-no-important\n\n// Flex variation\n//\n// Custom styles for additional flex alignment options.\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .flex#{$infix}-row { flex-direction: row !important; }\n .flex#{$infix}-column { flex-direction: column !important; }\n .flex#{$infix}-row-reverse { flex-direction: row-reverse !important; }\n .flex#{$infix}-column-reverse { flex-direction: column-reverse !important; }\n\n .flex#{$infix}-wrap { flex-wrap: wrap !important; }\n .flex#{$infix}-nowrap { flex-wrap: nowrap !important; }\n .flex#{$infix}-wrap-reverse { flex-wrap: wrap-reverse !important; }\n .flex#{$infix}-fill { flex: 1 1 auto !important; }\n .flex#{$infix}-grow-0 { flex-grow: 0 !important; }\n .flex#{$infix}-grow-1 { flex-grow: 1 !important; }\n .flex#{$infix}-shrink-0 { flex-shrink: 0 !important; }\n .flex#{$infix}-shrink-1 { flex-shrink: 1 !important; }\n\n .justify-content#{$infix}-start { justify-content: flex-start !important; }\n .justify-content#{$infix}-end { justify-content: flex-end !important; }\n .justify-content#{$infix}-center { justify-content: center !important; }\n .justify-content#{$infix}-between { justify-content: space-between !important; }\n .justify-content#{$infix}-around { justify-content: space-around !important; }\n\n .align-items#{$infix}-start { align-items: flex-start !important; }\n .align-items#{$infix}-end { align-items: flex-end !important; }\n .align-items#{$infix}-center { align-items: center !important; }\n .align-items#{$infix}-baseline { align-items: baseline !important; }\n .align-items#{$infix}-stretch { align-items: stretch !important; }\n\n .align-content#{$infix}-start { align-content: flex-start !important; }\n .align-content#{$infix}-end { align-content: flex-end !important; }\n .align-content#{$infix}-center { align-content: center !important; }\n .align-content#{$infix}-between { align-content: space-between !important; }\n .align-content#{$infix}-around { align-content: space-around !important; }\n .align-content#{$infix}-stretch { align-content: stretch !important; }\n\n .align-self#{$infix}-auto { align-self: auto !important; }\n .align-self#{$infix}-start { align-self: flex-start !important; }\n .align-self#{$infix}-end { align-self: flex-end !important; }\n .align-self#{$infix}-center { align-self: center !important; }\n .align-self#{$infix}-baseline { align-self: baseline !important; }\n .align-self#{$infix}-stretch { align-self: stretch !important; }\n }\n}\n","// stylelint-disable declaration-no-important\n\n// Margin and Padding\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @each $prop, $abbrev in (margin: m, padding: p) {\n @each $size, $length in $spacers {\n .#{$abbrev}#{$infix}-#{$size} { #{$prop}: $length !important; }\n .#{$abbrev}t#{$infix}-#{$size},\n .#{$abbrev}y#{$infix}-#{$size} {\n #{$prop}-top: $length !important;\n }\n .#{$abbrev}r#{$infix}-#{$size},\n .#{$abbrev}x#{$infix}-#{$size} {\n #{$prop}-right: $length !important;\n }\n .#{$abbrev}b#{$infix}-#{$size},\n .#{$abbrev}y#{$infix}-#{$size} {\n #{$prop}-bottom: $length !important;\n }\n .#{$abbrev}l#{$infix}-#{$size},\n .#{$abbrev}x#{$infix}-#{$size} {\n #{$prop}-left: $length !important;\n }\n }\n }\n\n // Negative margins (e.g., where `.mb-n1` is negative version of `.mb-1`)\n @each $size, $length in $spacers {\n @if $size != 0 {\n .m#{$infix}-n#{$size} { margin: -$length !important; }\n .mt#{$infix}-n#{$size},\n .my#{$infix}-n#{$size} {\n margin-top: -$length !important;\n }\n .mr#{$infix}-n#{$size},\n .mx#{$infix}-n#{$size} {\n margin-right: -$length !important;\n }\n .mb#{$infix}-n#{$size},\n .my#{$infix}-n#{$size} {\n margin-bottom: -$length !important;\n }\n .ml#{$infix}-n#{$size},\n .mx#{$infix}-n#{$size} {\n margin-left: -$length !important;\n }\n }\n }\n\n // Some special margin utils\n .m#{$infix}-auto { margin: auto !important; }\n .mt#{$infix}-auto,\n .my#{$infix}-auto {\n margin-top: auto !important;\n }\n .mr#{$infix}-auto,\n .mx#{$infix}-auto {\n margin-right: auto !important;\n }\n .mb#{$infix}-auto,\n .my#{$infix}-auto {\n margin-bottom: auto !important;\n }\n .ml#{$infix}-auto,\n .mx#{$infix}-auto {\n margin-left: auto !important;\n }\n }\n}\n"]} \ No newline at end of file diff --git a/_Resources/node_modules/web-dev-utils/bootstrap-4.3.1-dist/css/bootstrap-reboot.css b/_Resources/node_modules/web-dev-utils/bootstrap-4.3.1-dist/css/bootstrap-reboot.css deleted file mode 100644 index 09cf986..0000000 --- a/_Resources/node_modules/web-dev-utils/bootstrap-4.3.1-dist/css/bootstrap-reboot.css +++ /dev/null @@ -1,331 +0,0 @@ -/*! - * Bootstrap Reboot v4.3.1 (https://getbootstrap.com/) - * Copyright 2011-2019 The Bootstrap Authors - * Copyright 2011-2019 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) - */ -*, -*::before, -*::after { - box-sizing: border-box; -} - -html { - font-family: sans-serif; - line-height: 1.15; - -webkit-text-size-adjust: 100%; - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -} - -article, aside, figcaption, figure, footer, header, hgroup, main, nav, section { - display: block; -} - -body { - margin: 0; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - font-size: 1rem; - font-weight: 400; - line-height: 1.5; - color: #212529; - text-align: left; - background-color: #fff; -} - -[tabindex="-1"]:focus { - outline: 0 !important; -} - -hr { - box-sizing: content-box; - height: 0; - overflow: visible; -} - -h1, h2, h3, h4, h5, h6 { - margin-top: 0; - margin-bottom: 0.5rem; -} - -p { - margin-top: 0; - margin-bottom: 1rem; -} - -abbr[title], -abbr[data-original-title] { - text-decoration: underline; - -webkit-text-decoration: underline dotted; - text-decoration: underline dotted; - cursor: help; - border-bottom: 0; - -webkit-text-decoration-skip-ink: none; - text-decoration-skip-ink: none; -} - -address { - margin-bottom: 1rem; - font-style: normal; - line-height: inherit; -} - -ol, -ul, -dl { - margin-top: 0; - margin-bottom: 1rem; -} - -ol ol, -ul ul, -ol ul, -ul ol { - margin-bottom: 0; -} - -dt { - font-weight: 700; -} - -dd { - margin-bottom: .5rem; - margin-left: 0; -} - -blockquote { - margin: 0 0 1rem; -} - -b, -strong { - font-weight: bolder; -} - -small { - font-size: 80%; -} - -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} - -sub { - bottom: -.25em; -} - -sup { - top: -.5em; -} - -a { - color: #007bff; - text-decoration: none; - background-color: transparent; -} - -a:hover { - color: #0056b3; - text-decoration: underline; -} - -a:not([href]):not([tabindex]) { - color: inherit; - text-decoration: none; -} - -a:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus { - color: inherit; - text-decoration: none; -} - -a:not([href]):not([tabindex]):focus { - outline: 0; -} - -pre, -code, -kbd, -samp { - font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; - font-size: 1em; -} - -pre { - margin-top: 0; - margin-bottom: 1rem; - overflow: auto; -} - -figure { - margin: 0 0 1rem; -} - -img { - vertical-align: middle; - border-style: none; -} - -svg { - overflow: hidden; - vertical-align: middle; -} - -table { - border-collapse: collapse; -} - -caption { - padding-top: 0.75rem; - padding-bottom: 0.75rem; - color: #6c757d; - text-align: left; - caption-side: bottom; -} - -th { - text-align: inherit; -} - -label { - display: inline-block; - margin-bottom: 0.5rem; -} - -button { - border-radius: 0; -} - -button:focus { - outline: 1px dotted; - outline: 5px auto -webkit-focus-ring-color; -} - -input, -button, -select, -optgroup, -textarea { - margin: 0; - font-family: inherit; - font-size: inherit; - line-height: inherit; -} - -button, -input { - overflow: visible; -} - -button, -select { - text-transform: none; -} - -select { - word-wrap: normal; -} - -button, -[type="button"], -[type="reset"], -[type="submit"] { - -webkit-appearance: button; -} - -button:not(:disabled), -[type="button"]:not(:disabled), -[type="reset"]:not(:disabled), -[type="submit"]:not(:disabled) { - cursor: pointer; -} - -button::-moz-focus-inner, -[type="button"]::-moz-focus-inner, -[type="reset"]::-moz-focus-inner, -[type="submit"]::-moz-focus-inner { - padding: 0; - border-style: none; -} - -input[type="radio"], -input[type="checkbox"] { - box-sizing: border-box; - padding: 0; -} - -input[type="date"], -input[type="time"], -input[type="datetime-local"], -input[type="month"] { - -webkit-appearance: listbox; -} - -textarea { - overflow: auto; - resize: vertical; -} - -fieldset { - min-width: 0; - padding: 0; - margin: 0; - border: 0; -} - -legend { - display: block; - width: 100%; - max-width: 100%; - padding: 0; - margin-bottom: .5rem; - font-size: 1.5rem; - line-height: inherit; - color: inherit; - white-space: normal; -} - -progress { - vertical-align: baseline; -} - -[type="number"]::-webkit-inner-spin-button, -[type="number"]::-webkit-outer-spin-button { - height: auto; -} - -[type="search"] { - outline-offset: -2px; - -webkit-appearance: none; -} - -[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} - -::-webkit-file-upload-button { - font: inherit; - -webkit-appearance: button; -} - -output { - display: inline-block; -} - -summary { - display: list-item; - cursor: pointer; -} - -template { - display: none; -} - -[hidden] { - display: none !important; -} -/*# sourceMappingURL=bootstrap-reboot.css.map */ \ No newline at end of file diff --git a/_Resources/node_modules/web-dev-utils/bootstrap-4.3.1-dist/css/bootstrap-reboot.css.map b/_Resources/node_modules/web-dev-utils/bootstrap-4.3.1-dist/css/bootstrap-reboot.css.map deleted file mode 100644 index d0b0f02..0000000 --- a/_Resources/node_modules/web-dev-utils/bootstrap-4.3.1-dist/css/bootstrap-reboot.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../../scss/bootstrap-reboot.scss","bootstrap-reboot.css","../../scss/_reboot.scss","../../scss/_variables.scss","../../scss/vendor/_rfs.scss","../../scss/mixins/_hover.scss"],"names":[],"mappings":"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","file":"bootstrap-reboot.css","sourcesContent":["/*!\n * Bootstrap Reboot v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)\n */\n\n@import \"functions\";\n@import \"variables\";\n@import \"mixins\";\n@import \"reboot\";\n","/*!\n * Bootstrap Reboot v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)\n */\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\nhtml {\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\nbody {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #212529;\n text-align: left;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: 0.5rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n text-decoration-skip-ink: none;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #007bff;\n text-decoration: none;\n background-color: transparent;\n}\n\na:hover {\n color: #0056b3;\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg {\n overflow: hidden;\n vertical-align: middle;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n color: #6c757d;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: inherit;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: 0.5rem;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nselect {\n word-wrap: normal;\n}\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton:not(:disabled),\n[type=\"button\"]:not(:disabled),\n[type=\"reset\"]:not(:disabled),\n[type=\"submit\"]:not(:disabled) {\n cursor: pointer;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n cursor: pointer;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n\n/*# sourceMappingURL=bootstrap-reboot.css.map */","// stylelint-disable at-rule-no-vendor-prefix, declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// 1. Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n// 2. Change the default font family in all browsers.\n// 3. Correct the line height in all browsers.\n// 4. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS.\n// 5. Change the default tap highlight to be completely transparent in iOS.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box; // 1\n}\n\nhtml {\n font-family: sans-serif; // 2\n line-height: 1.15; // 3\n -webkit-text-size-adjust: 100%; // 4\n -webkit-tap-highlight-color: rgba($black, 0); // 5\n}\n\n// Shim for \"new\" HTML5 structural elements to display correctly (IE10, older browsers)\n// TODO: remove in v5\n// stylelint-disable-next-line selector-list-comma-newline-after\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Set an explicit initial text-align value so that we can later use\n// the `inherit` value on things like `` elements.\n\nbody {\n margin: 0; // 1\n font-family: $font-family-base;\n @include font-size($font-size-base);\n font-weight: $font-weight-base;\n line-height: $line-height-base;\n color: $body-color;\n text-align: left; // 3\n background-color: $body-bg; // 2\n}\n\n// Suppress the focus outline on elements that cannot be accessed via keyboard.\n// This prevents an unwanted focus outline from appearing around elements that\n// might still respond to pointer events.\n//\n// Credit: https://github.com/suitcss/base\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\n\n// Content grouping\n//\n// 1. Add the correct box sizing in Firefox.\n// 2. Show the overflow in Edge and IE.\n\nhr {\n box-sizing: content-box; // 1\n height: 0; // 1\n overflow: visible; // 2\n}\n\n\n//\n// Typography\n//\n\n// Remove top margins from headings\n//\n// By default, `

`-`

` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n// stylelint-disable-next-line selector-list-comma-newline-after\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: $headings-margin-bottom;\n}\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `

`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n// Abbreviations\n//\n// 1. Duplicate behavior to the data-* attribute for our tooltip plugin\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Remove the bottom border in Firefox 39-.\n// 5. Prevent the text-decoration to be skipped.\n\nabbr[title],\nabbr[data-original-title] { // 1\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n border-bottom: 0; // 4\n text-decoration-skip-ink: none; // 5\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // Undo browser default\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: $font-weight-bolder; // Add the correct font weight in Chrome, Edge, and Safari\n}\n\nsmall {\n @include font-size(80%); // Add the correct font size in all browsers\n}\n\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n//\n\nsub,\nsup {\n position: relative;\n @include font-size(75%);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n//\n// Links\n//\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n background-color: transparent; // Remove the gray background on active links in IE 10.\n\n @include hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href)\n// which have not been made explicitly keyboard-focusable (without tabindex).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n\n @include hover-focus {\n color: inherit;\n text-decoration: none;\n }\n\n &:focus {\n outline: 0;\n }\n}\n\n\n//\n// Code\n//\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-monospace;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\npre {\n // Remove browser default top margin\n margin-top: 0;\n // Reset browser default of `1em` to use `rem`s\n margin-bottom: 1rem;\n // Don't allow content to break outside\n overflow: auto;\n}\n\n\n//\n// Figures\n//\n\nfigure {\n // Apply a consistent margin strategy (matches our type styles).\n margin: 0 0 1rem;\n}\n\n\n//\n// Images and content\n//\n\nimg {\n vertical-align: middle;\n border-style: none; // Remove the border on images inside links in IE 10-.\n}\n\nsvg {\n // Workaround for the SVG overflow bug in IE10/11 is still required.\n // See https://github.com/twbs/bootstrap/issues/26878\n overflow: hidden;\n vertical-align: middle;\n}\n\n\n//\n// Tables\n//\n\ntable {\n border-collapse: collapse; // Prevent double borders\n}\n\ncaption {\n padding-top: $table-cell-padding;\n padding-bottom: $table-cell-padding;\n color: $table-caption-color;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n // Matches default `` alignment by inheriting from the ``, or the\n // closest parent with a set `text-align`.\n text-align: inherit;\n}\n\n\n//\n// Forms\n//\n\nlabel {\n // Allow labels to use `margin` for spacing.\n display: inline-block;\n margin-bottom: $label-margin-bottom;\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24093\nbutton {\n // stylelint-disable-next-line property-blacklist\n border-radius: 0;\n}\n\n// Work around a Firefox/IE bug where the transparent `button` background\n// results in a loss of the default `button` focus styles.\n//\n// Credit: https://github.com/suitcss/base/\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // Remove the margin in Firefox and Safari\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible; // Show the overflow in Edge\n}\n\nbutton,\nselect {\n text-transform: none; // Remove the inheritance of text transform in Firefox\n}\n\n// Remove the inheritance of word-wrap in Safari.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24990\nselect {\n word-wrap: normal;\n}\n\n\n// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\n// controls in Android 4.\n// 2. Correct the inability to style clickable types in iOS and Safari.\nbutton,\n[type=\"button\"], // 1\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button; // 2\n}\n\n// Opinionated: add \"hand\" cursor to non-disabled button elements.\n@if $enable-pointer-cursor-for-buttons {\n button,\n [type=\"button\"],\n [type=\"reset\"],\n [type=\"submit\"] {\n &:not(:disabled) {\n cursor: pointer;\n }\n }\n}\n\n// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box; // 1. Add the correct box sizing in IE 10-\n padding: 0; // 2. Remove the padding in IE 10-\n}\n\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n // Remove the default appearance of temporal inputs to avoid a Mobile Safari\n // bug where setting a custom line-height prevents text from being vertically\n // centered within the input.\n // See https://bugs.webkit.org/show_bug.cgi?id=139848\n // and https://github.com/twbs/bootstrap/issues/11266\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto; // Remove the default vertical scrollbar in IE.\n // Textareas should really only resize vertically so they don't break their (horizontal) containers.\n resize: vertical;\n}\n\nfieldset {\n // Browsers set a default `min-width: min-content;` on fieldsets,\n // unlike e.g. `

`s, which have `min-width: 0;` by default.\n // So we reset that to ensure fieldsets behave more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359\n // and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements\n min-width: 0;\n // Reset the default outline behavior of fieldsets so they don't affect page layout.\n padding: 0;\n margin: 0;\n border: 0;\n}\n\n// 1. Correct the text wrapping in Edge and IE.\n// 2. Correct the color inheritance from `fieldset` elements in IE.\nlegend {\n display: block;\n width: 100%;\n max-width: 100%; // 1\n padding: 0;\n margin-bottom: .5rem;\n @include font-size(1.5rem);\n line-height: inherit;\n color: inherit; // 2\n white-space: normal; // 1\n}\n\nprogress {\n vertical-align: baseline; // Add the correct vertical alignment in Chrome, Firefox, and Opera.\n}\n\n// Correct the cursor style of increment and decrement buttons in Chrome.\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n // This overrides the extra rounded corners on search inputs in iOS so that our\n // `.form-control` class can properly style them. Note that this cannot simply\n // be added to `.form-control` as it's not specific enough. For details, see\n // https://github.com/twbs/bootstrap/issues/11586.\n outline-offset: -2px; // 2. Correct the outline style in Safari.\n -webkit-appearance: none;\n}\n\n//\n// Remove the inner padding in Chrome and Safari on macOS.\n//\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// 1. Correct the inability to style clickable types in iOS and Safari.\n// 2. Change font properties to `inherit` in Safari.\n//\n\n::-webkit-file-upload-button {\n font: inherit; // 2\n -webkit-appearance: button; // 1\n}\n\n//\n// Correct element displays\n//\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item; // Add the correct display in all browsers\n cursor: pointer;\n}\n\ntemplate {\n display: none; // Add the correct display in IE\n}\n\n// Always hide an element with the `hidden` HTML attribute (from PureCSS).\n// Needed for proper display in IE 10-.\n[hidden] {\n display: none !important;\n}\n","// Variables\n//\n// Variables should follow the `$component-state-property-size` formula for\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\n\n// Color system\n\n$white: #fff !default;\n$gray-100: #f8f9fa !default;\n$gray-200: #e9ecef !default;\n$gray-300: #dee2e6 !default;\n$gray-400: #ced4da !default;\n$gray-500: #adb5bd !default;\n$gray-600: #6c757d !default;\n$gray-700: #495057 !default;\n$gray-800: #343a40 !default;\n$gray-900: #212529 !default;\n$black: #000 !default;\n\n$grays: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$grays: map-merge(\n (\n \"100\": $gray-100,\n \"200\": $gray-200,\n \"300\": $gray-300,\n \"400\": $gray-400,\n \"500\": $gray-500,\n \"600\": $gray-600,\n \"700\": $gray-700,\n \"800\": $gray-800,\n \"900\": $gray-900\n ),\n $grays\n);\n\n$blue: #007bff !default;\n$indigo: #6610f2 !default;\n$purple: #6f42c1 !default;\n$pink: #e83e8c !default;\n$red: #dc3545 !default;\n$orange: #fd7e14 !default;\n$yellow: #ffc107 !default;\n$green: #28a745 !default;\n$teal: #20c997 !default;\n$cyan: #17a2b8 !default;\n\n$colors: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$colors: map-merge(\n (\n \"blue\": $blue,\n \"indigo\": $indigo,\n \"purple\": $purple,\n \"pink\": $pink,\n \"red\": $red,\n \"orange\": $orange,\n \"yellow\": $yellow,\n \"green\": $green,\n \"teal\": $teal,\n \"cyan\": $cyan,\n \"white\": $white,\n \"gray\": $gray-600,\n \"gray-dark\": $gray-800\n ),\n $colors\n);\n\n$primary: $blue !default;\n$secondary: $gray-600 !default;\n$success: $green !default;\n$info: $cyan !default;\n$warning: $yellow !default;\n$danger: $red !default;\n$light: $gray-100 !default;\n$dark: $gray-800 !default;\n\n$theme-colors: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$theme-colors: map-merge(\n (\n \"primary\": $primary,\n \"secondary\": $secondary,\n \"success\": $success,\n \"info\": $info,\n \"warning\": $warning,\n \"danger\": $danger,\n \"light\": $light,\n \"dark\": $dark\n ),\n $theme-colors\n);\n\n// Set a specific jump point for requesting color jumps\n$theme-color-interval: 8% !default;\n\n// The yiq lightness value that determines when the lightness of color changes from \"dark\" to \"light\". Acceptable values are between 0 and 255.\n$yiq-contrasted-threshold: 150 !default;\n\n// Customize the light and dark text colors for use in our YIQ color contrast function.\n$yiq-text-dark: $gray-900 !default;\n$yiq-text-light: $white !default;\n\n\n// Options\n//\n// Quickly modify global styling by enabling or disabling optional features.\n\n$enable-caret: true !default;\n$enable-rounded: true !default;\n$enable-shadows: false !default;\n$enable-gradients: false !default;\n$enable-transitions: true !default;\n$enable-prefers-reduced-motion-media-query: true !default;\n$enable-hover-media-query: false !default; // Deprecated, no longer affects any compiled CSS\n$enable-grid-classes: true !default;\n$enable-pointer-cursor-for-buttons: true !default;\n$enable-print-styles: true !default;\n$enable-responsive-font-sizes: false !default;\n$enable-validation-icons: true !default;\n$enable-deprecation-messages: true !default;\n\n\n// Spacing\n//\n// Control the default styling of most Bootstrap elements by modifying these\n// variables. Mostly focused on spacing.\n// You can add more entries to the $spacers map, should you need more variation.\n\n$spacer: 1rem !default;\n$spacers: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$spacers: map-merge(\n (\n 0: 0,\n 1: ($spacer * .25),\n 2: ($spacer * .5),\n 3: $spacer,\n 4: ($spacer * 1.5),\n 5: ($spacer * 3)\n ),\n $spacers\n);\n\n// This variable affects the `.h-*` and `.w-*` classes.\n$sizes: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$sizes: map-merge(\n (\n 25: 25%,\n 50: 50%,\n 75: 75%,\n 100: 100%,\n auto: auto\n ),\n $sizes\n);\n\n\n// Body\n//\n// Settings for the `` element.\n\n$body-bg: $white !default;\n$body-color: $gray-900 !default;\n\n\n// Links\n//\n// Style anchor elements.\n\n$link-color: theme-color(\"primary\") !default;\n$link-decoration: none !default;\n$link-hover-color: darken($link-color, 15%) !default;\n$link-hover-decoration: underline !default;\n// Darken percentage for links with `.text-*` class (e.g. `.text-success`)\n$emphasized-link-hover-darken-percentage: 15% !default;\n\n// Paragraphs\n//\n// Style p element.\n\n$paragraph-margin-bottom: 1rem !default;\n\n\n// Grid breakpoints\n//\n// Define the minimum dimensions at which your layout will change,\n// adapting to different screen sizes, for use in media queries.\n\n$grid-breakpoints: (\n xs: 0,\n sm: 576px,\n md: 768px,\n lg: 992px,\n xl: 1200px\n) !default;\n\n@include _assert-ascending($grid-breakpoints, \"$grid-breakpoints\");\n@include _assert-starts-at-zero($grid-breakpoints, \"$grid-breakpoints\");\n\n\n// Grid containers\n//\n// Define the maximum width of `.container` for different screen sizes.\n\n$container-max-widths: (\n sm: 540px,\n md: 720px,\n lg: 960px,\n xl: 1140px\n) !default;\n\n@include _assert-ascending($container-max-widths, \"$container-max-widths\");\n\n\n// Grid columns\n//\n// Set the number of columns and specify the width of the gutters.\n\n$grid-columns: 12 !default;\n$grid-gutter-width: 30px !default;\n\n\n// Components\n//\n// Define common padding and border radius sizes and more.\n\n$line-height-lg: 1.5 !default;\n$line-height-sm: 1.5 !default;\n\n$border-width: 1px !default;\n$border-color: $gray-300 !default;\n\n$border-radius: .25rem !default;\n$border-radius-lg: .3rem !default;\n$border-radius-sm: .2rem !default;\n\n$rounded-pill: 50rem !default;\n\n$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;\n$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;\n$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;\n\n$component-active-color: $white !default;\n$component-active-bg: theme-color(\"primary\") !default;\n\n$caret-width: .3em !default;\n$caret-vertical-align: $caret-width * .85 !default;\n$caret-spacing: $caret-width * .85 !default;\n\n$transition-base: all .2s ease-in-out !default;\n$transition-fade: opacity .15s linear !default;\n$transition-collapse: height .35s ease !default;\n\n$embed-responsive-aspect-ratios: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$embed-responsive-aspect-ratios: join(\n (\n (21 9),\n (16 9),\n (4 3),\n (1 1),\n ),\n $embed-responsive-aspect-ratios\n);\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// stylelint-disable value-keyword-case\n$font-family-sans-serif: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\" !default;\n$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !default;\n$font-family-base: $font-family-sans-serif !default;\n// stylelint-enable value-keyword-case\n\n$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`\n$font-size-lg: $font-size-base * 1.25 !default;\n$font-size-sm: $font-size-base * .875 !default;\n\n$font-weight-lighter: lighter !default;\n$font-weight-light: 300 !default;\n$font-weight-normal: 400 !default;\n$font-weight-bold: 700 !default;\n$font-weight-bolder: bolder !default;\n\n$font-weight-base: $font-weight-normal !default;\n$line-height-base: 1.5 !default;\n\n$h1-font-size: $font-size-base * 2.5 !default;\n$h2-font-size: $font-size-base * 2 !default;\n$h3-font-size: $font-size-base * 1.75 !default;\n$h4-font-size: $font-size-base * 1.5 !default;\n$h5-font-size: $font-size-base * 1.25 !default;\n$h6-font-size: $font-size-base !default;\n\n$headings-margin-bottom: $spacer / 2 !default;\n$headings-font-family: null !default;\n$headings-font-weight: 500 !default;\n$headings-line-height: 1.2 !default;\n$headings-color: null !default;\n\n$display1-size: 6rem !default;\n$display2-size: 5.5rem !default;\n$display3-size: 4.5rem !default;\n$display4-size: 3.5rem !default;\n\n$display1-weight: 300 !default;\n$display2-weight: 300 !default;\n$display3-weight: 300 !default;\n$display4-weight: 300 !default;\n$display-line-height: $headings-line-height !default;\n\n$lead-font-size: $font-size-base * 1.25 !default;\n$lead-font-weight: 300 !default;\n\n$small-font-size: 80% !default;\n\n$text-muted: $gray-600 !default;\n\n$blockquote-small-color: $gray-600 !default;\n$blockquote-small-font-size: $small-font-size !default;\n$blockquote-font-size: $font-size-base * 1.25 !default;\n\n$hr-border-color: rgba($black, .1) !default;\n$hr-border-width: $border-width !default;\n\n$mark-padding: .2em !default;\n\n$dt-font-weight: $font-weight-bold !default;\n\n$kbd-box-shadow: inset 0 -.1rem 0 rgba($black, .25) !default;\n$nested-kbd-font-weight: $font-weight-bold !default;\n\n$list-inline-padding: .5rem !default;\n\n$mark-bg: #fcf8e3 !default;\n\n$hr-margin-y: $spacer !default;\n\n\n// Tables\n//\n// Customizes the `.table` component with basic values, each used across all table variations.\n\n$table-cell-padding: .75rem !default;\n$table-cell-padding-sm: .3rem !default;\n\n$table-color: $body-color !default;\n$table-bg: null !default;\n$table-accent-bg: rgba($black, .05) !default;\n$table-hover-color: $table-color !default;\n$table-hover-bg: rgba($black, .075) !default;\n$table-active-bg: $table-hover-bg !default;\n\n$table-border-width: $border-width !default;\n$table-border-color: $border-color !default;\n\n$table-head-bg: $gray-200 !default;\n$table-head-color: $gray-700 !default;\n\n$table-dark-color: $white !default;\n$table-dark-bg: $gray-800 !default;\n$table-dark-accent-bg: rgba($white, .05) !default;\n$table-dark-hover-color: $table-dark-color !default;\n$table-dark-hover-bg: rgba($white, .075) !default;\n$table-dark-border-color: lighten($table-dark-bg, 7.5%) !default;\n$table-dark-color: $white !default;\n\n$table-striped-order: odd !default;\n\n$table-caption-color: $text-muted !default;\n\n$table-bg-level: -9 !default;\n$table-border-level: -6 !default;\n\n\n// Buttons + Forms\n//\n// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.\n\n$input-btn-padding-y: .375rem !default;\n$input-btn-padding-x: .75rem !default;\n$input-btn-font-family: null !default;\n$input-btn-font-size: $font-size-base !default;\n$input-btn-line-height: $line-height-base !default;\n\n$input-btn-focus-width: .2rem !default;\n$input-btn-focus-color: rgba($component-active-bg, .25) !default;\n$input-btn-focus-box-shadow: 0 0 0 $input-btn-focus-width $input-btn-focus-color !default;\n\n$input-btn-padding-y-sm: .25rem !default;\n$input-btn-padding-x-sm: .5rem !default;\n$input-btn-font-size-sm: $font-size-sm !default;\n$input-btn-line-height-sm: $line-height-sm !default;\n\n$input-btn-padding-y-lg: .5rem !default;\n$input-btn-padding-x-lg: 1rem !default;\n$input-btn-font-size-lg: $font-size-lg !default;\n$input-btn-line-height-lg: $line-height-lg !default;\n\n$input-btn-border-width: $border-width !default;\n\n\n// Buttons\n//\n// For each of Bootstrap's buttons, define text, background, and border color.\n\n$btn-padding-y: $input-btn-padding-y !default;\n$btn-padding-x: $input-btn-padding-x !default;\n$btn-font-family: $input-btn-font-family !default;\n$btn-font-size: $input-btn-font-size !default;\n$btn-line-height: $input-btn-line-height !default;\n\n$btn-padding-y-sm: $input-btn-padding-y-sm !default;\n$btn-padding-x-sm: $input-btn-padding-x-sm !default;\n$btn-font-size-sm: $input-btn-font-size-sm !default;\n$btn-line-height-sm: $input-btn-line-height-sm !default;\n\n$btn-padding-y-lg: $input-btn-padding-y-lg !default;\n$btn-padding-x-lg: $input-btn-padding-x-lg !default;\n$btn-font-size-lg: $input-btn-font-size-lg !default;\n$btn-line-height-lg: $input-btn-line-height-lg !default;\n\n$btn-border-width: $input-btn-border-width !default;\n\n$btn-font-weight: $font-weight-normal !default;\n$btn-box-shadow: inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default;\n$btn-focus-width: $input-btn-focus-width !default;\n$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$btn-disabled-opacity: .65 !default;\n$btn-active-box-shadow: inset 0 3px 5px rgba($black, .125) !default;\n\n$btn-link-disabled-color: $gray-600 !default;\n\n$btn-block-spacing-y: .5rem !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius: $border-radius !default;\n$btn-border-radius-lg: $border-radius-lg !default;\n$btn-border-radius-sm: $border-radius-sm !default;\n\n$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n\n// Forms\n\n$label-margin-bottom: .5rem !default;\n\n$input-padding-y: $input-btn-padding-y !default;\n$input-padding-x: $input-btn-padding-x !default;\n$input-font-family: $input-btn-font-family !default;\n$input-font-size: $input-btn-font-size !default;\n$input-font-weight: $font-weight-base !default;\n$input-line-height: $input-btn-line-height !default;\n\n$input-padding-y-sm: $input-btn-padding-y-sm !default;\n$input-padding-x-sm: $input-btn-padding-x-sm !default;\n$input-font-size-sm: $input-btn-font-size-sm !default;\n$input-line-height-sm: $input-btn-line-height-sm !default;\n\n$input-padding-y-lg: $input-btn-padding-y-lg !default;\n$input-padding-x-lg: $input-btn-padding-x-lg !default;\n$input-font-size-lg: $input-btn-font-size-lg !default;\n$input-line-height-lg: $input-btn-line-height-lg !default;\n\n$input-bg: $white !default;\n$input-disabled-bg: $gray-200 !default;\n\n$input-color: $gray-700 !default;\n$input-border-color: $gray-400 !default;\n$input-border-width: $input-btn-border-width !default;\n$input-box-shadow: inset 0 1px 1px rgba($black, .075) !default;\n\n$input-border-radius: $border-radius !default;\n$input-border-radius-lg: $border-radius-lg !default;\n$input-border-radius-sm: $border-radius-sm !default;\n\n$input-focus-bg: $input-bg !default;\n$input-focus-border-color: lighten($component-active-bg, 25%) !default;\n$input-focus-color: $input-color !default;\n$input-focus-width: $input-btn-focus-width !default;\n$input-focus-box-shadow: $input-btn-focus-box-shadow !default;\n\n$input-placeholder-color: $gray-600 !default;\n$input-plaintext-color: $body-color !default;\n\n$input-height-border: $input-border-width * 2 !default;\n\n$input-height-inner: calc(#{$input-line-height * 1em} + #{$input-padding-y * 2}) !default;\n$input-height-inner-half: calc(#{$input-line-height * .5em} + #{$input-padding-y}) !default;\n$input-height-inner-quarter: calc(#{$input-line-height * .25em} + #{$input-padding-y / 2}) !default;\n\n$input-height: calc(#{$input-line-height * 1em} + #{$input-padding-y * 2} + #{$input-height-border}) !default;\n$input-height-sm: calc(#{$input-line-height-sm * 1em} + #{$input-btn-padding-y-sm * 2} + #{$input-height-border}) !default;\n$input-height-lg: calc(#{$input-line-height-lg * 1em} + #{$input-btn-padding-y-lg * 2} + #{$input-height-border}) !default;\n\n$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$form-text-margin-top: .25rem !default;\n\n$form-check-input-gutter: 1.25rem !default;\n$form-check-input-margin-y: .3rem !default;\n$form-check-input-margin-x: .25rem !default;\n\n$form-check-inline-margin-x: .75rem !default;\n$form-check-inline-input-margin-x: .3125rem !default;\n\n$form-grid-gutter-width: 10px !default;\n$form-group-margin-bottom: 1rem !default;\n\n$input-group-addon-color: $input-color !default;\n$input-group-addon-bg: $gray-200 !default;\n$input-group-addon-border-color: $input-border-color !default;\n\n$custom-forms-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$custom-control-gutter: .5rem !default;\n$custom-control-spacer-x: 1rem !default;\n\n$custom-control-indicator-size: 1rem !default;\n$custom-control-indicator-bg: $input-bg !default;\n\n$custom-control-indicator-bg-size: 50% 50% !default;\n$custom-control-indicator-box-shadow: $input-box-shadow !default;\n$custom-control-indicator-border-color: $gray-500 !default;\n$custom-control-indicator-border-width: $input-border-width !default;\n\n$custom-control-indicator-disabled-bg: $input-disabled-bg !default;\n$custom-control-label-disabled-color: $gray-600 !default;\n\n$custom-control-indicator-checked-color: $component-active-color !default;\n$custom-control-indicator-checked-bg: $component-active-bg !default;\n$custom-control-indicator-checked-disabled-bg: rgba(theme-color(\"primary\"), .5) !default;\n$custom-control-indicator-checked-box-shadow: none !default;\n$custom-control-indicator-checked-border-color: $custom-control-indicator-checked-bg !default;\n\n$custom-control-indicator-focus-box-shadow: $input-focus-box-shadow !default;\n$custom-control-indicator-focus-border-color: $input-focus-border-color !default;\n\n$custom-control-indicator-active-color: $component-active-color !default;\n$custom-control-indicator-active-bg: lighten($component-active-bg, 35%) !default;\n$custom-control-indicator-active-box-shadow: none !default;\n$custom-control-indicator-active-border-color: $custom-control-indicator-active-bg !default;\n\n$custom-checkbox-indicator-border-radius: $border-radius !default;\n$custom-checkbox-indicator-icon-checked: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='#{$custom-control-indicator-checked-color}' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n\n$custom-checkbox-indicator-indeterminate-bg: $component-active-bg !default;\n$custom-checkbox-indicator-indeterminate-color: $custom-control-indicator-checked-color !default;\n$custom-checkbox-indicator-icon-indeterminate: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='#{$custom-checkbox-indicator-indeterminate-color}' d='M0 2h4'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$custom-checkbox-indicator-indeterminate-box-shadow: none !default;\n$custom-checkbox-indicator-indeterminate-border-color: $custom-checkbox-indicator-indeterminate-bg !default;\n\n$custom-radio-indicator-border-radius: 50% !default;\n$custom-radio-indicator-icon-checked: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='#{$custom-control-indicator-checked-color}'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n\n$custom-switch-width: $custom-control-indicator-size * 1.75 !default;\n$custom-switch-indicator-border-radius: $custom-control-indicator-size / 2 !default;\n$custom-switch-indicator-size: calc(#{$custom-control-indicator-size} - #{$custom-control-indicator-border-width * 4}) !default;\n\n$custom-select-padding-y: $input-padding-y !default;\n$custom-select-padding-x: $input-padding-x !default;\n$custom-select-font-family: $input-font-family !default;\n$custom-select-font-size: $input-font-size !default;\n$custom-select-height: $input-height !default;\n$custom-select-indicator-padding: 1rem !default; // Extra padding to account for the presence of the background-image based indicator\n$custom-select-font-weight: $input-font-weight !default;\n$custom-select-line-height: $input-line-height !default;\n$custom-select-color: $input-color !default;\n$custom-select-disabled-color: $gray-600 !default;\n$custom-select-bg: $input-bg !default;\n$custom-select-disabled-bg: $gray-200 !default;\n$custom-select-bg-size: 8px 10px !default; // In pixels because image dimensions\n$custom-select-indicator-color: $gray-800 !default;\n$custom-select-indicator: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='#{$custom-select-indicator-color}' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$custom-select-background: $custom-select-indicator no-repeat right $custom-select-padding-x center / $custom-select-bg-size !default; // Used so we can have multiple background elements (e.g., arrow and feedback icon)\n\n$custom-select-feedback-icon-padding-right: calc((1em + #{2 * $custom-select-padding-y}) * 3 / 4 + #{$custom-select-padding-x + $custom-select-indicator-padding}) !default;\n$custom-select-feedback-icon-position: center right ($custom-select-padding-x + $custom-select-indicator-padding) !default;\n$custom-select-feedback-icon-size: $input-height-inner-half $input-height-inner-half !default;\n\n$custom-select-border-width: $input-border-width !default;\n$custom-select-border-color: $input-border-color !default;\n$custom-select-border-radius: $border-radius !default;\n$custom-select-box-shadow: inset 0 1px 2px rgba($black, .075) !default;\n\n$custom-select-focus-border-color: $input-focus-border-color !default;\n$custom-select-focus-width: $input-focus-width !default;\n$custom-select-focus-box-shadow: 0 0 0 $custom-select-focus-width $input-btn-focus-color !default;\n\n$custom-select-padding-y-sm: $input-padding-y-sm !default;\n$custom-select-padding-x-sm: $input-padding-x-sm !default;\n$custom-select-font-size-sm: $input-font-size-sm !default;\n$custom-select-height-sm: $input-height-sm !default;\n\n$custom-select-padding-y-lg: $input-padding-y-lg !default;\n$custom-select-padding-x-lg: $input-padding-x-lg !default;\n$custom-select-font-size-lg: $input-font-size-lg !default;\n$custom-select-height-lg: $input-height-lg !default;\n\n$custom-range-track-width: 100% !default;\n$custom-range-track-height: .5rem !default;\n$custom-range-track-cursor: pointer !default;\n$custom-range-track-bg: $gray-300 !default;\n$custom-range-track-border-radius: 1rem !default;\n$custom-range-track-box-shadow: inset 0 .25rem .25rem rgba($black, .1) !default;\n\n$custom-range-thumb-width: 1rem !default;\n$custom-range-thumb-height: $custom-range-thumb-width !default;\n$custom-range-thumb-bg: $component-active-bg !default;\n$custom-range-thumb-border: 0 !default;\n$custom-range-thumb-border-radius: 1rem !default;\n$custom-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;\n$custom-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, $input-focus-box-shadow !default;\n$custom-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in IE/Edge\n$custom-range-thumb-active-bg: lighten($component-active-bg, 35%) !default;\n$custom-range-thumb-disabled-bg: $gray-500 !default;\n\n$custom-file-height: $input-height !default;\n$custom-file-height-inner: $input-height-inner !default;\n$custom-file-focus-border-color: $input-focus-border-color !default;\n$custom-file-focus-box-shadow: $input-focus-box-shadow !default;\n$custom-file-disabled-bg: $input-disabled-bg !default;\n\n$custom-file-padding-y: $input-padding-y !default;\n$custom-file-padding-x: $input-padding-x !default;\n$custom-file-line-height: $input-line-height !default;\n$custom-file-font-family: $input-font-family !default;\n$custom-file-font-weight: $input-font-weight !default;\n$custom-file-color: $input-color !default;\n$custom-file-bg: $input-bg !default;\n$custom-file-border-width: $input-border-width !default;\n$custom-file-border-color: $input-border-color !default;\n$custom-file-border-radius: $input-border-radius !default;\n$custom-file-box-shadow: $input-box-shadow !default;\n$custom-file-button-color: $custom-file-color !default;\n$custom-file-button-bg: $input-group-addon-bg !default;\n$custom-file-text: (\n en: \"Browse\"\n) !default;\n\n\n// Form validation\n\n$form-feedback-margin-top: $form-text-margin-top !default;\n$form-feedback-font-size: $small-font-size !default;\n$form-feedback-valid-color: theme-color(\"success\") !default;\n$form-feedback-invalid-color: theme-color(\"danger\") !default;\n\n$form-feedback-icon-valid-color: $form-feedback-valid-color !default;\n$form-feedback-icon-valid: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='#{$form-feedback-icon-valid-color}' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$form-feedback-icon-invalid-color: $form-feedback-invalid-color !default;\n$form-feedback-icon-invalid: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$form-feedback-icon-invalid-color}' viewBox='-2 -2 7 7'%3e%3cpath stroke='#{$form-feedback-icon-invalid-color}' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\"), \"#\", \"%23\") !default;\n\n$form-validation-states: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$form-validation-states: map-merge(\n (\n \"valid\": (\n \"color\": $form-feedback-valid-color,\n \"icon\": $form-feedback-icon-valid\n ),\n \"invalid\": (\n \"color\": $form-feedback-invalid-color,\n \"icon\": $form-feedback-icon-invalid\n ),\n ),\n $form-validation-states\n);\n\n// Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n\n$zindex-dropdown: 1000 !default;\n$zindex-sticky: 1020 !default;\n$zindex-fixed: 1030 !default;\n$zindex-modal-backdrop: 1040 !default;\n$zindex-modal: 1050 !default;\n$zindex-popover: 1060 !default;\n$zindex-tooltip: 1070 !default;\n\n\n// Navs\n\n$nav-link-padding-y: .5rem !default;\n$nav-link-padding-x: 1rem !default;\n$nav-link-disabled-color: $gray-600 !default;\n\n$nav-tabs-border-color: $gray-300 !default;\n$nav-tabs-border-width: $border-width !default;\n$nav-tabs-border-radius: $border-radius !default;\n$nav-tabs-link-hover-border-color: $gray-200 $gray-200 $nav-tabs-border-color !default;\n$nav-tabs-link-active-color: $gray-700 !default;\n$nav-tabs-link-active-bg: $body-bg !default;\n$nav-tabs-link-active-border-color: $gray-300 $gray-300 $nav-tabs-link-active-bg !default;\n\n$nav-pills-border-radius: $border-radius !default;\n$nav-pills-link-active-color: $component-active-color !default;\n$nav-pills-link-active-bg: $component-active-bg !default;\n\n$nav-divider-color: $gray-200 !default;\n$nav-divider-margin-y: $spacer / 2 !default;\n\n\n// Navbar\n\n$navbar-padding-y: $spacer / 2 !default;\n$navbar-padding-x: $spacer !default;\n\n$navbar-nav-link-padding-x: .5rem !default;\n\n$navbar-brand-font-size: $font-size-lg !default;\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\n$nav-link-height: $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default;\n$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default;\n$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) / 2 !default;\n\n$navbar-toggler-padding-y: .25rem !default;\n$navbar-toggler-padding-x: .75rem !default;\n$navbar-toggler-font-size: $font-size-lg !default;\n$navbar-toggler-border-radius: $btn-border-radius !default;\n\n$navbar-dark-color: rgba($white, .5) !default;\n$navbar-dark-hover-color: rgba($white, .75) !default;\n$navbar-dark-active-color: $white !default;\n$navbar-dark-disabled-color: rgba($white, .25) !default;\n$navbar-dark-toggler-icon-bg: str-replace(url(\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='#{$navbar-dark-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$navbar-dark-toggler-border-color: rgba($white, .1) !default;\n\n$navbar-light-color: rgba($black, .5) !default;\n$navbar-light-hover-color: rgba($black, .7) !default;\n$navbar-light-active-color: rgba($black, .9) !default;\n$navbar-light-disabled-color: rgba($black, .3) !default;\n$navbar-light-toggler-icon-bg: str-replace(url(\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='#{$navbar-light-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$navbar-light-toggler-border-color: rgba($black, .1) !default;\n\n$navbar-light-brand-color: $navbar-light-active-color !default;\n$navbar-light-brand-hover-color: $navbar-light-active-color !default;\n$navbar-dark-brand-color: $navbar-dark-active-color !default;\n$navbar-dark-brand-hover-color: $navbar-dark-active-color !default;\n\n\n// Dropdowns\n//\n// Dropdown menu container and contents.\n\n$dropdown-min-width: 10rem !default;\n$dropdown-padding-y: .5rem !default;\n$dropdown-spacer: .125rem !default;\n$dropdown-font-size: $font-size-base !default;\n$dropdown-color: $body-color !default;\n$dropdown-bg: $white !default;\n$dropdown-border-color: rgba($black, .15) !default;\n$dropdown-border-radius: $border-radius !default;\n$dropdown-border-width: $border-width !default;\n$dropdown-inner-border-radius: calc(#{$dropdown-border-radius} - #{$dropdown-border-width}) !default;\n$dropdown-divider-bg: $gray-200 !default;\n$dropdown-divider-margin-y: $nav-divider-margin-y !default;\n$dropdown-box-shadow: 0 .5rem 1rem rgba($black, .175) !default;\n\n$dropdown-link-color: $gray-900 !default;\n$dropdown-link-hover-color: darken($gray-900, 5%) !default;\n$dropdown-link-hover-bg: $gray-100 !default;\n\n$dropdown-link-active-color: $component-active-color !default;\n$dropdown-link-active-bg: $component-active-bg !default;\n\n$dropdown-link-disabled-color: $gray-600 !default;\n\n$dropdown-item-padding-y: .25rem !default;\n$dropdown-item-padding-x: 1.5rem !default;\n\n$dropdown-header-color: $gray-600 !default;\n\n\n// Pagination\n\n$pagination-padding-y: .5rem !default;\n$pagination-padding-x: .75rem !default;\n$pagination-padding-y-sm: .25rem !default;\n$pagination-padding-x-sm: .5rem !default;\n$pagination-padding-y-lg: .75rem !default;\n$pagination-padding-x-lg: 1.5rem !default;\n$pagination-line-height: 1.25 !default;\n\n$pagination-color: $link-color !default;\n$pagination-bg: $white !default;\n$pagination-border-width: $border-width !default;\n$pagination-border-color: $gray-300 !default;\n\n$pagination-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$pagination-focus-outline: 0 !default;\n\n$pagination-hover-color: $link-hover-color !default;\n$pagination-hover-bg: $gray-200 !default;\n$pagination-hover-border-color: $gray-300 !default;\n\n$pagination-active-color: $component-active-color !default;\n$pagination-active-bg: $component-active-bg !default;\n$pagination-active-border-color: $pagination-active-bg !default;\n\n$pagination-disabled-color: $gray-600 !default;\n$pagination-disabled-bg: $white !default;\n$pagination-disabled-border-color: $gray-300 !default;\n\n\n// Jumbotron\n\n$jumbotron-padding: 2rem !default;\n$jumbotron-color: null !default;\n$jumbotron-bg: $gray-200 !default;\n\n\n// Cards\n\n$card-spacer-y: .75rem !default;\n$card-spacer-x: 1.25rem !default;\n$card-border-width: $border-width !default;\n$card-border-radius: $border-radius !default;\n$card-border-color: rgba($black, .125) !default;\n$card-inner-border-radius: calc(#{$card-border-radius} - #{$card-border-width}) !default;\n$card-cap-bg: rgba($black, .03) !default;\n$card-cap-color: null !default;\n$card-color: null !default;\n$card-bg: $white !default;\n\n$card-img-overlay-padding: 1.25rem !default;\n\n$card-group-margin: $grid-gutter-width / 2 !default;\n$card-deck-margin: $card-group-margin !default;\n\n$card-columns-count: 3 !default;\n$card-columns-gap: 1.25rem !default;\n$card-columns-margin: $card-spacer-y !default;\n\n\n// Tooltips\n\n$tooltip-font-size: $font-size-sm !default;\n$tooltip-max-width: 200px !default;\n$tooltip-color: $white !default;\n$tooltip-bg: $black !default;\n$tooltip-border-radius: $border-radius !default;\n$tooltip-opacity: .9 !default;\n$tooltip-padding-y: .25rem !default;\n$tooltip-padding-x: .5rem !default;\n$tooltip-margin: 0 !default;\n\n$tooltip-arrow-width: .8rem !default;\n$tooltip-arrow-height: .4rem !default;\n$tooltip-arrow-color: $tooltip-bg !default;\n\n// Form tooltips must come after regular tooltips\n$form-feedback-tooltip-padding-y: $tooltip-padding-y !default;\n$form-feedback-tooltip-padding-x: $tooltip-padding-x !default;\n$form-feedback-tooltip-font-size: $tooltip-font-size !default;\n$form-feedback-tooltip-line-height: $line-height-base !default;\n$form-feedback-tooltip-opacity: $tooltip-opacity !default;\n$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;\n\n\n// Popovers\n\n$popover-font-size: $font-size-sm !default;\n$popover-bg: $white !default;\n$popover-max-width: 276px !default;\n$popover-border-width: $border-width !default;\n$popover-border-color: rgba($black, .2) !default;\n$popover-border-radius: $border-radius-lg !default;\n$popover-box-shadow: 0 .25rem .5rem rgba($black, .2) !default;\n\n$popover-header-bg: darken($popover-bg, 3%) !default;\n$popover-header-color: $headings-color !default;\n$popover-header-padding-y: .5rem !default;\n$popover-header-padding-x: .75rem !default;\n\n$popover-body-color: $body-color !default;\n$popover-body-padding-y: $popover-header-padding-y !default;\n$popover-body-padding-x: $popover-header-padding-x !default;\n\n$popover-arrow-width: 1rem !default;\n$popover-arrow-height: .5rem !default;\n$popover-arrow-color: $popover-bg !default;\n\n$popover-arrow-outer-color: fade-in($popover-border-color, .05) !default;\n\n\n// Toasts\n\n$toast-max-width: 350px !default;\n$toast-padding-x: .75rem !default;\n$toast-padding-y: .25rem !default;\n$toast-font-size: .875rem !default;\n$toast-color: null !default;\n$toast-background-color: rgba($white, .85) !default;\n$toast-border-width: 1px !default;\n$toast-border-color: rgba(0, 0, 0, .1) !default;\n$toast-border-radius: .25rem !default;\n$toast-box-shadow: 0 .25rem .75rem rgba($black, .1) !default;\n\n$toast-header-color: $gray-600 !default;\n$toast-header-background-color: rgba($white, .85) !default;\n$toast-header-border-color: rgba(0, 0, 0, .05) !default;\n\n\n// Badges\n\n$badge-font-size: 75% !default;\n$badge-font-weight: $font-weight-bold !default;\n$badge-padding-y: .25em !default;\n$badge-padding-x: .4em !default;\n$badge-border-radius: $border-radius !default;\n\n$badge-transition: $btn-transition !default;\n$badge-focus-width: $input-btn-focus-width !default;\n\n$badge-pill-padding-x: .6em !default;\n// Use a higher than normal value to ensure completely rounded edges when\n// customizing padding or font-size on labels.\n$badge-pill-border-radius: 10rem !default;\n\n\n// Modals\n\n// Padding applied to the modal body\n$modal-inner-padding: 1rem !default;\n\n$modal-dialog-margin: .5rem !default;\n$modal-dialog-margin-y-sm-up: 1.75rem !default;\n\n$modal-title-line-height: $line-height-base !default;\n\n$modal-content-color: null !default;\n$modal-content-bg: $white !default;\n$modal-content-border-color: rgba($black, .2) !default;\n$modal-content-border-width: $border-width !default;\n$modal-content-border-radius: $border-radius-lg !default;\n$modal-content-box-shadow-xs: 0 .25rem .5rem rgba($black, .5) !default;\n$modal-content-box-shadow-sm-up: 0 .5rem 1rem rgba($black, .5) !default;\n\n$modal-backdrop-bg: $black !default;\n$modal-backdrop-opacity: .5 !default;\n$modal-header-border-color: $border-color !default;\n$modal-footer-border-color: $modal-header-border-color !default;\n$modal-header-border-width: $modal-content-border-width !default;\n$modal-footer-border-width: $modal-header-border-width !default;\n$modal-header-padding-y: 1rem !default;\n$modal-header-padding-x: 1rem !default;\n$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility\n\n$modal-xl: 1140px !default;\n$modal-lg: 800px !default;\n$modal-md: 500px !default;\n$modal-sm: 300px !default;\n\n$modal-fade-transform: translate(0, -50px) !default;\n$modal-show-transform: none !default;\n$modal-transition: transform .3s ease-out !default;\n\n\n// Alerts\n//\n// Define alert colors, border radius, and padding.\n\n$alert-padding-y: .75rem !default;\n$alert-padding-x: 1.25rem !default;\n$alert-margin-bottom: 1rem !default;\n$alert-border-radius: $border-radius !default;\n$alert-link-font-weight: $font-weight-bold !default;\n$alert-border-width: $border-width !default;\n\n$alert-bg-level: -10 !default;\n$alert-border-level: -9 !default;\n$alert-color-level: 6 !default;\n\n\n// Progress bars\n\n$progress-height: 1rem !default;\n$progress-font-size: $font-size-base * .75 !default;\n$progress-bg: $gray-200 !default;\n$progress-border-radius: $border-radius !default;\n$progress-box-shadow: inset 0 .1rem .1rem rgba($black, .1) !default;\n$progress-bar-color: $white !default;\n$progress-bar-bg: theme-color(\"primary\") !default;\n$progress-bar-animation-timing: 1s linear infinite !default;\n$progress-bar-transition: width .6s ease !default;\n\n\n// List group\n\n$list-group-color: null !default;\n$list-group-bg: $white !default;\n$list-group-border-color: rgba($black, .125) !default;\n$list-group-border-width: $border-width !default;\n$list-group-border-radius: $border-radius !default;\n\n$list-group-item-padding-y: .75rem !default;\n$list-group-item-padding-x: 1.25rem !default;\n\n$list-group-hover-bg: $gray-100 !default;\n$list-group-active-color: $component-active-color !default;\n$list-group-active-bg: $component-active-bg !default;\n$list-group-active-border-color: $list-group-active-bg !default;\n\n$list-group-disabled-color: $gray-600 !default;\n$list-group-disabled-bg: $list-group-bg !default;\n\n$list-group-action-color: $gray-700 !default;\n$list-group-action-hover-color: $list-group-action-color !default;\n\n$list-group-action-active-color: $body-color !default;\n$list-group-action-active-bg: $gray-200 !default;\n\n\n// Image thumbnails\n\n$thumbnail-padding: .25rem !default;\n$thumbnail-bg: $body-bg !default;\n$thumbnail-border-width: $border-width !default;\n$thumbnail-border-color: $gray-300 !default;\n$thumbnail-border-radius: $border-radius !default;\n$thumbnail-box-shadow: 0 1px 2px rgba($black, .075) !default;\n\n\n// Figures\n\n$figure-caption-font-size: 90% !default;\n$figure-caption-color: $gray-600 !default;\n\n\n// Breadcrumbs\n\n$breadcrumb-padding-y: .75rem !default;\n$breadcrumb-padding-x: 1rem !default;\n$breadcrumb-item-padding: .5rem !default;\n\n$breadcrumb-margin-bottom: 1rem !default;\n\n$breadcrumb-bg: $gray-200 !default;\n$breadcrumb-divider-color: $gray-600 !default;\n$breadcrumb-active-color: $gray-600 !default;\n$breadcrumb-divider: quote(\"/\") !default;\n\n$breadcrumb-border-radius: $border-radius !default;\n\n\n// Carousel\n\n$carousel-control-color: $white !default;\n$carousel-control-width: 15% !default;\n$carousel-control-opacity: .5 !default;\n$carousel-control-hover-opacity: .9 !default;\n$carousel-control-transition: opacity .15s ease !default;\n\n$carousel-indicator-width: 30px !default;\n$carousel-indicator-height: 3px !default;\n$carousel-indicator-hit-area-height: 10px !default;\n$carousel-indicator-spacer: 3px !default;\n$carousel-indicator-active-bg: $white !default;\n$carousel-indicator-transition: opacity .6s ease !default;\n\n$carousel-caption-width: 70% !default;\n$carousel-caption-color: $white !default;\n\n$carousel-control-icon-width: 20px !default;\n\n$carousel-control-prev-icon-bg: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$carousel-control-next-icon-bg: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n\n$carousel-transition-duration: .6s !default;\n$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)\n\n\n// Spinners\n\n$spinner-width: 2rem !default;\n$spinner-height: $spinner-width !default;\n$spinner-border-width: .25em !default;\n\n$spinner-width-sm: 1rem !default;\n$spinner-height-sm: $spinner-width-sm !default;\n$spinner-border-width-sm: .2em !default;\n\n\n// Close\n\n$close-font-size: $font-size-base * 1.5 !default;\n$close-font-weight: $font-weight-bold !default;\n$close-color: $black !default;\n$close-text-shadow: 0 1px 0 $white !default;\n\n\n// Code\n\n$code-font-size: 87.5% !default;\n$code-color: $pink !default;\n\n$kbd-padding-y: .2rem !default;\n$kbd-padding-x: .4rem !default;\n$kbd-font-size: $code-font-size !default;\n$kbd-color: $white !default;\n$kbd-bg: $gray-900 !default;\n\n$pre-color: $gray-900 !default;\n$pre-scrollable-max-height: 340px !default;\n\n\n// Utilities\n\n$displays: none, inline, inline-block, block, table, table-row, table-cell, flex, inline-flex !default;\n$overflows: auto, hidden !default;\n$positions: static, relative, absolute, fixed, sticky !default;\n\n\n// Printing\n\n$print-page-size: a3 !default;\n$print-body-min-width: map-get($grid-breakpoints, \"lg\") !default;\n","// stylelint-disable property-blacklist, scss/dollar-variable-default\n\n// SCSS RFS mixin\n//\n// Automated font-resizing\n//\n// See https://github.com/twbs/rfs\n\n// Configuration\n\n// Base font size\n$rfs-base-font-size: 1.25rem !default;\n$rfs-font-size-unit: rem !default;\n\n// Breakpoint at where font-size starts decreasing if screen width is smaller\n$rfs-breakpoint: 1200px !default;\n$rfs-breakpoint-unit: px !default;\n\n// Resize font-size based on screen height and width\n$rfs-two-dimensional: false !default;\n\n// Factor of decrease\n$rfs-factor: 10 !default;\n\n@if type-of($rfs-factor) != \"number\" or $rfs-factor <= 1 {\n @error \"`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.\";\n}\n\n// Generate enable or disable classes. Possibilities: false, \"enable\" or \"disable\"\n$rfs-class: false !default;\n\n// 1 rem = $rfs-rem-value px\n$rfs-rem-value: 16 !default;\n\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\n$rfs-safari-iframe-resize-bug-fix: false !default;\n\n// Disable RFS by setting $enable-responsive-font-sizes to false\n$enable-responsive-font-sizes: true !default;\n\n// Cache $rfs-base-font-size unit\n$rfs-base-font-size-unit: unit($rfs-base-font-size);\n\n// Remove px-unit from $rfs-base-font-size for calculations\n@if $rfs-base-font-size-unit == \"px\" {\n $rfs-base-font-size: $rfs-base-font-size / ($rfs-base-font-size * 0 + 1);\n}\n@else if $rfs-base-font-size-unit == \"rem\" {\n $rfs-base-font-size: $rfs-base-font-size / ($rfs-base-font-size * 0 + 1 / $rfs-rem-value);\n}\n\n// Cache $rfs-breakpoint unit to prevent multiple calls\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\n\n// Remove unit from $rfs-breakpoint for calculations\n@if $rfs-breakpoint-unit-cache == \"px\" {\n $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1);\n}\n@else if $rfs-breakpoint-unit-cache == \"rem\" or $rfs-breakpoint-unit-cache == \"em\" {\n $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1 / $rfs-rem-value);\n}\n\n// Responsive font-size mixin\n@mixin rfs($fs, $important: false) {\n // Cache $fs unit\n $fs-unit: if(type-of($fs) == \"number\", unit($fs), false);\n\n // Add !important suffix if needed\n $rfs-suffix: if($important, \" !important\", \"\");\n\n // If $fs isn't a number (like inherit) or $fs has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n @if not $fs-unit or $fs-unit != \"\" and $fs-unit != \"px\" and $fs-unit != \"rem\" or $fs == 0 {\n font-size: #{$fs}#{$rfs-suffix};\n }\n @else {\n // Variables for storing static and fluid rescaling\n $rfs-static: null;\n $rfs-fluid: null;\n\n // Remove px-unit from $fs for calculations\n @if $fs-unit == \"px\" {\n $fs: $fs / ($fs * 0 + 1);\n }\n @else if $fs-unit == \"rem\" {\n $fs: $fs / ($fs * 0 + 1 / $rfs-rem-value);\n }\n\n // Set default font-size\n @if $rfs-font-size-unit == rem {\n $rfs-static: #{$fs / $rfs-rem-value}rem#{$rfs-suffix};\n }\n @else if $rfs-font-size-unit == px {\n $rfs-static: #{$fs}px#{$rfs-suffix};\n }\n @else {\n @error \"`#{$rfs-font-size-unit}` is not a valid unit for $rfs-font-size-unit. Use `px` or `rem`.\";\n }\n\n // Only add media query if font-size is bigger as the minimum font-size\n // If $rfs-factor == 1, no rescaling will take place\n @if $fs > $rfs-base-font-size and $enable-responsive-font-sizes {\n $min-width: null;\n $variable-unit: null;\n\n // Calculate minimum font-size for given font-size\n $fs-min: $rfs-base-font-size + ($fs - $rfs-base-font-size) / $rfs-factor;\n\n // Calculate difference between given font-size and minimum font-size for given font-size\n $fs-diff: $fs - $fs-min;\n\n // Base font-size formatting\n // No need to check if the unit is valid, because we did that before\n $min-width: if($rfs-font-size-unit == rem, #{$fs-min / $rfs-rem-value}rem, #{$fs-min}px);\n\n // If two-dimensional, use smallest of screen width and height\n $variable-unit: if($rfs-two-dimensional, vmin, vw);\n\n // Calculate the variable width between 0 and $rfs-breakpoint\n $variable-width: #{$fs-diff * 100 / $rfs-breakpoint}#{$variable-unit};\n\n // Set the calculated font-size.\n $rfs-fluid: calc(#{$min-width} + #{$variable-width}) #{$rfs-suffix};\n }\n\n // Rendering\n @if $rfs-fluid == null {\n // Only render static font-size if no fluid font-size is available\n font-size: $rfs-static;\n }\n @else {\n $mq-value: null;\n\n // RFS breakpoint formatting\n @if $rfs-breakpoint-unit == em or $rfs-breakpoint-unit == rem {\n $mq-value: #{$rfs-breakpoint / $rfs-rem-value}#{$rfs-breakpoint-unit};\n }\n @else if $rfs-breakpoint-unit == px {\n $mq-value: #{$rfs-breakpoint}px;\n }\n @else {\n @error \"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\";\n }\n\n @if $rfs-class == \"disable\" {\n // Adding an extra class increases specificity,\n // which prevents the media query to override the font size\n &,\n .disable-responsive-font-size &,\n &.disable-responsive-font-size {\n font-size: $rfs-static;\n }\n }\n @else {\n font-size: $rfs-static;\n }\n\n @if $rfs-two-dimensional {\n @media (max-width: #{$mq-value}), (max-height: #{$mq-value}) {\n @if $rfs-class == \"enable\" {\n .enable-responsive-font-size &,\n &.enable-responsive-font-size {\n font-size: $rfs-fluid;\n }\n }\n @else {\n font-size: $rfs-fluid;\n }\n\n @if $rfs-safari-iframe-resize-bug-fix {\n // stylelint-disable-next-line length-zero-no-unit\n min-width: 0vw;\n }\n }\n }\n @else {\n @media (max-width: #{$mq-value}) {\n @if $rfs-class == \"enable\" {\n .enable-responsive-font-size &,\n &.enable-responsive-font-size {\n font-size: $rfs-fluid;\n }\n }\n @else {\n font-size: $rfs-fluid;\n }\n\n @if $rfs-safari-iframe-resize-bug-fix {\n // stylelint-disable-next-line length-zero-no-unit\n min-width: 0vw;\n }\n }\n }\n }\n }\n}\n\n// The font-size & responsive-font-size mixin uses RFS to rescale font sizes\n@mixin font-size($fs, $important: false) {\n @include rfs($fs, $important);\n}\n\n@mixin responsive-font-size($fs, $important: false) {\n @include rfs($fs, $important);\n}\n","// Hover mixin and `$enable-hover-media-query` are deprecated.\n//\n// Originally added during our alphas and maintained during betas, this mixin was\n// designed to prevent `:hover` stickiness on iOS-an issue where hover styles\n// would persist after initial touch.\n//\n// For backward compatibility, we've kept these mixins and updated them to\n// always return their regular pseudo-classes instead of a shimmed media query.\n//\n// Issue: https://github.com/twbs/bootstrap/issues/25195\n\n@mixin hover {\n &:hover { @content; }\n}\n\n@mixin hover-focus {\n &:hover,\n &:focus {\n @content;\n }\n}\n\n@mixin plain-hover-focus {\n &,\n &:hover,\n &:focus {\n @content;\n }\n}\n\n@mixin hover-focus-active {\n &:hover,\n &:focus,\n &:active {\n @content;\n }\n}\n"]} \ No newline at end of file diff --git a/_Resources/node_modules/web-dev-utils/bootstrap-4.3.1-dist/css/bootstrap-reboot.min.css b/_Resources/node_modules/web-dev-utils/bootstrap-4.3.1-dist/css/bootstrap-reboot.min.css deleted file mode 100644 index c804b3b..0000000 --- a/_Resources/node_modules/web-dev-utils/bootstrap-4.3.1-dist/css/bootstrap-reboot.min.css +++ /dev/null @@ -1,8 +0,0 @@ -/*! - * Bootstrap Reboot v4.3.1 (https://getbootstrap.com/) - * Copyright 2011-2019 The Bootstrap Authors - * Copyright 2011-2019 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) - */*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important} -/*# sourceMappingURL=bootstrap-reboot.min.css.map */ \ No newline at end of file diff --git a/_Resources/node_modules/web-dev-utils/bootstrap-4.3.1-dist/css/bootstrap-reboot.min.css.map b/_Resources/node_modules/web-dev-utils/bootstrap-4.3.1-dist/css/bootstrap-reboot.min.css.map deleted file mode 100644 index 73f4a19..0000000 --- a/_Resources/node_modules/web-dev-utils/bootstrap-4.3.1-dist/css/bootstrap-reboot.min.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../../scss/bootstrap-reboot.scss","../../scss/_reboot.scss","dist/css/bootstrap-reboot.css","../../scss/vendor/_rfs.scss","bootstrap-reboot.css","../../scss/mixins/_hover.scss"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Bootstrap Reboot v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)\n */\n\n@import \"functions\";\n@import \"variables\";\n@import \"mixins\";\n@import \"reboot\";\n","// stylelint-disable at-rule-no-vendor-prefix, declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// 1. Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n// 2. Change the default font family in all browsers.\n// 3. Correct the line height in all browsers.\n// 4. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS.\n// 5. Change the default tap highlight to be completely transparent in iOS.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box; // 1\n}\n\nhtml {\n font-family: sans-serif; // 2\n line-height: 1.15; // 3\n -webkit-text-size-adjust: 100%; // 4\n -webkit-tap-highlight-color: rgba($black, 0); // 5\n}\n\n// Shim for \"new\" HTML5 structural elements to display correctly (IE10, older browsers)\n// TODO: remove in v5\n// stylelint-disable-next-line selector-list-comma-newline-after\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Set an explicit initial text-align value so that we can later use\n// the `inherit` value on things like `` elements.\n\nbody {\n margin: 0; // 1\n font-family: $font-family-base;\n @include font-size($font-size-base);\n font-weight: $font-weight-base;\n line-height: $line-height-base;\n color: $body-color;\n text-align: left; // 3\n background-color: $body-bg; // 2\n}\n\n// Suppress the focus outline on elements that cannot be accessed via keyboard.\n// This prevents an unwanted focus outline from appearing around elements that\n// might still respond to pointer events.\n//\n// Credit: https://github.com/suitcss/base\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\n\n// Content grouping\n//\n// 1. Add the correct box sizing in Firefox.\n// 2. Show the overflow in Edge and IE.\n\nhr {\n box-sizing: content-box; // 1\n height: 0; // 1\n overflow: visible; // 2\n}\n\n\n//\n// Typography\n//\n\n// Remove top margins from headings\n//\n// By default, `

`-`

` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n// stylelint-disable-next-line selector-list-comma-newline-after\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: $headings-margin-bottom;\n}\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `

`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n// Abbreviations\n//\n// 1. Duplicate behavior to the data-* attribute for our tooltip plugin\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Remove the bottom border in Firefox 39-.\n// 5. Prevent the text-decoration to be skipped.\n\nabbr[title],\nabbr[data-original-title] { // 1\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n border-bottom: 0; // 4\n text-decoration-skip-ink: none; // 5\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // Undo browser default\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: $font-weight-bolder; // Add the correct font weight in Chrome, Edge, and Safari\n}\n\nsmall {\n @include font-size(80%); // Add the correct font size in all browsers\n}\n\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n//\n\nsub,\nsup {\n position: relative;\n @include font-size(75%);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n//\n// Links\n//\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n background-color: transparent; // Remove the gray background on active links in IE 10.\n\n @include hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href)\n// which have not been made explicitly keyboard-focusable (without tabindex).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n\n @include hover-focus {\n color: inherit;\n text-decoration: none;\n }\n\n &:focus {\n outline: 0;\n }\n}\n\n\n//\n// Code\n//\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-monospace;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\npre {\n // Remove browser default top margin\n margin-top: 0;\n // Reset browser default of `1em` to use `rem`s\n margin-bottom: 1rem;\n // Don't allow content to break outside\n overflow: auto;\n}\n\n\n//\n// Figures\n//\n\nfigure {\n // Apply a consistent margin strategy (matches our type styles).\n margin: 0 0 1rem;\n}\n\n\n//\n// Images and content\n//\n\nimg {\n vertical-align: middle;\n border-style: none; // Remove the border on images inside links in IE 10-.\n}\n\nsvg {\n // Workaround for the SVG overflow bug in IE10/11 is still required.\n // See https://github.com/twbs/bootstrap/issues/26878\n overflow: hidden;\n vertical-align: middle;\n}\n\n\n//\n// Tables\n//\n\ntable {\n border-collapse: collapse; // Prevent double borders\n}\n\ncaption {\n padding-top: $table-cell-padding;\n padding-bottom: $table-cell-padding;\n color: $table-caption-color;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n // Matches default `` alignment by inheriting from the ``, or the\n // closest parent with a set `text-align`.\n text-align: inherit;\n}\n\n\n//\n// Forms\n//\n\nlabel {\n // Allow labels to use `margin` for spacing.\n display: inline-block;\n margin-bottom: $label-margin-bottom;\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24093\nbutton {\n // stylelint-disable-next-line property-blacklist\n border-radius: 0;\n}\n\n// Work around a Firefox/IE bug where the transparent `button` background\n// results in a loss of the default `button` focus styles.\n//\n// Credit: https://github.com/suitcss/base/\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // Remove the margin in Firefox and Safari\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible; // Show the overflow in Edge\n}\n\nbutton,\nselect {\n text-transform: none; // Remove the inheritance of text transform in Firefox\n}\n\n// Remove the inheritance of word-wrap in Safari.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24990\nselect {\n word-wrap: normal;\n}\n\n\n// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\n// controls in Android 4.\n// 2. Correct the inability to style clickable types in iOS and Safari.\nbutton,\n[type=\"button\"], // 1\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button; // 2\n}\n\n// Opinionated: add \"hand\" cursor to non-disabled button elements.\n@if $enable-pointer-cursor-for-buttons {\n button,\n [type=\"button\"],\n [type=\"reset\"],\n [type=\"submit\"] {\n &:not(:disabled) {\n cursor: pointer;\n }\n }\n}\n\n// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box; // 1. Add the correct box sizing in IE 10-\n padding: 0; // 2. Remove the padding in IE 10-\n}\n\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n // Remove the default appearance of temporal inputs to avoid a Mobile Safari\n // bug where setting a custom line-height prevents text from being vertically\n // centered within the input.\n // See https://bugs.webkit.org/show_bug.cgi?id=139848\n // and https://github.com/twbs/bootstrap/issues/11266\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto; // Remove the default vertical scrollbar in IE.\n // Textareas should really only resize vertically so they don't break their (horizontal) containers.\n resize: vertical;\n}\n\nfieldset {\n // Browsers set a default `min-width: min-content;` on fieldsets,\n // unlike e.g. `

`s, which have `min-width: 0;` by default.\n // So we reset that to ensure fieldsets behave more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359\n // and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements\n min-width: 0;\n // Reset the default outline behavior of fieldsets so they don't affect page layout.\n padding: 0;\n margin: 0;\n border: 0;\n}\n\n// 1. Correct the text wrapping in Edge and IE.\n// 2. Correct the color inheritance from `fieldset` elements in IE.\nlegend {\n display: block;\n width: 100%;\n max-width: 100%; // 1\n padding: 0;\n margin-bottom: .5rem;\n @include font-size(1.5rem);\n line-height: inherit;\n color: inherit; // 2\n white-space: normal; // 1\n}\n\nprogress {\n vertical-align: baseline; // Add the correct vertical alignment in Chrome, Firefox, and Opera.\n}\n\n// Correct the cursor style of increment and decrement buttons in Chrome.\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n // This overrides the extra rounded corners on search inputs in iOS so that our\n // `.form-control` class can properly style them. Note that this cannot simply\n // be added to `.form-control` as it's not specific enough. For details, see\n // https://github.com/twbs/bootstrap/issues/11586.\n outline-offset: -2px; // 2. Correct the outline style in Safari.\n -webkit-appearance: none;\n}\n\n//\n// Remove the inner padding in Chrome and Safari on macOS.\n//\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// 1. Correct the inability to style clickable types in iOS and Safari.\n// 2. Change font properties to `inherit` in Safari.\n//\n\n::-webkit-file-upload-button {\n font: inherit; // 2\n -webkit-appearance: button; // 1\n}\n\n//\n// Correct element displays\n//\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item; // Add the correct display in all browsers\n cursor: pointer;\n}\n\ntemplate {\n display: none; // Add the correct display in IE\n}\n\n// Always hide an element with the `hidden` HTML attribute (from PureCSS).\n// Needed for proper display in IE 10-.\n[hidden] {\n display: none !important;\n}\n","/*!\n * Bootstrap Reboot v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)\n */\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\nhtml {\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\nbody {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #212529;\n text-align: left;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: 0.5rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n -webkit-text-decoration-skip-ink: none;\n text-decoration-skip-ink: none;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #007bff;\n text-decoration: none;\n background-color: transparent;\n}\n\na:hover {\n color: #0056b3;\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg {\n overflow: hidden;\n vertical-align: middle;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n color: #6c757d;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: inherit;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: 0.5rem;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nselect {\n word-wrap: normal;\n}\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton:not(:disabled),\n[type=\"button\"]:not(:disabled),\n[type=\"reset\"]:not(:disabled),\n[type=\"submit\"]:not(:disabled) {\n cursor: pointer;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n cursor: pointer;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n/*# sourceMappingURL=bootstrap-reboot.css.map */","// stylelint-disable property-blacklist, scss/dollar-variable-default\n\n// SCSS RFS mixin\n//\n// Automated font-resizing\n//\n// See https://github.com/twbs/rfs\n\n// Configuration\n\n// Base font size\n$rfs-base-font-size: 1.25rem !default;\n$rfs-font-size-unit: rem !default;\n\n// Breakpoint at where font-size starts decreasing if screen width is smaller\n$rfs-breakpoint: 1200px !default;\n$rfs-breakpoint-unit: px !default;\n\n// Resize font-size based on screen height and width\n$rfs-two-dimensional: false !default;\n\n// Factor of decrease\n$rfs-factor: 10 !default;\n\n@if type-of($rfs-factor) != \"number\" or $rfs-factor <= 1 {\n @error \"`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.\";\n}\n\n// Generate enable or disable classes. Possibilities: false, \"enable\" or \"disable\"\n$rfs-class: false !default;\n\n// 1 rem = $rfs-rem-value px\n$rfs-rem-value: 16 !default;\n\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\n$rfs-safari-iframe-resize-bug-fix: false !default;\n\n// Disable RFS by setting $enable-responsive-font-sizes to false\n$enable-responsive-font-sizes: true !default;\n\n// Cache $rfs-base-font-size unit\n$rfs-base-font-size-unit: unit($rfs-base-font-size);\n\n// Remove px-unit from $rfs-base-font-size for calculations\n@if $rfs-base-font-size-unit == \"px\" {\n $rfs-base-font-size: $rfs-base-font-size / ($rfs-base-font-size * 0 + 1);\n}\n@else if $rfs-base-font-size-unit == \"rem\" {\n $rfs-base-font-size: $rfs-base-font-size / ($rfs-base-font-size * 0 + 1 / $rfs-rem-value);\n}\n\n// Cache $rfs-breakpoint unit to prevent multiple calls\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\n\n// Remove unit from $rfs-breakpoint for calculations\n@if $rfs-breakpoint-unit-cache == \"px\" {\n $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1);\n}\n@else if $rfs-breakpoint-unit-cache == \"rem\" or $rfs-breakpoint-unit-cache == \"em\" {\n $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1 / $rfs-rem-value);\n}\n\n// Responsive font-size mixin\n@mixin rfs($fs, $important: false) {\n // Cache $fs unit\n $fs-unit: if(type-of($fs) == \"number\", unit($fs), false);\n\n // Add !important suffix if needed\n $rfs-suffix: if($important, \" !important\", \"\");\n\n // If $fs isn't a number (like inherit) or $fs has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n @if not $fs-unit or $fs-unit != \"\" and $fs-unit != \"px\" and $fs-unit != \"rem\" or $fs == 0 {\n font-size: #{$fs}#{$rfs-suffix};\n }\n @else {\n // Variables for storing static and fluid rescaling\n $rfs-static: null;\n $rfs-fluid: null;\n\n // Remove px-unit from $fs for calculations\n @if $fs-unit == \"px\" {\n $fs: $fs / ($fs * 0 + 1);\n }\n @else if $fs-unit == \"rem\" {\n $fs: $fs / ($fs * 0 + 1 / $rfs-rem-value);\n }\n\n // Set default font-size\n @if $rfs-font-size-unit == rem {\n $rfs-static: #{$fs / $rfs-rem-value}rem#{$rfs-suffix};\n }\n @else if $rfs-font-size-unit == px {\n $rfs-static: #{$fs}px#{$rfs-suffix};\n }\n @else {\n @error \"`#{$rfs-font-size-unit}` is not a valid unit for $rfs-font-size-unit. Use `px` or `rem`.\";\n }\n\n // Only add media query if font-size is bigger as the minimum font-size\n // If $rfs-factor == 1, no rescaling will take place\n @if $fs > $rfs-base-font-size and $enable-responsive-font-sizes {\n $min-width: null;\n $variable-unit: null;\n\n // Calculate minimum font-size for given font-size\n $fs-min: $rfs-base-font-size + ($fs - $rfs-base-font-size) / $rfs-factor;\n\n // Calculate difference between given font-size and minimum font-size for given font-size\n $fs-diff: $fs - $fs-min;\n\n // Base font-size formatting\n // No need to check if the unit is valid, because we did that before\n $min-width: if($rfs-font-size-unit == rem, #{$fs-min / $rfs-rem-value}rem, #{$fs-min}px);\n\n // If two-dimensional, use smallest of screen width and height\n $variable-unit: if($rfs-two-dimensional, vmin, vw);\n\n // Calculate the variable width between 0 and $rfs-breakpoint\n $variable-width: #{$fs-diff * 100 / $rfs-breakpoint}#{$variable-unit};\n\n // Set the calculated font-size.\n $rfs-fluid: calc(#{$min-width} + #{$variable-width}) #{$rfs-suffix};\n }\n\n // Rendering\n @if $rfs-fluid == null {\n // Only render static font-size if no fluid font-size is available\n font-size: $rfs-static;\n }\n @else {\n $mq-value: null;\n\n // RFS breakpoint formatting\n @if $rfs-breakpoint-unit == em or $rfs-breakpoint-unit == rem {\n $mq-value: #{$rfs-breakpoint / $rfs-rem-value}#{$rfs-breakpoint-unit};\n }\n @else if $rfs-breakpoint-unit == px {\n $mq-value: #{$rfs-breakpoint}px;\n }\n @else {\n @error \"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\";\n }\n\n @if $rfs-class == \"disable\" {\n // Adding an extra class increases specificity,\n // which prevents the media query to override the font size\n &,\n .disable-responsive-font-size &,\n &.disable-responsive-font-size {\n font-size: $rfs-static;\n }\n }\n @else {\n font-size: $rfs-static;\n }\n\n @if $rfs-two-dimensional {\n @media (max-width: #{$mq-value}), (max-height: #{$mq-value}) {\n @if $rfs-class == \"enable\" {\n .enable-responsive-font-size &,\n &.enable-responsive-font-size {\n font-size: $rfs-fluid;\n }\n }\n @else {\n font-size: $rfs-fluid;\n }\n\n @if $rfs-safari-iframe-resize-bug-fix {\n // stylelint-disable-next-line length-zero-no-unit\n min-width: 0vw;\n }\n }\n }\n @else {\n @media (max-width: #{$mq-value}) {\n @if $rfs-class == \"enable\" {\n .enable-responsive-font-size &,\n &.enable-responsive-font-size {\n font-size: $rfs-fluid;\n }\n }\n @else {\n font-size: $rfs-fluid;\n }\n\n @if $rfs-safari-iframe-resize-bug-fix {\n // stylelint-disable-next-line length-zero-no-unit\n min-width: 0vw;\n }\n }\n }\n }\n }\n}\n\n// The font-size & responsive-font-size mixin uses RFS to rescale font sizes\n@mixin font-size($fs, $important: false) {\n @include rfs($fs, $important);\n}\n\n@mixin responsive-font-size($fs, $important: false) {\n @include rfs($fs, $important);\n}\n","/*!\n * Bootstrap Reboot v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)\n */\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\nhtml {\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\nbody {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #212529;\n text-align: left;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: 0.5rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n text-decoration-skip-ink: none;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #007bff;\n text-decoration: none;\n background-color: transparent;\n}\n\na:hover {\n color: #0056b3;\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg {\n overflow: hidden;\n vertical-align: middle;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n color: #6c757d;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: inherit;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: 0.5rem;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nselect {\n word-wrap: normal;\n}\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton:not(:disabled),\n[type=\"button\"]:not(:disabled),\n[type=\"reset\"]:not(:disabled),\n[type=\"submit\"]:not(:disabled) {\n cursor: pointer;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n cursor: pointer;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n\n/*# sourceMappingURL=bootstrap-reboot.css.map */","// Hover mixin and `$enable-hover-media-query` are deprecated.\n//\n// Originally added during our alphas and maintained during betas, this mixin was\n// designed to prevent `:hover` stickiness on iOS-an issue where hover styles\n// would persist after initial touch.\n//\n// For backward compatibility, we've kept these mixins and updated them to\n// always return their regular pseudo-classes instead of a shimmed media query.\n//\n// Issue: https://github.com/twbs/bootstrap/issues/25195\n\n@mixin hover {\n &:hover { @content; }\n}\n\n@mixin hover-focus {\n &:hover,\n &:focus {\n @content;\n }\n}\n\n@mixin plain-hover-focus {\n &,\n &:hover,\n &:focus {\n @content;\n }\n}\n\n@mixin hover-focus-active {\n &:hover,\n &:focus,\n &:active {\n @content;\n }\n}\n"]} \ No newline at end of file diff --git a/_Resources/node_modules/web-dev-utils/bootstrap-4.3.1-dist/css/bootstrap.css b/_Resources/node_modules/web-dev-utils/bootstrap-4.3.1-dist/css/bootstrap.css deleted file mode 100644 index 8f47589..0000000 --- a/_Resources/node_modules/web-dev-utils/bootstrap-4.3.1-dist/css/bootstrap.css +++ /dev/null @@ -1,10038 +0,0 @@ -/*! - * Bootstrap v4.3.1 (https://getbootstrap.com/) - * Copyright 2011-2019 The Bootstrap Authors - * Copyright 2011-2019 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ -:root { - --blue: #007bff; - --indigo: #6610f2; - --purple: #6f42c1; - --pink: #e83e8c; - --red: #dc3545; - --orange: #fd7e14; - --yellow: #ffc107; - --green: #28a745; - --teal: #20c997; - --cyan: #17a2b8; - --white: #fff; - --gray: #6c757d; - --gray-dark: #343a40; - --primary: #007bff; - --secondary: #6c757d; - --success: #28a745; - --info: #17a2b8; - --warning: #ffc107; - --danger: #dc3545; - --light: #f8f9fa; - --dark: #343a40; - --breakpoint-xs: 0; - --breakpoint-sm: 576px; - --breakpoint-md: 768px; - --breakpoint-lg: 992px; - --breakpoint-xl: 1200px; - --font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; -} - -*, -*::before, -*::after { - box-sizing: border-box; -} - -html { - font-family: sans-serif; - line-height: 1.15; - -webkit-text-size-adjust: 100%; - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -} - -article, aside, figcaption, figure, footer, header, hgroup, main, nav, section { - display: block; -} - -body { - margin: 0; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - font-size: 1rem; - font-weight: 400; - line-height: 1.5; - color: #212529; - text-align: left; - background-color: #fff; -} - -[tabindex="-1"]:focus { - outline: 0 !important; -} - -hr { - box-sizing: content-box; - height: 0; - overflow: visible; -} - -h1, h2, h3, h4, h5, h6 { - margin-top: 0; - margin-bottom: 0.5rem; -} - -p { - margin-top: 0; - margin-bottom: 1rem; -} - -abbr[title], -abbr[data-original-title] { - text-decoration: underline; - -webkit-text-decoration: underline dotted; - text-decoration: underline dotted; - cursor: help; - border-bottom: 0; - -webkit-text-decoration-skip-ink: none; - text-decoration-skip-ink: none; -} - -address { - margin-bottom: 1rem; - font-style: normal; - line-height: inherit; -} - -ol, -ul, -dl { - margin-top: 0; - margin-bottom: 1rem; -} - -ol ol, -ul ul, -ol ul, -ul ol { - margin-bottom: 0; -} - -dt { - font-weight: 700; -} - -dd { - margin-bottom: .5rem; - margin-left: 0; -} - -blockquote { - margin: 0 0 1rem; -} - -b, -strong { - font-weight: bolder; -} - -small { - font-size: 80%; -} - -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} - -sub { - bottom: -.25em; -} - -sup { - top: -.5em; -} - -a { - color: #007bff; - text-decoration: none; - background-color: transparent; -} - -a:hover { - color: #0056b3; - text-decoration: underline; -} - -a:not([href]):not([tabindex]) { - color: inherit; - text-decoration: none; -} - -a:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus { - color: inherit; - text-decoration: none; -} - -a:not([href]):not([tabindex]):focus { - outline: 0; -} - -pre, -code, -kbd, -samp { - font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; - font-size: 1em; -} - -pre { - margin-top: 0; - margin-bottom: 1rem; - overflow: auto; -} - -figure { - margin: 0 0 1rem; -} - -img { - vertical-align: middle; - border-style: none; -} - -svg { - overflow: hidden; - vertical-align: middle; -} - -table { - border-collapse: collapse; -} - -caption { - padding-top: 0.75rem; - padding-bottom: 0.75rem; - color: #6c757d; - text-align: left; - caption-side: bottom; -} - -th { - text-align: inherit; -} - -label { - display: inline-block; - margin-bottom: 0.5rem; -} - -button { - border-radius: 0; -} - -button:focus { - outline: 1px dotted; - outline: 5px auto -webkit-focus-ring-color; -} - -input, -button, -select, -optgroup, -textarea { - margin: 0; - font-family: inherit; - font-size: inherit; - line-height: inherit; -} - -button, -input { - overflow: visible; -} - -button, -select { - text-transform: none; -} - -select { - word-wrap: normal; -} - -button, -[type="button"], -[type="reset"], -[type="submit"] { - -webkit-appearance: button; -} - -button:not(:disabled), -[type="button"]:not(:disabled), -[type="reset"]:not(:disabled), -[type="submit"]:not(:disabled) { - cursor: pointer; -} - -button::-moz-focus-inner, -[type="button"]::-moz-focus-inner, -[type="reset"]::-moz-focus-inner, -[type="submit"]::-moz-focus-inner { - padding: 0; - border-style: none; -} - -input[type="radio"], -input[type="checkbox"] { - box-sizing: border-box; - padding: 0; -} - -input[type="date"], -input[type="time"], -input[type="datetime-local"], -input[type="month"] { - -webkit-appearance: listbox; -} - -textarea { - overflow: auto; - resize: vertical; -} - -fieldset { - min-width: 0; - padding: 0; - margin: 0; - border: 0; -} - -legend { - display: block; - width: 100%; - max-width: 100%; - padding: 0; - margin-bottom: .5rem; - font-size: 1.5rem; - line-height: inherit; - color: inherit; - white-space: normal; -} - -progress { - vertical-align: baseline; -} - -[type="number"]::-webkit-inner-spin-button, -[type="number"]::-webkit-outer-spin-button { - height: auto; -} - -[type="search"] { - outline-offset: -2px; - -webkit-appearance: none; -} - -[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} - -::-webkit-file-upload-button { - font: inherit; - -webkit-appearance: button; -} - -output { - display: inline-block; -} - -summary { - display: list-item; - cursor: pointer; -} - -template { - display: none; -} - -[hidden] { - display: none !important; -} - -h1, h2, h3, h4, h5, h6, -.h1, .h2, .h3, .h4, .h5, .h6 { - margin-bottom: 0.5rem; - font-weight: 500; - line-height: 1.2; -} - -h1, .h1 { - font-size: 2.5rem; -} - -h2, .h2 { - font-size: 2rem; -} - -h3, .h3 { - font-size: 1.75rem; -} - -h4, .h4 { - font-size: 1.5rem; -} - -h5, .h5 { - font-size: 1.25rem; -} - -h6, .h6 { - font-size: 1rem; -} - -.lead { - font-size: 1.25rem; - font-weight: 300; -} - -.display-1 { - font-size: 6rem; - font-weight: 300; - line-height: 1.2; -} - -.display-2 { - font-size: 5.5rem; - font-weight: 300; - line-height: 1.2; -} - -.display-3 { - font-size: 4.5rem; - font-weight: 300; - line-height: 1.2; -} - -.display-4 { - font-size: 3.5rem; - font-weight: 300; - line-height: 1.2; -} - -hr { - margin-top: 1rem; - margin-bottom: 1rem; - border: 0; - border-top: 1px solid rgba(0, 0, 0, 0.1); -} - -small, -.small { - font-size: 80%; - font-weight: 400; -} - -mark, -.mark { - padding: 0.2em; - background-color: #fcf8e3; -} - -.list-unstyled { - padding-left: 0; - list-style: none; -} - -.list-inline { - padding-left: 0; - list-style: none; -} - -.list-inline-item { - display: inline-block; -} - -.list-inline-item:not(:last-child) { - margin-right: 0.5rem; -} - -.initialism { - font-size: 90%; - text-transform: uppercase; -} - -.blockquote { - margin-bottom: 1rem; - font-size: 1.25rem; -} - -.blockquote-footer { - display: block; - font-size: 80%; - color: #6c757d; -} - -.blockquote-footer::before { - content: "\2014\00A0"; -} - -.img-fluid { - max-width: 100%; - height: auto; -} - -.img-thumbnail { - padding: 0.25rem; - background-color: #fff; - border: 1px solid #dee2e6; - border-radius: 0.25rem; - max-width: 100%; - height: auto; -} - -.figure { - display: inline-block; -} - -.figure-img { - margin-bottom: 0.5rem; - line-height: 1; -} - -.figure-caption { - font-size: 90%; - color: #6c757d; -} - -code { - font-size: 87.5%; - color: #e83e8c; - word-break: break-word; -} - -a > code { - color: inherit; -} - -kbd { - padding: 0.2rem 0.4rem; - font-size: 87.5%; - color: #fff; - background-color: #212529; - border-radius: 0.2rem; -} - -kbd kbd { - padding: 0; - font-size: 100%; - font-weight: 700; -} - -pre { - display: block; - font-size: 87.5%; - color: #212529; -} - -pre code { - font-size: inherit; - color: inherit; - word-break: normal; -} - -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; -} - -.container { - width: 100%; - padding-right: 15px; - padding-left: 15px; - margin-right: auto; - margin-left: auto; -} - -@media (min-width: 576px) { - .container { - max-width: 540px; - } -} - -@media (min-width: 768px) { - .container { - max-width: 720px; - } -} - -@media (min-width: 992px) { - .container { - max-width: 960px; - } -} - -@media (min-width: 1200px) { - .container { - max-width: 1140px; - } -} - -.container-fluid { - width: 100%; - padding-right: 15px; - padding-left: 15px; - margin-right: auto; - margin-left: auto; -} - -.row { - display: -ms-flexbox; - display: flex; - -ms-flex-wrap: wrap; - flex-wrap: wrap; - margin-right: -15px; - margin-left: -15px; -} - -.no-gutters { - margin-right: 0; - margin-left: 0; -} - -.no-gutters > .col, -.no-gutters > [class*="col-"] { - padding-right: 0; - padding-left: 0; -} - -.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col, -.col-auto, .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, .col-sm, -.col-sm-auto, .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, .col-md, -.col-md-auto, .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, .col-lg, -.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl, -.col-xl-auto { - position: relative; - width: 100%; - padding-right: 15px; - padding-left: 15px; -} - -.col { - -ms-flex-preferred-size: 0; - flex-basis: 0; - -ms-flex-positive: 1; - flex-grow: 1; - max-width: 100%; -} - -.col-auto { - -ms-flex: 0 0 auto; - flex: 0 0 auto; - width: auto; - max-width: 100%; -} - -.col-1 { - -ms-flex: 0 0 8.333333%; - flex: 0 0 8.333333%; - max-width: 8.333333%; -} - -.col-2 { - -ms-flex: 0 0 16.666667%; - flex: 0 0 16.666667%; - max-width: 16.666667%; -} - -.col-3 { - -ms-flex: 0 0 25%; - flex: 0 0 25%; - max-width: 25%; -} - -.col-4 { - -ms-flex: 0 0 33.333333%; - flex: 0 0 33.333333%; - max-width: 33.333333%; -} - -.col-5 { - -ms-flex: 0 0 41.666667%; - flex: 0 0 41.666667%; - max-width: 41.666667%; -} - -.col-6 { - -ms-flex: 0 0 50%; - flex: 0 0 50%; - max-width: 50%; -} - -.col-7 { - -ms-flex: 0 0 58.333333%; - flex: 0 0 58.333333%; - max-width: 58.333333%; -} - -.col-8 { - -ms-flex: 0 0 66.666667%; - flex: 0 0 66.666667%; - max-width: 66.666667%; -} - -.col-9 { - -ms-flex: 0 0 75%; - flex: 0 0 75%; - max-width: 75%; -} - -.col-10 { - -ms-flex: 0 0 83.333333%; - flex: 0 0 83.333333%; - max-width: 83.333333%; -} - -.col-11 { - -ms-flex: 0 0 91.666667%; - flex: 0 0 91.666667%; - max-width: 91.666667%; -} - -.col-12 { - -ms-flex: 0 0 100%; - flex: 0 0 100%; - max-width: 100%; -} - -.order-first { - -ms-flex-order: -1; - order: -1; -} - -.order-last { - -ms-flex-order: 13; - order: 13; -} - -.order-0 { - -ms-flex-order: 0; - order: 0; -} - -.order-1 { - -ms-flex-order: 1; - order: 1; -} - -.order-2 { - -ms-flex-order: 2; - order: 2; -} - -.order-3 { - -ms-flex-order: 3; - order: 3; -} - -.order-4 { - -ms-flex-order: 4; - order: 4; -} - -.order-5 { - -ms-flex-order: 5; - order: 5; -} - -.order-6 { - -ms-flex-order: 6; - order: 6; -} - -.order-7 { - -ms-flex-order: 7; - order: 7; -} - -.order-8 { - -ms-flex-order: 8; - order: 8; -} - -.order-9 { - -ms-flex-order: 9; - order: 9; -} - -.order-10 { - -ms-flex-order: 10; - order: 10; -} - -.order-11 { - -ms-flex-order: 11; - order: 11; -} - -.order-12 { - -ms-flex-order: 12; - order: 12; -} - -.offset-1 { - margin-left: 8.333333%; -} - -.offset-2 { - margin-left: 16.666667%; -} - -.offset-3 { - margin-left: 25%; -} - -.offset-4 { - margin-left: 33.333333%; -} - -.offset-5 { - margin-left: 41.666667%; -} - -.offset-6 { - margin-left: 50%; -} - -.offset-7 { - margin-left: 58.333333%; -} - -.offset-8 { - margin-left: 66.666667%; -} - -.offset-9 { - margin-left: 75%; -} - -.offset-10 { - margin-left: 83.333333%; -} - -.offset-11 { - margin-left: 91.666667%; -} - -@media (min-width: 576px) { - .col-sm { - -ms-flex-preferred-size: 0; - flex-basis: 0; - -ms-flex-positive: 1; - flex-grow: 1; - max-width: 100%; - } - .col-sm-auto { - -ms-flex: 0 0 auto; - flex: 0 0 auto; - width: auto; - max-width: 100%; - } - .col-sm-1 { - -ms-flex: 0 0 8.333333%; - flex: 0 0 8.333333%; - max-width: 8.333333%; - } - .col-sm-2 { - -ms-flex: 0 0 16.666667%; - flex: 0 0 16.666667%; - max-width: 16.666667%; - } - .col-sm-3 { - -ms-flex: 0 0 25%; - flex: 0 0 25%; - max-width: 25%; - } - .col-sm-4 { - -ms-flex: 0 0 33.333333%; - flex: 0 0 33.333333%; - max-width: 33.333333%; - } - .col-sm-5 { - -ms-flex: 0 0 41.666667%; - flex: 0 0 41.666667%; - max-width: 41.666667%; - } - .col-sm-6 { - -ms-flex: 0 0 50%; - flex: 0 0 50%; - max-width: 50%; - } - .col-sm-7 { - -ms-flex: 0 0 58.333333%; - flex: 0 0 58.333333%; - max-width: 58.333333%; - } - .col-sm-8 { - -ms-flex: 0 0 66.666667%; - flex: 0 0 66.666667%; - max-width: 66.666667%; - } - .col-sm-9 { - -ms-flex: 0 0 75%; - flex: 0 0 75%; - max-width: 75%; - } - .col-sm-10 { - -ms-flex: 0 0 83.333333%; - flex: 0 0 83.333333%; - max-width: 83.333333%; - } - .col-sm-11 { - -ms-flex: 0 0 91.666667%; - flex: 0 0 91.666667%; - max-width: 91.666667%; - } - .col-sm-12 { - -ms-flex: 0 0 100%; - flex: 0 0 100%; - max-width: 100%; - } - .order-sm-first { - -ms-flex-order: -1; - order: -1; - } - .order-sm-last { - -ms-flex-order: 13; - order: 13; - } - .order-sm-0 { - -ms-flex-order: 0; - order: 0; - } - .order-sm-1 { - -ms-flex-order: 1; - order: 1; - } - .order-sm-2 { - -ms-flex-order: 2; - order: 2; - } - .order-sm-3 { - -ms-flex-order: 3; - order: 3; - } - .order-sm-4 { - -ms-flex-order: 4; - order: 4; - } - .order-sm-5 { - -ms-flex-order: 5; - order: 5; - } - .order-sm-6 { - -ms-flex-order: 6; - order: 6; - } - .order-sm-7 { - -ms-flex-order: 7; - order: 7; - } - .order-sm-8 { - -ms-flex-order: 8; - order: 8; - } - .order-sm-9 { - -ms-flex-order: 9; - order: 9; - } - .order-sm-10 { - -ms-flex-order: 10; - order: 10; - } - .order-sm-11 { - -ms-flex-order: 11; - order: 11; - } - .order-sm-12 { - -ms-flex-order: 12; - order: 12; - } - .offset-sm-0 { - margin-left: 0; - } - .offset-sm-1 { - margin-left: 8.333333%; - } - .offset-sm-2 { - margin-left: 16.666667%; - } - .offset-sm-3 { - margin-left: 25%; - } - .offset-sm-4 { - margin-left: 33.333333%; - } - .offset-sm-5 { - margin-left: 41.666667%; - } - .offset-sm-6 { - margin-left: 50%; - } - .offset-sm-7 { - margin-left: 58.333333%; - } - .offset-sm-8 { - margin-left: 66.666667%; - } - .offset-sm-9 { - margin-left: 75%; - } - .offset-sm-10 { - margin-left: 83.333333%; - } - .offset-sm-11 { - margin-left: 91.666667%; - } -} - -@media (min-width: 768px) { - .col-md { - -ms-flex-preferred-size: 0; - flex-basis: 0; - -ms-flex-positive: 1; - flex-grow: 1; - max-width: 100%; - } - .col-md-auto { - -ms-flex: 0 0 auto; - flex: 0 0 auto; - width: auto; - max-width: 100%; - } - .col-md-1 { - -ms-flex: 0 0 8.333333%; - flex: 0 0 8.333333%; - max-width: 8.333333%; - } - .col-md-2 { - -ms-flex: 0 0 16.666667%; - flex: 0 0 16.666667%; - max-width: 16.666667%; - } - .col-md-3 { - -ms-flex: 0 0 25%; - flex: 0 0 25%; - max-width: 25%; - } - .col-md-4 { - -ms-flex: 0 0 33.333333%; - flex: 0 0 33.333333%; - max-width: 33.333333%; - } - .col-md-5 { - -ms-flex: 0 0 41.666667%; - flex: 0 0 41.666667%; - max-width: 41.666667%; - } - .col-md-6 { - -ms-flex: 0 0 50%; - flex: 0 0 50%; - max-width: 50%; - } - .col-md-7 { - -ms-flex: 0 0 58.333333%; - flex: 0 0 58.333333%; - max-width: 58.333333%; - } - .col-md-8 { - -ms-flex: 0 0 66.666667%; - flex: 0 0 66.666667%; - max-width: 66.666667%; - } - .col-md-9 { - -ms-flex: 0 0 75%; - flex: 0 0 75%; - max-width: 75%; - } - .col-md-10 { - -ms-flex: 0 0 83.333333%; - flex: 0 0 83.333333%; - max-width: 83.333333%; - } - .col-md-11 { - -ms-flex: 0 0 91.666667%; - flex: 0 0 91.666667%; - max-width: 91.666667%; - } - .col-md-12 { - -ms-flex: 0 0 100%; - flex: 0 0 100%; - max-width: 100%; - } - .order-md-first { - -ms-flex-order: -1; - order: -1; - } - .order-md-last { - -ms-flex-order: 13; - order: 13; - } - .order-md-0 { - -ms-flex-order: 0; - order: 0; - } - .order-md-1 { - -ms-flex-order: 1; - order: 1; - } - .order-md-2 { - -ms-flex-order: 2; - order: 2; - } - .order-md-3 { - -ms-flex-order: 3; - order: 3; - } - .order-md-4 { - -ms-flex-order: 4; - order: 4; - } - .order-md-5 { - -ms-flex-order: 5; - order: 5; - } - .order-md-6 { - -ms-flex-order: 6; - order: 6; - } - .order-md-7 { - -ms-flex-order: 7; - order: 7; - } - .order-md-8 { - -ms-flex-order: 8; - order: 8; - } - .order-md-9 { - -ms-flex-order: 9; - order: 9; - } - .order-md-10 { - -ms-flex-order: 10; - order: 10; - } - .order-md-11 { - -ms-flex-order: 11; - order: 11; - } - .order-md-12 { - -ms-flex-order: 12; - order: 12; - } - .offset-md-0 { - margin-left: 0; - } - .offset-md-1 { - margin-left: 8.333333%; - } - .offset-md-2 { - margin-left: 16.666667%; - } - .offset-md-3 { - margin-left: 25%; - } - .offset-md-4 { - margin-left: 33.333333%; - } - .offset-md-5 { - margin-left: 41.666667%; - } - .offset-md-6 { - margin-left: 50%; - } - .offset-md-7 { - margin-left: 58.333333%; - } - .offset-md-8 { - margin-left: 66.666667%; - } - .offset-md-9 { - margin-left: 75%; - } - .offset-md-10 { - margin-left: 83.333333%; - } - .offset-md-11 { - margin-left: 91.666667%; - } -} - -@media (min-width: 992px) { - .col-lg { - -ms-flex-preferred-size: 0; - flex-basis: 0; - -ms-flex-positive: 1; - flex-grow: 1; - max-width: 100%; - } - .col-lg-auto { - -ms-flex: 0 0 auto; - flex: 0 0 auto; - width: auto; - max-width: 100%; - } - .col-lg-1 { - -ms-flex: 0 0 8.333333%; - flex: 0 0 8.333333%; - max-width: 8.333333%; - } - .col-lg-2 { - -ms-flex: 0 0 16.666667%; - flex: 0 0 16.666667%; - max-width: 16.666667%; - } - .col-lg-3 { - -ms-flex: 0 0 25%; - flex: 0 0 25%; - max-width: 25%; - } - .col-lg-4 { - -ms-flex: 0 0 33.333333%; - flex: 0 0 33.333333%; - max-width: 33.333333%; - } - .col-lg-5 { - -ms-flex: 0 0 41.666667%; - flex: 0 0 41.666667%; - max-width: 41.666667%; - } - .col-lg-6 { - -ms-flex: 0 0 50%; - flex: 0 0 50%; - max-width: 50%; - } - .col-lg-7 { - -ms-flex: 0 0 58.333333%; - flex: 0 0 58.333333%; - max-width: 58.333333%; - } - .col-lg-8 { - -ms-flex: 0 0 66.666667%; - flex: 0 0 66.666667%; - max-width: 66.666667%; - } - .col-lg-9 { - -ms-flex: 0 0 75%; - flex: 0 0 75%; - max-width: 75%; - } - .col-lg-10 { - -ms-flex: 0 0 83.333333%; - flex: 0 0 83.333333%; - max-width: 83.333333%; - } - .col-lg-11 { - -ms-flex: 0 0 91.666667%; - flex: 0 0 91.666667%; - max-width: 91.666667%; - } - .col-lg-12 { - -ms-flex: 0 0 100%; - flex: 0 0 100%; - max-width: 100%; - } - .order-lg-first { - -ms-flex-order: -1; - order: -1; - } - .order-lg-last { - -ms-flex-order: 13; - order: 13; - } - .order-lg-0 { - -ms-flex-order: 0; - order: 0; - } - .order-lg-1 { - -ms-flex-order: 1; - order: 1; - } - .order-lg-2 { - -ms-flex-order: 2; - order: 2; - } - .order-lg-3 { - -ms-flex-order: 3; - order: 3; - } - .order-lg-4 { - -ms-flex-order: 4; - order: 4; - } - .order-lg-5 { - -ms-flex-order: 5; - order: 5; - } - .order-lg-6 { - -ms-flex-order: 6; - order: 6; - } - .order-lg-7 { - -ms-flex-order: 7; - order: 7; - } - .order-lg-8 { - -ms-flex-order: 8; - order: 8; - } - .order-lg-9 { - -ms-flex-order: 9; - order: 9; - } - .order-lg-10 { - -ms-flex-order: 10; - order: 10; - } - .order-lg-11 { - -ms-flex-order: 11; - order: 11; - } - .order-lg-12 { - -ms-flex-order: 12; - order: 12; - } - .offset-lg-0 { - margin-left: 0; - } - .offset-lg-1 { - margin-left: 8.333333%; - } - .offset-lg-2 { - margin-left: 16.666667%; - } - .offset-lg-3 { - margin-left: 25%; - } - .offset-lg-4 { - margin-left: 33.333333%; - } - .offset-lg-5 { - margin-left: 41.666667%; - } - .offset-lg-6 { - margin-left: 50%; - } - .offset-lg-7 { - margin-left: 58.333333%; - } - .offset-lg-8 { - margin-left: 66.666667%; - } - .offset-lg-9 { - margin-left: 75%; - } - .offset-lg-10 { - margin-left: 83.333333%; - } - .offset-lg-11 { - margin-left: 91.666667%; - } -} - -@media (min-width: 1200px) { - .col-xl { - -ms-flex-preferred-size: 0; - flex-basis: 0; - -ms-flex-positive: 1; - flex-grow: 1; - max-width: 100%; - } - .col-xl-auto { - -ms-flex: 0 0 auto; - flex: 0 0 auto; - width: auto; - max-width: 100%; - } - .col-xl-1 { - -ms-flex: 0 0 8.333333%; - flex: 0 0 8.333333%; - max-width: 8.333333%; - } - .col-xl-2 { - -ms-flex: 0 0 16.666667%; - flex: 0 0 16.666667%; - max-width: 16.666667%; - } - .col-xl-3 { - -ms-flex: 0 0 25%; - flex: 0 0 25%; - max-width: 25%; - } - .col-xl-4 { - -ms-flex: 0 0 33.333333%; - flex: 0 0 33.333333%; - max-width: 33.333333%; - } - .col-xl-5 { - -ms-flex: 0 0 41.666667%; - flex: 0 0 41.666667%; - max-width: 41.666667%; - } - .col-xl-6 { - -ms-flex: 0 0 50%; - flex: 0 0 50%; - max-width: 50%; - } - .col-xl-7 { - -ms-flex: 0 0 58.333333%; - flex: 0 0 58.333333%; - max-width: 58.333333%; - } - .col-xl-8 { - -ms-flex: 0 0 66.666667%; - flex: 0 0 66.666667%; - max-width: 66.666667%; - } - .col-xl-9 { - -ms-flex: 0 0 75%; - flex: 0 0 75%; - max-width: 75%; - } - .col-xl-10 { - -ms-flex: 0 0 83.333333%; - flex: 0 0 83.333333%; - max-width: 83.333333%; - } - .col-xl-11 { - -ms-flex: 0 0 91.666667%; - flex: 0 0 91.666667%; - max-width: 91.666667%; - } - .col-xl-12 { - -ms-flex: 0 0 100%; - flex: 0 0 100%; - max-width: 100%; - } - .order-xl-first { - -ms-flex-order: -1; - order: -1; - } - .order-xl-last { - -ms-flex-order: 13; - order: 13; - } - .order-xl-0 { - -ms-flex-order: 0; - order: 0; - } - .order-xl-1 { - -ms-flex-order: 1; - order: 1; - } - .order-xl-2 { - -ms-flex-order: 2; - order: 2; - } - .order-xl-3 { - -ms-flex-order: 3; - order: 3; - } - .order-xl-4 { - -ms-flex-order: 4; - order: 4; - } - .order-xl-5 { - -ms-flex-order: 5; - order: 5; - } - .order-xl-6 { - -ms-flex-order: 6; - order: 6; - } - .order-xl-7 { - -ms-flex-order: 7; - order: 7; - } - .order-xl-8 { - -ms-flex-order: 8; - order: 8; - } - .order-xl-9 { - -ms-flex-order: 9; - order: 9; - } - .order-xl-10 { - -ms-flex-order: 10; - order: 10; - } - .order-xl-11 { - -ms-flex-order: 11; - order: 11; - } - .order-xl-12 { - -ms-flex-order: 12; - order: 12; - } - .offset-xl-0 { - margin-left: 0; - } - .offset-xl-1 { - margin-left: 8.333333%; - } - .offset-xl-2 { - margin-left: 16.666667%; - } - .offset-xl-3 { - margin-left: 25%; - } - .offset-xl-4 { - margin-left: 33.333333%; - } - .offset-xl-5 { - margin-left: 41.666667%; - } - .offset-xl-6 { - margin-left: 50%; - } - .offset-xl-7 { - margin-left: 58.333333%; - } - .offset-xl-8 { - margin-left: 66.666667%; - } - .offset-xl-9 { - margin-left: 75%; - } - .offset-xl-10 { - margin-left: 83.333333%; - } - .offset-xl-11 { - margin-left: 91.666667%; - } -} - -.table { - width: 100%; - margin-bottom: 1rem; - color: #212529; -} - -.table th, -.table td { - padding: 0.75rem; - vertical-align: top; - border-top: 1px solid #dee2e6; -} - -.table thead th { - vertical-align: bottom; - border-bottom: 2px solid #dee2e6; -} - -.table tbody + tbody { - border-top: 2px solid #dee2e6; -} - -.table-sm th, -.table-sm td { - padding: 0.3rem; -} - -.table-bordered { - border: 1px solid #dee2e6; -} - -.table-bordered th, -.table-bordered td { - border: 1px solid #dee2e6; -} - -.table-bordered thead th, -.table-bordered thead td { - border-bottom-width: 2px; -} - -.table-borderless th, -.table-borderless td, -.table-borderless thead th, -.table-borderless tbody + tbody { - border: 0; -} - -.table-striped tbody tr:nth-of-type(odd) { - background-color: rgba(0, 0, 0, 0.05); -} - -.table-hover tbody tr:hover { - color: #212529; - background-color: rgba(0, 0, 0, 0.075); -} - -.table-primary, -.table-primary > th, -.table-primary > td { - background-color: #b8daff; -} - -.table-primary th, -.table-primary td, -.table-primary thead th, -.table-primary tbody + tbody { - border-color: #7abaff; -} - -.table-hover .table-primary:hover { - background-color: #9fcdff; -} - -.table-hover .table-primary:hover > td, -.table-hover .table-primary:hover > th { - background-color: #9fcdff; -} - -.table-secondary, -.table-secondary > th, -.table-secondary > td { - background-color: #d6d8db; -} - -.table-secondary th, -.table-secondary td, -.table-secondary thead th, -.table-secondary tbody + tbody { - border-color: #b3b7bb; -} - -.table-hover .table-secondary:hover { - background-color: #c8cbcf; -} - -.table-hover .table-secondary:hover > td, -.table-hover .table-secondary:hover > th { - background-color: #c8cbcf; -} - -.table-success, -.table-success > th, -.table-success > td { - background-color: #c3e6cb; -} - -.table-success th, -.table-success td, -.table-success thead th, -.table-success tbody + tbody { - border-color: #8fd19e; -} - -.table-hover .table-success:hover { - background-color: #b1dfbb; -} - -.table-hover .table-success:hover > td, -.table-hover .table-success:hover > th { - background-color: #b1dfbb; -} - -.table-info, -.table-info > th, -.table-info > td { - background-color: #bee5eb; -} - -.table-info th, -.table-info td, -.table-info thead th, -.table-info tbody + tbody { - border-color: #86cfda; -} - -.table-hover .table-info:hover { - background-color: #abdde5; -} - -.table-hover .table-info:hover > td, -.table-hover .table-info:hover > th { - background-color: #abdde5; -} - -.table-warning, -.table-warning > th, -.table-warning > td { - background-color: #ffeeba; -} - -.table-warning th, -.table-warning td, -.table-warning thead th, -.table-warning tbody + tbody { - border-color: #ffdf7e; -} - -.table-hover .table-warning:hover { - background-color: #ffe8a1; -} - -.table-hover .table-warning:hover > td, -.table-hover .table-warning:hover > th { - background-color: #ffe8a1; -} - -.table-danger, -.table-danger > th, -.table-danger > td { - background-color: #f5c6cb; -} - -.table-danger th, -.table-danger td, -.table-danger thead th, -.table-danger tbody + tbody { - border-color: #ed969e; -} - -.table-hover .table-danger:hover { - background-color: #f1b0b7; -} - -.table-hover .table-danger:hover > td, -.table-hover .table-danger:hover > th { - background-color: #f1b0b7; -} - -.table-light, -.table-light > th, -.table-light > td { - background-color: #fdfdfe; -} - -.table-light th, -.table-light td, -.table-light thead th, -.table-light tbody + tbody { - border-color: #fbfcfc; -} - -.table-hover .table-light:hover { - background-color: #ececf6; -} - -.table-hover .table-light:hover > td, -.table-hover .table-light:hover > th { - background-color: #ececf6; -} - -.table-dark, -.table-dark > th, -.table-dark > td { - background-color: #c6c8ca; -} - -.table-dark th, -.table-dark td, -.table-dark thead th, -.table-dark tbody + tbody { - border-color: #95999c; -} - -.table-hover .table-dark:hover { - background-color: #b9bbbe; -} - -.table-hover .table-dark:hover > td, -.table-hover .table-dark:hover > th { - background-color: #b9bbbe; -} - -.table-active, -.table-active > th, -.table-active > td { - background-color: rgba(0, 0, 0, 0.075); -} - -.table-hover .table-active:hover { - background-color: rgba(0, 0, 0, 0.075); -} - -.table-hover .table-active:hover > td, -.table-hover .table-active:hover > th { - background-color: rgba(0, 0, 0, 0.075); -} - -.table .thead-dark th { - color: #fff; - background-color: #343a40; - border-color: #454d55; -} - -.table .thead-light th { - color: #495057; - background-color: #e9ecef; - border-color: #dee2e6; -} - -.table-dark { - color: #fff; - background-color: #343a40; -} - -.table-dark th, -.table-dark td, -.table-dark thead th { - border-color: #454d55; -} - -.table-dark.table-bordered { - border: 0; -} - -.table-dark.table-striped tbody tr:nth-of-type(odd) { - background-color: rgba(255, 255, 255, 0.05); -} - -.table-dark.table-hover tbody tr:hover { - color: #fff; - background-color: rgba(255, 255, 255, 0.075); -} - -@media (max-width: 575.98px) { - .table-responsive-sm { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch; - } - .table-responsive-sm > .table-bordered { - border: 0; - } -} - -@media (max-width: 767.98px) { - .table-responsive-md { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch; - } - .table-responsive-md > .table-bordered { - border: 0; - } -} - -@media (max-width: 991.98px) { - .table-responsive-lg { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch; - } - .table-responsive-lg > .table-bordered { - border: 0; - } -} - -@media (max-width: 1199.98px) { - .table-responsive-xl { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch; - } - .table-responsive-xl > .table-bordered { - border: 0; - } -} - -.table-responsive { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch; -} - -.table-responsive > .table-bordered { - border: 0; -} - -.form-control { - display: block; - width: 100%; - height: calc(1.5em + 0.75rem + 2px); - padding: 0.375rem 0.75rem; - font-size: 1rem; - font-weight: 400; - line-height: 1.5; - color: #495057; - background-color: #fff; - background-clip: padding-box; - border: 1px solid #ced4da; - border-radius: 0.25rem; - transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; -} - -@media (prefers-reduced-motion: reduce) { - .form-control { - transition: none; - } -} - -.form-control::-ms-expand { - background-color: transparent; - border: 0; -} - -.form-control:focus { - color: #495057; - background-color: #fff; - border-color: #80bdff; - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); -} - -.form-control::-webkit-input-placeholder { - color: #6c757d; - opacity: 1; -} - -.form-control::-moz-placeholder { - color: #6c757d; - opacity: 1; -} - -.form-control:-ms-input-placeholder { - color: #6c757d; - opacity: 1; -} - -.form-control::-ms-input-placeholder { - color: #6c757d; - opacity: 1; -} - -.form-control::placeholder { - color: #6c757d; - opacity: 1; -} - -.form-control:disabled, .form-control[readonly] { - background-color: #e9ecef; - opacity: 1; -} - -select.form-control:focus::-ms-value { - color: #495057; - background-color: #fff; -} - -.form-control-file, -.form-control-range { - display: block; - width: 100%; -} - -.col-form-label { - padding-top: calc(0.375rem + 1px); - padding-bottom: calc(0.375rem + 1px); - margin-bottom: 0; - font-size: inherit; - line-height: 1.5; -} - -.col-form-label-lg { - padding-top: calc(0.5rem + 1px); - padding-bottom: calc(0.5rem + 1px); - font-size: 1.25rem; - line-height: 1.5; -} - -.col-form-label-sm { - padding-top: calc(0.25rem + 1px); - padding-bottom: calc(0.25rem + 1px); - font-size: 0.875rem; - line-height: 1.5; -} - -.form-control-plaintext { - display: block; - width: 100%; - padding-top: 0.375rem; - padding-bottom: 0.375rem; - margin-bottom: 0; - line-height: 1.5; - color: #212529; - background-color: transparent; - border: solid transparent; - border-width: 1px 0; -} - -.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg { - padding-right: 0; - padding-left: 0; -} - -.form-control-sm { - height: calc(1.5em + 0.5rem + 2px); - padding: 0.25rem 0.5rem; - font-size: 0.875rem; - line-height: 1.5; - border-radius: 0.2rem; -} - -.form-control-lg { - height: calc(1.5em + 1rem + 2px); - padding: 0.5rem 1rem; - font-size: 1.25rem; - line-height: 1.5; - border-radius: 0.3rem; -} - -select.form-control[size], select.form-control[multiple] { - height: auto; -} - -textarea.form-control { - height: auto; -} - -.form-group { - margin-bottom: 1rem; -} - -.form-text { - display: block; - margin-top: 0.25rem; -} - -.form-row { - display: -ms-flexbox; - display: flex; - -ms-flex-wrap: wrap; - flex-wrap: wrap; - margin-right: -5px; - margin-left: -5px; -} - -.form-row > .col, -.form-row > [class*="col-"] { - padding-right: 5px; - padding-left: 5px; -} - -.form-check { - position: relative; - display: block; - padding-left: 1.25rem; -} - -.form-check-input { - position: absolute; - margin-top: 0.3rem; - margin-left: -1.25rem; -} - -.form-check-input:disabled ~ .form-check-label { - color: #6c757d; -} - -.form-check-label { - margin-bottom: 0; -} - -.form-check-inline { - display: -ms-inline-flexbox; - display: inline-flex; - -ms-flex-align: center; - align-items: center; - padding-left: 0; - margin-right: 0.75rem; -} - -.form-check-inline .form-check-input { - position: static; - margin-top: 0; - margin-right: 0.3125rem; - margin-left: 0; -} - -.valid-feedback { - display: none; - width: 100%; - margin-top: 0.25rem; - font-size: 80%; - color: #28a745; -} - -.valid-tooltip { - position: absolute; - top: 100%; - z-index: 5; - display: none; - max-width: 100%; - padding: 0.25rem 0.5rem; - margin-top: .1rem; - font-size: 0.875rem; - line-height: 1.5; - color: #fff; - background-color: rgba(40, 167, 69, 0.9); - border-radius: 0.25rem; -} - -.was-validated .form-control:valid, .form-control.is-valid { - border-color: #28a745; - padding-right: calc(1.5em + 0.75rem); - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); - background-repeat: no-repeat; - background-position: center right calc(0.375em + 0.1875rem); - background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); -} - -.was-validated .form-control:valid:focus, .form-control.is-valid:focus { - border-color: #28a745; - box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); -} - -.was-validated .form-control:valid ~ .valid-feedback, -.was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-feedback, -.form-control.is-valid ~ .valid-tooltip { - display: block; -} - -.was-validated textarea.form-control:valid, textarea.form-control.is-valid { - padding-right: calc(1.5em + 0.75rem); - background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); -} - -.was-validated .custom-select:valid, .custom-select.is-valid { - border-color: #28a745; - padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem); - background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); -} - -.was-validated .custom-select:valid:focus, .custom-select.is-valid:focus { - border-color: #28a745; - box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); -} - -.was-validated .custom-select:valid ~ .valid-feedback, -.was-validated .custom-select:valid ~ .valid-tooltip, .custom-select.is-valid ~ .valid-feedback, -.custom-select.is-valid ~ .valid-tooltip { - display: block; -} - -.was-validated .form-control-file:valid ~ .valid-feedback, -.was-validated .form-control-file:valid ~ .valid-tooltip, .form-control-file.is-valid ~ .valid-feedback, -.form-control-file.is-valid ~ .valid-tooltip { - display: block; -} - -.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label { - color: #28a745; -} - -.was-validated .form-check-input:valid ~ .valid-feedback, -.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback, -.form-check-input.is-valid ~ .valid-tooltip { - display: block; -} - -.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label { - color: #28a745; -} - -.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before { - border-color: #28a745; -} - -.was-validated .custom-control-input:valid ~ .valid-feedback, -.was-validated .custom-control-input:valid ~ .valid-tooltip, .custom-control-input.is-valid ~ .valid-feedback, -.custom-control-input.is-valid ~ .valid-tooltip { - display: block; -} - -.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before { - border-color: #34ce57; - background-color: #34ce57; -} - -.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before { - box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); -} - -.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before { - border-color: #28a745; -} - -.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label { - border-color: #28a745; -} - -.was-validated .custom-file-input:valid ~ .valid-feedback, -.was-validated .custom-file-input:valid ~ .valid-tooltip, .custom-file-input.is-valid ~ .valid-feedback, -.custom-file-input.is-valid ~ .valid-tooltip { - display: block; -} - -.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label { - border-color: #28a745; - box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); -} - -.invalid-feedback { - display: none; - width: 100%; - margin-top: 0.25rem; - font-size: 80%; - color: #dc3545; -} - -.invalid-tooltip { - position: absolute; - top: 100%; - z-index: 5; - display: none; - max-width: 100%; - padding: 0.25rem 0.5rem; - margin-top: .1rem; - font-size: 0.875rem; - line-height: 1.5; - color: #fff; - background-color: rgba(220, 53, 69, 0.9); - border-radius: 0.25rem; -} - -.was-validated .form-control:invalid, .form-control.is-invalid { - border-color: #dc3545; - padding-right: calc(1.5em + 0.75rem); - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E"); - background-repeat: no-repeat; - background-position: center right calc(0.375em + 0.1875rem); - background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); -} - -.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus { - border-color: #dc3545; - box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); -} - -.was-validated .form-control:invalid ~ .invalid-feedback, -.was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-feedback, -.form-control.is-invalid ~ .invalid-tooltip { - display: block; -} - -.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid { - padding-right: calc(1.5em + 0.75rem); - background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); -} - -.was-validated .custom-select:invalid, .custom-select.is-invalid { - border-color: #dc3545; - padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem); - background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); -} - -.was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus { - border-color: #dc3545; - box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); -} - -.was-validated .custom-select:invalid ~ .invalid-feedback, -.was-validated .custom-select:invalid ~ .invalid-tooltip, .custom-select.is-invalid ~ .invalid-feedback, -.custom-select.is-invalid ~ .invalid-tooltip { - display: block; -} - -.was-validated .form-control-file:invalid ~ .invalid-feedback, -.was-validated .form-control-file:invalid ~ .invalid-tooltip, .form-control-file.is-invalid ~ .invalid-feedback, -.form-control-file.is-invalid ~ .invalid-tooltip { - display: block; -} - -.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label { - color: #dc3545; -} - -.was-validated .form-check-input:invalid ~ .invalid-feedback, -.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback, -.form-check-input.is-invalid ~ .invalid-tooltip { - display: block; -} - -.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label { - color: #dc3545; -} - -.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before { - border-color: #dc3545; -} - -.was-validated .custom-control-input:invalid ~ .invalid-feedback, -.was-validated .custom-control-input:invalid ~ .invalid-tooltip, .custom-control-input.is-invalid ~ .invalid-feedback, -.custom-control-input.is-invalid ~ .invalid-tooltip { - display: block; -} - -.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before { - border-color: #e4606d; - background-color: #e4606d; -} - -.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before { - box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); -} - -.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before { - border-color: #dc3545; -} - -.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label { - border-color: #dc3545; -} - -.was-validated .custom-file-input:invalid ~ .invalid-feedback, -.was-validated .custom-file-input:invalid ~ .invalid-tooltip, .custom-file-input.is-invalid ~ .invalid-feedback, -.custom-file-input.is-invalid ~ .invalid-tooltip { - display: block; -} - -.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label { - border-color: #dc3545; - box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); -} - -.form-inline { - display: -ms-flexbox; - display: flex; - -ms-flex-flow: row wrap; - flex-flow: row wrap; - -ms-flex-align: center; - align-items: center; -} - -.form-inline .form-check { - width: 100%; -} - -@media (min-width: 576px) { - .form-inline label { - display: -ms-flexbox; - display: flex; - -ms-flex-align: center; - align-items: center; - -ms-flex-pack: center; - justify-content: center; - margin-bottom: 0; - } - .form-inline .form-group { - display: -ms-flexbox; - display: flex; - -ms-flex: 0 0 auto; - flex: 0 0 auto; - -ms-flex-flow: row wrap; - flex-flow: row wrap; - -ms-flex-align: center; - align-items: center; - margin-bottom: 0; - } - .form-inline .form-control { - display: inline-block; - width: auto; - vertical-align: middle; - } - .form-inline .form-control-plaintext { - display: inline-block; - } - .form-inline .input-group, - .form-inline .custom-select { - width: auto; - } - .form-inline .form-check { - display: -ms-flexbox; - display: flex; - -ms-flex-align: center; - align-items: center; - -ms-flex-pack: center; - justify-content: center; - width: auto; - padding-left: 0; - } - .form-inline .form-check-input { - position: relative; - -ms-flex-negative: 0; - flex-shrink: 0; - margin-top: 0; - margin-right: 0.25rem; - margin-left: 0; - } - .form-inline .custom-control { - -ms-flex-align: center; - align-items: center; - -ms-flex-pack: center; - justify-content: center; - } - .form-inline .custom-control-label { - margin-bottom: 0; - } -} - -.btn { - display: inline-block; - font-weight: 400; - color: #212529; - text-align: center; - vertical-align: middle; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - background-color: transparent; - border: 1px solid transparent; - padding: 0.375rem 0.75rem; - font-size: 1rem; - line-height: 1.5; - border-radius: 0.25rem; - transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; -} - -@media (prefers-reduced-motion: reduce) { - .btn { - transition: none; - } -} - -.btn:hover { - color: #212529; - text-decoration: none; -} - -.btn:focus, .btn.focus { - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); -} - -.btn.disabled, .btn:disabled { - opacity: 0.65; -} - -a.btn.disabled, -fieldset:disabled a.btn { - pointer-events: none; -} - -.btn-primary { - color: #fff; - background-color: #007bff; - border-color: #007bff; -} - -.btn-primary:hover { - color: #fff; - background-color: #0069d9; - border-color: #0062cc; -} - -.btn-primary:focus, .btn-primary.focus { - box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5); -} - -.btn-primary.disabled, .btn-primary:disabled { - color: #fff; - background-color: #007bff; - border-color: #007bff; -} - -.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active, -.show > .btn-primary.dropdown-toggle { - color: #fff; - background-color: #0062cc; - border-color: #005cbf; -} - -.btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus, -.show > .btn-primary.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5); -} - -.btn-secondary { - color: #fff; - background-color: #6c757d; - border-color: #6c757d; -} - -.btn-secondary:hover { - color: #fff; - background-color: #5a6268; - border-color: #545b62; -} - -.btn-secondary:focus, .btn-secondary.focus { - box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5); -} - -.btn-secondary.disabled, .btn-secondary:disabled { - color: #fff; - background-color: #6c757d; - border-color: #6c757d; -} - -.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active, -.show > .btn-secondary.dropdown-toggle { - color: #fff; - background-color: #545b62; - border-color: #4e555b; -} - -.btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus, -.show > .btn-secondary.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5); -} - -.btn-success { - color: #fff; - background-color: #28a745; - border-color: #28a745; -} - -.btn-success:hover { - color: #fff; - background-color: #218838; - border-color: #1e7e34; -} - -.btn-success:focus, .btn-success.focus { - box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5); -} - -.btn-success.disabled, .btn-success:disabled { - color: #fff; - background-color: #28a745; - border-color: #28a745; -} - -.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active, -.show > .btn-success.dropdown-toggle { - color: #fff; - background-color: #1e7e34; - border-color: #1c7430; -} - -.btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus, -.show > .btn-success.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5); -} - -.btn-info { - color: #fff; - background-color: #17a2b8; - border-color: #17a2b8; -} - -.btn-info:hover { - color: #fff; - background-color: #138496; - border-color: #117a8b; -} - -.btn-info:focus, .btn-info.focus { - box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5); -} - -.btn-info.disabled, .btn-info:disabled { - color: #fff; - background-color: #17a2b8; - border-color: #17a2b8; -} - -.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active, -.show > .btn-info.dropdown-toggle { - color: #fff; - background-color: #117a8b; - border-color: #10707f; -} - -.btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus, -.show > .btn-info.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5); -} - -.btn-warning { - color: #212529; - background-color: #ffc107; - border-color: #ffc107; -} - -.btn-warning:hover { - color: #212529; - background-color: #e0a800; - border-color: #d39e00; -} - -.btn-warning:focus, .btn-warning.focus { - box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5); -} - -.btn-warning.disabled, .btn-warning:disabled { - color: #212529; - background-color: #ffc107; - border-color: #ffc107; -} - -.btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active, -.show > .btn-warning.dropdown-toggle { - color: #212529; - background-color: #d39e00; - border-color: #c69500; -} - -.btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus, -.show > .btn-warning.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5); -} - -.btn-danger { - color: #fff; - background-color: #dc3545; - border-color: #dc3545; -} - -.btn-danger:hover { - color: #fff; - background-color: #c82333; - border-color: #bd2130; -} - -.btn-danger:focus, .btn-danger.focus { - box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5); -} - -.btn-danger.disabled, .btn-danger:disabled { - color: #fff; - background-color: #dc3545; - border-color: #dc3545; -} - -.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active, -.show > .btn-danger.dropdown-toggle { - color: #fff; - background-color: #bd2130; - border-color: #b21f2d; -} - -.btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus, -.show > .btn-danger.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5); -} - -.btn-light { - color: #212529; - background-color: #f8f9fa; - border-color: #f8f9fa; -} - -.btn-light:hover { - color: #212529; - background-color: #e2e6ea; - border-color: #dae0e5; -} - -.btn-light:focus, .btn-light.focus { - box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5); -} - -.btn-light.disabled, .btn-light:disabled { - color: #212529; - background-color: #f8f9fa; - border-color: #f8f9fa; -} - -.btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active, -.show > .btn-light.dropdown-toggle { - color: #212529; - background-color: #dae0e5; - border-color: #d3d9df; -} - -.btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus, -.show > .btn-light.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5); -} - -.btn-dark { - color: #fff; - background-color: #343a40; - border-color: #343a40; -} - -.btn-dark:hover { - color: #fff; - background-color: #23272b; - border-color: #1d2124; -} - -.btn-dark:focus, .btn-dark.focus { - box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5); -} - -.btn-dark.disabled, .btn-dark:disabled { - color: #fff; - background-color: #343a40; - border-color: #343a40; -} - -.btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active, -.show > .btn-dark.dropdown-toggle { - color: #fff; - background-color: #1d2124; - border-color: #171a1d; -} - -.btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus, -.show > .btn-dark.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5); -} - -.btn-outline-primary { - color: #007bff; - border-color: #007bff; -} - -.btn-outline-primary:hover { - color: #fff; - background-color: #007bff; - border-color: #007bff; -} - -.btn-outline-primary:focus, .btn-outline-primary.focus { - box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); -} - -.btn-outline-primary.disabled, .btn-outline-primary:disabled { - color: #007bff; - background-color: transparent; -} - -.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active, -.show > .btn-outline-primary.dropdown-toggle { - color: #fff; - background-color: #007bff; - border-color: #007bff; -} - -.btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus, -.show > .btn-outline-primary.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); -} - -.btn-outline-secondary { - color: #6c757d; - border-color: #6c757d; -} - -.btn-outline-secondary:hover { - color: #fff; - background-color: #6c757d; - border-color: #6c757d; -} - -.btn-outline-secondary:focus, .btn-outline-secondary.focus { - box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); -} - -.btn-outline-secondary.disabled, .btn-outline-secondary:disabled { - color: #6c757d; - background-color: transparent; -} - -.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active, -.show > .btn-outline-secondary.dropdown-toggle { - color: #fff; - background-color: #6c757d; - border-color: #6c757d; -} - -.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus, -.show > .btn-outline-secondary.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); -} - -.btn-outline-success { - color: #28a745; - border-color: #28a745; -} - -.btn-outline-success:hover { - color: #fff; - background-color: #28a745; - border-color: #28a745; -} - -.btn-outline-success:focus, .btn-outline-success.focus { - box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); -} - -.btn-outline-success.disabled, .btn-outline-success:disabled { - color: #28a745; - background-color: transparent; -} - -.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active, -.show > .btn-outline-success.dropdown-toggle { - color: #fff; - background-color: #28a745; - border-color: #28a745; -} - -.btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus, -.show > .btn-outline-success.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); -} - -.btn-outline-info { - color: #17a2b8; - border-color: #17a2b8; -} - -.btn-outline-info:hover { - color: #fff; - background-color: #17a2b8; - border-color: #17a2b8; -} - -.btn-outline-info:focus, .btn-outline-info.focus { - box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); -} - -.btn-outline-info.disabled, .btn-outline-info:disabled { - color: #17a2b8; - background-color: transparent; -} - -.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active, -.show > .btn-outline-info.dropdown-toggle { - color: #fff; - background-color: #17a2b8; - border-color: #17a2b8; -} - -.btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus, -.show > .btn-outline-info.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); -} - -.btn-outline-warning { - color: #ffc107; - border-color: #ffc107; -} - -.btn-outline-warning:hover { - color: #212529; - background-color: #ffc107; - border-color: #ffc107; -} - -.btn-outline-warning:focus, .btn-outline-warning.focus { - box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); -} - -.btn-outline-warning.disabled, .btn-outline-warning:disabled { - color: #ffc107; - background-color: transparent; -} - -.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active, -.show > .btn-outline-warning.dropdown-toggle { - color: #212529; - background-color: #ffc107; - border-color: #ffc107; -} - -.btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus, -.show > .btn-outline-warning.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); -} - -.btn-outline-danger { - color: #dc3545; - border-color: #dc3545; -} - -.btn-outline-danger:hover { - color: #fff; - background-color: #dc3545; - border-color: #dc3545; -} - -.btn-outline-danger:focus, .btn-outline-danger.focus { - box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); -} - -.btn-outline-danger.disabled, .btn-outline-danger:disabled { - color: #dc3545; - background-color: transparent; -} - -.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active, -.show > .btn-outline-danger.dropdown-toggle { - color: #fff; - background-color: #dc3545; - border-color: #dc3545; -} - -.btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus, -.show > .btn-outline-danger.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); -} - -.btn-outline-light { - color: #f8f9fa; - border-color: #f8f9fa; -} - -.btn-outline-light:hover { - color: #212529; - background-color: #f8f9fa; - border-color: #f8f9fa; -} - -.btn-outline-light:focus, .btn-outline-light.focus { - box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); -} - -.btn-outline-light.disabled, .btn-outline-light:disabled { - color: #f8f9fa; - background-color: transparent; -} - -.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active, -.show > .btn-outline-light.dropdown-toggle { - color: #212529; - background-color: #f8f9fa; - border-color: #f8f9fa; -} - -.btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus, -.show > .btn-outline-light.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); -} - -.btn-outline-dark { - color: #343a40; - border-color: #343a40; -} - -.btn-outline-dark:hover { - color: #fff; - background-color: #343a40; - border-color: #343a40; -} - -.btn-outline-dark:focus, .btn-outline-dark.focus { - box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); -} - -.btn-outline-dark.disabled, .btn-outline-dark:disabled { - color: #343a40; - background-color: transparent; -} - -.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active, -.show > .btn-outline-dark.dropdown-toggle { - color: #fff; - background-color: #343a40; - border-color: #343a40; -} - -.btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus, -.show > .btn-outline-dark.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); -} - -.btn-link { - font-weight: 400; - color: #007bff; - text-decoration: none; -} - -.btn-link:hover { - color: #0056b3; - text-decoration: underline; -} - -.btn-link:focus, .btn-link.focus { - text-decoration: underline; - box-shadow: none; -} - -.btn-link:disabled, .btn-link.disabled { - color: #6c757d; - pointer-events: none; -} - -.btn-lg, .btn-group-lg > .btn { - padding: 0.5rem 1rem; - font-size: 1.25rem; - line-height: 1.5; - border-radius: 0.3rem; -} - -.btn-sm, .btn-group-sm > .btn { - padding: 0.25rem 0.5rem; - font-size: 0.875rem; - line-height: 1.5; - border-radius: 0.2rem; -} - -.btn-block { - display: block; - width: 100%; -} - -.btn-block + .btn-block { - margin-top: 0.5rem; -} - -input[type="submit"].btn-block, -input[type="reset"].btn-block, -input[type="button"].btn-block { - width: 100%; -} - -.fade { - transition: opacity 0.15s linear; -} - -@media (prefers-reduced-motion: reduce) { - .fade { - transition: none; - } -} - -.fade:not(.show) { - opacity: 0; -} - -.collapse:not(.show) { - display: none; -} - -.collapsing { - position: relative; - height: 0; - overflow: hidden; - transition: height 0.35s ease; -} - -@media (prefers-reduced-motion: reduce) { - .collapsing { - transition: none; - } -} - -.dropup, -.dropright, -.dropdown, -.dropleft { - position: relative; -} - -.dropdown-toggle { - white-space: nowrap; -} - -.dropdown-toggle::after { - display: inline-block; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ""; - border-top: 0.3em solid; - border-right: 0.3em solid transparent; - border-bottom: 0; - border-left: 0.3em solid transparent; -} - -.dropdown-toggle:empty::after { - margin-left: 0; -} - -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 10rem; - padding: 0.5rem 0; - margin: 0.125rem 0 0; - font-size: 1rem; - color: #212529; - text-align: left; - list-style: none; - background-color: #fff; - background-clip: padding-box; - border: 1px solid rgba(0, 0, 0, 0.15); - border-radius: 0.25rem; -} - -.dropdown-menu-left { - right: auto; - left: 0; -} - -.dropdown-menu-right { - right: 0; - left: auto; -} - -@media (min-width: 576px) { - .dropdown-menu-sm-left { - right: auto; - left: 0; - } - .dropdown-menu-sm-right { - right: 0; - left: auto; - } -} - -@media (min-width: 768px) { - .dropdown-menu-md-left { - right: auto; - left: 0; - } - .dropdown-menu-md-right { - right: 0; - left: auto; - } -} - -@media (min-width: 992px) { - .dropdown-menu-lg-left { - right: auto; - left: 0; - } - .dropdown-menu-lg-right { - right: 0; - left: auto; - } -} - -@media (min-width: 1200px) { - .dropdown-menu-xl-left { - right: auto; - left: 0; - } - .dropdown-menu-xl-right { - right: 0; - left: auto; - } -} - -.dropup .dropdown-menu { - top: auto; - bottom: 100%; - margin-top: 0; - margin-bottom: 0.125rem; -} - -.dropup .dropdown-toggle::after { - display: inline-block; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ""; - border-top: 0; - border-right: 0.3em solid transparent; - border-bottom: 0.3em solid; - border-left: 0.3em solid transparent; -} - -.dropup .dropdown-toggle:empty::after { - margin-left: 0; -} - -.dropright .dropdown-menu { - top: 0; - right: auto; - left: 100%; - margin-top: 0; - margin-left: 0.125rem; -} - -.dropright .dropdown-toggle::after { - display: inline-block; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ""; - border-top: 0.3em solid transparent; - border-right: 0; - border-bottom: 0.3em solid transparent; - border-left: 0.3em solid; -} - -.dropright .dropdown-toggle:empty::after { - margin-left: 0; -} - -.dropright .dropdown-toggle::after { - vertical-align: 0; -} - -.dropleft .dropdown-menu { - top: 0; - right: 100%; - left: auto; - margin-top: 0; - margin-right: 0.125rem; -} - -.dropleft .dropdown-toggle::after { - display: inline-block; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ""; -} - -.dropleft .dropdown-toggle::after { - display: none; -} - -.dropleft .dropdown-toggle::before { - display: inline-block; - margin-right: 0.255em; - vertical-align: 0.255em; - content: ""; - border-top: 0.3em solid transparent; - border-right: 0.3em solid; - border-bottom: 0.3em solid transparent; -} - -.dropleft .dropdown-toggle:empty::after { - margin-left: 0; -} - -.dropleft .dropdown-toggle::before { - vertical-align: 0; -} - -.dropdown-menu[x-placement^="top"], .dropdown-menu[x-placement^="right"], .dropdown-menu[x-placement^="bottom"], .dropdown-menu[x-placement^="left"] { - right: auto; - bottom: auto; -} - -.dropdown-divider { - height: 0; - margin: 0.5rem 0; - overflow: hidden; - border-top: 1px solid #e9ecef; -} - -.dropdown-item { - display: block; - width: 100%; - padding: 0.25rem 1.5rem; - clear: both; - font-weight: 400; - color: #212529; - text-align: inherit; - white-space: nowrap; - background-color: transparent; - border: 0; -} - -.dropdown-item:hover, .dropdown-item:focus { - color: #16181b; - text-decoration: none; - background-color: #f8f9fa; -} - -.dropdown-item.active, .dropdown-item:active { - color: #fff; - text-decoration: none; - background-color: #007bff; -} - -.dropdown-item.disabled, .dropdown-item:disabled { - color: #6c757d; - pointer-events: none; - background-color: transparent; -} - -.dropdown-menu.show { - display: block; -} - -.dropdown-header { - display: block; - padding: 0.5rem 1.5rem; - margin-bottom: 0; - font-size: 0.875rem; - color: #6c757d; - white-space: nowrap; -} - -.dropdown-item-text { - display: block; - padding: 0.25rem 1.5rem; - color: #212529; -} - -.btn-group, -.btn-group-vertical { - position: relative; - display: -ms-inline-flexbox; - display: inline-flex; - vertical-align: middle; -} - -.btn-group > .btn, -.btn-group-vertical > .btn { - position: relative; - -ms-flex: 1 1 auto; - flex: 1 1 auto; -} - -.btn-group > .btn:hover, -.btn-group-vertical > .btn:hover { - z-index: 1; -} - -.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active, -.btn-group-vertical > .btn:focus, -.btn-group-vertical > .btn:active, -.btn-group-vertical > .btn.active { - z-index: 1; -} - -.btn-toolbar { - display: -ms-flexbox; - display: flex; - -ms-flex-wrap: wrap; - flex-wrap: wrap; - -ms-flex-pack: start; - justify-content: flex-start; -} - -.btn-toolbar .input-group { - width: auto; -} - -.btn-group > .btn:not(:first-child), -.btn-group > .btn-group:not(:first-child) { - margin-left: -1px; -} - -.btn-group > .btn:not(:last-child):not(.dropdown-toggle), -.btn-group > .btn-group:not(:last-child) > .btn { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} - -.btn-group > .btn:not(:first-child), -.btn-group > .btn-group:not(:first-child) > .btn { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} - -.dropdown-toggle-split { - padding-right: 0.5625rem; - padding-left: 0.5625rem; -} - -.dropdown-toggle-split::after, -.dropup .dropdown-toggle-split::after, -.dropright .dropdown-toggle-split::after { - margin-left: 0; -} - -.dropleft .dropdown-toggle-split::before { - margin-right: 0; -} - -.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split { - padding-right: 0.375rem; - padding-left: 0.375rem; -} - -.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split { - padding-right: 0.75rem; - padding-left: 0.75rem; -} - -.btn-group-vertical { - -ms-flex-direction: column; - flex-direction: column; - -ms-flex-align: start; - align-items: flex-start; - -ms-flex-pack: center; - justify-content: center; -} - -.btn-group-vertical > .btn, -.btn-group-vertical > .btn-group { - width: 100%; -} - -.btn-group-vertical > .btn:not(:first-child), -.btn-group-vertical > .btn-group:not(:first-child) { - margin-top: -1px; -} - -.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle), -.btn-group-vertical > .btn-group:not(:last-child) > .btn { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} - -.btn-group-vertical > .btn:not(:first-child), -.btn-group-vertical > .btn-group:not(:first-child) > .btn { - border-top-left-radius: 0; - border-top-right-radius: 0; -} - -.btn-group-toggle > .btn, -.btn-group-toggle > .btn-group > .btn { - margin-bottom: 0; -} - -.btn-group-toggle > .btn input[type="radio"], -.btn-group-toggle > .btn input[type="checkbox"], -.btn-group-toggle > .btn-group > .btn input[type="radio"], -.btn-group-toggle > .btn-group > .btn input[type="checkbox"] { - position: absolute; - clip: rect(0, 0, 0, 0); - pointer-events: none; -} - -.input-group { - position: relative; - display: -ms-flexbox; - display: flex; - -ms-flex-wrap: wrap; - flex-wrap: wrap; - -ms-flex-align: stretch; - align-items: stretch; - width: 100%; -} - -.input-group > .form-control, -.input-group > .form-control-plaintext, -.input-group > .custom-select, -.input-group > .custom-file { - position: relative; - -ms-flex: 1 1 auto; - flex: 1 1 auto; - width: 1%; - margin-bottom: 0; -} - -.input-group > .form-control + .form-control, -.input-group > .form-control + .custom-select, -.input-group > .form-control + .custom-file, -.input-group > .form-control-plaintext + .form-control, -.input-group > .form-control-plaintext + .custom-select, -.input-group > .form-control-plaintext + .custom-file, -.input-group > .custom-select + .form-control, -.input-group > .custom-select + .custom-select, -.input-group > .custom-select + .custom-file, -.input-group > .custom-file + .form-control, -.input-group > .custom-file + .custom-select, -.input-group > .custom-file + .custom-file { - margin-left: -1px; -} - -.input-group > .form-control:focus, -.input-group > .custom-select:focus, -.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label { - z-index: 3; -} - -.input-group > .custom-file .custom-file-input:focus { - z-index: 4; -} - -.input-group > .form-control:not(:last-child), -.input-group > .custom-select:not(:last-child) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} - -.input-group > .form-control:not(:first-child), -.input-group > .custom-select:not(:first-child) { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} - -.input-group > .custom-file { - display: -ms-flexbox; - display: flex; - -ms-flex-align: center; - align-items: center; -} - -.input-group > .custom-file:not(:last-child) .custom-file-label, -.input-group > .custom-file:not(:last-child) .custom-file-label::after { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} - -.input-group > .custom-file:not(:first-child) .custom-file-label { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} - -.input-group-prepend, -.input-group-append { - display: -ms-flexbox; - display: flex; -} - -.input-group-prepend .btn, -.input-group-append .btn { - position: relative; - z-index: 2; -} - -.input-group-prepend .btn:focus, -.input-group-append .btn:focus { - z-index: 3; -} - -.input-group-prepend .btn + .btn, -.input-group-prepend .btn + .input-group-text, -.input-group-prepend .input-group-text + .input-group-text, -.input-group-prepend .input-group-text + .btn, -.input-group-append .btn + .btn, -.input-group-append .btn + .input-group-text, -.input-group-append .input-group-text + .input-group-text, -.input-group-append .input-group-text + .btn { - margin-left: -1px; -} - -.input-group-prepend { - margin-right: -1px; -} - -.input-group-append { - margin-left: -1px; -} - -.input-group-text { - display: -ms-flexbox; - display: flex; - -ms-flex-align: center; - align-items: center; - padding: 0.375rem 0.75rem; - margin-bottom: 0; - font-size: 1rem; - font-weight: 400; - line-height: 1.5; - color: #495057; - text-align: center; - white-space: nowrap; - background-color: #e9ecef; - border: 1px solid #ced4da; - border-radius: 0.25rem; -} - -.input-group-text input[type="radio"], -.input-group-text input[type="checkbox"] { - margin-top: 0; -} - -.input-group-lg > .form-control:not(textarea), -.input-group-lg > .custom-select { - height: calc(1.5em + 1rem + 2px); -} - -.input-group-lg > .form-control, -.input-group-lg > .custom-select, -.input-group-lg > .input-group-prepend > .input-group-text, -.input-group-lg > .input-group-append > .input-group-text, -.input-group-lg > .input-group-prepend > .btn, -.input-group-lg > .input-group-append > .btn { - padding: 0.5rem 1rem; - font-size: 1.25rem; - line-height: 1.5; - border-radius: 0.3rem; -} - -.input-group-sm > .form-control:not(textarea), -.input-group-sm > .custom-select { - height: calc(1.5em + 0.5rem + 2px); -} - -.input-group-sm > .form-control, -.input-group-sm > .custom-select, -.input-group-sm > .input-group-prepend > .input-group-text, -.input-group-sm > .input-group-append > .input-group-text, -.input-group-sm > .input-group-prepend > .btn, -.input-group-sm > .input-group-append > .btn { - padding: 0.25rem 0.5rem; - font-size: 0.875rem; - line-height: 1.5; - border-radius: 0.2rem; -} - -.input-group-lg > .custom-select, -.input-group-sm > .custom-select { - padding-right: 1.75rem; -} - -.input-group > .input-group-prepend > .btn, -.input-group > .input-group-prepend > .input-group-text, -.input-group > .input-group-append:not(:last-child) > .btn, -.input-group > .input-group-append:not(:last-child) > .input-group-text, -.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle), -.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} - -.input-group > .input-group-append > .btn, -.input-group > .input-group-append > .input-group-text, -.input-group > .input-group-prepend:not(:first-child) > .btn, -.input-group > .input-group-prepend:not(:first-child) > .input-group-text, -.input-group > .input-group-prepend:first-child > .btn:not(:first-child), -.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} - -.custom-control { - position: relative; - display: block; - min-height: 1.5rem; - padding-left: 1.5rem; -} - -.custom-control-inline { - display: -ms-inline-flexbox; - display: inline-flex; - margin-right: 1rem; -} - -.custom-control-input { - position: absolute; - z-index: -1; - opacity: 0; -} - -.custom-control-input:checked ~ .custom-control-label::before { - color: #fff; - border-color: #007bff; - background-color: #007bff; -} - -.custom-control-input:focus ~ .custom-control-label::before { - box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); -} - -.custom-control-input:focus:not(:checked) ~ .custom-control-label::before { - border-color: #80bdff; -} - -.custom-control-input:not(:disabled):active ~ .custom-control-label::before { - color: #fff; - background-color: #b3d7ff; - border-color: #b3d7ff; -} - -.custom-control-input:disabled ~ .custom-control-label { - color: #6c757d; -} - -.custom-control-input:disabled ~ .custom-control-label::before { - background-color: #e9ecef; -} - -.custom-control-label { - position: relative; - margin-bottom: 0; - vertical-align: top; -} - -.custom-control-label::before { - position: absolute; - top: 0.25rem; - left: -1.5rem; - display: block; - width: 1rem; - height: 1rem; - pointer-events: none; - content: ""; - background-color: #fff; - border: #adb5bd solid 1px; -} - -.custom-control-label::after { - position: absolute; - top: 0.25rem; - left: -1.5rem; - display: block; - width: 1rem; - height: 1rem; - content: ""; - background: no-repeat 50% / 50% 50%; -} - -.custom-checkbox .custom-control-label::before { - border-radius: 0.25rem; -} - -.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e"); -} - -.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before { - border-color: #007bff; - background-color: #007bff; -} - -.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e"); -} - -.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before { - background-color: rgba(0, 123, 255, 0.5); -} - -.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before { - background-color: rgba(0, 123, 255, 0.5); -} - -.custom-radio .custom-control-label::before { - border-radius: 50%; -} - -.custom-radio .custom-control-input:checked ~ .custom-control-label::after { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e"); -} - -.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before { - background-color: rgba(0, 123, 255, 0.5); -} - -.custom-switch { - padding-left: 2.25rem; -} - -.custom-switch .custom-control-label::before { - left: -2.25rem; - width: 1.75rem; - pointer-events: all; - border-radius: 0.5rem; -} - -.custom-switch .custom-control-label::after { - top: calc(0.25rem + 2px); - left: calc(-2.25rem + 2px); - width: calc(1rem - 4px); - height: calc(1rem - 4px); - background-color: #adb5bd; - border-radius: 0.5rem; - transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out; - transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; - transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out; -} - -@media (prefers-reduced-motion: reduce) { - .custom-switch .custom-control-label::after { - transition: none; - } -} - -.custom-switch .custom-control-input:checked ~ .custom-control-label::after { - background-color: #fff; - -webkit-transform: translateX(0.75rem); - transform: translateX(0.75rem); -} - -.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before { - background-color: rgba(0, 123, 255, 0.5); -} - -.custom-select { - display: inline-block; - width: 100%; - height: calc(1.5em + 0.75rem + 2px); - padding: 0.375rem 1.75rem 0.375rem 0.75rem; - font-size: 1rem; - font-weight: 400; - line-height: 1.5; - color: #495057; - vertical-align: middle; - background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px; - background-color: #fff; - border: 1px solid #ced4da; - border-radius: 0.25rem; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; -} - -.custom-select:focus { - border-color: #80bdff; - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); -} - -.custom-select:focus::-ms-value { - color: #495057; - background-color: #fff; -} - -.custom-select[multiple], .custom-select[size]:not([size="1"]) { - height: auto; - padding-right: 0.75rem; - background-image: none; -} - -.custom-select:disabled { - color: #6c757d; - background-color: #e9ecef; -} - -.custom-select::-ms-expand { - display: none; -} - -.custom-select-sm { - height: calc(1.5em + 0.5rem + 2px); - padding-top: 0.25rem; - padding-bottom: 0.25rem; - padding-left: 0.5rem; - font-size: 0.875rem; -} - -.custom-select-lg { - height: calc(1.5em + 1rem + 2px); - padding-top: 0.5rem; - padding-bottom: 0.5rem; - padding-left: 1rem; - font-size: 1.25rem; -} - -.custom-file { - position: relative; - display: inline-block; - width: 100%; - height: calc(1.5em + 0.75rem + 2px); - margin-bottom: 0; -} - -.custom-file-input { - position: relative; - z-index: 2; - width: 100%; - height: calc(1.5em + 0.75rem + 2px); - margin: 0; - opacity: 0; -} - -.custom-file-input:focus ~ .custom-file-label { - border-color: #80bdff; - box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); -} - -.custom-file-input:disabled ~ .custom-file-label { - background-color: #e9ecef; -} - -.custom-file-input:lang(en) ~ .custom-file-label::after { - content: "Browse"; -} - -.custom-file-input ~ .custom-file-label[data-browse]::after { - content: attr(data-browse); -} - -.custom-file-label { - position: absolute; - top: 0; - right: 0; - left: 0; - z-index: 1; - height: calc(1.5em + 0.75rem + 2px); - padding: 0.375rem 0.75rem; - font-weight: 400; - line-height: 1.5; - color: #495057; - background-color: #fff; - border: 1px solid #ced4da; - border-radius: 0.25rem; -} - -.custom-file-label::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - z-index: 3; - display: block; - height: calc(1.5em + 0.75rem); - padding: 0.375rem 0.75rem; - line-height: 1.5; - color: #495057; - content: "Browse"; - background-color: #e9ecef; - border-left: inherit; - border-radius: 0 0.25rem 0.25rem 0; -} - -.custom-range { - width: 100%; - height: calc(1rem + 0.4rem); - padding: 0; - background-color: transparent; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; -} - -.custom-range:focus { - outline: none; -} - -.custom-range:focus::-webkit-slider-thumb { - box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25); -} - -.custom-range:focus::-moz-range-thumb { - box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25); -} - -.custom-range:focus::-ms-thumb { - box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25); -} - -.custom-range::-moz-focus-outer { - border: 0; -} - -.custom-range::-webkit-slider-thumb { - width: 1rem; - height: 1rem; - margin-top: -0.25rem; - background-color: #007bff; - border: 0; - border-radius: 1rem; - transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; - -webkit-appearance: none; - appearance: none; -} - -@media (prefers-reduced-motion: reduce) { - .custom-range::-webkit-slider-thumb { - transition: none; - } -} - -.custom-range::-webkit-slider-thumb:active { - background-color: #b3d7ff; -} - -.custom-range::-webkit-slider-runnable-track { - width: 100%; - height: 0.5rem; - color: transparent; - cursor: pointer; - background-color: #dee2e6; - border-color: transparent; - border-radius: 1rem; -} - -.custom-range::-moz-range-thumb { - width: 1rem; - height: 1rem; - background-color: #007bff; - border: 0; - border-radius: 1rem; - transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; - -moz-appearance: none; - appearance: none; -} - -@media (prefers-reduced-motion: reduce) { - .custom-range::-moz-range-thumb { - transition: none; - } -} - -.custom-range::-moz-range-thumb:active { - background-color: #b3d7ff; -} - -.custom-range::-moz-range-track { - width: 100%; - height: 0.5rem; - color: transparent; - cursor: pointer; - background-color: #dee2e6; - border-color: transparent; - border-radius: 1rem; -} - -.custom-range::-ms-thumb { - width: 1rem; - height: 1rem; - margin-top: 0; - margin-right: 0.2rem; - margin-left: 0.2rem; - background-color: #007bff; - border: 0; - border-radius: 1rem; - transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; - appearance: none; -} - -@media (prefers-reduced-motion: reduce) { - .custom-range::-ms-thumb { - transition: none; - } -} - -.custom-range::-ms-thumb:active { - background-color: #b3d7ff; -} - -.custom-range::-ms-track { - width: 100%; - height: 0.5rem; - color: transparent; - cursor: pointer; - background-color: transparent; - border-color: transparent; - border-width: 0.5rem; -} - -.custom-range::-ms-fill-lower { - background-color: #dee2e6; - border-radius: 1rem; -} - -.custom-range::-ms-fill-upper { - margin-right: 15px; - background-color: #dee2e6; - border-radius: 1rem; -} - -.custom-range:disabled::-webkit-slider-thumb { - background-color: #adb5bd; -} - -.custom-range:disabled::-webkit-slider-runnable-track { - cursor: default; -} - -.custom-range:disabled::-moz-range-thumb { - background-color: #adb5bd; -} - -.custom-range:disabled::-moz-range-track { - cursor: default; -} - -.custom-range:disabled::-ms-thumb { - background-color: #adb5bd; -} - -.custom-control-label::before, -.custom-file-label, -.custom-select { - transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; -} - -@media (prefers-reduced-motion: reduce) { - .custom-control-label::before, - .custom-file-label, - .custom-select { - transition: none; - } -} - -.nav { - display: -ms-flexbox; - display: flex; - -ms-flex-wrap: wrap; - flex-wrap: wrap; - padding-left: 0; - margin-bottom: 0; - list-style: none; -} - -.nav-link { - display: block; - padding: 0.5rem 1rem; -} - -.nav-link:hover, .nav-link:focus { - text-decoration: none; -} - -.nav-link.disabled { - color: #6c757d; - pointer-events: none; - cursor: default; -} - -.nav-tabs { - border-bottom: 1px solid #dee2e6; -} - -.nav-tabs .nav-item { - margin-bottom: -1px; -} - -.nav-tabs .nav-link { - border: 1px solid transparent; - border-top-left-radius: 0.25rem; - border-top-right-radius: 0.25rem; -} - -.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus { - border-color: #e9ecef #e9ecef #dee2e6; -} - -.nav-tabs .nav-link.disabled { - color: #6c757d; - background-color: transparent; - border-color: transparent; -} - -.nav-tabs .nav-link.active, -.nav-tabs .nav-item.show .nav-link { - color: #495057; - background-color: #fff; - border-color: #dee2e6 #dee2e6 #fff; -} - -.nav-tabs .dropdown-menu { - margin-top: -1px; - border-top-left-radius: 0; - border-top-right-radius: 0; -} - -.nav-pills .nav-link { - border-radius: 0.25rem; -} - -.nav-pills .nav-link.active, -.nav-pills .show > .nav-link { - color: #fff; - background-color: #007bff; -} - -.nav-fill .nav-item { - -ms-flex: 1 1 auto; - flex: 1 1 auto; - text-align: center; -} - -.nav-justified .nav-item { - -ms-flex-preferred-size: 0; - flex-basis: 0; - -ms-flex-positive: 1; - flex-grow: 1; - text-align: center; -} - -.tab-content > .tab-pane { - display: none; -} - -.tab-content > .active { - display: block; -} - -.navbar { - position: relative; - display: -ms-flexbox; - display: flex; - -ms-flex-wrap: wrap; - flex-wrap: wrap; - -ms-flex-align: center; - align-items: center; - -ms-flex-pack: justify; - justify-content: space-between; - padding: 0.5rem 1rem; -} - -.navbar > .container, -.navbar > .container-fluid { - display: -ms-flexbox; - display: flex; - -ms-flex-wrap: wrap; - flex-wrap: wrap; - -ms-flex-align: center; - align-items: center; - -ms-flex-pack: justify; - justify-content: space-between; -} - -.navbar-brand { - display: inline-block; - padding-top: 0.3125rem; - padding-bottom: 0.3125rem; - margin-right: 1rem; - font-size: 1.25rem; - line-height: inherit; - white-space: nowrap; -} - -.navbar-brand:hover, .navbar-brand:focus { - text-decoration: none; -} - -.navbar-nav { - display: -ms-flexbox; - display: flex; - -ms-flex-direction: column; - flex-direction: column; - padding-left: 0; - margin-bottom: 0; - list-style: none; -} - -.navbar-nav .nav-link { - padding-right: 0; - padding-left: 0; -} - -.navbar-nav .dropdown-menu { - position: static; - float: none; -} - -.navbar-text { - display: inline-block; - padding-top: 0.5rem; - padding-bottom: 0.5rem; -} - -.navbar-collapse { - -ms-flex-preferred-size: 100%; - flex-basis: 100%; - -ms-flex-positive: 1; - flex-grow: 1; - -ms-flex-align: center; - align-items: center; -} - -.navbar-toggler { - padding: 0.25rem 0.75rem; - font-size: 1.25rem; - line-height: 1; - background-color: transparent; - border: 1px solid transparent; - border-radius: 0.25rem; -} - -.navbar-toggler:hover, .navbar-toggler:focus { - text-decoration: none; -} - -.navbar-toggler-icon { - display: inline-block; - width: 1.5em; - height: 1.5em; - vertical-align: middle; - content: ""; - background: no-repeat center center; - background-size: 100% 100%; -} - -@media (max-width: 575.98px) { - .navbar-expand-sm > .container, - .navbar-expand-sm > .container-fluid { - padding-right: 0; - padding-left: 0; - } -} - -@media (min-width: 576px) { - .navbar-expand-sm { - -ms-flex-flow: row nowrap; - flex-flow: row nowrap; - -ms-flex-pack: start; - justify-content: flex-start; - } - .navbar-expand-sm .navbar-nav { - -ms-flex-direction: row; - flex-direction: row; - } - .navbar-expand-sm .navbar-nav .dropdown-menu { - position: absolute; - } - .navbar-expand-sm .navbar-nav .nav-link { - padding-right: 0.5rem; - padding-left: 0.5rem; - } - .navbar-expand-sm > .container, - .navbar-expand-sm > .container-fluid { - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - } - .navbar-expand-sm .navbar-collapse { - display: -ms-flexbox !important; - display: flex !important; - -ms-flex-preferred-size: auto; - flex-basis: auto; - } - .navbar-expand-sm .navbar-toggler { - display: none; - } -} - -@media (max-width: 767.98px) { - .navbar-expand-md > .container, - .navbar-expand-md > .container-fluid { - padding-right: 0; - padding-left: 0; - } -} - -@media (min-width: 768px) { - .navbar-expand-md { - -ms-flex-flow: row nowrap; - flex-flow: row nowrap; - -ms-flex-pack: start; - justify-content: flex-start; - } - .navbar-expand-md .navbar-nav { - -ms-flex-direction: row; - flex-direction: row; - } - .navbar-expand-md .navbar-nav .dropdown-menu { - position: absolute; - } - .navbar-expand-md .navbar-nav .nav-link { - padding-right: 0.5rem; - padding-left: 0.5rem; - } - .navbar-expand-md > .container, - .navbar-expand-md > .container-fluid { - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - } - .navbar-expand-md .navbar-collapse { - display: -ms-flexbox !important; - display: flex !important; - -ms-flex-preferred-size: auto; - flex-basis: auto; - } - .navbar-expand-md .navbar-toggler { - display: none; - } -} - -@media (max-width: 991.98px) { - .navbar-expand-lg > .container, - .navbar-expand-lg > .container-fluid { - padding-right: 0; - padding-left: 0; - } -} - -@media (min-width: 992px) { - .navbar-expand-lg { - -ms-flex-flow: row nowrap; - flex-flow: row nowrap; - -ms-flex-pack: start; - justify-content: flex-start; - } - .navbar-expand-lg .navbar-nav { - -ms-flex-direction: row; - flex-direction: row; - } - .navbar-expand-lg .navbar-nav .dropdown-menu { - position: absolute; - } - .navbar-expand-lg .navbar-nav .nav-link { - padding-right: 0.5rem; - padding-left: 0.5rem; - } - .navbar-expand-lg > .container, - .navbar-expand-lg > .container-fluid { - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - } - .navbar-expand-lg .navbar-collapse { - display: -ms-flexbox !important; - display: flex !important; - -ms-flex-preferred-size: auto; - flex-basis: auto; - } - .navbar-expand-lg .navbar-toggler { - display: none; - } -} - -@media (max-width: 1199.98px) { - .navbar-expand-xl > .container, - .navbar-expand-xl > .container-fluid { - padding-right: 0; - padding-left: 0; - } -} - -@media (min-width: 1200px) { - .navbar-expand-xl { - -ms-flex-flow: row nowrap; - flex-flow: row nowrap; - -ms-flex-pack: start; - justify-content: flex-start; - } - .navbar-expand-xl .navbar-nav { - -ms-flex-direction: row; - flex-direction: row; - } - .navbar-expand-xl .navbar-nav .dropdown-menu { - position: absolute; - } - .navbar-expand-xl .navbar-nav .nav-link { - padding-right: 0.5rem; - padding-left: 0.5rem; - } - .navbar-expand-xl > .container, - .navbar-expand-xl > .container-fluid { - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - } - .navbar-expand-xl .navbar-collapse { - display: -ms-flexbox !important; - display: flex !important; - -ms-flex-preferred-size: auto; - flex-basis: auto; - } - .navbar-expand-xl .navbar-toggler { - display: none; - } -} - -.navbar-expand { - -ms-flex-flow: row nowrap; - flex-flow: row nowrap; - -ms-flex-pack: start; - justify-content: flex-start; -} - -.navbar-expand > .container, -.navbar-expand > .container-fluid { - padding-right: 0; - padding-left: 0; -} - -.navbar-expand .navbar-nav { - -ms-flex-direction: row; - flex-direction: row; -} - -.navbar-expand .navbar-nav .dropdown-menu { - position: absolute; -} - -.navbar-expand .navbar-nav .nav-link { - padding-right: 0.5rem; - padding-left: 0.5rem; -} - -.navbar-expand > .container, -.navbar-expand > .container-fluid { - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; -} - -.navbar-expand .navbar-collapse { - display: -ms-flexbox !important; - display: flex !important; - -ms-flex-preferred-size: auto; - flex-basis: auto; -} - -.navbar-expand .navbar-toggler { - display: none; -} - -.navbar-light .navbar-brand { - color: rgba(0, 0, 0, 0.9); -} - -.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus { - color: rgba(0, 0, 0, 0.9); -} - -.navbar-light .navbar-nav .nav-link { - color: rgba(0, 0, 0, 0.5); -} - -.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus { - color: rgba(0, 0, 0, 0.7); -} - -.navbar-light .navbar-nav .nav-link.disabled { - color: rgba(0, 0, 0, 0.3); -} - -.navbar-light .navbar-nav .show > .nav-link, -.navbar-light .navbar-nav .active > .nav-link, -.navbar-light .navbar-nav .nav-link.show, -.navbar-light .navbar-nav .nav-link.active { - color: rgba(0, 0, 0, 0.9); -} - -.navbar-light .navbar-toggler { - color: rgba(0, 0, 0, 0.5); - border-color: rgba(0, 0, 0, 0.1); -} - -.navbar-light .navbar-toggler-icon { - background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); -} - -.navbar-light .navbar-text { - color: rgba(0, 0, 0, 0.5); -} - -.navbar-light .navbar-text a { - color: rgba(0, 0, 0, 0.9); -} - -.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus { - color: rgba(0, 0, 0, 0.9); -} - -.navbar-dark .navbar-brand { - color: #fff; -} - -.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus { - color: #fff; -} - -.navbar-dark .navbar-nav .nav-link { - color: rgba(255, 255, 255, 0.5); -} - -.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus { - color: rgba(255, 255, 255, 0.75); -} - -.navbar-dark .navbar-nav .nav-link.disabled { - color: rgba(255, 255, 255, 0.25); -} - -.navbar-dark .navbar-nav .show > .nav-link, -.navbar-dark .navbar-nav .active > .nav-link, -.navbar-dark .navbar-nav .nav-link.show, -.navbar-dark .navbar-nav .nav-link.active { - color: #fff; -} - -.navbar-dark .navbar-toggler { - color: rgba(255, 255, 255, 0.5); - border-color: rgba(255, 255, 255, 0.1); -} - -.navbar-dark .navbar-toggler-icon { - background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); -} - -.navbar-dark .navbar-text { - color: rgba(255, 255, 255, 0.5); -} - -.navbar-dark .navbar-text a { - color: #fff; -} - -.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus { - color: #fff; -} - -.card { - position: relative; - display: -ms-flexbox; - display: flex; - -ms-flex-direction: column; - flex-direction: column; - min-width: 0; - word-wrap: break-word; - background-color: #fff; - background-clip: border-box; - border: 1px solid rgba(0, 0, 0, 0.125); - border-radius: 0.25rem; -} - -.card > hr { - margin-right: 0; - margin-left: 0; -} - -.card > .list-group:first-child .list-group-item:first-child { - border-top-left-radius: 0.25rem; - border-top-right-radius: 0.25rem; -} - -.card > .list-group:last-child .list-group-item:last-child { - border-bottom-right-radius: 0.25rem; - border-bottom-left-radius: 0.25rem; -} - -.card-body { - -ms-flex: 1 1 auto; - flex: 1 1 auto; - padding: 1.25rem; -} - -.card-title { - margin-bottom: 0.75rem; -} - -.card-subtitle { - margin-top: -0.375rem; - margin-bottom: 0; -} - -.card-text:last-child { - margin-bottom: 0; -} - -.card-link:hover { - text-decoration: none; -} - -.card-link + .card-link { - margin-left: 1.25rem; -} - -.card-header { - padding: 0.75rem 1.25rem; - margin-bottom: 0; - background-color: rgba(0, 0, 0, 0.03); - border-bottom: 1px solid rgba(0, 0, 0, 0.125); -} - -.card-header:first-child { - border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0; -} - -.card-header + .list-group .list-group-item:first-child { - border-top: 0; -} - -.card-footer { - padding: 0.75rem 1.25rem; - background-color: rgba(0, 0, 0, 0.03); - border-top: 1px solid rgba(0, 0, 0, 0.125); -} - -.card-footer:last-child { - border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px); -} - -.card-header-tabs { - margin-right: -0.625rem; - margin-bottom: -0.75rem; - margin-left: -0.625rem; - border-bottom: 0; -} - -.card-header-pills { - margin-right: -0.625rem; - margin-left: -0.625rem; -} - -.card-img-overlay { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: 1.25rem; -} - -.card-img { - width: 100%; - border-radius: calc(0.25rem - 1px); -} - -.card-img-top { - width: 100%; - border-top-left-radius: calc(0.25rem - 1px); - border-top-right-radius: calc(0.25rem - 1px); -} - -.card-img-bottom { - width: 100%; - border-bottom-right-radius: calc(0.25rem - 1px); - border-bottom-left-radius: calc(0.25rem - 1px); -} - -.card-deck { - display: -ms-flexbox; - display: flex; - -ms-flex-direction: column; - flex-direction: column; -} - -.card-deck .card { - margin-bottom: 15px; -} - -@media (min-width: 576px) { - .card-deck { - -ms-flex-flow: row wrap; - flex-flow: row wrap; - margin-right: -15px; - margin-left: -15px; - } - .card-deck .card { - display: -ms-flexbox; - display: flex; - -ms-flex: 1 0 0%; - flex: 1 0 0%; - -ms-flex-direction: column; - flex-direction: column; - margin-right: 15px; - margin-bottom: 0; - margin-left: 15px; - } -} - -.card-group { - display: -ms-flexbox; - display: flex; - -ms-flex-direction: column; - flex-direction: column; -} - -.card-group > .card { - margin-bottom: 15px; -} - -@media (min-width: 576px) { - .card-group { - -ms-flex-flow: row wrap; - flex-flow: row wrap; - } - .card-group > .card { - -ms-flex: 1 0 0%; - flex: 1 0 0%; - margin-bottom: 0; - } - .card-group > .card + .card { - margin-left: 0; - border-left: 0; - } - .card-group > .card:not(:last-child) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; - } - .card-group > .card:not(:last-child) .card-img-top, - .card-group > .card:not(:last-child) .card-header { - border-top-right-radius: 0; - } - .card-group > .card:not(:last-child) .card-img-bottom, - .card-group > .card:not(:last-child) .card-footer { - border-bottom-right-radius: 0; - } - .card-group > .card:not(:first-child) { - border-top-left-radius: 0; - border-bottom-left-radius: 0; - } - .card-group > .card:not(:first-child) .card-img-top, - .card-group > .card:not(:first-child) .card-header { - border-top-left-radius: 0; - } - .card-group > .card:not(:first-child) .card-img-bottom, - .card-group > .card:not(:first-child) .card-footer { - border-bottom-left-radius: 0; - } -} - -.card-columns .card { - margin-bottom: 0.75rem; -} - -@media (min-width: 576px) { - .card-columns { - -webkit-column-count: 3; - -moz-column-count: 3; - column-count: 3; - -webkit-column-gap: 1.25rem; - -moz-column-gap: 1.25rem; - column-gap: 1.25rem; - orphans: 1; - widows: 1; - } - .card-columns .card { - display: inline-block; - width: 100%; - } -} - -.accordion > .card { - overflow: hidden; -} - -.accordion > .card:not(:first-of-type) .card-header:first-child { - border-radius: 0; -} - -.accordion > .card:not(:first-of-type):not(:last-of-type) { - border-bottom: 0; - border-radius: 0; -} - -.accordion > .card:first-of-type { - border-bottom: 0; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} - -.accordion > .card:last-of-type { - border-top-left-radius: 0; - border-top-right-radius: 0; -} - -.accordion > .card .card-header { - margin-bottom: -1px; -} - -.breadcrumb { - display: -ms-flexbox; - display: flex; - -ms-flex-wrap: wrap; - flex-wrap: wrap; - padding: 0.75rem 1rem; - margin-bottom: 1rem; - list-style: none; - background-color: #e9ecef; - border-radius: 0.25rem; -} - -.breadcrumb-item + .breadcrumb-item { - padding-left: 0.5rem; -} - -.breadcrumb-item + .breadcrumb-item::before { - display: inline-block; - padding-right: 0.5rem; - color: #6c757d; - content: "/"; -} - -.breadcrumb-item + .breadcrumb-item:hover::before { - text-decoration: underline; -} - -.breadcrumb-item + .breadcrumb-item:hover::before { - text-decoration: none; -} - -.breadcrumb-item.active { - color: #6c757d; -} - -.pagination { - display: -ms-flexbox; - display: flex; - padding-left: 0; - list-style: none; - border-radius: 0.25rem; -} - -.page-link { - position: relative; - display: block; - padding: 0.5rem 0.75rem; - margin-left: -1px; - line-height: 1.25; - color: #007bff; - background-color: #fff; - border: 1px solid #dee2e6; -} - -.page-link:hover { - z-index: 2; - color: #0056b3; - text-decoration: none; - background-color: #e9ecef; - border-color: #dee2e6; -} - -.page-link:focus { - z-index: 2; - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); -} - -.page-item:first-child .page-link { - margin-left: 0; - border-top-left-radius: 0.25rem; - border-bottom-left-radius: 0.25rem; -} - -.page-item:last-child .page-link { - border-top-right-radius: 0.25rem; - border-bottom-right-radius: 0.25rem; -} - -.page-item.active .page-link { - z-index: 1; - color: #fff; - background-color: #007bff; - border-color: #007bff; -} - -.page-item.disabled .page-link { - color: #6c757d; - pointer-events: none; - cursor: auto; - background-color: #fff; - border-color: #dee2e6; -} - -.pagination-lg .page-link { - padding: 0.75rem 1.5rem; - font-size: 1.25rem; - line-height: 1.5; -} - -.pagination-lg .page-item:first-child .page-link { - border-top-left-radius: 0.3rem; - border-bottom-left-radius: 0.3rem; -} - -.pagination-lg .page-item:last-child .page-link { - border-top-right-radius: 0.3rem; - border-bottom-right-radius: 0.3rem; -} - -.pagination-sm .page-link { - padding: 0.25rem 0.5rem; - font-size: 0.875rem; - line-height: 1.5; -} - -.pagination-sm .page-item:first-child .page-link { - border-top-left-radius: 0.2rem; - border-bottom-left-radius: 0.2rem; -} - -.pagination-sm .page-item:last-child .page-link { - border-top-right-radius: 0.2rem; - border-bottom-right-radius: 0.2rem; -} - -.badge { - display: inline-block; - padding: 0.25em 0.4em; - font-size: 75%; - font-weight: 700; - line-height: 1; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - border-radius: 0.25rem; - transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; -} - -@media (prefers-reduced-motion: reduce) { - .badge { - transition: none; - } -} - -a.badge:hover, a.badge:focus { - text-decoration: none; -} - -.badge:empty { - display: none; -} - -.btn .badge { - position: relative; - top: -1px; -} - -.badge-pill { - padding-right: 0.6em; - padding-left: 0.6em; - border-radius: 10rem; -} - -.badge-primary { - color: #fff; - background-color: #007bff; -} - -a.badge-primary:hover, a.badge-primary:focus { - color: #fff; - background-color: #0062cc; -} - -a.badge-primary:focus, a.badge-primary.focus { - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); -} - -.badge-secondary { - color: #fff; - background-color: #6c757d; -} - -a.badge-secondary:hover, a.badge-secondary:focus { - color: #fff; - background-color: #545b62; -} - -a.badge-secondary:focus, a.badge-secondary.focus { - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); -} - -.badge-success { - color: #fff; - background-color: #28a745; -} - -a.badge-success:hover, a.badge-success:focus { - color: #fff; - background-color: #1e7e34; -} - -a.badge-success:focus, a.badge-success.focus { - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); -} - -.badge-info { - color: #fff; - background-color: #17a2b8; -} - -a.badge-info:hover, a.badge-info:focus { - color: #fff; - background-color: #117a8b; -} - -a.badge-info:focus, a.badge-info.focus { - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); -} - -.badge-warning { - color: #212529; - background-color: #ffc107; -} - -a.badge-warning:hover, a.badge-warning:focus { - color: #212529; - background-color: #d39e00; -} - -a.badge-warning:focus, a.badge-warning.focus { - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); -} - -.badge-danger { - color: #fff; - background-color: #dc3545; -} - -a.badge-danger:hover, a.badge-danger:focus { - color: #fff; - background-color: #bd2130; -} - -a.badge-danger:focus, a.badge-danger.focus { - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); -} - -.badge-light { - color: #212529; - background-color: #f8f9fa; -} - -a.badge-light:hover, a.badge-light:focus { - color: #212529; - background-color: #dae0e5; -} - -a.badge-light:focus, a.badge-light.focus { - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); -} - -.badge-dark { - color: #fff; - background-color: #343a40; -} - -a.badge-dark:hover, a.badge-dark:focus { - color: #fff; - background-color: #1d2124; -} - -a.badge-dark:focus, a.badge-dark.focus { - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); -} - -.jumbotron { - padding: 2rem 1rem; - margin-bottom: 2rem; - background-color: #e9ecef; - border-radius: 0.3rem; -} - -@media (min-width: 576px) { - .jumbotron { - padding: 4rem 2rem; - } -} - -.jumbotron-fluid { - padding-right: 0; - padding-left: 0; - border-radius: 0; -} - -.alert { - position: relative; - padding: 0.75rem 1.25rem; - margin-bottom: 1rem; - border: 1px solid transparent; - border-radius: 0.25rem; -} - -.alert-heading { - color: inherit; -} - -.alert-link { - font-weight: 700; -} - -.alert-dismissible { - padding-right: 4rem; -} - -.alert-dismissible .close { - position: absolute; - top: 0; - right: 0; - padding: 0.75rem 1.25rem; - color: inherit; -} - -.alert-primary { - color: #004085; - background-color: #cce5ff; - border-color: #b8daff; -} - -.alert-primary hr { - border-top-color: #9fcdff; -} - -.alert-primary .alert-link { - color: #002752; -} - -.alert-secondary { - color: #383d41; - background-color: #e2e3e5; - border-color: #d6d8db; -} - -.alert-secondary hr { - border-top-color: #c8cbcf; -} - -.alert-secondary .alert-link { - color: #202326; -} - -.alert-success { - color: #155724; - background-color: #d4edda; - border-color: #c3e6cb; -} - -.alert-success hr { - border-top-color: #b1dfbb; -} - -.alert-success .alert-link { - color: #0b2e13; -} - -.alert-info { - color: #0c5460; - background-color: #d1ecf1; - border-color: #bee5eb; -} - -.alert-info hr { - border-top-color: #abdde5; -} - -.alert-info .alert-link { - color: #062c33; -} - -.alert-warning { - color: #856404; - background-color: #fff3cd; - border-color: #ffeeba; -} - -.alert-warning hr { - border-top-color: #ffe8a1; -} - -.alert-warning .alert-link { - color: #533f03; -} - -.alert-danger { - color: #721c24; - background-color: #f8d7da; - border-color: #f5c6cb; -} - -.alert-danger hr { - border-top-color: #f1b0b7; -} - -.alert-danger .alert-link { - color: #491217; -} - -.alert-light { - color: #818182; - background-color: #fefefe; - border-color: #fdfdfe; -} - -.alert-light hr { - border-top-color: #ececf6; -} - -.alert-light .alert-link { - color: #686868; -} - -.alert-dark { - color: #1b1e21; - background-color: #d6d8d9; - border-color: #c6c8ca; -} - -.alert-dark hr { - border-top-color: #b9bbbe; -} - -.alert-dark .alert-link { - color: #040505; -} - -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 1rem 0; - } - to { - background-position: 0 0; - } -} - -@keyframes progress-bar-stripes { - from { - background-position: 1rem 0; - } - to { - background-position: 0 0; - } -} - -.progress { - display: -ms-flexbox; - display: flex; - height: 1rem; - overflow: hidden; - font-size: 0.75rem; - background-color: #e9ecef; - border-radius: 0.25rem; -} - -.progress-bar { - display: -ms-flexbox; - display: flex; - -ms-flex-direction: column; - flex-direction: column; - -ms-flex-pack: center; - justify-content: center; - color: #fff; - text-align: center; - white-space: nowrap; - background-color: #007bff; - transition: width 0.6s ease; -} - -@media (prefers-reduced-motion: reduce) { - .progress-bar { - transition: none; - } -} - -.progress-bar-striped { - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-size: 1rem 1rem; -} - -.progress-bar-animated { - -webkit-animation: progress-bar-stripes 1s linear infinite; - animation: progress-bar-stripes 1s linear infinite; -} - -@media (prefers-reduced-motion: reduce) { - .progress-bar-animated { - -webkit-animation: none; - animation: none; - } -} - -.media { - display: -ms-flexbox; - display: flex; - -ms-flex-align: start; - align-items: flex-start; -} - -.media-body { - -ms-flex: 1; - flex: 1; -} - -.list-group { - display: -ms-flexbox; - display: flex; - -ms-flex-direction: column; - flex-direction: column; - padding-left: 0; - margin-bottom: 0; -} - -.list-group-item-action { - width: 100%; - color: #495057; - text-align: inherit; -} - -.list-group-item-action:hover, .list-group-item-action:focus { - z-index: 1; - color: #495057; - text-decoration: none; - background-color: #f8f9fa; -} - -.list-group-item-action:active { - color: #212529; - background-color: #e9ecef; -} - -.list-group-item { - position: relative; - display: block; - padding: 0.75rem 1.25rem; - margin-bottom: -1px; - background-color: #fff; - border: 1px solid rgba(0, 0, 0, 0.125); -} - -.list-group-item:first-child { - border-top-left-radius: 0.25rem; - border-top-right-radius: 0.25rem; -} - -.list-group-item:last-child { - margin-bottom: 0; - border-bottom-right-radius: 0.25rem; - border-bottom-left-radius: 0.25rem; -} - -.list-group-item.disabled, .list-group-item:disabled { - color: #6c757d; - pointer-events: none; - background-color: #fff; -} - -.list-group-item.active { - z-index: 2; - color: #fff; - background-color: #007bff; - border-color: #007bff; -} - -.list-group-horizontal { - -ms-flex-direction: row; - flex-direction: row; -} - -.list-group-horizontal .list-group-item { - margin-right: -1px; - margin-bottom: 0; -} - -.list-group-horizontal .list-group-item:first-child { - border-top-left-radius: 0.25rem; - border-bottom-left-radius: 0.25rem; - border-top-right-radius: 0; -} - -.list-group-horizontal .list-group-item:last-child { - margin-right: 0; - border-top-right-radius: 0.25rem; - border-bottom-right-radius: 0.25rem; - border-bottom-left-radius: 0; -} - -@media (min-width: 576px) { - .list-group-horizontal-sm { - -ms-flex-direction: row; - flex-direction: row; - } - .list-group-horizontal-sm .list-group-item { - margin-right: -1px; - margin-bottom: 0; - } - .list-group-horizontal-sm .list-group-item:first-child { - border-top-left-radius: 0.25rem; - border-bottom-left-radius: 0.25rem; - border-top-right-radius: 0; - } - .list-group-horizontal-sm .list-group-item:last-child { - margin-right: 0; - border-top-right-radius: 0.25rem; - border-bottom-right-radius: 0.25rem; - border-bottom-left-radius: 0; - } -} - -@media (min-width: 768px) { - .list-group-horizontal-md { - -ms-flex-direction: row; - flex-direction: row; - } - .list-group-horizontal-md .list-group-item { - margin-right: -1px; - margin-bottom: 0; - } - .list-group-horizontal-md .list-group-item:first-child { - border-top-left-radius: 0.25rem; - border-bottom-left-radius: 0.25rem; - border-top-right-radius: 0; - } - .list-group-horizontal-md .list-group-item:last-child { - margin-right: 0; - border-top-right-radius: 0.25rem; - border-bottom-right-radius: 0.25rem; - border-bottom-left-radius: 0; - } -} - -@media (min-width: 992px) { - .list-group-horizontal-lg { - -ms-flex-direction: row; - flex-direction: row; - } - .list-group-horizontal-lg .list-group-item { - margin-right: -1px; - margin-bottom: 0; - } - .list-group-horizontal-lg .list-group-item:first-child { - border-top-left-radius: 0.25rem; - border-bottom-left-radius: 0.25rem; - border-top-right-radius: 0; - } - .list-group-horizontal-lg .list-group-item:last-child { - margin-right: 0; - border-top-right-radius: 0.25rem; - border-bottom-right-radius: 0.25rem; - border-bottom-left-radius: 0; - } -} - -@media (min-width: 1200px) { - .list-group-horizontal-xl { - -ms-flex-direction: row; - flex-direction: row; - } - .list-group-horizontal-xl .list-group-item { - margin-right: -1px; - margin-bottom: 0; - } - .list-group-horizontal-xl .list-group-item:first-child { - border-top-left-radius: 0.25rem; - border-bottom-left-radius: 0.25rem; - border-top-right-radius: 0; - } - .list-group-horizontal-xl .list-group-item:last-child { - margin-right: 0; - border-top-right-radius: 0.25rem; - border-bottom-right-radius: 0.25rem; - border-bottom-left-radius: 0; - } -} - -.list-group-flush .list-group-item { - border-right: 0; - border-left: 0; - border-radius: 0; -} - -.list-group-flush .list-group-item:last-child { - margin-bottom: -1px; -} - -.list-group-flush:first-child .list-group-item:first-child { - border-top: 0; -} - -.list-group-flush:last-child .list-group-item:last-child { - margin-bottom: 0; - border-bottom: 0; -} - -.list-group-item-primary { - color: #004085; - background-color: #b8daff; -} - -.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus { - color: #004085; - background-color: #9fcdff; -} - -.list-group-item-primary.list-group-item-action.active { - color: #fff; - background-color: #004085; - border-color: #004085; -} - -.list-group-item-secondary { - color: #383d41; - background-color: #d6d8db; -} - -.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus { - color: #383d41; - background-color: #c8cbcf; -} - -.list-group-item-secondary.list-group-item-action.active { - color: #fff; - background-color: #383d41; - border-color: #383d41; -} - -.list-group-item-success { - color: #155724; - background-color: #c3e6cb; -} - -.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus { - color: #155724; - background-color: #b1dfbb; -} - -.list-group-item-success.list-group-item-action.active { - color: #fff; - background-color: #155724; - border-color: #155724; -} - -.list-group-item-info { - color: #0c5460; - background-color: #bee5eb; -} - -.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus { - color: #0c5460; - background-color: #abdde5; -} - -.list-group-item-info.list-group-item-action.active { - color: #fff; - background-color: #0c5460; - border-color: #0c5460; -} - -.list-group-item-warning { - color: #856404; - background-color: #ffeeba; -} - -.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus { - color: #856404; - background-color: #ffe8a1; -} - -.list-group-item-warning.list-group-item-action.active { - color: #fff; - background-color: #856404; - border-color: #856404; -} - -.list-group-item-danger { - color: #721c24; - background-color: #f5c6cb; -} - -.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus { - color: #721c24; - background-color: #f1b0b7; -} - -.list-group-item-danger.list-group-item-action.active { - color: #fff; - background-color: #721c24; - border-color: #721c24; -} - -.list-group-item-light { - color: #818182; - background-color: #fdfdfe; -} - -.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus { - color: #818182; - background-color: #ececf6; -} - -.list-group-item-light.list-group-item-action.active { - color: #fff; - background-color: #818182; - border-color: #818182; -} - -.list-group-item-dark { - color: #1b1e21; - background-color: #c6c8ca; -} - -.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus { - color: #1b1e21; - background-color: #b9bbbe; -} - -.list-group-item-dark.list-group-item-action.active { - color: #fff; - background-color: #1b1e21; - border-color: #1b1e21; -} - -.close { - float: right; - font-size: 1.5rem; - font-weight: 700; - line-height: 1; - color: #000; - text-shadow: 0 1px 0 #fff; - opacity: .5; -} - -.close:hover { - color: #000; - text-decoration: none; -} - -.close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus { - opacity: .75; -} - -button.close { - padding: 0; - background-color: transparent; - border: 0; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; -} - -a.close.disabled { - pointer-events: none; -} - -.toast { - max-width: 350px; - overflow: hidden; - font-size: 0.875rem; - background-color: rgba(255, 255, 255, 0.85); - background-clip: padding-box; - border: 1px solid rgba(0, 0, 0, 0.1); - box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1); - -webkit-backdrop-filter: blur(10px); - backdrop-filter: blur(10px); - opacity: 0; - border-radius: 0.25rem; -} - -.toast:not(:last-child) { - margin-bottom: 0.75rem; -} - -.toast.showing { - opacity: 1; -} - -.toast.show { - display: block; - opacity: 1; -} - -.toast.hide { - display: none; -} - -.toast-header { - display: -ms-flexbox; - display: flex; - -ms-flex-align: center; - align-items: center; - padding: 0.25rem 0.75rem; - color: #6c757d; - background-color: rgba(255, 255, 255, 0.85); - background-clip: padding-box; - border-bottom: 1px solid rgba(0, 0, 0, 0.05); -} - -.toast-body { - padding: 0.75rem; -} - -.modal-open { - overflow: hidden; -} - -.modal-open .modal { - overflow-x: hidden; - overflow-y: auto; -} - -.modal { - position: fixed; - top: 0; - left: 0; - z-index: 1050; - display: none; - width: 100%; - height: 100%; - overflow: hidden; - outline: 0; -} - -.modal-dialog { - position: relative; - width: auto; - margin: 0.5rem; - pointer-events: none; -} - -.modal.fade .modal-dialog { - transition: -webkit-transform 0.3s ease-out; - transition: transform 0.3s ease-out; - transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out; - -webkit-transform: translate(0, -50px); - transform: translate(0, -50px); -} - -@media (prefers-reduced-motion: reduce) { - .modal.fade .modal-dialog { - transition: none; - } -} - -.modal.show .modal-dialog { - -webkit-transform: none; - transform: none; -} - -.modal-dialog-scrollable { - display: -ms-flexbox; - display: flex; - max-height: calc(100% - 1rem); -} - -.modal-dialog-scrollable .modal-content { - max-height: calc(100vh - 1rem); - overflow: hidden; -} - -.modal-dialog-scrollable .modal-header, -.modal-dialog-scrollable .modal-footer { - -ms-flex-negative: 0; - flex-shrink: 0; -} - -.modal-dialog-scrollable .modal-body { - overflow-y: auto; -} - -.modal-dialog-centered { - display: -ms-flexbox; - display: flex; - -ms-flex-align: center; - align-items: center; - min-height: calc(100% - 1rem); -} - -.modal-dialog-centered::before { - display: block; - height: calc(100vh - 1rem); - content: ""; -} - -.modal-dialog-centered.modal-dialog-scrollable { - -ms-flex-direction: column; - flex-direction: column; - -ms-flex-pack: center; - justify-content: center; - height: 100%; -} - -.modal-dialog-centered.modal-dialog-scrollable .modal-content { - max-height: none; -} - -.modal-dialog-centered.modal-dialog-scrollable::before { - content: none; -} - -.modal-content { - position: relative; - display: -ms-flexbox; - display: flex; - -ms-flex-direction: column; - flex-direction: column; - width: 100%; - pointer-events: auto; - background-color: #fff; - background-clip: padding-box; - border: 1px solid rgba(0, 0, 0, 0.2); - border-radius: 0.3rem; - outline: 0; -} - -.modal-backdrop { - position: fixed; - top: 0; - left: 0; - z-index: 1040; - width: 100vw; - height: 100vh; - background-color: #000; -} - -.modal-backdrop.fade { - opacity: 0; -} - -.modal-backdrop.show { - opacity: 0.5; -} - -.modal-header { - display: -ms-flexbox; - display: flex; - -ms-flex-align: start; - align-items: flex-start; - -ms-flex-pack: justify; - justify-content: space-between; - padding: 1rem 1rem; - border-bottom: 1px solid #dee2e6; - border-top-left-radius: 0.3rem; - border-top-right-radius: 0.3rem; -} - -.modal-header .close { - padding: 1rem 1rem; - margin: -1rem -1rem -1rem auto; -} - -.modal-title { - margin-bottom: 0; - line-height: 1.5; -} - -.modal-body { - position: relative; - -ms-flex: 1 1 auto; - flex: 1 1 auto; - padding: 1rem; -} - -.modal-footer { - display: -ms-flexbox; - display: flex; - -ms-flex-align: center; - align-items: center; - -ms-flex-pack: end; - justify-content: flex-end; - padding: 1rem; - border-top: 1px solid #dee2e6; - border-bottom-right-radius: 0.3rem; - border-bottom-left-radius: 0.3rem; -} - -.modal-footer > :not(:first-child) { - margin-left: .25rem; -} - -.modal-footer > :not(:last-child) { - margin-right: .25rem; -} - -.modal-scrollbar-measure { - position: absolute; - top: -9999px; - width: 50px; - height: 50px; - overflow: scroll; -} - -@media (min-width: 576px) { - .modal-dialog { - max-width: 500px; - margin: 1.75rem auto; - } - .modal-dialog-scrollable { - max-height: calc(100% - 3.5rem); - } - .modal-dialog-scrollable .modal-content { - max-height: calc(100vh - 3.5rem); - } - .modal-dialog-centered { - min-height: calc(100% - 3.5rem); - } - .modal-dialog-centered::before { - height: calc(100vh - 3.5rem); - } - .modal-sm { - max-width: 300px; - } -} - -@media (min-width: 992px) { - .modal-lg, - .modal-xl { - max-width: 800px; - } -} - -@media (min-width: 1200px) { - .modal-xl { - max-width: 1140px; - } -} - -.tooltip { - position: absolute; - z-index: 1070; - display: block; - margin: 0; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - font-style: normal; - font-weight: 400; - line-height: 1.5; - text-align: left; - text-align: start; - text-decoration: none; - text-shadow: none; - text-transform: none; - letter-spacing: normal; - word-break: normal; - word-spacing: normal; - white-space: normal; - line-break: auto; - font-size: 0.875rem; - word-wrap: break-word; - opacity: 0; -} - -.tooltip.show { - opacity: 0.9; -} - -.tooltip .arrow { - position: absolute; - display: block; - width: 0.8rem; - height: 0.4rem; -} - -.tooltip .arrow::before { - position: absolute; - content: ""; - border-color: transparent; - border-style: solid; -} - -.bs-tooltip-top, .bs-tooltip-auto[x-placement^="top"] { - padding: 0.4rem 0; -} - -.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^="top"] .arrow { - bottom: 0; -} - -.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^="top"] .arrow::before { - top: 0; - border-width: 0.4rem 0.4rem 0; - border-top-color: #000; -} - -.bs-tooltip-right, .bs-tooltip-auto[x-placement^="right"] { - padding: 0 0.4rem; -} - -.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^="right"] .arrow { - left: 0; - width: 0.4rem; - height: 0.8rem; -} - -.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^="right"] .arrow::before { - right: 0; - border-width: 0.4rem 0.4rem 0.4rem 0; - border-right-color: #000; -} - -.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^="bottom"] { - padding: 0.4rem 0; -} - -.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^="bottom"] .arrow { - top: 0; -} - -.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^="bottom"] .arrow::before { - bottom: 0; - border-width: 0 0.4rem 0.4rem; - border-bottom-color: #000; -} - -.bs-tooltip-left, .bs-tooltip-auto[x-placement^="left"] { - padding: 0 0.4rem; -} - -.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^="left"] .arrow { - right: 0; - width: 0.4rem; - height: 0.8rem; -} - -.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^="left"] .arrow::before { - left: 0; - border-width: 0.4rem 0 0.4rem 0.4rem; - border-left-color: #000; -} - -.tooltip-inner { - max-width: 200px; - padding: 0.25rem 0.5rem; - color: #fff; - text-align: center; - background-color: #000; - border-radius: 0.25rem; -} - -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1060; - display: block; - max-width: 276px; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - font-style: normal; - font-weight: 400; - line-height: 1.5; - text-align: left; - text-align: start; - text-decoration: none; - text-shadow: none; - text-transform: none; - letter-spacing: normal; - word-break: normal; - word-spacing: normal; - white-space: normal; - line-break: auto; - font-size: 0.875rem; - word-wrap: break-word; - background-color: #fff; - background-clip: padding-box; - border: 1px solid rgba(0, 0, 0, 0.2); - border-radius: 0.3rem; -} - -.popover .arrow { - position: absolute; - display: block; - width: 1rem; - height: 0.5rem; - margin: 0 0.3rem; -} - -.popover .arrow::before, .popover .arrow::after { - position: absolute; - display: block; - content: ""; - border-color: transparent; - border-style: solid; -} - -.bs-popover-top, .bs-popover-auto[x-placement^="top"] { - margin-bottom: 0.5rem; -} - -.bs-popover-top > .arrow, .bs-popover-auto[x-placement^="top"] > .arrow { - bottom: calc((0.5rem + 1px) * -1); -} - -.bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^="top"] > .arrow::before { - bottom: 0; - border-width: 0.5rem 0.5rem 0; - border-top-color: rgba(0, 0, 0, 0.25); -} - -.bs-popover-top > .arrow::after, .bs-popover-auto[x-placement^="top"] > .arrow::after { - bottom: 1px; - border-width: 0.5rem 0.5rem 0; - border-top-color: #fff; -} - -.bs-popover-right, .bs-popover-auto[x-placement^="right"] { - margin-left: 0.5rem; -} - -.bs-popover-right > .arrow, .bs-popover-auto[x-placement^="right"] > .arrow { - left: calc((0.5rem + 1px) * -1); - width: 0.5rem; - height: 1rem; - margin: 0.3rem 0; -} - -.bs-popover-right > .arrow::before, .bs-popover-auto[x-placement^="right"] > .arrow::before { - left: 0; - border-width: 0.5rem 0.5rem 0.5rem 0; - border-right-color: rgba(0, 0, 0, 0.25); -} - -.bs-popover-right > .arrow::after, .bs-popover-auto[x-placement^="right"] > .arrow::after { - left: 1px; - border-width: 0.5rem 0.5rem 0.5rem 0; - border-right-color: #fff; -} - -.bs-popover-bottom, .bs-popover-auto[x-placement^="bottom"] { - margin-top: 0.5rem; -} - -.bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^="bottom"] > .arrow { - top: calc((0.5rem + 1px) * -1); -} - -.bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^="bottom"] > .arrow::before { - top: 0; - border-width: 0 0.5rem 0.5rem 0.5rem; - border-bottom-color: rgba(0, 0, 0, 0.25); -} - -.bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^="bottom"] > .arrow::after { - top: 1px; - border-width: 0 0.5rem 0.5rem 0.5rem; - border-bottom-color: #fff; -} - -.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^="bottom"] .popover-header::before { - position: absolute; - top: 0; - left: 50%; - display: block; - width: 1rem; - margin-left: -0.5rem; - content: ""; - border-bottom: 1px solid #f7f7f7; -} - -.bs-popover-left, .bs-popover-auto[x-placement^="left"] { - margin-right: 0.5rem; -} - -.bs-popover-left > .arrow, .bs-popover-auto[x-placement^="left"] > .arrow { - right: calc((0.5rem + 1px) * -1); - width: 0.5rem; - height: 1rem; - margin: 0.3rem 0; -} - -.bs-popover-left > .arrow::before, .bs-popover-auto[x-placement^="left"] > .arrow::before { - right: 0; - border-width: 0.5rem 0 0.5rem 0.5rem; - border-left-color: rgba(0, 0, 0, 0.25); -} - -.bs-popover-left > .arrow::after, .bs-popover-auto[x-placement^="left"] > .arrow::after { - right: 1px; - border-width: 0.5rem 0 0.5rem 0.5rem; - border-left-color: #fff; -} - -.popover-header { - padding: 0.5rem 0.75rem; - margin-bottom: 0; - font-size: 1rem; - background-color: #f7f7f7; - border-bottom: 1px solid #ebebeb; - border-top-left-radius: calc(0.3rem - 1px); - border-top-right-radius: calc(0.3rem - 1px); -} - -.popover-header:empty { - display: none; -} - -.popover-body { - padding: 0.5rem 0.75rem; - color: #212529; -} - -.carousel { - position: relative; -} - -.carousel.pointer-event { - -ms-touch-action: pan-y; - touch-action: pan-y; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; -} - -.carousel-inner::after { - display: block; - clear: both; - content: ""; -} - -.carousel-item { - position: relative; - display: none; - float: left; - width: 100%; - margin-right: -100%; - -webkit-backface-visibility: hidden; - backface-visibility: hidden; - transition: -webkit-transform 0.6s ease-in-out; - transition: transform 0.6s ease-in-out; - transition: transform 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out; -} - -@media (prefers-reduced-motion: reduce) { - .carousel-item { - transition: none; - } -} - -.carousel-item.active, -.carousel-item-next, -.carousel-item-prev { - display: block; -} - -.carousel-item-next:not(.carousel-item-left), -.active.carousel-item-right { - -webkit-transform: translateX(100%); - transform: translateX(100%); -} - -.carousel-item-prev:not(.carousel-item-right), -.active.carousel-item-left { - -webkit-transform: translateX(-100%); - transform: translateX(-100%); -} - -.carousel-fade .carousel-item { - opacity: 0; - transition-property: opacity; - -webkit-transform: none; - transform: none; -} - -.carousel-fade .carousel-item.active, -.carousel-fade .carousel-item-next.carousel-item-left, -.carousel-fade .carousel-item-prev.carousel-item-right { - z-index: 1; - opacity: 1; -} - -.carousel-fade .active.carousel-item-left, -.carousel-fade .active.carousel-item-right { - z-index: 0; - opacity: 0; - transition: 0s 0.6s opacity; -} - -@media (prefers-reduced-motion: reduce) { - .carousel-fade .active.carousel-item-left, - .carousel-fade .active.carousel-item-right { - transition: none; - } -} - -.carousel-control-prev, -.carousel-control-next { - position: absolute; - top: 0; - bottom: 0; - z-index: 1; - display: -ms-flexbox; - display: flex; - -ms-flex-align: center; - align-items: center; - -ms-flex-pack: center; - justify-content: center; - width: 15%; - color: #fff; - text-align: center; - opacity: 0.5; - transition: opacity 0.15s ease; -} - -@media (prefers-reduced-motion: reduce) { - .carousel-control-prev, - .carousel-control-next { - transition: none; - } -} - -.carousel-control-prev:hover, .carousel-control-prev:focus, -.carousel-control-next:hover, -.carousel-control-next:focus { - color: #fff; - text-decoration: none; - outline: 0; - opacity: 0.9; -} - -.carousel-control-prev { - left: 0; -} - -.carousel-control-next { - right: 0; -} - -.carousel-control-prev-icon, -.carousel-control-next-icon { - display: inline-block; - width: 20px; - height: 20px; - background: no-repeat 50% / 100% 100%; -} - -.carousel-control-prev-icon { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e"); -} - -.carousel-control-next-icon { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e"); -} - -.carousel-indicators { - position: absolute; - right: 0; - bottom: 0; - left: 0; - z-index: 15; - display: -ms-flexbox; - display: flex; - -ms-flex-pack: center; - justify-content: center; - padding-left: 0; - margin-right: 15%; - margin-left: 15%; - list-style: none; -} - -.carousel-indicators li { - box-sizing: content-box; - -ms-flex: 0 1 auto; - flex: 0 1 auto; - width: 30px; - height: 3px; - margin-right: 3px; - margin-left: 3px; - text-indent: -999px; - cursor: pointer; - background-color: #fff; - background-clip: padding-box; - border-top: 10px solid transparent; - border-bottom: 10px solid transparent; - opacity: .5; - transition: opacity 0.6s ease; -} - -@media (prefers-reduced-motion: reduce) { - .carousel-indicators li { - transition: none; - } -} - -.carousel-indicators .active { - opacity: 1; -} - -.carousel-caption { - position: absolute; - right: 15%; - bottom: 20px; - left: 15%; - z-index: 10; - padding-top: 20px; - padding-bottom: 20px; - color: #fff; - text-align: center; -} - -@-webkit-keyframes spinner-border { - to { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } -} - -@keyframes spinner-border { - to { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } -} - -.spinner-border { - display: inline-block; - width: 2rem; - height: 2rem; - vertical-align: text-bottom; - border: 0.25em solid currentColor; - border-right-color: transparent; - border-radius: 50%; - -webkit-animation: spinner-border .75s linear infinite; - animation: spinner-border .75s linear infinite; -} - -.spinner-border-sm { - width: 1rem; - height: 1rem; - border-width: 0.2em; -} - -@-webkit-keyframes spinner-grow { - 0% { - -webkit-transform: scale(0); - transform: scale(0); - } - 50% { - opacity: 1; - } -} - -@keyframes spinner-grow { - 0% { - -webkit-transform: scale(0); - transform: scale(0); - } - 50% { - opacity: 1; - } -} - -.spinner-grow { - display: inline-block; - width: 2rem; - height: 2rem; - vertical-align: text-bottom; - background-color: currentColor; - border-radius: 50%; - opacity: 0; - -webkit-animation: spinner-grow .75s linear infinite; - animation: spinner-grow .75s linear infinite; -} - -.spinner-grow-sm { - width: 1rem; - height: 1rem; -} - -.align-baseline { - vertical-align: baseline !important; -} - -.align-top { - vertical-align: top !important; -} - -.align-middle { - vertical-align: middle !important; -} - -.align-bottom { - vertical-align: bottom !important; -} - -.align-text-bottom { - vertical-align: text-bottom !important; -} - -.align-text-top { - vertical-align: text-top !important; -} - -.bg-primary { - background-color: #007bff !important; -} - -a.bg-primary:hover, a.bg-primary:focus, -button.bg-primary:hover, -button.bg-primary:focus { - background-color: #0062cc !important; -} - -.bg-secondary { - background-color: #6c757d !important; -} - -a.bg-secondary:hover, a.bg-secondary:focus, -button.bg-secondary:hover, -button.bg-secondary:focus { - background-color: #545b62 !important; -} - -.bg-success { - background-color: #28a745 !important; -} - -a.bg-success:hover, a.bg-success:focus, -button.bg-success:hover, -button.bg-success:focus { - background-color: #1e7e34 !important; -} - -.bg-info { - background-color: #17a2b8 !important; -} - -a.bg-info:hover, a.bg-info:focus, -button.bg-info:hover, -button.bg-info:focus { - background-color: #117a8b !important; -} - -.bg-warning { - background-color: #ffc107 !important; -} - -a.bg-warning:hover, a.bg-warning:focus, -button.bg-warning:hover, -button.bg-warning:focus { - background-color: #d39e00 !important; -} - -.bg-danger { - background-color: #dc3545 !important; -} - -a.bg-danger:hover, a.bg-danger:focus, -button.bg-danger:hover, -button.bg-danger:focus { - background-color: #bd2130 !important; -} - -.bg-light { - background-color: #f8f9fa !important; -} - -a.bg-light:hover, a.bg-light:focus, -button.bg-light:hover, -button.bg-light:focus { - background-color: #dae0e5 !important; -} - -.bg-dark { - background-color: #343a40 !important; -} - -a.bg-dark:hover, a.bg-dark:focus, -button.bg-dark:hover, -button.bg-dark:focus { - background-color: #1d2124 !important; -} - -.bg-white { - background-color: #fff !important; -} - -.bg-transparent { - background-color: transparent !important; -} - -.border { - border: 1px solid #dee2e6 !important; -} - -.border-top { - border-top: 1px solid #dee2e6 !important; -} - -.border-right { - border-right: 1px solid #dee2e6 !important; -} - -.border-bottom { - border-bottom: 1px solid #dee2e6 !important; -} - -.border-left { - border-left: 1px solid #dee2e6 !important; -} - -.border-0 { - border: 0 !important; -} - -.border-top-0 { - border-top: 0 !important; -} - -.border-right-0 { - border-right: 0 !important; -} - -.border-bottom-0 { - border-bottom: 0 !important; -} - -.border-left-0 { - border-left: 0 !important; -} - -.border-primary { - border-color: #007bff !important; -} - -.border-secondary { - border-color: #6c757d !important; -} - -.border-success { - border-color: #28a745 !important; -} - -.border-info { - border-color: #17a2b8 !important; -} - -.border-warning { - border-color: #ffc107 !important; -} - -.border-danger { - border-color: #dc3545 !important; -} - -.border-light { - border-color: #f8f9fa !important; -} - -.border-dark { - border-color: #343a40 !important; -} - -.border-white { - border-color: #fff !important; -} - -.rounded-sm { - border-radius: 0.2rem !important; -} - -.rounded { - border-radius: 0.25rem !important; -} - -.rounded-top { - border-top-left-radius: 0.25rem !important; - border-top-right-radius: 0.25rem !important; -} - -.rounded-right { - border-top-right-radius: 0.25rem !important; - border-bottom-right-radius: 0.25rem !important; -} - -.rounded-bottom { - border-bottom-right-radius: 0.25rem !important; - border-bottom-left-radius: 0.25rem !important; -} - -.rounded-left { - border-top-left-radius: 0.25rem !important; - border-bottom-left-radius: 0.25rem !important; -} - -.rounded-lg { - border-radius: 0.3rem !important; -} - -.rounded-circle { - border-radius: 50% !important; -} - -.rounded-pill { - border-radius: 50rem !important; -} - -.rounded-0 { - border-radius: 0 !important; -} - -.clearfix::after { - display: block; - clear: both; - content: ""; -} - -.d-none { - display: none !important; -} - -.d-inline { - display: inline !important; -} - -.d-inline-block { - display: inline-block !important; -} - -.d-block { - display: block !important; -} - -.d-table { - display: table !important; -} - -.d-table-row { - display: table-row !important; -} - -.d-table-cell { - display: table-cell !important; -} - -.d-flex { - display: -ms-flexbox !important; - display: flex !important; -} - -.d-inline-flex { - display: -ms-inline-flexbox !important; - display: inline-flex !important; -} - -@media (min-width: 576px) { - .d-sm-none { - display: none !important; - } - .d-sm-inline { - display: inline !important; - } - .d-sm-inline-block { - display: inline-block !important; - } - .d-sm-block { - display: block !important; - } - .d-sm-table { - display: table !important; - } - .d-sm-table-row { - display: table-row !important; - } - .d-sm-table-cell { - display: table-cell !important; - } - .d-sm-flex { - display: -ms-flexbox !important; - display: flex !important; - } - .d-sm-inline-flex { - display: -ms-inline-flexbox !important; - display: inline-flex !important; - } -} - -@media (min-width: 768px) { - .d-md-none { - display: none !important; - } - .d-md-inline { - display: inline !important; - } - .d-md-inline-block { - display: inline-block !important; - } - .d-md-block { - display: block !important; - } - .d-md-table { - display: table !important; - } - .d-md-table-row { - display: table-row !important; - } - .d-md-table-cell { - display: table-cell !important; - } - .d-md-flex { - display: -ms-flexbox !important; - display: flex !important; - } - .d-md-inline-flex { - display: -ms-inline-flexbox !important; - display: inline-flex !important; - } -} - -@media (min-width: 992px) { - .d-lg-none { - display: none !important; - } - .d-lg-inline { - display: inline !important; - } - .d-lg-inline-block { - display: inline-block !important; - } - .d-lg-block { - display: block !important; - } - .d-lg-table { - display: table !important; - } - .d-lg-table-row { - display: table-row !important; - } - .d-lg-table-cell { - display: table-cell !important; - } - .d-lg-flex { - display: -ms-flexbox !important; - display: flex !important; - } - .d-lg-inline-flex { - display: -ms-inline-flexbox !important; - display: inline-flex !important; - } -} - -@media (min-width: 1200px) { - .d-xl-none { - display: none !important; - } - .d-xl-inline { - display: inline !important; - } - .d-xl-inline-block { - display: inline-block !important; - } - .d-xl-block { - display: block !important; - } - .d-xl-table { - display: table !important; - } - .d-xl-table-row { - display: table-row !important; - } - .d-xl-table-cell { - display: table-cell !important; - } - .d-xl-flex { - display: -ms-flexbox !important; - display: flex !important; - } - .d-xl-inline-flex { - display: -ms-inline-flexbox !important; - display: inline-flex !important; - } -} - -@media print { - .d-print-none { - display: none !important; - } - .d-print-inline { - display: inline !important; - } - .d-print-inline-block { - display: inline-block !important; - } - .d-print-block { - display: block !important; - } - .d-print-table { - display: table !important; - } - .d-print-table-row { - display: table-row !important; - } - .d-print-table-cell { - display: table-cell !important; - } - .d-print-flex { - display: -ms-flexbox !important; - display: flex !important; - } - .d-print-inline-flex { - display: -ms-inline-flexbox !important; - display: inline-flex !important; - } -} - -.embed-responsive { - position: relative; - display: block; - width: 100%; - padding: 0; - overflow: hidden; -} - -.embed-responsive::before { - display: block; - content: ""; -} - -.embed-responsive .embed-responsive-item, -.embed-responsive iframe, -.embed-responsive embed, -.embed-responsive object, -.embed-responsive video { - position: absolute; - top: 0; - bottom: 0; - left: 0; - width: 100%; - height: 100%; - border: 0; -} - -.embed-responsive-21by9::before { - padding-top: 42.857143%; -} - -.embed-responsive-16by9::before { - padding-top: 56.25%; -} - -.embed-responsive-4by3::before { - padding-top: 75%; -} - -.embed-responsive-1by1::before { - padding-top: 100%; -} - -.flex-row { - -ms-flex-direction: row !important; - flex-direction: row !important; -} - -.flex-column { - -ms-flex-direction: column !important; - flex-direction: column !important; -} - -.flex-row-reverse { - -ms-flex-direction: row-reverse !important; - flex-direction: row-reverse !important; -} - -.flex-column-reverse { - -ms-flex-direction: column-reverse !important; - flex-direction: column-reverse !important; -} - -.flex-wrap { - -ms-flex-wrap: wrap !important; - flex-wrap: wrap !important; -} - -.flex-nowrap { - -ms-flex-wrap: nowrap !important; - flex-wrap: nowrap !important; -} - -.flex-wrap-reverse { - -ms-flex-wrap: wrap-reverse !important; - flex-wrap: wrap-reverse !important; -} - -.flex-fill { - -ms-flex: 1 1 auto !important; - flex: 1 1 auto !important; -} - -.flex-grow-0 { - -ms-flex-positive: 0 !important; - flex-grow: 0 !important; -} - -.flex-grow-1 { - -ms-flex-positive: 1 !important; - flex-grow: 1 !important; -} - -.flex-shrink-0 { - -ms-flex-negative: 0 !important; - flex-shrink: 0 !important; -} - -.flex-shrink-1 { - -ms-flex-negative: 1 !important; - flex-shrink: 1 !important; -} - -.justify-content-start { - -ms-flex-pack: start !important; - justify-content: flex-start !important; -} - -.justify-content-end { - -ms-flex-pack: end !important; - justify-content: flex-end !important; -} - -.justify-content-center { - -ms-flex-pack: center !important; - justify-content: center !important; -} - -.justify-content-between { - -ms-flex-pack: justify !important; - justify-content: space-between !important; -} - -.justify-content-around { - -ms-flex-pack: distribute !important; - justify-content: space-around !important; -} - -.align-items-start { - -ms-flex-align: start !important; - align-items: flex-start !important; -} - -.align-items-end { - -ms-flex-align: end !important; - align-items: flex-end !important; -} - -.align-items-center { - -ms-flex-align: center !important; - align-items: center !important; -} - -.align-items-baseline { - -ms-flex-align: baseline !important; - align-items: baseline !important; -} - -.align-items-stretch { - -ms-flex-align: stretch !important; - align-items: stretch !important; -} - -.align-content-start { - -ms-flex-line-pack: start !important; - align-content: flex-start !important; -} - -.align-content-end { - -ms-flex-line-pack: end !important; - align-content: flex-end !important; -} - -.align-content-center { - -ms-flex-line-pack: center !important; - align-content: center !important; -} - -.align-content-between { - -ms-flex-line-pack: justify !important; - align-content: space-between !important; -} - -.align-content-around { - -ms-flex-line-pack: distribute !important; - align-content: space-around !important; -} - -.align-content-stretch { - -ms-flex-line-pack: stretch !important; - align-content: stretch !important; -} - -.align-self-auto { - -ms-flex-item-align: auto !important; - align-self: auto !important; -} - -.align-self-start { - -ms-flex-item-align: start !important; - align-self: flex-start !important; -} - -.align-self-end { - -ms-flex-item-align: end !important; - align-self: flex-end !important; -} - -.align-self-center { - -ms-flex-item-align: center !important; - align-self: center !important; -} - -.align-self-baseline { - -ms-flex-item-align: baseline !important; - align-self: baseline !important; -} - -.align-self-stretch { - -ms-flex-item-align: stretch !important; - align-self: stretch !important; -} - -@media (min-width: 576px) { - .flex-sm-row { - -ms-flex-direction: row !important; - flex-direction: row !important; - } - .flex-sm-column { - -ms-flex-direction: column !important; - flex-direction: column !important; - } - .flex-sm-row-reverse { - -ms-flex-direction: row-reverse !important; - flex-direction: row-reverse !important; - } - .flex-sm-column-reverse { - -ms-flex-direction: column-reverse !important; - flex-direction: column-reverse !important; - } - .flex-sm-wrap { - -ms-flex-wrap: wrap !important; - flex-wrap: wrap !important; - } - .flex-sm-nowrap { - -ms-flex-wrap: nowrap !important; - flex-wrap: nowrap !important; - } - .flex-sm-wrap-reverse { - -ms-flex-wrap: wrap-reverse !important; - flex-wrap: wrap-reverse !important; - } - .flex-sm-fill { - -ms-flex: 1 1 auto !important; - flex: 1 1 auto !important; - } - .flex-sm-grow-0 { - -ms-flex-positive: 0 !important; - flex-grow: 0 !important; - } - .flex-sm-grow-1 { - -ms-flex-positive: 1 !important; - flex-grow: 1 !important; - } - .flex-sm-shrink-0 { - -ms-flex-negative: 0 !important; - flex-shrink: 0 !important; - } - .flex-sm-shrink-1 { - -ms-flex-negative: 1 !important; - flex-shrink: 1 !important; - } - .justify-content-sm-start { - -ms-flex-pack: start !important; - justify-content: flex-start !important; - } - .justify-content-sm-end { - -ms-flex-pack: end !important; - justify-content: flex-end !important; - } - .justify-content-sm-center { - -ms-flex-pack: center !important; - justify-content: center !important; - } - .justify-content-sm-between { - -ms-flex-pack: justify !important; - justify-content: space-between !important; - } - .justify-content-sm-around { - -ms-flex-pack: distribute !important; - justify-content: space-around !important; - } - .align-items-sm-start { - -ms-flex-align: start !important; - align-items: flex-start !important; - } - .align-items-sm-end { - -ms-flex-align: end !important; - align-items: flex-end !important; - } - .align-items-sm-center { - -ms-flex-align: center !important; - align-items: center !important; - } - .align-items-sm-baseline { - -ms-flex-align: baseline !important; - align-items: baseline !important; - } - .align-items-sm-stretch { - -ms-flex-align: stretch !important; - align-items: stretch !important; - } - .align-content-sm-start { - -ms-flex-line-pack: start !important; - align-content: flex-start !important; - } - .align-content-sm-end { - -ms-flex-line-pack: end !important; - align-content: flex-end !important; - } - .align-content-sm-center { - -ms-flex-line-pack: center !important; - align-content: center !important; - } - .align-content-sm-between { - -ms-flex-line-pack: justify !important; - align-content: space-between !important; - } - .align-content-sm-around { - -ms-flex-line-pack: distribute !important; - align-content: space-around !important; - } - .align-content-sm-stretch { - -ms-flex-line-pack: stretch !important; - align-content: stretch !important; - } - .align-self-sm-auto { - -ms-flex-item-align: auto !important; - align-self: auto !important; - } - .align-self-sm-start { - -ms-flex-item-align: start !important; - align-self: flex-start !important; - } - .align-self-sm-end { - -ms-flex-item-align: end !important; - align-self: flex-end !important; - } - .align-self-sm-center { - -ms-flex-item-align: center !important; - align-self: center !important; - } - .align-self-sm-baseline { - -ms-flex-item-align: baseline !important; - align-self: baseline !important; - } - .align-self-sm-stretch { - -ms-flex-item-align: stretch !important; - align-self: stretch !important; - } -} - -@media (min-width: 768px) { - .flex-md-row { - -ms-flex-direction: row !important; - flex-direction: row !important; - } - .flex-md-column { - -ms-flex-direction: column !important; - flex-direction: column !important; - } - .flex-md-row-reverse { - -ms-flex-direction: row-reverse !important; - flex-direction: row-reverse !important; - } - .flex-md-column-reverse { - -ms-flex-direction: column-reverse !important; - flex-direction: column-reverse !important; - } - .flex-md-wrap { - -ms-flex-wrap: wrap !important; - flex-wrap: wrap !important; - } - .flex-md-nowrap { - -ms-flex-wrap: nowrap !important; - flex-wrap: nowrap !important; - } - .flex-md-wrap-reverse { - -ms-flex-wrap: wrap-reverse !important; - flex-wrap: wrap-reverse !important; - } - .flex-md-fill { - -ms-flex: 1 1 auto !important; - flex: 1 1 auto !important; - } - .flex-md-grow-0 { - -ms-flex-positive: 0 !important; - flex-grow: 0 !important; - } - .flex-md-grow-1 { - -ms-flex-positive: 1 !important; - flex-grow: 1 !important; - } - .flex-md-shrink-0 { - -ms-flex-negative: 0 !important; - flex-shrink: 0 !important; - } - .flex-md-shrink-1 { - -ms-flex-negative: 1 !important; - flex-shrink: 1 !important; - } - .justify-content-md-start { - -ms-flex-pack: start !important; - justify-content: flex-start !important; - } - .justify-content-md-end { - -ms-flex-pack: end !important; - justify-content: flex-end !important; - } - .justify-content-md-center { - -ms-flex-pack: center !important; - justify-content: center !important; - } - .justify-content-md-between { - -ms-flex-pack: justify !important; - justify-content: space-between !important; - } - .justify-content-md-around { - -ms-flex-pack: distribute !important; - justify-content: space-around !important; - } - .align-items-md-start { - -ms-flex-align: start !important; - align-items: flex-start !important; - } - .align-items-md-end { - -ms-flex-align: end !important; - align-items: flex-end !important; - } - .align-items-md-center { - -ms-flex-align: center !important; - align-items: center !important; - } - .align-items-md-baseline { - -ms-flex-align: baseline !important; - align-items: baseline !important; - } - .align-items-md-stretch { - -ms-flex-align: stretch !important; - align-items: stretch !important; - } - .align-content-md-start { - -ms-flex-line-pack: start !important; - align-content: flex-start !important; - } - .align-content-md-end { - -ms-flex-line-pack: end !important; - align-content: flex-end !important; - } - .align-content-md-center { - -ms-flex-line-pack: center !important; - align-content: center !important; - } - .align-content-md-between { - -ms-flex-line-pack: justify !important; - align-content: space-between !important; - } - .align-content-md-around { - -ms-flex-line-pack: distribute !important; - align-content: space-around !important; - } - .align-content-md-stretch { - -ms-flex-line-pack: stretch !important; - align-content: stretch !important; - } - .align-self-md-auto { - -ms-flex-item-align: auto !important; - align-self: auto !important; - } - .align-self-md-start { - -ms-flex-item-align: start !important; - align-self: flex-start !important; - } - .align-self-md-end { - -ms-flex-item-align: end !important; - align-self: flex-end !important; - } - .align-self-md-center { - -ms-flex-item-align: center !important; - align-self: center !important; - } - .align-self-md-baseline { - -ms-flex-item-align: baseline !important; - align-self: baseline !important; - } - .align-self-md-stretch { - -ms-flex-item-align: stretch !important; - align-self: stretch !important; - } -} - -@media (min-width: 992px) { - .flex-lg-row { - -ms-flex-direction: row !important; - flex-direction: row !important; - } - .flex-lg-column { - -ms-flex-direction: column !important; - flex-direction: column !important; - } - .flex-lg-row-reverse { - -ms-flex-direction: row-reverse !important; - flex-direction: row-reverse !important; - } - .flex-lg-column-reverse { - -ms-flex-direction: column-reverse !important; - flex-direction: column-reverse !important; - } - .flex-lg-wrap { - -ms-flex-wrap: wrap !important; - flex-wrap: wrap !important; - } - .flex-lg-nowrap { - -ms-flex-wrap: nowrap !important; - flex-wrap: nowrap !important; - } - .flex-lg-wrap-reverse { - -ms-flex-wrap: wrap-reverse !important; - flex-wrap: wrap-reverse !important; - } - .flex-lg-fill { - -ms-flex: 1 1 auto !important; - flex: 1 1 auto !important; - } - .flex-lg-grow-0 { - -ms-flex-positive: 0 !important; - flex-grow: 0 !important; - } - .flex-lg-grow-1 { - -ms-flex-positive: 1 !important; - flex-grow: 1 !important; - } - .flex-lg-shrink-0 { - -ms-flex-negative: 0 !important; - flex-shrink: 0 !important; - } - .flex-lg-shrink-1 { - -ms-flex-negative: 1 !important; - flex-shrink: 1 !important; - } - .justify-content-lg-start { - -ms-flex-pack: start !important; - justify-content: flex-start !important; - } - .justify-content-lg-end { - -ms-flex-pack: end !important; - justify-content: flex-end !important; - } - .justify-content-lg-center { - -ms-flex-pack: center !important; - justify-content: center !important; - } - .justify-content-lg-between { - -ms-flex-pack: justify !important; - justify-content: space-between !important; - } - .justify-content-lg-around { - -ms-flex-pack: distribute !important; - justify-content: space-around !important; - } - .align-items-lg-start { - -ms-flex-align: start !important; - align-items: flex-start !important; - } - .align-items-lg-end { - -ms-flex-align: end !important; - align-items: flex-end !important; - } - .align-items-lg-center { - -ms-flex-align: center !important; - align-items: center !important; - } - .align-items-lg-baseline { - -ms-flex-align: baseline !important; - align-items: baseline !important; - } - .align-items-lg-stretch { - -ms-flex-align: stretch !important; - align-items: stretch !important; - } - .align-content-lg-start { - -ms-flex-line-pack: start !important; - align-content: flex-start !important; - } - .align-content-lg-end { - -ms-flex-line-pack: end !important; - align-content: flex-end !important; - } - .align-content-lg-center { - -ms-flex-line-pack: center !important; - align-content: center !important; - } - .align-content-lg-between { - -ms-flex-line-pack: justify !important; - align-content: space-between !important; - } - .align-content-lg-around { - -ms-flex-line-pack: distribute !important; - align-content: space-around !important; - } - .align-content-lg-stretch { - -ms-flex-line-pack: stretch !important; - align-content: stretch !important; - } - .align-self-lg-auto { - -ms-flex-item-align: auto !important; - align-self: auto !important; - } - .align-self-lg-start { - -ms-flex-item-align: start !important; - align-self: flex-start !important; - } - .align-self-lg-end { - -ms-flex-item-align: end !important; - align-self: flex-end !important; - } - .align-self-lg-center { - -ms-flex-item-align: center !important; - align-self: center !important; - } - .align-self-lg-baseline { - -ms-flex-item-align: baseline !important; - align-self: baseline !important; - } - .align-self-lg-stretch { - -ms-flex-item-align: stretch !important; - align-self: stretch !important; - } -} - -@media (min-width: 1200px) { - .flex-xl-row { - -ms-flex-direction: row !important; - flex-direction: row !important; - } - .flex-xl-column { - -ms-flex-direction: column !important; - flex-direction: column !important; - } - .flex-xl-row-reverse { - -ms-flex-direction: row-reverse !important; - flex-direction: row-reverse !important; - } - .flex-xl-column-reverse { - -ms-flex-direction: column-reverse !important; - flex-direction: column-reverse !important; - } - .flex-xl-wrap { - -ms-flex-wrap: wrap !important; - flex-wrap: wrap !important; - } - .flex-xl-nowrap { - -ms-flex-wrap: nowrap !important; - flex-wrap: nowrap !important; - } - .flex-xl-wrap-reverse { - -ms-flex-wrap: wrap-reverse !important; - flex-wrap: wrap-reverse !important; - } - .flex-xl-fill { - -ms-flex: 1 1 auto !important; - flex: 1 1 auto !important; - } - .flex-xl-grow-0 { - -ms-flex-positive: 0 !important; - flex-grow: 0 !important; - } - .flex-xl-grow-1 { - -ms-flex-positive: 1 !important; - flex-grow: 1 !important; - } - .flex-xl-shrink-0 { - -ms-flex-negative: 0 !important; - flex-shrink: 0 !important; - } - .flex-xl-shrink-1 { - -ms-flex-negative: 1 !important; - flex-shrink: 1 !important; - } - .justify-content-xl-start { - -ms-flex-pack: start !important; - justify-content: flex-start !important; - } - .justify-content-xl-end { - -ms-flex-pack: end !important; - justify-content: flex-end !important; - } - .justify-content-xl-center { - -ms-flex-pack: center !important; - justify-content: center !important; - } - .justify-content-xl-between { - -ms-flex-pack: justify !important; - justify-content: space-between !important; - } - .justify-content-xl-around { - -ms-flex-pack: distribute !important; - justify-content: space-around !important; - } - .align-items-xl-start { - -ms-flex-align: start !important; - align-items: flex-start !important; - } - .align-items-xl-end { - -ms-flex-align: end !important; - align-items: flex-end !important; - } - .align-items-xl-center { - -ms-flex-align: center !important; - align-items: center !important; - } - .align-items-xl-baseline { - -ms-flex-align: baseline !important; - align-items: baseline !important; - } - .align-items-xl-stretch { - -ms-flex-align: stretch !important; - align-items: stretch !important; - } - .align-content-xl-start { - -ms-flex-line-pack: start !important; - align-content: flex-start !important; - } - .align-content-xl-end { - -ms-flex-line-pack: end !important; - align-content: flex-end !important; - } - .align-content-xl-center { - -ms-flex-line-pack: center !important; - align-content: center !important; - } - .align-content-xl-between { - -ms-flex-line-pack: justify !important; - align-content: space-between !important; - } - .align-content-xl-around { - -ms-flex-line-pack: distribute !important; - align-content: space-around !important; - } - .align-content-xl-stretch { - -ms-flex-line-pack: stretch !important; - align-content: stretch !important; - } - .align-self-xl-auto { - -ms-flex-item-align: auto !important; - align-self: auto !important; - } - .align-self-xl-start { - -ms-flex-item-align: start !important; - align-self: flex-start !important; - } - .align-self-xl-end { - -ms-flex-item-align: end !important; - align-self: flex-end !important; - } - .align-self-xl-center { - -ms-flex-item-align: center !important; - align-self: center !important; - } - .align-self-xl-baseline { - -ms-flex-item-align: baseline !important; - align-self: baseline !important; - } - .align-self-xl-stretch { - -ms-flex-item-align: stretch !important; - align-self: stretch !important; - } -} - -.float-left { - float: left !important; -} - -.float-right { - float: right !important; -} - -.float-none { - float: none !important; -} - -@media (min-width: 576px) { - .float-sm-left { - float: left !important; - } - .float-sm-right { - float: right !important; - } - .float-sm-none { - float: none !important; - } -} - -@media (min-width: 768px) { - .float-md-left { - float: left !important; - } - .float-md-right { - float: right !important; - } - .float-md-none { - float: none !important; - } -} - -@media (min-width: 992px) { - .float-lg-left { - float: left !important; - } - .float-lg-right { - float: right !important; - } - .float-lg-none { - float: none !important; - } -} - -@media (min-width: 1200px) { - .float-xl-left { - float: left !important; - } - .float-xl-right { - float: right !important; - } - .float-xl-none { - float: none !important; - } -} - -.overflow-auto { - overflow: auto !important; -} - -.overflow-hidden { - overflow: hidden !important; -} - -.position-static { - position: static !important; -} - -.position-relative { - position: relative !important; -} - -.position-absolute { - position: absolute !important; -} - -.position-fixed { - position: fixed !important; -} - -.position-sticky { - position: -webkit-sticky !important; - position: sticky !important; -} - -.fixed-top { - position: fixed; - top: 0; - right: 0; - left: 0; - z-index: 1030; -} - -.fixed-bottom { - position: fixed; - right: 0; - bottom: 0; - left: 0; - z-index: 1030; -} - -@supports ((position: -webkit-sticky) or (position: sticky)) { - .sticky-top { - position: -webkit-sticky; - position: sticky; - top: 0; - z-index: 1020; - } -} - -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - overflow: hidden; - clip: rect(0, 0, 0, 0); - white-space: nowrap; - border: 0; -} - -.sr-only-focusable:active, .sr-only-focusable:focus { - position: static; - width: auto; - height: auto; - overflow: visible; - clip: auto; - white-space: normal; -} - -.shadow-sm { - box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important; -} - -.shadow { - box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; -} - -.shadow-lg { - box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important; -} - -.shadow-none { - box-shadow: none !important; -} - -.w-25 { - width: 25% !important; -} - -.w-50 { - width: 50% !important; -} - -.w-75 { - width: 75% !important; -} - -.w-100 { - width: 100% !important; -} - -.w-auto { - width: auto !important; -} - -.h-25 { - height: 25% !important; -} - -.h-50 { - height: 50% !important; -} - -.h-75 { - height: 75% !important; -} - -.h-100 { - height: 100% !important; -} - -.h-auto { - height: auto !important; -} - -.mw-100 { - max-width: 100% !important; -} - -.mh-100 { - max-height: 100% !important; -} - -.min-vw-100 { - min-width: 100vw !important; -} - -.min-vh-100 { - min-height: 100vh !important; -} - -.vw-100 { - width: 100vw !important; -} - -.vh-100 { - height: 100vh !important; -} - -.stretched-link::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1; - pointer-events: auto; - content: ""; - background-color: rgba(0, 0, 0, 0); -} - -.m-0 { - margin: 0 !important; -} - -.mt-0, -.my-0 { - margin-top: 0 !important; -} - -.mr-0, -.mx-0 { - margin-right: 0 !important; -} - -.mb-0, -.my-0 { - margin-bottom: 0 !important; -} - -.ml-0, -.mx-0 { - margin-left: 0 !important; -} - -.m-1 { - margin: 0.25rem !important; -} - -.mt-1, -.my-1 { - margin-top: 0.25rem !important; -} - -.mr-1, -.mx-1 { - margin-right: 0.25rem !important; -} - -.mb-1, -.my-1 { - margin-bottom: 0.25rem !important; -} - -.ml-1, -.mx-1 { - margin-left: 0.25rem !important; -} - -.m-2 { - margin: 0.5rem !important; -} - -.mt-2, -.my-2 { - margin-top: 0.5rem !important; -} - -.mr-2, -.mx-2 { - margin-right: 0.5rem !important; -} - -.mb-2, -.my-2 { - margin-bottom: 0.5rem !important; -} - -.ml-2, -.mx-2 { - margin-left: 0.5rem !important; -} - -.m-3 { - margin: 1rem !important; -} - -.mt-3, -.my-3 { - margin-top: 1rem !important; -} - -.mr-3, -.mx-3 { - margin-right: 1rem !important; -} - -.mb-3, -.my-3 { - margin-bottom: 1rem !important; -} - -.ml-3, -.mx-3 { - margin-left: 1rem !important; -} - -.m-4 { - margin: 1.5rem !important; -} - -.mt-4, -.my-4 { - margin-top: 1.5rem !important; -} - -.mr-4, -.mx-4 { - margin-right: 1.5rem !important; -} - -.mb-4, -.my-4 { - margin-bottom: 1.5rem !important; -} - -.ml-4, -.mx-4 { - margin-left: 1.5rem !important; -} - -.m-5 { - margin: 3rem !important; -} - -.mt-5, -.my-5 { - margin-top: 3rem !important; -} - -.mr-5, -.mx-5 { - margin-right: 3rem !important; -} - -.mb-5, -.my-5 { - margin-bottom: 3rem !important; -} - -.ml-5, -.mx-5 { - margin-left: 3rem !important; -} - -.p-0 { - padding: 0 !important; -} - -.pt-0, -.py-0 { - padding-top: 0 !important; -} - -.pr-0, -.px-0 { - padding-right: 0 !important; -} - -.pb-0, -.py-0 { - padding-bottom: 0 !important; -} - -.pl-0, -.px-0 { - padding-left: 0 !important; -} - -.p-1 { - padding: 0.25rem !important; -} - -.pt-1, -.py-1 { - padding-top: 0.25rem !important; -} - -.pr-1, -.px-1 { - padding-right: 0.25rem !important; -} - -.pb-1, -.py-1 { - padding-bottom: 0.25rem !important; -} - -.pl-1, -.px-1 { - padding-left: 0.25rem !important; -} - -.p-2 { - padding: 0.5rem !important; -} - -.pt-2, -.py-2 { - padding-top: 0.5rem !important; -} - -.pr-2, -.px-2 { - padding-right: 0.5rem !important; -} - -.pb-2, -.py-2 { - padding-bottom: 0.5rem !important; -} - -.pl-2, -.px-2 { - padding-left: 0.5rem !important; -} - -.p-3 { - padding: 1rem !important; -} - -.pt-3, -.py-3 { - padding-top: 1rem !important; -} - -.pr-3, -.px-3 { - padding-right: 1rem !important; -} - -.pb-3, -.py-3 { - padding-bottom: 1rem !important; -} - -.pl-3, -.px-3 { - padding-left: 1rem !important; -} - -.p-4 { - padding: 1.5rem !important; -} - -.pt-4, -.py-4 { - padding-top: 1.5rem !important; -} - -.pr-4, -.px-4 { - padding-right: 1.5rem !important; -} - -.pb-4, -.py-4 { - padding-bottom: 1.5rem !important; -} - -.pl-4, -.px-4 { - padding-left: 1.5rem !important; -} - -.p-5 { - padding: 3rem !important; -} - -.pt-5, -.py-5 { - padding-top: 3rem !important; -} - -.pr-5, -.px-5 { - padding-right: 3rem !important; -} - -.pb-5, -.py-5 { - padding-bottom: 3rem !important; -} - -.pl-5, -.px-5 { - padding-left: 3rem !important; -} - -.m-n1 { - margin: -0.25rem !important; -} - -.mt-n1, -.my-n1 { - margin-top: -0.25rem !important; -} - -.mr-n1, -.mx-n1 { - margin-right: -0.25rem !important; -} - -.mb-n1, -.my-n1 { - margin-bottom: -0.25rem !important; -} - -.ml-n1, -.mx-n1 { - margin-left: -0.25rem !important; -} - -.m-n2 { - margin: -0.5rem !important; -} - -.mt-n2, -.my-n2 { - margin-top: -0.5rem !important; -} - -.mr-n2, -.mx-n2 { - margin-right: -0.5rem !important; -} - -.mb-n2, -.my-n2 { - margin-bottom: -0.5rem !important; -} - -.ml-n2, -.mx-n2 { - margin-left: -0.5rem !important; -} - -.m-n3 { - margin: -1rem !important; -} - -.mt-n3, -.my-n3 { - margin-top: -1rem !important; -} - -.mr-n3, -.mx-n3 { - margin-right: -1rem !important; -} - -.mb-n3, -.my-n3 { - margin-bottom: -1rem !important; -} - -.ml-n3, -.mx-n3 { - margin-left: -1rem !important; -} - -.m-n4 { - margin: -1.5rem !important; -} - -.mt-n4, -.my-n4 { - margin-top: -1.5rem !important; -} - -.mr-n4, -.mx-n4 { - margin-right: -1.5rem !important; -} - -.mb-n4, -.my-n4 { - margin-bottom: -1.5rem !important; -} - -.ml-n4, -.mx-n4 { - margin-left: -1.5rem !important; -} - -.m-n5 { - margin: -3rem !important; -} - -.mt-n5, -.my-n5 { - margin-top: -3rem !important; -} - -.mr-n5, -.mx-n5 { - margin-right: -3rem !important; -} - -.mb-n5, -.my-n5 { - margin-bottom: -3rem !important; -} - -.ml-n5, -.mx-n5 { - margin-left: -3rem !important; -} - -.m-auto { - margin: auto !important; -} - -.mt-auto, -.my-auto { - margin-top: auto !important; -} - -.mr-auto, -.mx-auto { - margin-right: auto !important; -} - -.mb-auto, -.my-auto { - margin-bottom: auto !important; -} - -.ml-auto, -.mx-auto { - margin-left: auto !important; -} - -@media (min-width: 576px) { - .m-sm-0 { - margin: 0 !important; - } - .mt-sm-0, - .my-sm-0 { - margin-top: 0 !important; - } - .mr-sm-0, - .mx-sm-0 { - margin-right: 0 !important; - } - .mb-sm-0, - .my-sm-0 { - margin-bottom: 0 !important; - } - .ml-sm-0, - .mx-sm-0 { - margin-left: 0 !important; - } - .m-sm-1 { - margin: 0.25rem !important; - } - .mt-sm-1, - .my-sm-1 { - margin-top: 0.25rem !important; - } - .mr-sm-1, - .mx-sm-1 { - margin-right: 0.25rem !important; - } - .mb-sm-1, - .my-sm-1 { - margin-bottom: 0.25rem !important; - } - .ml-sm-1, - .mx-sm-1 { - margin-left: 0.25rem !important; - } - .m-sm-2 { - margin: 0.5rem !important; - } - .mt-sm-2, - .my-sm-2 { - margin-top: 0.5rem !important; - } - .mr-sm-2, - .mx-sm-2 { - margin-right: 0.5rem !important; - } - .mb-sm-2, - .my-sm-2 { - margin-bottom: 0.5rem !important; - } - .ml-sm-2, - .mx-sm-2 { - margin-left: 0.5rem !important; - } - .m-sm-3 { - margin: 1rem !important; - } - .mt-sm-3, - .my-sm-3 { - margin-top: 1rem !important; - } - .mr-sm-3, - .mx-sm-3 { - margin-right: 1rem !important; - } - .mb-sm-3, - .my-sm-3 { - margin-bottom: 1rem !important; - } - .ml-sm-3, - .mx-sm-3 { - margin-left: 1rem !important; - } - .m-sm-4 { - margin: 1.5rem !important; - } - .mt-sm-4, - .my-sm-4 { - margin-top: 1.5rem !important; - } - .mr-sm-4, - .mx-sm-4 { - margin-right: 1.5rem !important; - } - .mb-sm-4, - .my-sm-4 { - margin-bottom: 1.5rem !important; - } - .ml-sm-4, - .mx-sm-4 { - margin-left: 1.5rem !important; - } - .m-sm-5 { - margin: 3rem !important; - } - .mt-sm-5, - .my-sm-5 { - margin-top: 3rem !important; - } - .mr-sm-5, - .mx-sm-5 { - margin-right: 3rem !important; - } - .mb-sm-5, - .my-sm-5 { - margin-bottom: 3rem !important; - } - .ml-sm-5, - .mx-sm-5 { - margin-left: 3rem !important; - } - .p-sm-0 { - padding: 0 !important; - } - .pt-sm-0, - .py-sm-0 { - padding-top: 0 !important; - } - .pr-sm-0, - .px-sm-0 { - padding-right: 0 !important; - } - .pb-sm-0, - .py-sm-0 { - padding-bottom: 0 !important; - } - .pl-sm-0, - .px-sm-0 { - padding-left: 0 !important; - } - .p-sm-1 { - padding: 0.25rem !important; - } - .pt-sm-1, - .py-sm-1 { - padding-top: 0.25rem !important; - } - .pr-sm-1, - .px-sm-1 { - padding-right: 0.25rem !important; - } - .pb-sm-1, - .py-sm-1 { - padding-bottom: 0.25rem !important; - } - .pl-sm-1, - .px-sm-1 { - padding-left: 0.25rem !important; - } - .p-sm-2 { - padding: 0.5rem !important; - } - .pt-sm-2, - .py-sm-2 { - padding-top: 0.5rem !important; - } - .pr-sm-2, - .px-sm-2 { - padding-right: 0.5rem !important; - } - .pb-sm-2, - .py-sm-2 { - padding-bottom: 0.5rem !important; - } - .pl-sm-2, - .px-sm-2 { - padding-left: 0.5rem !important; - } - .p-sm-3 { - padding: 1rem !important; - } - .pt-sm-3, - .py-sm-3 { - padding-top: 1rem !important; - } - .pr-sm-3, - .px-sm-3 { - padding-right: 1rem !important; - } - .pb-sm-3, - .py-sm-3 { - padding-bottom: 1rem !important; - } - .pl-sm-3, - .px-sm-3 { - padding-left: 1rem !important; - } - .p-sm-4 { - padding: 1.5rem !important; - } - .pt-sm-4, - .py-sm-4 { - padding-top: 1.5rem !important; - } - .pr-sm-4, - .px-sm-4 { - padding-right: 1.5rem !important; - } - .pb-sm-4, - .py-sm-4 { - padding-bottom: 1.5rem !important; - } - .pl-sm-4, - .px-sm-4 { - padding-left: 1.5rem !important; - } - .p-sm-5 { - padding: 3rem !important; - } - .pt-sm-5, - .py-sm-5 { - padding-top: 3rem !important; - } - .pr-sm-5, - .px-sm-5 { - padding-right: 3rem !important; - } - .pb-sm-5, - .py-sm-5 { - padding-bottom: 3rem !important; - } - .pl-sm-5, - .px-sm-5 { - padding-left: 3rem !important; - } - .m-sm-n1 { - margin: -0.25rem !important; - } - .mt-sm-n1, - .my-sm-n1 { - margin-top: -0.25rem !important; - } - .mr-sm-n1, - .mx-sm-n1 { - margin-right: -0.25rem !important; - } - .mb-sm-n1, - .my-sm-n1 { - margin-bottom: -0.25rem !important; - } - .ml-sm-n1, - .mx-sm-n1 { - margin-left: -0.25rem !important; - } - .m-sm-n2 { - margin: -0.5rem !important; - } - .mt-sm-n2, - .my-sm-n2 { - margin-top: -0.5rem !important; - } - .mr-sm-n2, - .mx-sm-n2 { - margin-right: -0.5rem !important; - } - .mb-sm-n2, - .my-sm-n2 { - margin-bottom: -0.5rem !important; - } - .ml-sm-n2, - .mx-sm-n2 { - margin-left: -0.5rem !important; - } - .m-sm-n3 { - margin: -1rem !important; - } - .mt-sm-n3, - .my-sm-n3 { - margin-top: -1rem !important; - } - .mr-sm-n3, - .mx-sm-n3 { - margin-right: -1rem !important; - } - .mb-sm-n3, - .my-sm-n3 { - margin-bottom: -1rem !important; - } - .ml-sm-n3, - .mx-sm-n3 { - margin-left: -1rem !important; - } - .m-sm-n4 { - margin: -1.5rem !important; - } - .mt-sm-n4, - .my-sm-n4 { - margin-top: -1.5rem !important; - } - .mr-sm-n4, - .mx-sm-n4 { - margin-right: -1.5rem !important; - } - .mb-sm-n4, - .my-sm-n4 { - margin-bottom: -1.5rem !important; - } - .ml-sm-n4, - .mx-sm-n4 { - margin-left: -1.5rem !important; - } - .m-sm-n5 { - margin: -3rem !important; - } - .mt-sm-n5, - .my-sm-n5 { - margin-top: -3rem !important; - } - .mr-sm-n5, - .mx-sm-n5 { - margin-right: -3rem !important; - } - .mb-sm-n5, - .my-sm-n5 { - margin-bottom: -3rem !important; - } - .ml-sm-n5, - .mx-sm-n5 { - margin-left: -3rem !important; - } - .m-sm-auto { - margin: auto !important; - } - .mt-sm-auto, - .my-sm-auto { - margin-top: auto !important; - } - .mr-sm-auto, - .mx-sm-auto { - margin-right: auto !important; - } - .mb-sm-auto, - .my-sm-auto { - margin-bottom: auto !important; - } - .ml-sm-auto, - .mx-sm-auto { - margin-left: auto !important; - } -} - -@media (min-width: 768px) { - .m-md-0 { - margin: 0 !important; - } - .mt-md-0, - .my-md-0 { - margin-top: 0 !important; - } - .mr-md-0, - .mx-md-0 { - margin-right: 0 !important; - } - .mb-md-0, - .my-md-0 { - margin-bottom: 0 !important; - } - .ml-md-0, - .mx-md-0 { - margin-left: 0 !important; - } - .m-md-1 { - margin: 0.25rem !important; - } - .mt-md-1, - .my-md-1 { - margin-top: 0.25rem !important; - } - .mr-md-1, - .mx-md-1 { - margin-right: 0.25rem !important; - } - .mb-md-1, - .my-md-1 { - margin-bottom: 0.25rem !important; - } - .ml-md-1, - .mx-md-1 { - margin-left: 0.25rem !important; - } - .m-md-2 { - margin: 0.5rem !important; - } - .mt-md-2, - .my-md-2 { - margin-top: 0.5rem !important; - } - .mr-md-2, - .mx-md-2 { - margin-right: 0.5rem !important; - } - .mb-md-2, - .my-md-2 { - margin-bottom: 0.5rem !important; - } - .ml-md-2, - .mx-md-2 { - margin-left: 0.5rem !important; - } - .m-md-3 { - margin: 1rem !important; - } - .mt-md-3, - .my-md-3 { - margin-top: 1rem !important; - } - .mr-md-3, - .mx-md-3 { - margin-right: 1rem !important; - } - .mb-md-3, - .my-md-3 { - margin-bottom: 1rem !important; - } - .ml-md-3, - .mx-md-3 { - margin-left: 1rem !important; - } - .m-md-4 { - margin: 1.5rem !important; - } - .mt-md-4, - .my-md-4 { - margin-top: 1.5rem !important; - } - .mr-md-4, - .mx-md-4 { - margin-right: 1.5rem !important; - } - .mb-md-4, - .my-md-4 { - margin-bottom: 1.5rem !important; - } - .ml-md-4, - .mx-md-4 { - margin-left: 1.5rem !important; - } - .m-md-5 { - margin: 3rem !important; - } - .mt-md-5, - .my-md-5 { - margin-top: 3rem !important; - } - .mr-md-5, - .mx-md-5 { - margin-right: 3rem !important; - } - .mb-md-5, - .my-md-5 { - margin-bottom: 3rem !important; - } - .ml-md-5, - .mx-md-5 { - margin-left: 3rem !important; - } - .p-md-0 { - padding: 0 !important; - } - .pt-md-0, - .py-md-0 { - padding-top: 0 !important; - } - .pr-md-0, - .px-md-0 { - padding-right: 0 !important; - } - .pb-md-0, - .py-md-0 { - padding-bottom: 0 !important; - } - .pl-md-0, - .px-md-0 { - padding-left: 0 !important; - } - .p-md-1 { - padding: 0.25rem !important; - } - .pt-md-1, - .py-md-1 { - padding-top: 0.25rem !important; - } - .pr-md-1, - .px-md-1 { - padding-right: 0.25rem !important; - } - .pb-md-1, - .py-md-1 { - padding-bottom: 0.25rem !important; - } - .pl-md-1, - .px-md-1 { - padding-left: 0.25rem !important; - } - .p-md-2 { - padding: 0.5rem !important; - } - .pt-md-2, - .py-md-2 { - padding-top: 0.5rem !important; - } - .pr-md-2, - .px-md-2 { - padding-right: 0.5rem !important; - } - .pb-md-2, - .py-md-2 { - padding-bottom: 0.5rem !important; - } - .pl-md-2, - .px-md-2 { - padding-left: 0.5rem !important; - } - .p-md-3 { - padding: 1rem !important; - } - .pt-md-3, - .py-md-3 { - padding-top: 1rem !important; - } - .pr-md-3, - .px-md-3 { - padding-right: 1rem !important; - } - .pb-md-3, - .py-md-3 { - padding-bottom: 1rem !important; - } - .pl-md-3, - .px-md-3 { - padding-left: 1rem !important; - } - .p-md-4 { - padding: 1.5rem !important; - } - .pt-md-4, - .py-md-4 { - padding-top: 1.5rem !important; - } - .pr-md-4, - .px-md-4 { - padding-right: 1.5rem !important; - } - .pb-md-4, - .py-md-4 { - padding-bottom: 1.5rem !important; - } - .pl-md-4, - .px-md-4 { - padding-left: 1.5rem !important; - } - .p-md-5 { - padding: 3rem !important; - } - .pt-md-5, - .py-md-5 { - padding-top: 3rem !important; - } - .pr-md-5, - .px-md-5 { - padding-right: 3rem !important; - } - .pb-md-5, - .py-md-5 { - padding-bottom: 3rem !important; - } - .pl-md-5, - .px-md-5 { - padding-left: 3rem !important; - } - .m-md-n1 { - margin: -0.25rem !important; - } - .mt-md-n1, - .my-md-n1 { - margin-top: -0.25rem !important; - } - .mr-md-n1, - .mx-md-n1 { - margin-right: -0.25rem !important; - } - .mb-md-n1, - .my-md-n1 { - margin-bottom: -0.25rem !important; - } - .ml-md-n1, - .mx-md-n1 { - margin-left: -0.25rem !important; - } - .m-md-n2 { - margin: -0.5rem !important; - } - .mt-md-n2, - .my-md-n2 { - margin-top: -0.5rem !important; - } - .mr-md-n2, - .mx-md-n2 { - margin-right: -0.5rem !important; - } - .mb-md-n2, - .my-md-n2 { - margin-bottom: -0.5rem !important; - } - .ml-md-n2, - .mx-md-n2 { - margin-left: -0.5rem !important; - } - .m-md-n3 { - margin: -1rem !important; - } - .mt-md-n3, - .my-md-n3 { - margin-top: -1rem !important; - } - .mr-md-n3, - .mx-md-n3 { - margin-right: -1rem !important; - } - .mb-md-n3, - .my-md-n3 { - margin-bottom: -1rem !important; - } - .ml-md-n3, - .mx-md-n3 { - margin-left: -1rem !important; - } - .m-md-n4 { - margin: -1.5rem !important; - } - .mt-md-n4, - .my-md-n4 { - margin-top: -1.5rem !important; - } - .mr-md-n4, - .mx-md-n4 { - margin-right: -1.5rem !important; - } - .mb-md-n4, - .my-md-n4 { - margin-bottom: -1.5rem !important; - } - .ml-md-n4, - .mx-md-n4 { - margin-left: -1.5rem !important; - } - .m-md-n5 { - margin: -3rem !important; - } - .mt-md-n5, - .my-md-n5 { - margin-top: -3rem !important; - } - .mr-md-n5, - .mx-md-n5 { - margin-right: -3rem !important; - } - .mb-md-n5, - .my-md-n5 { - margin-bottom: -3rem !important; - } - .ml-md-n5, - .mx-md-n5 { - margin-left: -3rem !important; - } - .m-md-auto { - margin: auto !important; - } - .mt-md-auto, - .my-md-auto { - margin-top: auto !important; - } - .mr-md-auto, - .mx-md-auto { - margin-right: auto !important; - } - .mb-md-auto, - .my-md-auto { - margin-bottom: auto !important; - } - .ml-md-auto, - .mx-md-auto { - margin-left: auto !important; - } -} - -@media (min-width: 992px) { - .m-lg-0 { - margin: 0 !important; - } - .mt-lg-0, - .my-lg-0 { - margin-top: 0 !important; - } - .mr-lg-0, - .mx-lg-0 { - margin-right: 0 !important; - } - .mb-lg-0, - .my-lg-0 { - margin-bottom: 0 !important; - } - .ml-lg-0, - .mx-lg-0 { - margin-left: 0 !important; - } - .m-lg-1 { - margin: 0.25rem !important; - } - .mt-lg-1, - .my-lg-1 { - margin-top: 0.25rem !important; - } - .mr-lg-1, - .mx-lg-1 { - margin-right: 0.25rem !important; - } - .mb-lg-1, - .my-lg-1 { - margin-bottom: 0.25rem !important; - } - .ml-lg-1, - .mx-lg-1 { - margin-left: 0.25rem !important; - } - .m-lg-2 { - margin: 0.5rem !important; - } - .mt-lg-2, - .my-lg-2 { - margin-top: 0.5rem !important; - } - .mr-lg-2, - .mx-lg-2 { - margin-right: 0.5rem !important; - } - .mb-lg-2, - .my-lg-2 { - margin-bottom: 0.5rem !important; - } - .ml-lg-2, - .mx-lg-2 { - margin-left: 0.5rem !important; - } - .m-lg-3 { - margin: 1rem !important; - } - .mt-lg-3, - .my-lg-3 { - margin-top: 1rem !important; - } - .mr-lg-3, - .mx-lg-3 { - margin-right: 1rem !important; - } - .mb-lg-3, - .my-lg-3 { - margin-bottom: 1rem !important; - } - .ml-lg-3, - .mx-lg-3 { - margin-left: 1rem !important; - } - .m-lg-4 { - margin: 1.5rem !important; - } - .mt-lg-4, - .my-lg-4 { - margin-top: 1.5rem !important; - } - .mr-lg-4, - .mx-lg-4 { - margin-right: 1.5rem !important; - } - .mb-lg-4, - .my-lg-4 { - margin-bottom: 1.5rem !important; - } - .ml-lg-4, - .mx-lg-4 { - margin-left: 1.5rem !important; - } - .m-lg-5 { - margin: 3rem !important; - } - .mt-lg-5, - .my-lg-5 { - margin-top: 3rem !important; - } - .mr-lg-5, - .mx-lg-5 { - margin-right: 3rem !important; - } - .mb-lg-5, - .my-lg-5 { - margin-bottom: 3rem !important; - } - .ml-lg-5, - .mx-lg-5 { - margin-left: 3rem !important; - } - .p-lg-0 { - padding: 0 !important; - } - .pt-lg-0, - .py-lg-0 { - padding-top: 0 !important; - } - .pr-lg-0, - .px-lg-0 { - padding-right: 0 !important; - } - .pb-lg-0, - .py-lg-0 { - padding-bottom: 0 !important; - } - .pl-lg-0, - .px-lg-0 { - padding-left: 0 !important; - } - .p-lg-1 { - padding: 0.25rem !important; - } - .pt-lg-1, - .py-lg-1 { - padding-top: 0.25rem !important; - } - .pr-lg-1, - .px-lg-1 { - padding-right: 0.25rem !important; - } - .pb-lg-1, - .py-lg-1 { - padding-bottom: 0.25rem !important; - } - .pl-lg-1, - .px-lg-1 { - padding-left: 0.25rem !important; - } - .p-lg-2 { - padding: 0.5rem !important; - } - .pt-lg-2, - .py-lg-2 { - padding-top: 0.5rem !important; - } - .pr-lg-2, - .px-lg-2 { - padding-right: 0.5rem !important; - } - .pb-lg-2, - .py-lg-2 { - padding-bottom: 0.5rem !important; - } - .pl-lg-2, - .px-lg-2 { - padding-left: 0.5rem !important; - } - .p-lg-3 { - padding: 1rem !important; - } - .pt-lg-3, - .py-lg-3 { - padding-top: 1rem !important; - } - .pr-lg-3, - .px-lg-3 { - padding-right: 1rem !important; - } - .pb-lg-3, - .py-lg-3 { - padding-bottom: 1rem !important; - } - .pl-lg-3, - .px-lg-3 { - padding-left: 1rem !important; - } - .p-lg-4 { - padding: 1.5rem !important; - } - .pt-lg-4, - .py-lg-4 { - padding-top: 1.5rem !important; - } - .pr-lg-4, - .px-lg-4 { - padding-right: 1.5rem !important; - } - .pb-lg-4, - .py-lg-4 { - padding-bottom: 1.5rem !important; - } - .pl-lg-4, - .px-lg-4 { - padding-left: 1.5rem !important; - } - .p-lg-5 { - padding: 3rem !important; - } - .pt-lg-5, - .py-lg-5 { - padding-top: 3rem !important; - } - .pr-lg-5, - .px-lg-5 { - padding-right: 3rem !important; - } - .pb-lg-5, - .py-lg-5 { - padding-bottom: 3rem !important; - } - .pl-lg-5, - .px-lg-5 { - padding-left: 3rem !important; - } - .m-lg-n1 { - margin: -0.25rem !important; - } - .mt-lg-n1, - .my-lg-n1 { - margin-top: -0.25rem !important; - } - .mr-lg-n1, - .mx-lg-n1 { - margin-right: -0.25rem !important; - } - .mb-lg-n1, - .my-lg-n1 { - margin-bottom: -0.25rem !important; - } - .ml-lg-n1, - .mx-lg-n1 { - margin-left: -0.25rem !important; - } - .m-lg-n2 { - margin: -0.5rem !important; - } - .mt-lg-n2, - .my-lg-n2 { - margin-top: -0.5rem !important; - } - .mr-lg-n2, - .mx-lg-n2 { - margin-right: -0.5rem !important; - } - .mb-lg-n2, - .my-lg-n2 { - margin-bottom: -0.5rem !important; - } - .ml-lg-n2, - .mx-lg-n2 { - margin-left: -0.5rem !important; - } - .m-lg-n3 { - margin: -1rem !important; - } - .mt-lg-n3, - .my-lg-n3 { - margin-top: -1rem !important; - } - .mr-lg-n3, - .mx-lg-n3 { - margin-right: -1rem !important; - } - .mb-lg-n3, - .my-lg-n3 { - margin-bottom: -1rem !important; - } - .ml-lg-n3, - .mx-lg-n3 { - margin-left: -1rem !important; - } - .m-lg-n4 { - margin: -1.5rem !important; - } - .mt-lg-n4, - .my-lg-n4 { - margin-top: -1.5rem !important; - } - .mr-lg-n4, - .mx-lg-n4 { - margin-right: -1.5rem !important; - } - .mb-lg-n4, - .my-lg-n4 { - margin-bottom: -1.5rem !important; - } - .ml-lg-n4, - .mx-lg-n4 { - margin-left: -1.5rem !important; - } - .m-lg-n5 { - margin: -3rem !important; - } - .mt-lg-n5, - .my-lg-n5 { - margin-top: -3rem !important; - } - .mr-lg-n5, - .mx-lg-n5 { - margin-right: -3rem !important; - } - .mb-lg-n5, - .my-lg-n5 { - margin-bottom: -3rem !important; - } - .ml-lg-n5, - .mx-lg-n5 { - margin-left: -3rem !important; - } - .m-lg-auto { - margin: auto !important; - } - .mt-lg-auto, - .my-lg-auto { - margin-top: auto !important; - } - .mr-lg-auto, - .mx-lg-auto { - margin-right: auto !important; - } - .mb-lg-auto, - .my-lg-auto { - margin-bottom: auto !important; - } - .ml-lg-auto, - .mx-lg-auto { - margin-left: auto !important; - } -} - -@media (min-width: 1200px) { - .m-xl-0 { - margin: 0 !important; - } - .mt-xl-0, - .my-xl-0 { - margin-top: 0 !important; - } - .mr-xl-0, - .mx-xl-0 { - margin-right: 0 !important; - } - .mb-xl-0, - .my-xl-0 { - margin-bottom: 0 !important; - } - .ml-xl-0, - .mx-xl-0 { - margin-left: 0 !important; - } - .m-xl-1 { - margin: 0.25rem !important; - } - .mt-xl-1, - .my-xl-1 { - margin-top: 0.25rem !important; - } - .mr-xl-1, - .mx-xl-1 { - margin-right: 0.25rem !important; - } - .mb-xl-1, - .my-xl-1 { - margin-bottom: 0.25rem !important; - } - .ml-xl-1, - .mx-xl-1 { - margin-left: 0.25rem !important; - } - .m-xl-2 { - margin: 0.5rem !important; - } - .mt-xl-2, - .my-xl-2 { - margin-top: 0.5rem !important; - } - .mr-xl-2, - .mx-xl-2 { - margin-right: 0.5rem !important; - } - .mb-xl-2, - .my-xl-2 { - margin-bottom: 0.5rem !important; - } - .ml-xl-2, - .mx-xl-2 { - margin-left: 0.5rem !important; - } - .m-xl-3 { - margin: 1rem !important; - } - .mt-xl-3, - .my-xl-3 { - margin-top: 1rem !important; - } - .mr-xl-3, - .mx-xl-3 { - margin-right: 1rem !important; - } - .mb-xl-3, - .my-xl-3 { - margin-bottom: 1rem !important; - } - .ml-xl-3, - .mx-xl-3 { - margin-left: 1rem !important; - } - .m-xl-4 { - margin: 1.5rem !important; - } - .mt-xl-4, - .my-xl-4 { - margin-top: 1.5rem !important; - } - .mr-xl-4, - .mx-xl-4 { - margin-right: 1.5rem !important; - } - .mb-xl-4, - .my-xl-4 { - margin-bottom: 1.5rem !important; - } - .ml-xl-4, - .mx-xl-4 { - margin-left: 1.5rem !important; - } - .m-xl-5 { - margin: 3rem !important; - } - .mt-xl-5, - .my-xl-5 { - margin-top: 3rem !important; - } - .mr-xl-5, - .mx-xl-5 { - margin-right: 3rem !important; - } - .mb-xl-5, - .my-xl-5 { - margin-bottom: 3rem !important; - } - .ml-xl-5, - .mx-xl-5 { - margin-left: 3rem !important; - } - .p-xl-0 { - padding: 0 !important; - } - .pt-xl-0, - .py-xl-0 { - padding-top: 0 !important; - } - .pr-xl-0, - .px-xl-0 { - padding-right: 0 !important; - } - .pb-xl-0, - .py-xl-0 { - padding-bottom: 0 !important; - } - .pl-xl-0, - .px-xl-0 { - padding-left: 0 !important; - } - .p-xl-1 { - padding: 0.25rem !important; - } - .pt-xl-1, - .py-xl-1 { - padding-top: 0.25rem !important; - } - .pr-xl-1, - .px-xl-1 { - padding-right: 0.25rem !important; - } - .pb-xl-1, - .py-xl-1 { - padding-bottom: 0.25rem !important; - } - .pl-xl-1, - .px-xl-1 { - padding-left: 0.25rem !important; - } - .p-xl-2 { - padding: 0.5rem !important; - } - .pt-xl-2, - .py-xl-2 { - padding-top: 0.5rem !important; - } - .pr-xl-2, - .px-xl-2 { - padding-right: 0.5rem !important; - } - .pb-xl-2, - .py-xl-2 { - padding-bottom: 0.5rem !important; - } - .pl-xl-2, - .px-xl-2 { - padding-left: 0.5rem !important; - } - .p-xl-3 { - padding: 1rem !important; - } - .pt-xl-3, - .py-xl-3 { - padding-top: 1rem !important; - } - .pr-xl-3, - .px-xl-3 { - padding-right: 1rem !important; - } - .pb-xl-3, - .py-xl-3 { - padding-bottom: 1rem !important; - } - .pl-xl-3, - .px-xl-3 { - padding-left: 1rem !important; - } - .p-xl-4 { - padding: 1.5rem !important; - } - .pt-xl-4, - .py-xl-4 { - padding-top: 1.5rem !important; - } - .pr-xl-4, - .px-xl-4 { - padding-right: 1.5rem !important; - } - .pb-xl-4, - .py-xl-4 { - padding-bottom: 1.5rem !important; - } - .pl-xl-4, - .px-xl-4 { - padding-left: 1.5rem !important; - } - .p-xl-5 { - padding: 3rem !important; - } - .pt-xl-5, - .py-xl-5 { - padding-top: 3rem !important; - } - .pr-xl-5, - .px-xl-5 { - padding-right: 3rem !important; - } - .pb-xl-5, - .py-xl-5 { - padding-bottom: 3rem !important; - } - .pl-xl-5, - .px-xl-5 { - padding-left: 3rem !important; - } - .m-xl-n1 { - margin: -0.25rem !important; - } - .mt-xl-n1, - .my-xl-n1 { - margin-top: -0.25rem !important; - } - .mr-xl-n1, - .mx-xl-n1 { - margin-right: -0.25rem !important; - } - .mb-xl-n1, - .my-xl-n1 { - margin-bottom: -0.25rem !important; - } - .ml-xl-n1, - .mx-xl-n1 { - margin-left: -0.25rem !important; - } - .m-xl-n2 { - margin: -0.5rem !important; - } - .mt-xl-n2, - .my-xl-n2 { - margin-top: -0.5rem !important; - } - .mr-xl-n2, - .mx-xl-n2 { - margin-right: -0.5rem !important; - } - .mb-xl-n2, - .my-xl-n2 { - margin-bottom: -0.5rem !important; - } - .ml-xl-n2, - .mx-xl-n2 { - margin-left: -0.5rem !important; - } - .m-xl-n3 { - margin: -1rem !important; - } - .mt-xl-n3, - .my-xl-n3 { - margin-top: -1rem !important; - } - .mr-xl-n3, - .mx-xl-n3 { - margin-right: -1rem !important; - } - .mb-xl-n3, - .my-xl-n3 { - margin-bottom: -1rem !important; - } - .ml-xl-n3, - .mx-xl-n3 { - margin-left: -1rem !important; - } - .m-xl-n4 { - margin: -1.5rem !important; - } - .mt-xl-n4, - .my-xl-n4 { - margin-top: -1.5rem !important; - } - .mr-xl-n4, - .mx-xl-n4 { - margin-right: -1.5rem !important; - } - .mb-xl-n4, - .my-xl-n4 { - margin-bottom: -1.5rem !important; - } - .ml-xl-n4, - .mx-xl-n4 { - margin-left: -1.5rem !important; - } - .m-xl-n5 { - margin: -3rem !important; - } - .mt-xl-n5, - .my-xl-n5 { - margin-top: -3rem !important; - } - .mr-xl-n5, - .mx-xl-n5 { - margin-right: -3rem !important; - } - .mb-xl-n5, - .my-xl-n5 { - margin-bottom: -3rem !important; - } - .ml-xl-n5, - .mx-xl-n5 { - margin-left: -3rem !important; - } - .m-xl-auto { - margin: auto !important; - } - .mt-xl-auto, - .my-xl-auto { - margin-top: auto !important; - } - .mr-xl-auto, - .mx-xl-auto { - margin-right: auto !important; - } - .mb-xl-auto, - .my-xl-auto { - margin-bottom: auto !important; - } - .ml-xl-auto, - .mx-xl-auto { - margin-left: auto !important; - } -} - -.text-monospace { - font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !important; -} - -.text-justify { - text-align: justify !important; -} - -.text-wrap { - white-space: normal !important; -} - -.text-nowrap { - white-space: nowrap !important; -} - -.text-truncate { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.text-left { - text-align: left !important; -} - -.text-right { - text-align: right !important; -} - -.text-center { - text-align: center !important; -} - -@media (min-width: 576px) { - .text-sm-left { - text-align: left !important; - } - .text-sm-right { - text-align: right !important; - } - .text-sm-center { - text-align: center !important; - } -} - -@media (min-width: 768px) { - .text-md-left { - text-align: left !important; - } - .text-md-right { - text-align: right !important; - } - .text-md-center { - text-align: center !important; - } -} - -@media (min-width: 992px) { - .text-lg-left { - text-align: left !important; - } - .text-lg-right { - text-align: right !important; - } - .text-lg-center { - text-align: center !important; - } -} - -@media (min-width: 1200px) { - .text-xl-left { - text-align: left !important; - } - .text-xl-right { - text-align: right !important; - } - .text-xl-center { - text-align: center !important; - } -} - -.text-lowercase { - text-transform: lowercase !important; -} - -.text-uppercase { - text-transform: uppercase !important; -} - -.text-capitalize { - text-transform: capitalize !important; -} - -.font-weight-light { - font-weight: 300 !important; -} - -.font-weight-lighter { - font-weight: lighter !important; -} - -.font-weight-normal { - font-weight: 400 !important; -} - -.font-weight-bold { - font-weight: 700 !important; -} - -.font-weight-bolder { - font-weight: bolder !important; -} - -.font-italic { - font-style: italic !important; -} - -.text-white { - color: #fff !important; -} - -.text-primary { - color: #007bff !important; -} - -a.text-primary:hover, a.text-primary:focus { - color: #0056b3 !important; -} - -.text-secondary { - color: #6c757d !important; -} - -a.text-secondary:hover, a.text-secondary:focus { - color: #494f54 !important; -} - -.text-success { - color: #28a745 !important; -} - -a.text-success:hover, a.text-success:focus { - color: #19692c !important; -} - -.text-info { - color: #17a2b8 !important; -} - -a.text-info:hover, a.text-info:focus { - color: #0f6674 !important; -} - -.text-warning { - color: #ffc107 !important; -} - -a.text-warning:hover, a.text-warning:focus { - color: #ba8b00 !important; -} - -.text-danger { - color: #dc3545 !important; -} - -a.text-danger:hover, a.text-danger:focus { - color: #a71d2a !important; -} - -.text-light { - color: #f8f9fa !important; -} - -a.text-light:hover, a.text-light:focus { - color: #cbd3da !important; -} - -.text-dark { - color: #343a40 !important; -} - -a.text-dark:hover, a.text-dark:focus { - color: #121416 !important; -} - -.text-body { - color: #212529 !important; -} - -.text-muted { - color: #6c757d !important; -} - -.text-black-50 { - color: rgba(0, 0, 0, 0.5) !important; -} - -.text-white-50 { - color: rgba(255, 255, 255, 0.5) !important; -} - -.text-hide { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} - -.text-decoration-none { - text-decoration: none !important; -} - -.text-break { - word-break: break-word !important; - overflow-wrap: break-word !important; -} - -.text-reset { - color: inherit !important; -} - -.visible { - visibility: visible !important; -} - -.invisible { - visibility: hidden !important; -} - -@media print { - *, - *::before, - *::after { - text-shadow: none !important; - box-shadow: none !important; - } - a:not(.btn) { - text-decoration: underline; - } - abbr[title]::after { - content: " (" attr(title) ")"; - } - pre { - white-space: pre-wrap !important; - } - pre, - blockquote { - border: 1px solid #adb5bd; - page-break-inside: avoid; - } - thead { - display: table-header-group; - } - tr, - img { - page-break-inside: avoid; - } - p, - h2, - h3 { - orphans: 3; - widows: 3; - } - h2, - h3 { - page-break-after: avoid; - } - @page { - size: a3; - } - body { - min-width: 992px !important; - } - .container { - min-width: 992px !important; - } - .navbar { - display: none; - } - .badge { - 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 #dee2e6 !important; - } - .table-dark { - color: inherit; - } - .table-dark th, - .table-dark td, - .table-dark thead th, - .table-dark tbody + tbody { - border-color: #dee2e6; - } - .table .thead-dark th { - color: inherit; - border-color: #dee2e6; - } -} -/*# sourceMappingURL=bootstrap.css.map */ \ No newline at end of file diff --git a/_Resources/node_modules/web-dev-utils/bootstrap-4.3.1-dist/css/bootstrap.css.map b/_Resources/node_modules/web-dev-utils/bootstrap-4.3.1-dist/css/bootstrap.css.map deleted file mode 100644 index 7eb1581..0000000 --- a/_Resources/node_modules/web-dev-utils/bootstrap-4.3.1-dist/css/bootstrap.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../../scss/bootstrap.scss","bootstrap.css","../../scss/_root.scss","../../scss/_reboot.scss","../../scss/_variables.scss","../../scss/vendor/_rfs.scss","../../scss/mixins/_hover.scss","../../scss/_type.scss","../../scss/mixins/_lists.scss","../../scss/_images.scss","../../scss/mixins/_image.scss","../../scss/mixins/_border-radius.scss","../../scss/_code.scss","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_breakpoints.scss","../../scss/mixins/_grid-framework.scss","../../scss/_tables.scss","../../scss/mixins/_table-row.scss","../../scss/_functions.scss","../../scss/_forms.scss","../../scss/mixins/_transition.scss","../../scss/mixins/_forms.scss","../../scss/mixins/_gradients.scss","../../scss/_buttons.scss","../../scss/mixins/_buttons.scss","../../scss/_transitions.scss","../../scss/_dropdown.scss","../../scss/mixins/_caret.scss","../../scss/mixins/_nav-divider.scss","../../scss/_button-group.scss","../../scss/_input-group.scss","../../scss/_custom-forms.scss","../../scss/_nav.scss","../../scss/_navbar.scss","../../scss/_card.scss","../../scss/_breadcrumb.scss","../../scss/_pagination.scss","../../scss/mixins/_pagination.scss","../../scss/_badge.scss","../../scss/mixins/_badge.scss","../../scss/_jumbotron.scss","../../scss/_alert.scss","../../scss/mixins/_alert.scss","../../scss/_progress.scss","../../scss/_media.scss","../../scss/_list-group.scss","../../scss/mixins/_list-group.scss","../../scss/_close.scss","../../scss/_toasts.scss","../../scss/_modal.scss","../../scss/_tooltip.scss","../../scss/mixins/_reset-text.scss","../../scss/_popover.scss","../../scss/_carousel.scss","../../scss/mixins/_clearfix.scss","../../scss/_spinners.scss","../../scss/utilities/_align.scss","../../scss/mixins/_background-variant.scss","../../scss/utilities/_background.scss","../../scss/utilities/_borders.scss","../../scss/utilities/_display.scss","../../scss/utilities/_embed.scss","../../scss/utilities/_flex.scss","../../scss/utilities/_float.scss","../../scss/utilities/_overflow.scss","../../scss/utilities/_position.scss","../../scss/utilities/_screenreaders.scss","../../scss/mixins/_screen-reader.scss","../../scss/utilities/_shadows.scss","../../scss/utilities/_sizing.scss","../../scss/utilities/_stretched-link.scss","../../scss/utilities/_spacing.scss","../../scss/utilities/_text.scss","../../scss/mixins/_text-truncate.scss","../../scss/mixins/_text-emphasis.scss","../../scss/mixins/_text-hide.scss","../../scss/utilities/_visibility.scss","../../scss/_print.scss"],"names":[],"mappings":"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AF7G1B;;AAEA;EEmHE,wBAAwB;AFjH1B;;AEyHA;EACE,aAAa;EACb,0BAA0B;AFtH5B;;AE6HA;EACE,qBAAqB;AF1HvB;;AE6HA;EACE,kBAAkB;EAClB,eAAe;AF1HjB;;AE6HA;EACE,aAAa;AF1Hf;;AAEA;EE8HE,wBAAwB;AF5H1B;;AM/VA;;EAEE,qBHiSuC;EG/RvC,gBHiS+B;EGhS/B,gBHiS+B;AHgEjC;;AM7VA;EFgHM,iBAtCY;AJuRlB;;AMhWA;EF+GM,eAtCY;AJ2RlB;;AMnWA;EF8GM,kBAtCY;AJ+RlB;;AMtWA;EF6GM,iBAtCY;AJmSlB;;AMzWA;EF4GM,kBAtCY;AJuSlB;;AM5WA;EF2GM,eAtCY;AJ2SlB;;AM9WA;EFyGM,kBAtCY;EEjEhB,gBHmS+B;AH8EjC;;AM7WA;EFmGM,eAtCY;EE3DhB,gBHsR+B;EGrR/B,gBH6Q+B;AHmGjC;;AM9WA;EF8FM,iBAtCY;EEtDhB,gBHkR+B;EGjR/B,gBHwQ+B;AHyGjC;;AM/WA;EFyFM,iBAtCY;EEjDhB,gBH8Q+B;EG7Q/B,gBHmQ+B;AH+GjC;;AMhXA;EFoFM,iBAtCY;EE5ChB,gBH0Q+B;EGzQ/B,gBH8P+B;AHqHjC;;AE1VA;EIhBE,gBH0EW;EGzEX,mBHyEW;EGxEX,SAAS;EACT,wCHzCa;AHuZf;;AMtWA;;EFMI,cAAW;EEHb,gBHsN+B;AHmJjC;;AMtWA;;EAEE,cH8PgC;EG7PhC,yBHsQmC;AHmGrC;;AMjWA;EC/EE,eAAe;EACf,gBAAgB;APoblB;;AMjWA;ECpFE,eAAe;EACf,gBAAgB;APyblB;;AMnWA;EACE,qBAAqB;ANsWvB;;AMvWA;EAII,oBHgP+B;AHuHnC;;AM7VA;EFjCI,cAAW;EEmCb,yBAAyB;ANgW3B;;AM5VA;EACE,mBHiBW;ECFP,kBAtCY;AJuXlB;;AM5VA;EACE,cAAc;EF7CZ,cAAW;EE+Cb,cH1GgB;AHyclB;;AMlWA;EAMI,qBAAqB;ANgWzB;;AQndA;ECIE,eAAe;EAGf,YAAY;ATidd;;AQldA;EACE,gBL++BwC;EK9+BxC,sBLRa;EKSb,yBLNgB;EOLd,sBPqOgC;EM/NlC,eAAe;EAGf,YAA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AAwB,iBADZ;IACY,QADZ;EfitClB;EehtCM;IAAwB,iBADZ;IACY,QADZ;EfotClB;EentCM;IAAwB,iBADZ;IACY,QADZ;EfutClB;EettCM;IAAwB,iBADZ;IACY,QADZ;Ef0tClB;EeztCM;IAAwB,iBADZ;IACY,QADZ;Ef6tClB;Ee5tCM;IAAwB,iBADZ;IACY,QADZ;EfguClB;Ee/tCM;IAAwB,iBADZ;IACY,QADZ;EfmuClB;EeluCM;IAAwB,iBADZ;IACY,QADZ;EfsuClB;EeruCM;IAAwB,iBADZ;IACY,QADZ;EfyuClB;EexuCM;IAAwB,iBADZ;IACY,QADZ;Ef4uClB;Ee3uCM;IAAwB,kBADZ;IACY,SADZ;Ef+uClB;Ee9uCM;IAAwB,kBADZ;IACY,SADZ;EfkvClB;EejvCM;IAAwB,kBADZ;IACY,SADZ;EfqvClB;Ee9uCQ;IFTR,cAA4B;Eb0vC5B;EejvCQ;IFTR,sBAA8C;Eb6vC9C;EepvCQ;IFTR,uBAA8C;EbgwC9C;EevvCQ;IFTR,gBAA8C;EbmwC9C;Ee1vCQ;IFTR,uBAA8C;EbswC9C;Ee7vCQ;IFTR,uBAA8C;EbywC9C;EehwCQ;IFTR,gBAA8C;Eb4wC9C;EenwCQ;IFTR,uBAA8C;Eb+wC9C;EetwCQ;IFTR,uBAA8C;EbkxC9C;EezwCQ;IFTR,gBAA8C;EbqxC9C;Ee5wCQ;IFTR,uBAA8C;EbwxC9C;Ee/wCQ;IFTR,uBAA8C;Eb2xC9C;AACF;;AgBz0CA;EACE,WAAW;EACX,mBb2HW;Ea1HX,cbSgB;AHm0ClB;;AgB/0CA;;EAQI,gBb8UgC;Ea7UhC,mBAAmB;EACnB,6BbJc;AHg1ClB;;AgBt1CA;EAcI,sBAAsB;EACtB,gCbTc;AHq1ClB;;AgB31CA;EAmBI,6Bbbc;AHy1ClB;;AgBn0CA;;EAGI,ebwT+B;AH6gCnC;;AgB5zCA;EACE,yBbnCgB;AHk2ClB;;AgBh0CA;;EAKI,yBbvCc;AHu2ClB;;AgBr0CA;;EAWM,wBAA4C;AhB+zClD;;AgB1zCA;;;;EAKI,SAAS;AhB4zCb;;AgBpzCA;EAEI,qCb1DW;AHg3Cf;;AKr3CE;EW2EI,cbvEY;EawEZ,sCbvES;AHq3Cf;;AiBj4CE;;;EAII,yBC2E4D;AlBwzClE;;AiBv4CE;;;;EAYM,qBCmE0D;AlB+zClE;;AKv4CE;EYiBM,yBAJsC;AjB83C9C;;AiB/3CE;;EASQ,yBARoC;AjBm4C9C;;AiBv5CE;;;EAII,yBC2E4D;AlB80ClE;;AiB75CE;;;;EAYM,qBCmE0D;AlBq1ClE;;AK75CE;EYiBM,yBAJsC;AjBo5C9C;;AiBr5CE;;EASQ,yBARoC;AjBy5C9C;;AiB76CE;;;EAII,yBC2E4D;AlBo2ClE;;AiBn7CE;;;;EAYM,qBCmE0D;AlB22ClE;;AKn7CE;EYiBM,yBAJsC;AjB06C9C;;AiB36CE;;EASQ,yBARoC;AjB+6C9C;;AiBn8CE;;;EAII,yBC2E4D;AlB03ClE;;AiBz8CE;;;;EAYM,qBCmE0D;AlBi4ClE;;AKz8CE;EYiBM,yBAJsC;AjBg8C9C;;AiBj8CE;;EASQ,yBARoC;AjBq8C9C;;AiBz9CE;;;EAII,yBC2E4D;AlBg5ClE;;AiB/9CE;;;;EAYM,qBCmE0D;AlBu5ClE;;AK/9CE;EYiBM,yBAJsC;AjBs9C9C;;AiBv9CE;;EASQ,yBARoC;AjB29C9C;;AiB/+CE;;;EAII,yBC2E4D;AlBs6ClE;;AiBr/CE;;;;EAYM,qBCmE0D;AlB66ClE;;AKr/CE;EYiBM,yBAJsC;AjB4+C9C;;AiB7+CE;;EASQ,yBARoC;AjBi/C9C;;AiBrgDE;;;EAII,yBC2E4D;AlB47ClE;;AiB3gDE;;;;EAYM,qBCmE0D;AlBm8ClE;;AK3gDE;EYiBM,yBAJsC;AjBkgD9C;;AiBngDE;;EASQ,yBARoC;AjBugD9C;;AiB3hDE;;;EAII,yBC2E4D;AlBk9ClE;;AiBjiDE;;;;EAYM,qBCmE0D;AlBy9ClE;;AKjiDE;EYiBM,yBAJsC;AjBwhD9C;;AiBzhDE;;EASQ,yBARoC;AjB6hD9C;;AiBjjDE;;;EAII,sCdQS;AH2iDf;;AKhjDE;EYiBM,sCAJsC;AjBuiD9C;;AiBxiDE;;EASQ,sCARoC;AjB4iD9C;;AgBt9CA;EAGM,Wb3GS;Ea4GT,yBbpGY;EaqGZ,qBb2PqD;AH4tC3D;;AgB59CA;EAWM,cb5GY;Ea6GZ,yBblHY;EamHZ,qBblHY;AHukDlB;;AgBh9CA;EACE,Wb3Ha;Ea4Hb,yBbpHgB;AHukDlB;;AgBr9CA;;;EAOI,qBbuOuD;AH6uC3D;;AgB39CA;EAWI,SAAS;AhBo9Cb;;AgB/9CA;EAgBM,2Cb1IS;AH6lDf;;AKxlDE;EW4IM,WbjJO;EakJP,4CblJO;AHkmDf;;AchiDI;EEiGA;IAEI,cAAc;IACd,WAAW;IACX,gBAAgB;IAChB,iCAAiC;EhBk8CvC;EgBv8CG;IASK,SAAS;EhBi8CjB;AACF;;Ac5iDI;EEiGA;IAEI,cAAc;IACd,WAAW;IACX,gBAAgB;IAChB,iCAAiC;EhB88CvC;EgBn9CG;IASK,SAAS;EhB68CjB;AACF;;AcxjDI;EEiGA;IAEI,cAAc;IACd,WAAW;IACX,gBAAgB;IAChB,iCAAiC;EhB09CvC;EgB/9CG;IASK,SAAS;EhBy9CjB;AACF;;AcpkDI;EEiGA;IAEI,cAAc;IACd,WAAW;IACX,gBAAgB;IAChB,iCAAiC;EhBs+CvC;EgB3+CG;IASK,SAAS;EhBq+CjB;AACF;;AgBp/CA;EAOQ,cAAc;EACd,WAAW;EACX,gBAAgB;EAChB,iCAAiC;AhBi/CzC;;AgB3/CA;EAcU,SAAS;AhBi/CnB;;AmB9pDA;EACE,cAAc;EACd,WAAW;EACX,mChBqe2H;EgBpe3H,yBhBqXkC;EChQ9B,eAtCY;Ee5EhB,gBhB8Q+B;EgB7Q/B,gBhBkR+B;EgBjR/B,chBDgB;EgBEhB,sBhBTa;EgBUb,4BAA4B;EAC5B,yBhBPgB;EONd,sBPqOgC;EiBpO9B,wEjB4e4F;AHksClG;;AoBzqDI;EDLJ;ICMM,gBAAgB;EpB6qDpB;AACF;;AmBprDA;EAsBI,6BAA6B;EAC7B,SAAS;AnBkqDb;;AqBlrDE;EACE,clBAc;EkBCd,sBlBRW;EkBSX,qBlBgdsE;EkB/ctE,UAAU;EAKR,gDlBcW;AHmqDjB;;AmBjsDA;EA+BI,chBxBc;EgB0Bd,UAAU;AnBqqDd;;AmBtsDA;EA+BI,chBxBc;EgB0Bd,UAAU;AnBqqDd;;AmBtsDA;EA+BI,chBxBc;EgB0Bd,UAAU;AnBqqDd;;AmBtsDA;EA+BI,chBxBc;EgB0Bd,UAAU;AnBqqDd;;AmBtsDA;EA+BI,chBxBc;EgB0Bd,UAAU;AnBqqDd;;AmBtsDA;EA2CI,yBhBxCc;EgB0Cd,UAAU;AnB8pDd;;AmB1pDA;EAOI,chBhDc;EgBiDd,sBhBxDW;AH+sDf;;AmBlpDA;;EAEE,cAAc;EACd,WAAW;AnBqpDb;;AmB3oDA;EACE,iCAA+D;EAC/D,oCAAkE;EAClE,gBAAgB;EfZd,kBAAW;Eecb,gBhB0M+B;AHo8CjC;;AmB3oDA;EACE,+BAAkE;EAClE,kCAAqE;EfoCjE,kBAtCY;EeIhB,gBhBuI+B;AHugDjC;;AmB3oDA;EACE,gCAAkE;EAClE,mCAAqE;Ef6BjE,mBAtCY;EeWhB,gBhBiI+B;AH6gDjC;;AmBroDA;EACE,cAAc;EACd,WAAW;EACX,qBhB8QmC;EgB7QnC,wBhB6QmC;EgB5QnC,gBAAgB;EAChB,gBhB6K+B;EgB5K/B,chBpGgB;EgBqGhB,6BAA6B;EAC7B,yBAAyB;EACzB,mBAAmC;AnBwoDrC;;AmBlpDA;EAcI,gBAAgB;EAChB,eAAe;AnBwoDnB;;AmB5nDA;EACE,kChBsWqI;EgBrWrI,uBhB+PiC;EC1Q7B,mBAtCY;EemDhB,gBhByF+B;EOhO7B,qBPuO+B;AHgiDnC;;AmB5nDA;EACE,gChB+VqI;EgB9VrI,oBhB4PgC;EC/Q5B,kBAtCY;Ee2DhB,gBhBgF+B;EO/N7B,qBPsO+B;AHyiDnC;;AmB3nDA;EAGI,YAAY;AnB4nDhB;;AmBxnDA;EACE,YAAY;AnB2nDd;;AmBnnDA;EACE,mBhBoV0C;AHkyC5C;;AmBnnDA;EACE,cAAc;EACd,mBhBqU4C;AHizC9C;;AmB9mDA;EACE,oBAAa;EAAb,aAAa;EACb,mBAAe;EAAf,eAAe;EACf,kBAA0C;EAC1C,iBAAyC;AnBinD3C;;AmBrnDA;;EAQI,kBAA0C;EAC1C,iBAAyC;AnBknD7C;;AmBzmDA;EACE,kBAAkB;EAClB,cAAc;EACd,qBhB0S6C;AHk0C/C;;AmBzmDA;EACE,kBAAkB;EAClB,kBhBsS2C;EgBrS3C,qBhBoS6C;AHw0C/C;;AmB/mDA;EAMI,chBxMc;AHqzDlB;;AmBzmDA;EACE,gBAAgB;AnB4mDlB;;AmBzmDA;EACE,2BAAoB;EAApB,oBAAoB;EACpB,sBAAmB;EAAnB,mBAAmB;EACnB,eAAe;EACf,qBhByR4C;AHm1C9C;;AmBhnDA;EAQI,gBAAgB;EAChB,aAAa;EACb,uBhBoR4C;EgBnR5C,cAAc;AnB4mDlB;;AqBvzDE;EACE,aAAa;EACb,WAAW;EACX,mBlBod0C;EC5a1C,cAAW;EiBtCX,clBSa;AHizDjB;;AqBvzDE;EACE,kBAAkB;EAClB,SAAS;EACT,UAAU;EACV,aAAa;EACb,eAAe;EACf,uBlBsyBqC;EkBryBrC,iBAAiB;EjBmFf,mBAtCY;EiB3Cd,gBlBkP6B;EkBjP7B,WlBxCW;EkByCX,wClBLa;EOtCb,sBPqOgC;AHioDpC;;AqBtzDI;EAEE,qBlBZW;EkBeT,oClBgb2F;EkB/a3F,4PHfmI;EGgBnI,4BAA4B;EAC5B,2DlB+a6F;EkB9a7F,gElB6awF;AHy4ChG;;AqB/zDI;EAaI,qBlBvBS;EkBwBT,gDlBxBS;AH80DjB;;AqBp0DI;;;EAmBI,cAAc;ArBuzDtB;;AqBhzDI;EAGI,oClBwZ2F;EkBvZ3F,kFlByZ6F;AHw5CrG;;AqB3yDI;EAEE,qBlBhDW;EkBmDT,sDlBqe0J;EkBpe1J,6gBAAkJ;ArB2yD1J;;AqBjzDI;EAUI,qBlBxDS;EkByDT,gDlBzDS;AHo2DjB;;AqBtzDI;;;EAgBI,cAAc;ArB4yDtB;;AqBryDI;;;EAII,cAAc;ArBuyDtB;;AqBjyDI;EAGI,clBlFS;AHo3DjB;;AqBryDI;;;EAQI,cAAc;ArBmyDtB;;AqB7xDI;EAGI,clBhGS;AH83DjB;;AqBjyDI;EAMM,qBlBnGO;AHk4DjB;;AqBryDI;;;EAYI,cAAc;ArB+xDtB;;AqB3yDI;EAiBM,qBAAkC;ECnJxC,yBDoJ+C;ArB8xDnD;;AqBhzDI;EAwBM,gDlBrHO;AHi5DjB;;AqBpzDI;EA4BM,qBlBzHO;AHq5DjB;;AqBpxDI;EAGI,qBlBpIS;AHy5DjB;;AqBxxDI;;;EAQI,cAAc;ArBsxDtB;;AqB9xDI;EAaM,qBlB9IO;EkB+IP,gDlB/IO;AHo6DjB;;AqBl7DE;EACE,aAAa;EACb,WAAW;EACX,mBlBod0C;EC5a1C,cAAW;EiBtCX,clBMa;AH+6DjB;;AqBl7DE;EACE,kBAAkB;EAClB,SAAS;EACT,UAAU;EACV,aAAa;EACb,eAAe;EACf,uBlBsyBqC;EkBryBrC,iBAAiB;EjBmFf,mBAtCY;EiB3Cd,gBlBkP6B;EkBjP7B,WlBxCW;EkByCX,wClBRa;EOnCb,sBPqOgC;AH4vDpC;;AqBj7DI;EAEE,qBlBfW;EkBkBT,oClBgb2F;EkB/a3F,sSHfmI;EGgBnI,4BAA4B;EAC5B,2DlB+a6F;EkB9a7F,gElB6awF;AHogDhG;;AqB17DI;EAaI,qBlB1BS;EkB2BT,gDlB3BS;AH48DjB;;AqB/7DI;;;EAmBI,cAAc;ArBk7DtB;;AqB36DI;EAGI,oClBwZ2F;EkBvZ3F,kFlByZ6F;AHmhDrG;;AqBt6DI;EAEE,qBlBnDW;EkBsDT,sDlBqe0J;EkBpe1J,ujBAAkJ;ArBs6D1J;;AqB56DI;EAUI,qBlB3DS;EkB4DT,gDlB5DS;AHk+DjB;;AqBj7DI;;;EAgBI,cAAc;ArBu6DtB;;AqBh6DI;;;EAII,cAAc;ArBk6DtB;;AqB55DI;EAGI,clBrFS;AHk/DjB;;AqBh6DI;;;EAQI,cAAc;ArB85DtB;;AqBx5DI;EAGI,clBnGS;AH4/DjB;;AqB55DI;EAMM,qBlBtGO;AHggEjB;;AqBh6DI;;;EAYI,cAAc;ArB05DtB;;AqBt6DI;EAiBM,qBAAkC;ECnJxC,yBDoJ+C;ArBy5DnD;;AqB36DI;EAwBM,gDlBxHO;AH+gEjB;;AqB/6DI;EA4BM,qBlB5HO;AHmhEjB;;AqB/4DI;EAGI,qBlBvIS;AHuhEjB;;AqBn5DI;;;EAQI,cAAc;ArBi5DtB;;AqBz5DI;EAaM,qBlBjJO;EkBkJP,gDlBlJO;AHkiEjB;;AmBz0DA;EACE,oBAAa;EAAb,aAAa;EACb,uBAAmB;EAAnB,mBAAmB;EACnB,sBAAmB;EAAnB,mBAAmB;AnB40DrB;;AmB/0DA;EASI,WAAW;AnB00Df;;AcxhEI;EKqMJ;IAeM,oBAAa;IAAb,aAAa;IACb,sBAAmB;IAAnB,mBAAmB;IACnB,qBAAuB;IAAvB,uBAAuB;IACvB,gBAAgB;EnBy0DpB;EmB31DF;IAuBM,oBAAa;IAAb,aAAa;IACb,kBAAc;IAAd,cAAc;IACd,uBAAmB;IAAnB,mBAAmB;IACnB,sBAAmB;IAAnB,mBAAmB;IACnB,gBAAgB;EnBu0DpB;EmBl2DF;IAgCM,qBAAqB;IACrB,WAAW;IACX,sBAAsB;EnBq0D1B;EmBv2DF;IAuCM,qBAAqB;EnBm0DzB;EmB12DF;;IA4CM,WAAW;EnBk0Df;EmB92DF;IAkDM,oBAAa;IAAb,aAAa;IACb,sBAAmB;IAAnB,mBAAmB;IACnB,qBAAuB;IAAvB,uBAAuB;IACvB,WAAW;IACX,eAAe;EnB+zDnB;EmBr3DF;IAyDM,kBAAkB;IAClB,oBAAc;IAAd,cAAc;IACd,aAAa;IACb,qBhB2LwC;IgB1LxC,cAAc;EnB+zDlB;EmB53DF;IAiEM,sBAAmB;IAAnB,mBAAmB;IACnB,qBAAuB;IAAvB,uBAAuB;EnB8zD3B;EmBh4DF;IAqEM,gBAAgB;EnB8zDpB;AACF;;AuB/nEA;EACE,qBAAqB;EAErB,gBpBkR+B;EoBjR/B,cpBMgB;EoBLhB,kBAAkB;EAClB,sBAAsB;EACtB,yBAAiB;EAAjB,sBAAiB;EAAjB,qBAAiB;EAAjB,iBAAiB;EACjB,6BAA6B;EAC7B,6BAA2C;ECsF3C,yBrB0RkC;EChQ9B,eAtCY;EoBchB,gBrByL+B;EO3R7B,sBPqOgC;EiBpO9B,qIjBqb6I;AH0tDnJ;;AoB1oEI;EGLJ;IHMM,gBAAgB;EpB8oEpB;AACF;;AK/oEE;EkBQE,cpBJc;EoBKd,qBAAqB;AvB2oEzB;;AuB1pEA;EAoBI,UAAU;EACV,gDpBSa;AHioEjB;;AuB/pEA;EA2BI,apB8Y6B;AH0vDjC;;AuBznEA;;EAEE,oBAAoB;AvB4nEtB;;AuBnnEE;ECrDA,WrBCa;EmBDX,yBnB8Ba;EqB5Bf,qBrB4Be;AHgpEjB;;AKxqEE;EmBAE,WrBLW;EmBDX,yBEDoF;EASpF,qBATyH;AxBqrE7H;;AwBzqEE;EAMI,gDAAiF;AxBuqEvF;;AwBlqEE;EAEE,WrBvBW;EqBwBX,yBrBKa;EqBJb,qBrBIa;AHgqEjB;;AwB7pEE;;EAGE,WrBnCW;EqBoCX,yBAtCuK;EA0CvK,qBA1C+M;AxBssEnN;;AwB1pEI;;EAKI,gDAAiF;AxB0pEzF;;AuBrpEE;ECrDA,WrBCa;EmBDX,yBnBOc;EqBLhB,qBrBKgB;AHysElB;;AK1sEE;EmBAE,WrBLW;EmBDX,yBEDoF;EASpF,qBATyH;AxButE7H;;AwB3sEE;EAMI,iDAAiF;AxBysEvF;;AwBpsEE;EAEE,WrBvBW;EqBwBX,yBrBlBc;EqBmBd,qBrBnBc;AHytElB;;AwB/rEE;;EAGE,WrBnCW;EqBoCX,yBAtCuK;EA0CvK,qBA1C+M;AxBwuEnN;;AwB5rEI;;EAKI,iDAAiF;AxB4rEzF;;AuBvrEE;ECrDA,WrBCa;EmBDX,yBnBqCa;EqBnCf,qBrBmCe;AH6sEjB;;AK5uEE;EmBAE,WrBLW;EmBDX,yBEDoF;EASpF,qBATyH;AxByvE7H;;AwB7uEE;EAMI,+CAAiF;AxB2uEvF;;AwBtuEE;EAEE,WrBvBW;EqBwBX,yBrBYa;EqBXb,qBrBWa;AH6tEjB;;AwBjuEE;;EAGE,WrBnCW;EqBoCX,yBAtCuK;EA0CvK,qBA1C+M;AxB0wEnN;;AwB9tEI;;EAKI,+CAAiF;AxB8tEzF;;AuBztEE;ECrDA,WrBCa;EmBDX,yBnBuCa;EqBrCf,qBrBqCe;AH6uEjB;;AK9wEE;EmBAE,WrBLW;EmBDX,yBEDoF;EASpF,qBATyH;AxB2xE7H;;AwB/wEE;EAMI,gDAAiF;AxB6wEvF;;AwBxwEE;EAEE,WrBvBW;EqBwBX,yBrBca;EqBbb,qBrBaa;AH6vEjB;;AwBnwEE;;EAGE,WrBnCW;EqBoCX,yBAtCuK;EA0CvK,qBA1C+M;AxB4yEnN;;AwBhwEI;;EAKI,gDAAiF;AxBgwEzF;;AuB3vEE;ECrDA,crBUgB;EmBVd,yBnBoCa;EqBlCf,qBrBkCe;AHkxEjB;;AKhzEE;EmBAE,crBIc;EmBVd,yBEDoF;EASpF,qBATyH;AxB6zE7H;;AwBjzEE;EAMI,gDAAiF;AxB+yEvF;;AwB1yEE;EAEE,crBdc;EqBed,yBrBWa;EqBVb,qBrBUa;AHkyEjB;;AwBryEE;;EAGE,crB1Bc;EqB2Bd,yBAtCuK;EA0CvK,qBA1C+M;AxB80EnN;;AwBlyEI;;EAKI,gDAAiF;AxBkyEzF;;AuB7xEE;ECrDA,WrBCa;EmBDX,yBnBkCa;EqBhCf,qBrBgCe;AHszEjB;;AKl1EE;EmBAE,WrBLW;EmBDX,yBEDoF;EASpF,qBATyH;AxB+1E7H;;AwBn1EE;EAMI,+CAAiF;AxBi1EvF;;AwB50EE;EAEE,WrBvBW;EqBwBX,yBrBSa;EqBRb,qBrBQa;AHs0EjB;;AwBv0EE;;EAGE,WrBnCW;EqBoCX,yBAtCuK;EA0CvK,qBA1C+M;AxBg3EnN;;AwBp0EI;;EAKI,+CAAiF;AxBo0EzF;;AuB/zEE;ECrDA,crBUgB;EmBVd,yBnBEc;EqBAhB,qBrBAgB;AHw3ElB;;AKp3EE;EmBAE,crBIc;EmBVd,yBEDoF;EASpF,qBATyH;AxBi4E7H;;AwBr3EE;EAMI,iDAAiF;AxBm3EvF;;AwB92EE;EAEE,crBdc;EqBed,yBrBvBc;EqBwBd,qBrBxBc;AHw4ElB;;AwBz2EE;;EAGE,crB1Bc;EqB2Bd,yBAtCuK;EA0CvK,qBA1C+M;AxBk5EnN;;AwBt2EI;;EAKI,iDAAiF;AxBs2EzF;;AuBj2EE;ECrDA,WrBCa;EmBDX,yBnBSc;EqBPhB,qBrBOgB;AHm5ElB;;AKt5EE;EmBAE,WrBLW;EmBDX,yBEDoF;EASpF,qBATyH;AxBm6E7H;;AwBv5EE;EAMI,8CAAiF;AxBq5EvF;;AwBh5EE;EAEE,WrBvBW;EqBwBX,yBrBhBc;EqBiBd,qBrBjBc;AHm6ElB;;AwB34EE;;EAGE,WrBnCW;EqBoCX,yBAtCuK;EA0CvK,qBA1C+M;AxBo7EnN;;AwBx4EI;;EAKI,8CAAiF;AxBw4EzF;;AuB73EE;ECJA,crBzBe;EqB0Bf,qBrB1Be;AH+5EjB;;AKv7EE;EmBqDE,WrB1DW;EqB2DX,yBrB9Ba;EqB+Bb,qBrB/Ba;AHq6EjB;;AwBn4EE;EAEE,+CrBpCa;AHy6EjB;;AwBl4EE;EAEE,crBzCa;EqB0Cb,6BAA6B;AxBo4EjC;;AwBj4EE;;EAGE,WrB7EW;EqB8EX,yBrBjDa;EqBkDb,qBrBlDa;AHq7EjB;;AwBj4EI;;EAKI,+CrBzDS;AH07EjB;;AuB75EE;ECJA,crBhDgB;EqBiDhB,qBrBjDgB;AHs9ElB;;AKv9EE;EmBqDE,WrB1DW;EqB2DX,yBrBrDc;EqBsDd,qBrBtDc;AH49ElB;;AwBn6EE;EAEE,iDrB3Dc;AHg+ElB;;AwBl6EE;EAEE,crBhEc;EqBiEd,6BAA6B;AxBo6EjC;;AwBj6EE;;EAGE,WrB7EW;EqB8EX,yBrBxEc;EqByEd,qBrBzEc;AH4+ElB;;AwBj6EI;;EAKI,iDrBhFU;AHi/ElB;;AuB77EE;ECJA,crBlBe;EqBmBf,qBrBnBe;AHw9EjB;;AKv/EE;EmBqDE,WrB1DW;EqB2DX,yBrBvBa;EqBwBb,qBrBxBa;AH89EjB;;AwBn8EE;EAEE,+CrB7Ba;AHk+EjB;;AwBl8EE;EAEE,crBlCa;EqBmCb,6BAA6B;AxBo8EjC;;AwBj8EE;;EAGE,WrB7EW;EqB8EX,yBrB1Ca;EqB2Cb,qBrB3Ca;AH8+EjB;;AwBj8EI;;EAKI,+CrBlDS;AHm/EjB;;AuB79EE;ECJA,crBhBe;EqBiBf,qBrBjBe;AHs/EjB;;AKvhFE;EmBqDE,WrB1DW;EqB2DX,yBrBrBa;EqBsBb,qBrBtBa;AH4/EjB;;AwBn+EE;EAEE,gDrB3Ba;AHggFjB;;AwBl+EE;EAEE,crBhCa;EqBiCb,6BAA6B;AxBo+EjC;;AwBj+EE;;EAGE,WrB7EW;EqB8EX,yBrBxCa;EqByCb,qBrBzCa;AH4gFjB;;AwBj+EI;;EAKI,gDrBhDS;AHihFjB;;AuB7/EE;ECJA,crBnBe;EqBoBf,qBrBpBe;AHyhFjB;;AKvjFE;EmBqDE,crBjDc;EqBkDd,yBrBxBa;EqByBb,qBrBzBa;AH+hFjB;;AwBngFE;EAEE,+CrB9Ba;AHmiFjB;;AwBlgFE;EAEE,crBnCa;EqBoCb,6BAA6B;AxBogFjC;;AwBjgFE;;EAGE,crBpEc;EqBqEd,yBrB3Ca;EqB4Cb,qBrB5Ca;AH+iFjB;;AwBjgFI;;EAKI,+CrBnDS;AHojFjB;;AuB7hFE;ECJA,crBrBe;EqBsBf,qBrBtBe;AH2jFjB;;AKvlFE;EmBqDE,WrB1DW;EqB2DX,yBrB1Ba;EqB2Bb,qBrB3Ba;AHikFjB;;AwBniFE;EAEE,+CrBhCa;AHqkFjB;;AwBliFE;EAEE,crBrCa;EqBsCb,6BAA6B;AxBoiFjC;;AwBjiFE;;EAGE,WrB7EW;EqB8EX,yBrB7Ca;EqB8Cb,qBrB9Ca;AHilFjB;;AwBjiFI;;EAKI,+CrBrDS;AHslFjB;;AuB7jFE;ECJA,crBrDgB;EqBsDhB,qBrBtDgB;AH2nFlB;;AKvnFE;EmBqDE,crBjDc;EqBkDd,yBrB1Dc;EqB2Dd,qBrB3Dc;AHioFlB;;AwBnkFE;EAEE,iDrBhEc;AHqoFlB;;AwBlkFE;EAEE,crBrEc;EqBsEd,6BAA6B;AxBokFjC;;AwBjkFE;;EAGE,crBpEc;EqBqEd,yBrB7Ec;EqB8Ed,qBrB9Ec;AHipFlB;;AwBjkFI;;EAKI,iDrBrFU;AHspFlB;;AuB7lFE;ECJA,crB9CgB;EqB+ChB,qBrB/CgB;AHopFlB;;AKvpFE;EmBqDE,WrB1DW;EqB2DX,yBrBnDc;EqBoDd,qBrBpDc;AH0pFlB;;AwBnmFE;EAEE,8CrBzDc;AH8pFlB;;AwBlmFE;EAEE,crB9Dc;EqB+Dd,6BAA6B;AxBomFjC;;AwBjmFE;;EAGE,WrB7EW;EqB8EX,yBrBtEc;EqBuEd,qBrBvEc;AH0qFlB;;AwBjmFI;;EAKI,8CrB9EU;AH+qFlB;;AuBlnFA;EACE,gBpB8M+B;EoB7M/B,cpB1Ce;EoB2Cf,qBpB6F4C;AHwhF9C;;AKxrFE;EkBsEE,cpB2F8D;EoB1F9D,0BpB2F+C;AH2hFnD;;AuB7nFA;EAYI,0BpBsF+C;EoBrF/C,gBAAgB;AvBqnFpB;;AuBloFA;EAkBI,cpBjFc;EoBkFd,oBAAoB;AvBonFxB;;AuBzmFA;ECLE,oBrBySgC;EC/Q5B,kBAtCY;EoBchB,gBrB6H+B;EO/N7B,qBPsO+B;AH++EnC;;AuB5mFA;ECTE,uBrBoSiC;EC1Q7B,mBAtCY;EoBchB,gBrB8H+B;EOhO7B,qBPuO+B;AHq/EnC;;AuB1mFA;EACE,cAAc;EACd,WAAW;AvB6mFb;;AuB/mFA;EAMI,kBpBuT+B;AHszEnC;;AuBxmFA;;;EAII,WAAW;AvB0mFf;;AyBhvFA;ELMM,gCjBsP2C;AHw/EjD;;AoBzuFI;EKXJ;ILYM,gBAAgB;EpB6uFpB;AACF;;Ay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CT,gBAAgB;A9B0nGpB;;A8B1oGA;;;;;;;;;;;;EAqBM,iB3B4M2B;AHw7FjC;;A8BzpGA;;;EA6BI,UAAU;A9BkoGd;;A8B/pGA;EAkCI,UAAU;A9BioGd;;A8BnqGA;;EpBeI,0BoBwBmD;EpBvBnD,6BoBuBmD;A9BkoGvD;;A8BzqGA;;EpB6BI,yBoBWmD;EpBVnD,4BoBUmD;A9BuoGvD;;A8B/qGA;EA8CI,oBAAa;EAAb,aAAa;EACb,sBAAmB;EAAnB,mBAAmB;A9BqoGvB;;A8BprGA;;EpBeI,0BoBmC6E;EpBlC7E,6BoBkC6E;A9BwoGjF;;A8B1rGA;EpB6BI,yBoBsBsE;EpBrBtE,4BoBqBsE;A9B4oG1E;;A8BjoGA;;EAEE,oBAAa;EAAb,aAAa;A9BooGf;;A8BtoGA;;EAQI,kBAAkB;EAClB,UAAU;A9BmoGd;;A8B5oGA;;EAYM,UAAU;A9BqoGhB;;A8BjpGA;;;;;;;;EAoBI,iB3B+I6B;AHy/FjC;;A8BpoGA;EAAuB,kB3B2IU;AH6/FjC;;A8BvoGA;EAAsB,iB3B0IW;AHigGjC;;A8BnoGA;EACE,oBAAa;EAAb,aAAa;EACb,sBAAmB;EAAnB,mBAAmB;EACnB,yB3BuRkC;E2BtRlC,gBAAgB;E1BsBZ,eAtCY;E0BkBhB,gB3BgL+B;E2B/K/B,gB3BoL+B;E2BnL/B,c3B/FgB;E2BgGhB,kBAAkB;EAClB,mBAAmB;EACnB,yB3BvGgB;E2BwGhB,yB3BtGgB;EONd,sBPqOgC;AH8gGpC;;A8BnpGA;;EAkBI,aAAa;A9BsoGjB;;A8B5nGA;;EAEE,gC3B6WqI;AHkxFvI;;A8B5nGA;;;;;;EAME,oB3BkQgC;EC/Q5B,kBAtCY;E0BqDhB,gB3BsF+B;EO/N7B,qBPsO+B;AHmiGnC;;A8B5nGA;;EAEE,kC3B2VqI;AHoyFvI;;A8B5nGA;;;;;;EAME,uB3B4OiC;EC1Q7B,mBAtCY;E0BsEhB,gB3BsE+B;EOhO7B,qBPuO+B;AHmjGnC;;A8B5nGA;;EAEE,sBAA0E;A9B+nG5E;;A8BpnGA;;;;;;EpB3JI,0BoBiK4B;EpBhK5B,6BoBgK4B;A9BwnGhC;;A8BrnGA;;;;;;EpBtJI,yBoB4J2B;EpB3J3B,4BoB2J2B;A9BynG/B;;A+B/yGA;EACE,kBAAkB;EAClB,cAAc;EACd,kBAA+C;EAC/C,oBAAqE;A/BkzGvE;;A+B/yGA;EACE,2BAAoB;EAApB,oBAAoB;EACpB,kB5Bqf0C;AH6zF5C;;A+B/yGA;EACE,kBAAkB;EAClB,WAAW;EACX,UAAU;A/BkzGZ;;A+BrzGA;EAMI,W5BpBW;E4BqBX,qB5BQa;EmB9Bb,yBnB8Ba;AH4yGjB;;A+B3zGA;EAiBM,gD5BFW;AHgzGjB;;A+B/zGA;EAsBI,qB5BqbsE;AHw3F1E;;A+Bn0GA;EA0BI,W5BxCW;E4ByCX,yB5B8e8E;E4B7e9E,qB5B6e8E;AHg0FlF;;A+Bz0GA;EAkCM,c5B1CY;AHq1GlB;;A+B70GA;EAqCQ,yB5BjDU;AH61GlB;;A+BlyGA;EACE,kBAAkB;EAClB,gBAAgB;EAChB,mBAAmB;A/BqyGrB;;A+BxyGA;EAOI,kBAAkB;EAClB,YAA+E;EAC/E,aAA+D;EAC/D,cAAc;EACd,W5B0bwC;E4BzbxC,Y5BybwC;E4BxbxC,oBAAoB;EACpB,WAAW;EACX,sB5B5EW;E4B6EX,yB5BmJ6B;AHkpGjC;;A+BrzGA;EAsBI,kBAAkB;EAClB,YAA+E;EAC/E,aAA+D;EAC/D,cAAc;EACd,W5B2awC;E4B1axC,Y5B0awC;E4BzaxC,WAAW;EACX,mCAAgE;A/BmyGpE;;A+B1xGA;ErBrGI,sBPqOgC;AH8pGpC;;A+B9xGA;EAOM,6MbrEqI;AlBg2G3I;;A+BlyGA;EAaM,qB5BnFW;EmB9Bb,yBnB8Ba;AH62GjB;;A+BvyGA;EAkBM,0JbhFqI;AlBy2G3I;;A+B3yGA;EAwBM,wC5B9FW;AHq3GjB;;A+B/yGA;EA2BM,wC5BjGW;AHy3GjB;;A+B/wGA;EAGI,kB5B0Z+C;AHs3FnD;;A+BnxGA;EAQM,uJb1GqI;AlBy3G3I;;A+BvxGA;EAcM,wC5BxHW;AHq4GjB;;A+BnwGA;EACE,qBAA2D;A/BswG7D;;A+BvwGA;EAKM,cAAqD;EACrD,c5BkY+E;E4BjY/E,mBAAmB;EAEnB,qB5BgY4E;AHq4FlF;;A+B9wGA;EAaM,wBAA0I;EAC1I,0BAA+G;EAC/G,uB5B2XiI;E4B1XjI,wB5B0XiI;E4BzXjI,yB5B3KY;E4B6KZ,qB5BsX4E;EiBziB5E,iJjB8f+H;EiB9f/H,yIjB8f+H;EiB9f/H,8KjB8f+H;AH07FrI;;AoBn7GI;EW2JJ;IX1JM,gBAAgB;EpBu7GpB;AACF;;A+B9xGA;EA0BM,sB5BzLS;E4B0LT,sCAA4E;EAA5E,8BAA4E;A/BwwGlF;;A+BnyGA;EAiCM,wC5BnKW;AHy6GjB;;A+B1vGA;EACE,qBAAqB;EACrB,WAAW;EACX,mC5BwR2H;E4BvR3H,0C5BwKkC;EChQ9B,eAtCY;E2BiIhB,gB5BiE+B;E4BhE/B,gB5BqE+B;E4BpE/B,c5B9MgB;E4B+MhB,sBAAsB;EACtB,6M5BmWmI;E4BlWnI,sB5BxNa;E4ByNb,yB5BrNgB;EONd,sBPqOgC;E4BPlC,wBAAgB;EAAhB,qBAAgB;EAAhB,gBAAgB;A/B2vGlB;;A+B3wGA;EAmBI,qB5B0PsE;E4BzPtE,UAAU;EAIR,gD5BvMW;AHg8GjB;;A+BjxGA;EAiCM,c5BtOY;E4BuOZ,sB5B9OS;AHk+Gf;;A+BtxGA;EAwCI,YAAY;EACZ,sB5BmIgC;E4BlIhC,sBAAsB;A/BkvG1B;;A+B5xGA;EA8CI,c5BpPc;E4BqPd,yB5BzPc;AH2+GlB;;A+BjyGA;EAoDI,aAAa;A/BivGjB;;A+B7uGA;EACE,kC5BmOqI;E4BlOrI,oB5B2HkC;E4B1HlC,uB5B0HkC;E4BzHlC,oB5B0HiC;EC1Q7B,mBAtCY;AJu6GlB;;A+B7uGA;EACE,gC5B4NqI;E4B3NrI,mB5BwHiC;E4BvHjC,sB5BuHiC;E4BtHjC,kB5BuHgC;EC/Q5B,kBAtCY;AJ+6GlB;;A+BxuGA;EACE,kBAAkB;EAClB,qBAAqB;EACrB,WAAW;EACX,mC5B0M2H;E4BzM3H,gBAAgB;A/B2uGlB;;A+BxuGA;EACE,kBAAkB;EAClB,UAAU;EACV,WAAW;EACX,mC5BkM2H;E4BjM3H,SAAS;EACT,UAAU;A/B2uGZ;;A+BjvGA;EASI,qB5B+KsE;E4B9KtE,gD5B9Qa;AH0/GjB;;A+BtvGA;EAcI,yB5B7Sc;AHyhHlB;;A+B1vGA;EAmBM,iB5BqUQ;AHs6Fd;;A+B9vGA;EAwBI,0BAA0B;A/B0uG9B;;A+BtuGA;EACE,kBAAkB;EAClB,MAAM;EACN,QAAQ;EACR,OAAO;EACP,UAAU;EACV,mC5BoK2H;E4BnK3H,yB5BoDkC;E4BlDlC,gB5BlD+B;E4BmD/B,gB5B9C+B;E4B+C/B,c5BjUgB;E4BkUhB,sB5BzUa;E4B0Ub,yB5BtUgB;EONd,sBPqOgC;AHg1GpC;;A+BtvGA;EAkBI,kBAAkB;EAClB,MAAM;EACN,QAAQ;EACR,SAAS;EACT,UAAU;EACV,cAAc;EACd,6B5B8I+F;E4B7I/F,yB5BkCgC;E4BjChC,gB5B9D6B;E4B+D7B,c5BjVc;E4BkVd,iBAAiB;ET1VjB,yBnBGc;E4ByVd,oBAAoB;ErB7VpB,kCqB8VgF;A/BwuGpF;;A+B9tGA;EACE,WAAW;EACX,2BAA+F;EAC/F,UAAU;EACV,6BAA6B;EAC7B,wBAAgB;EAAhB,qBAAgB;EAAhB,gBAAgB;A/BiuGlB;;A+BtuGA;EAQI,aAAa;A/BkuGjB;;A+B1uGA;EAY8B,gE5BrVb;AHujHjB;;A+B9uGA;EAa8B,gE5BtVb;AH2jHjB;;A+BlvGA;EAc8B,gE5BvVb;AH+jHjB;;A+BtvGA;EAkBI,SAAS;A/BwuGb;;A+B1vGA;EAsBI,W5B8N6C;E4B7N7C,Y5B6N6C;E4B5N7C,oBAAyE;ET/XzE,yBnB8Ba;E4BmWb,S5B6N0C;EO/lB1C,mBPgmB6C;EiB/lB3C,4GjB8f+H;E4BzHjI,wBAAgB;EAAhB,gBAAgB;A/BuuGpB;;AoBvmHI;EWkWJ;IXjWM,gBAAgB;EpB2mHpB;AACF;;A+B3wGA;ETvWI,yBnBmmB2E;AHmhG/E;;A+B/wGA;EAsCI,W5BuMoC;E4BtMpC,c5BuMqC;E4BtMrC,kBAAkB;EAClB,e5BsMuC;E4BrMvC,yB5B7Yc;E4B8Yd,yBAAyB;ErBnZzB,mBPylBoC;AHwiGxC;;A+BzxGA;EAiDI,W5BmM6C;E4BlM7C,Y5BkM6C;EmB3lB7C,yBnB8Ba;E4B6Xb,S5BmM0C;EO/lB1C,mBPgmB6C;EiB/lB3C,4GjB8f+H;E4B/FjI,qBAAgB;EAAhB,gBAAgB;A/B2uGpB;;AoBroHI;EWkWJ;IXjWM,gBAAgB;EpByoHpB;AACF;;A+BzyGA;ETvWI,yBnBmmB2E;AHijG/E;;A+B7yGA;EAgEI,W5B6KoC;E4B5KpC,c5B6KqC;E4B5KrC,kBAAkB;EAClB,e5B4KuC;E4B3KvC,yB5Bvac;E4Bwad,yBAAyB;ErB7azB,mBPylBoC;AHskGxC;;A+BvzGA;EA2EI,W5ByK6C;E4BxK7C,Y5BwK6C;E4BvK7C,aAAa;EACb,oB5BvD+B;E4BwD/B,mB5BxD+B;EmB9X/B,yBnB8Ba;E4B0Zb,S5BsK0C;EO/lB1C,mBPgmB6C;EiB/lB3C,4GjB8f+H;E4BlEjI,gBAAgB;A/B+uGpB;;AoBtqHI;EWkWJ;IXjWM,gBAAgB;EpB0qHpB;AACF;;A+B10GA;ETvWI,yBnBmmB2E;AHklG/E;;A+B90GA;EA6FI,W5BgJoC;E4B/IpC,c5BgJqC;E4B/IrC,kBAAkB;EAClB,e5B+IuC;E4B9IvC,6BAA6B;EAC7B,yBAAyB;EACzB,oBAA4C;A/BqvGhD;;A+Bx1GA;EAwGI,yB5B3cc;EOLd,mBPylBoC;AH4mGxC;;A+B71GA;EA6GI,kBAAkB;EAClB,yB5Bjdc;EOLd,mBPylBoC;AHknGxC;;A+Bn2GA;EAoHM,yB5BrdY;AHwsHlB;;A+Bv2GA;EAwHM,eAAe;A/BmvGrB;;A+B32GA;EA4HM,yB5B7dY;AHgtHlB;;A+B/2GA;EAgIM,eAAe;A/BmvGrB;;A+Bn3GA;EAoIM,yB5BreY;AHwtHlB;;A+B9uGA;;;EXhfM,4GjB8f+H;AHsuGrI;;AoB/tHI;EW2eJ;;;IX1eM,gBAAgB;EpBquHpB;AACF;;AgC7uHA;EACE,oBAAa;EAAb,aAAa;EACb,mBAAe;EAAf,eAAe;EACf,eAAe;EACf,gBAAgB;EAChB,gBAAgB;AhCgvHlB;;AgC7uHA;EACE,cAAc;EACd,oB7BkqBsC;AH8kGxC;;AK/uHE;E2BEE,qBAAqB;AhCivHzB;;AgCtvHA;EAUI,c7BVc;E6BWd,oBAAoB;EACpB,eAAe;AhCgvHnB;;AgCxuHA;EACE,gC7BxBgB;AHmwHlB;;AgC5uHA;EAII,mB7BkM6B;AH0iHjC;;AgChvHA;EAQI,6BAAgD;EtB3BhD,+BP4NgC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9BzMS;AH+lIf;;AiCh7HA;EA+BI,yB9B9MW;E8B+MX,gC9B/MW;AHomIf;;AiCr7HA;EAoCI,wP9B6fsR;AHw5G1R;;AiCz7HA;EAwCI,yB9BvNW;AH4mIf;;AiC77HA;EA0CM,yB9BzNS;AHgnIf;;AKjnIE;E4B6NM,yB9B5NO;AHonIf;;AiCj5HA;EAEI,W9B/OW;AHkoIf;;AKznIE;E4ByOI,W9BlPS;AHsoIf;;AiCz5HA;EAWM,+B9BxPS;AH0oIf;;AKjoIE;E4BkPM,gC9B3PO;AH8oIf;;AiCj6HA;EAkBQ,gC9B/PO;AHkpIf;;AiCr6HA;;;;EA0BM,W9BvQS;AHypIf;;AiC56HA;EA+BI,+B9B5QW;E8B6QX,sC9B7QW;AH8pIf;;AiCj7HA;EAoCI,8P9BkcqR;AH+8GzR;;AiCr7HA;EAwCI,+B9BrRW;AHsqIf;;AiCz7HA;EA0CM,W9BvRS;AH0qIf;;AKjqIE;E4BiRM,W9B1RO;AH8qIf;;AkCjrIA;EACE,kBAAkB;EAClB,oBAAa;EAAb,aAAa;EACb,0BAAsB;EAAtB,sBAAsB;EACtB,YAAY;EACZ,qBAAqB;EACrB,sB/BHa;E+BIb,2BAA2B;EAC3B,sC/BKa;EOZX,sBPqOgC;AHu9HpC;;AkC7rIA;EAYI,eAAe;EACf,cAAc;AlCqrIlB;;AkClsIA;ExBUI,+BP4NgC;EO3NhC,gCP2NgC;AHi+HpC;;AkCvsIA;ExBwBI,mCP8MgC;EO7MhC,kCP6MgC;AHs+HpC;;AkC/qIA;EAGE,kBAAc;EAAd,cAAc;EACd,gB/B+wByC;AHi6G3C;;AkC5qIA;EACE,sB/BywBwC;AHs6G1C;;AkC5qIA;EACE,qBAA+B;EAC/B,gBAAgB;AlC+qIlB;;AkC5qIA;EACE,gBAAgB;AlC+qIlB;;AKttIE;E6B4CE,qBAAqB;AlC8qIzB;;AkChrIA;EAMI,oB/BwvBuC;AHs7G3C;;AkCtqIA;EACE,wB/B+uByC;E+B9uBzC,gBAAgB;EAEhB,qC/BvDa;E+BwDb,6C/BxDa;AHguIf;;AkC7qIA;ExB/DI,0DwBuE8E;AlCyqIlF;;AkCjrIA;EAaM,aAAa;AlCwqInB;;AkCnqIA;EACE,wB/B6tByC;E+B5tBzC,qC/BvEa;E+BwEb,0C/BxEa;AH8uIf;;AkCzqIA;ExBjFI,0DPmzBoF;AH28GxF;;AkC9pIA;EACE,uBAAiC;EACjC,uB/B4sBwC;E+B3sBxC,sBAAgC;EAChC,gBAAgB;AlCiqIlB;;AkC9pIA;EACE,uBAAiC;EACjC,sBAAgC;AlCiqIlC;;AkC7pIA;EACE,kBAAkB;EAClB,MAAM;EACN,QAAQ;EACR,SAAS;EACT,OAAO;EACP,gB/BssByC;AH09G3C;;AkC7pIA;EACE,WAAW;ExBvHT,kCPmzBoF;AHq+GxF;;AkC5pIA;EACE,WAAW;ExBpHT,2CP0yBoF;EOzyBpF,4CPyyBoF;AH2+GxF;;AkC7pIA;EACE,WAAW;ExB3GT,+CP4xBoF;EO3xBpF,8CP2xBoF;AHi/GxF;;AkC3pIA;EACE,oBAAa;EAAb,aAAa;EACb,0BAAsB;EAAtB,sBAAsB;AlC8pIxB;;AkChqIA;EAKI,mB/B6qBsD;AHk/G1D;;ActvII;EoBkFJ;IASI,uBAAmB;IAAnB,mBAAmB;IACnB,mB/BwqBsD;I+BvqBtD,kB/BuqBsD;EHy/GxD;EkC3qIF;IAcM,oBAAa;IAAb,aAAa;IAEb,gBAAY;IAAZ,YAAY;IACZ,0BAAsB;IAAtB,sBAAsB;IACtB,kB/BgqBoD;I+B/pBpD,gBAAgB;IAChB,iB/B8pBoD;EHigHxD;AACF;;AkCtpIA;EACE,oBAAa;EAAb,aAAa;EACb,0BAAsB;EAAtB,sBAAsB;AlCypIxB;;AkC3pIA;EAOI,mB/B6oBsD;AH2gH1D;;Ac/wII;EoBgHJ;IAWI,uBAAmB;IAAnB,mBAAmB;ElCypIrB;EkCpqIF;IAgBM,gBAAY;IAAZ,YAAY;IACZ,gBAAgB;ElCupIpB;EkCxqIF;IAoBQ,cAAc;IACd,cAAc;ElCupIpB;EkC5qIF;IxBvJI,0BwBkLoC;IxBjLpC,6BwBiLoC;ElCqpItC;EkChrIF;;IAgCY,0BAA0B;ElCopIpC;EkCprIF;;IAqCY,6BAA6B;ElCmpIvC;EkCxrIF;IxBzII,yBwBmLmC;IxBlLnC,4BwBkLmC;ElCkpIrC;EkC5rIF;;IA+CY,yBAAyB;ElCipInC;EkChsIF;;IAoDY,4BAA4B;ElCgpItC;AACF;;AkCpoIA;EAEI,sB/BokBsC;AHkkH1C;;AczzII;EoBiLJ;IAMI,uB/BglBiC;I+BhlBjC,oB/BglBiC;I+BhlBjC,e/BglBiC;I+B/kBjC,2B/BglBuC;I+BhlBvC,wB/BglBuC;I+BhlBvC,mB/BglBuC;I+B/kBvC,UAAU;IACV,SAAS;ElCuoIX;EkChpIF;IAYM,qBAAqB;IACrB,WAAW;ElCuoIf;AACF;;AkC9nIA;EAEI,gBAAgB;AlCgoIpB;;AkCloIA;ExB/PI,gBwBqQ4B;AlCgoIhC;;AkCtoIA;EAUQ,gBAAgB;ExBzQpB,gBwB0Q4B;AlCgoIhC;;AkC3oIA;EAgBM,gBAAgB;ExBxPlB,6BwByPiC;ExBxPjC,4BwBwPiC;AlCgoIrC;;AkCjpIA;ExBtPI,yBwB2Q8B;ExB1Q9B,0BwB0Q8B;AlCioIlC;;AkCtpIA;EAyBM,mB/BtD2B;AHurIjC;;AmC95IA;EACE,oBAAa;EAAb,aAAa;EACb,mBAAe;EAAf,eAAe;EACf,qBhC2gCsC;EgC1gCtC,mBhC6gCsC;EgC5gCtC,gBAAgB;EAChB,yBhCGgB;EOJd,sBPqOgC;AH8rIpC;;AmC95IA;EAGI,oBhCkgCqC;AH65GzC;;AmCl6IA;EAMM,qBAAqB;EACrB,qBhC8/BmC;EgC7/BnC,chCLY;EgCMZ,YhCmgCuC;AH65G7C;;AmCz6IA;EAoBI,0BAA0B;AnCy5I9B;;AmC76IA;EAwBI,qBAAqB;AnCy5IzB;;AmCj7IA;EA4BI,chCzBc;AHk7IlB;;AoC/7IA;EACE,oBAAa;EAAb,aAAa;E7BGb,eAAe;EACf,gBAAgB;EGAd,sBPqOgC;AH4tIpC;;AoCh8IA;EACE,kBAAkB;EAClB,cAAc;EACd,uBjCqwBwC;EiCpwBxC,iBjC6N+B;EiC5N/B,iBjCwwBsC;EiCvwBtC,cjCwBe;EiCvBf,sBjCNa;EiCOb,yBjCJgB;AHu8IlB;;AoC38IA;EAWI,UAAU;EACV,cjC2J8D;EiC1J9D,qBAAqB;EACrB,yBjCXc;EiCYd,qBjCXc;AH+8IlB;;AoCn9IA;EAmBI,UAAU;EACV,UjCiwBiC;EiChwBjC,gDjCSa;AH27IjB;;AoCh8IA;EAGM,cAAc;E1BChB,+BPuMgC;EOtMhC,kCPsMgC;AH2vIpC;;AoCt8IA;E1BVI,gCPqNgC;EOpNhC,mCPoNgC;AHgwIpC;;AoC38IA;EAcI,UAAU;EACV,WjCvCW;EiCwCX,yBjCXa;EiCYb,qBjCZa;AH68IjB;;AoCl9IA;EAqBI,cjCvCc;EiCwCd,oBAAoB;EAEpB,YAAY;EACZ,sBjCjDW;EiCkDX,qBjC/Cc;AH++IlB;;AqCt/IE;EACE,uBlC8wBsC;ECnpBpC,kBAtCY;EiCnFd,gBlC8N6B;AH2xIjC;;AqCp/IM;E3BwBF,8BPwM+B;EOvM/B,iCPuM+B;AHyxInC;;AqCp/IM;E3BKF,+BPsN+B;EOrN/B,kCPqN+B;AH8xInC;;AqCtgJE;EACE,uBlC4wBqC;ECjpBnC,mBAtCY;EiCnFd,gBlC+N6B;AH0yIjC;;AqCpgJM;E3BwBF,8BPyM+B;EOxM/B,iCPwM+B;AHwyInC;;AqCpgJM;E3BKF,+BPuN+B;EOtN/B,kCPsN+B;AH6yInC;;AsCphJA;EACE,qBAAqB;EACrB,qBnC24BsC;EC10BpC,cAAW;EkC/Db,gBnCmR+B;EmClR/B,cAAc;EACd,kBAAkB;EAClB,mBAAmB;EACnB,wBAAwB;E5BRtB,sBPqOgC;EiBpO9B,qIjBqb6I;AH2mInJ;;AoB3hJI;EkBNJ;IlBOM,gBAAgB;EpB+hJpB;AACF;;AK5hJE;EiCGI,qBAAqB;AtC6hJ3B;;AsC3iJA;EAoBI,aAAa;AtC2hJjB;;AsCthJA;EACE,kBAAkB;EAClB,SAAS;AtCyhJX;;AsClhJA;EACE,oBnCg3BsC;EmC/2BtC,mBnC+2BsC;EOn5BpC,oBPs5BqC;AHoqHzC;;AsC7gJE;ECjDA,WpCMa;EoCLb,yBpCkCe;AHgiJjB;;AKpjJE;EkCVI,WpCCS;EoCAT,yBAAkC;AvCkkJxC;;AuCrkJU;EAQJ,UAAU;EACV,+CpCuBW;AH0iJjB;;AsC5hJE;ECjDA,WpCMa;EoCLb,yBpCWgB;AHskJlB;;AKnkJE;EkCVI,WpCCS;EoCAT,yBAAkC;AvCilJxC;;AuCplJU;EAQJ,UAAU;EACV,iDpCAY;AHglJlB;;AsC3iJE;ECjDA,WpCMa;EoCLb,yBpCyCe;AHujJjB;;AKllJE;EkCVI,WpCCS;EoCAT,yBAAkC;AvCgmJxC;;AuCnmJU;EAQJ,UAAU;EACV,+CpC8BW;AHikJjB;;AsC1jJE;ECjDA,WpCMa;EoCLb,yBpC2Ce;AHokJjB;;AKjmJE;EkCVI,WpCCS;EoCAT,yBAAkC;AvC+mJxC;;AuClnJU;EAQJ,UAAU;EACV,gDpCgCW;AH8kJjB;;AsCzkJE;ECjDA,cpCegB;EoCdhB,yBpCwCe;AHslJjB;;AKhnJE;EkCVI,cpCUY;EoCTZ,yBAAkC;AvC8nJxC;;AuCjoJU;EAQJ,UAAU;EACV,+CpC6BW;AHgmJjB;;AsCxlJE;ECjDA,WpCMa;EoCLb,yBpCsCe;AHumJjB;;AK/nJE;EkCVI,WpCCS;EoCAT,yBAAkC;AvC6oJxC;;AuChpJU;EAQJ,UAAU;EACV,+CpC2BW;AHinJjB;;AsCvmJE;ECjDA,cpCegB;EoCdhB,yBpCMgB;AHspJlB;;AK9oJE;EkCVI,cpCUY;EoCTZ,yBAAkC;AvC4pJxC;;AuC/pJU;EAQJ,UAAU;EACV,iDpCLY;AHgqJlB;;AsCtnJE;ECjDA,WpCMa;EoCLb,yBpCagB;AH8pJlB;;AK7pJE;EkCVI,WpCCS;EoCAT,yBAAkC;AvC2qJxC;;AuC9qJU;EAQJ,UAAU;EACV,8CpCEY;AHwqJlB;;AwCvrJA;EACE,kBAAoD;EACpD,mBrC0yBsC;EqCxyBtC,yBrCKgB;EOJd,qBPsO+B;AHm9InC;;AcloJI;E0B5DJ;IAQI,kBrCoyBoC;EHu5HtC;AACF;;AwCxrJA;EACE,gBAAgB;EAChB,eAAe;E9BTb,gB8BUsB;AxC2rJ1B;;AyCtsJA;EACE,kBAAkB;EAClB,wBtCm8ByC;EsCl8BzC,mBtCm8BsC;EsCl8BtC,6BAA6C;E/BH3C,sBPqOgC;AHw+IpC;;AyCrsJA;EAEE,cAAc;AzCusJhB;;AyCnsJA;EACE,gBtCwQ+B;AH87IjC;;AyC9rJA;EACE,mBAAsD;AzCisJxD;;AyClsJA;EAKI,kBAAkB;EAClB,MAAM;EACN,QAAQ;EACR,wBtCq6BuC;EsCp6BvC,cAAc;AzCisJlB;;AyCvrJE;EC9CA,cxBmFgE;EI9E9D,yBJ8E8D;EwBjFhE,qBxBiFgE;AlBwpJlE;;A0CvuJE;EACE,yBAAqC;A1C0uJzC;;A0CvuJE;EACE,cAA0B;A1C0uJ9B;;AyCrsJE;EC9CA,cxBmFgE;EI9E9D,yBJ8E8D;EwBjFhE,qBxBiFgE;AlBsqJlE;;A0CrvJE;EACE,yBAAqC;A1CwvJzC;;A0CrvJE;EACE,cAA0B;A1CwvJ9B;;AyCntJE;EC9CA,cxBmFgE;EI9E9D,yBJ8E8D;EwBjFhE,qBxBiFgE;AlBorJlE;;A0CnwJE;EACE,yBAAqC;A1CswJzC;;A0CnwJE;EACE,cAA0B;A1CswJ9B;;AyCjuJE;EC9CA,cxBmFgE;EI9E9D,yBJ8E8D;EwBjFhE,qBxBiFgE;AlBksJlE;;A0CjxJE;EACE,yBAAqC;A1CoxJzC;;A0CjxJE;EACE,cAA0B;A1CoxJ9B;;AyC/uJE;EC9CA,cxBmFgE;EI9E9D,yBJ8E8D;EwBjFhE,qBxBiFgE;AlBgtJlE;;A0C/xJE;EACE,yBAAqC;A1CkyJzC;;A0C/xJE;EACE,cAA0B;A1CkyJ9B;;AyC7vJE;EC9CA,cxBmFgE;EI9E9D,yBJ8E8D;EwBjFhE,qBxBiFgE;AlB8tJlE;;A0C7yJE;EACE,yBAAqC;A1CgzJzC;;A0C7yJE;EACE,cAA0B;A1CgzJ9B;;AyC3wJE;EC9CA,cxBmFgE;EI9E9D,yBJ8E8D;EwBjFhE,qBxBiFgE;AlB4uJlE;;A0C3zJE;EACE,yBAAqC;A1C8zJzC;;A0C3zJE;EACE,cAA0B;A1C8zJ9B;;AyCzxJE;EC9CA,cxBmFgE;EI9E9D,yBJ8E8D;EwBjFhE,qBxBiFgE;AlB0vJlE;;A0Cz0JE;EACE,yBAAqC;A1C40JzC;;A0Cz0JE;EACE,cAA0B;A1C40J9B;;A2Cp1JE;EACE;IAAO,2BAAuC;E3Cw1JhD;E2Cv1JE;IAAK,wBAAwB;E3C01J/B;AACF;;A2C71JE;EACE;IAAO,2BAAuC;E3Cw1JhD;E2Cv1JE;IAAK,wBAAwB;E3C01J/B;AACF;;A2Cv1JA;EACE,oBAAa;EAAb,aAAa;EACb,YxC48BsC;EwC38BtC,gBAAgB;EvCoHZ,kBAtCY;EuC5EhB,yBxCJgB;EOJd,sBPqOgC;AH8nJpC;;A2Ct1JA;EACE,oBAAa;EAAb,aAAa;EACb,0BAAsB;EAAtB,sBAAsB;EACtB,qBAAuB;EAAvB,uBAAuB;EACvB,WxCfa;EwCgBb,kBAAkB;EAClB,mBAAmB;EACnB,yBxCWe;EiB9BX,2BjBw9B4C;AHq5HlD;;AoBx2JI;EuBOJ;IvBNM,gBAAgB;EpB42JpB;AACF;;A2C51JA;ErBcE,qMAA6I;EqBZ7I,0BxCu7BsC;AHw6HxC;;A2C31JE;EACE,0DxCy7BkD;EwCz7BlD,kDxCy7BkD;AHq6HtD;;A2C51JI;EAHF;IAII,uBAAe;IAAf,eAAe;E3Cg2JnB;AACF;;A4Cx4JA;EACE,oBAAa;EAAb,aAAa;EACb,qBAAuB;EAAvB,uBAAuB;A5C24JzB;;A4Cx4JA;EACE,WAAO;EAAP,OAAO;A5C24JT;;A6C74JA;EACE,oBAAa;EAAb,aAAa;EACb,0BAAsB;EAAtB,sBAAsB;EAGtB,eAAe;EACf,gBAAgB;A7C84JlB;;A6Cr4JA;EACE,WAAW;EACX,c1CPgB;E0CQhB,mBAAmB;A7Cw4JrB;;AK94JE;EwCUE,UAAU;EACV,c1Cbc;E0Ccd,qBAAqB;EACrB,yB1CrBc;AH65JlB;;A6Cl5JA;EAcI,c1CjBc;E0CkBd,yB1CzBc;AHi6JlB;;A6C/3JA;EACE,kBAAkB;EAClB,cAAc;EACd,wB1C47ByC;E0C17BzC,mB1CuL+B;E0CrL/B,sB1C3Ca;E0C4Cb,sC1ClCa;AHk6Jf;;A6Cx4JA;EnC7BI,+BP4NgC;EO3NhC,gCP2NgC;AH8sJpC;;A6C74JA;EAeI,gBAAgB;EnC9BhB,mCP8MgC;EO7MhC,kCP6MgC;AHotJpC;;A6Cn5JA;EAqBI,c1CnDc;E0CoDd,oBAAoB;EACpB,sB1C3DW;AH67Jf;;A6Cz5JA;EA4BI,UAAU;EACV,W1CjEW;E0CkEX,yB1CrCa;E0CsCb,qB1CtCa;AHu6JjB;;A6Cp3JI;EACE,uBAAmB;EAAnB,mBAAmB;A7Cu3JzB;;A6Cx3JI;EAII,kB1C4IyB;E0C3IzB,gBAAgB;A7Cw3JxB;;A6C73JI;EnCpDA,+BPuMgC;EOtMhC,kCPsMgC;EO1LhC,0BmCgDwC;A7C03J5C;;A6Cn4JI;EAaM,eAAe;EnC/ErB,gCPqNgC;EOpNhC,mCPoNgC;EO9KhC,4BmC0C0C;A7C23J9C;;Acr6JI;E+B2BA;IACE,uBAAmB;IAAnB,mBAAmB;E7C84JvB;E6C/4JE;IAII,kB1C4IyB;I0C3IzB,gBAAgB;E7C84JtB;E6Cn5JE;InCpDA,+BPuMgC;IOtMhC,kCPsMgC;IO1LhC,0BmCgDwC;E7C+4J1C;E6Cx5JE;IAaM,eAAe;InC/ErB,gCPqNgC;IOpNhC,mCPoNgC;IO9KhC,4BmC0C0C;E7C+4J5C;AACF;;Ac17JI;E+B2BA;IACE,uBAAmB;IAAnB,mBAAmB;E7Cm6JvB;E6Cp6JE;IAII,kB1C4IyB;I0C3IzB,gBAAgB;E7Cm6JtB;E6Cx6JE;InCpDA,+BPuMgC;IOtMhC,kCPsMgC;IO1LhC,0BmCgDwC;E7Co6J1C;E6C76JE;IAaM,eAAe;InC/ErB,gCPqNgC;IOpNhC,mCPoNgC;IO9KhC,4BmC0C0C;E7Co6J5C;AACF;;Ac/8JI;E+B2BA;IACE,uBAAmB;IAAnB,mBAAmB;E7Cw7JvB;E6Cz7JE;IAII,kB1C4IyB;I0C3IzB,gBAAgB;E7Cw7JtB;E6C77JE;InCpDA,+BPuMgC;IOtMhC,kCPsMgC;IO1LhC,0BmCgDwC;E7Cy7J1C;E6Cl8JE;IAaM,eAAe;InC/ErB,gCPqNgC;IOpNhC,mCPoNgC;IO9KhC,4BmC0C0C;E7Cy7J5C;AACF;;Acp+JI;E+B2BA;IACE,uBAAmB;IAAnB,mBAAmB;E7C68JvB;E6C98JE;IAII,kB1C4IyB;I0C3IzB,gBAAgB;E7C68JtB;E6Cl9JE;InCpDA,+BPuMgC;IOtMhC,kCPsMgC;IO1LhC,0BmCgDwC;E7C88J1C;E6Cv9JE;IAaM,eAAe;InC/ErB,gCPqNgC;IOpNhC,mCPoNgC;IO9KhC,4BmC0C0C;E7C88J5C;AACF;;A6Cl8JA;EAEI,eAAe;EACf,cAAc;EnCjHd,gBmCkHwB;A7Co8J5B;;A6Cx8JA;EAOM,mB1C6G2B;AHw1JjC;;A6C58JA;EAaM,aAAa;A7Cm8JnB;;A6Ch9JA;EAmBM,gBAAgB;EAChB,gBAAgB;A7Ci8JtB;;A8CrkKE;EACE,c5BgF8D;E4B/E9D,yB5B+E8D;AlBy/JlE;;AK7jKE;EyCPM,c5B2E0D;E4B1E1D,yBAAyC;A9CwkKjD;;A8C/kKE;EAWM,W3CPO;E2CQP,yB5BqE0D;E4BpE1D,qB5BoE0D;AlBogKlE;;A8CrlKE;EACE,c5BgF8D;E4B/E9D,yB5B+E8D;AlBygKlE;;AK7kKE;EyCPM,c5B2E0D;E4B1E1D,yBAAyC;A9CwlKjD;;A8C/lKE;EAWM,W3CPO;E2CQP,yB5BqE0D;E4BpE1D,qB5BoE0D;AlBohKlE;;A8CrmKE;EACE,c5BgF8D;E4B/E9D,yB5B+E8D;AlByhKlE;;AK7lKE;EyCPM,c5B2E0D;E4B1E1D,yBAAyC;A9CwmKjD;;A8C/mKE;EAWM,W3CPO;E2CQP,yB5BqE0D;E4BpE1D,qB5BoE0D;AlBoiKlE;;A8CrnKE;EACE,c5BgF8D;E4B/E9D,yB5B+E8D;AlByiKlE;;AK7mKE;EyCPM,c5B2E0D;E4B1E1D,yBAAyC;A9CwnKjD;;A8C/nKE;EAWM,W3CPO;E2CQP,yB5BqE0D;E4BpE1D,qB5BoE0D;AlBojKlE;;A8CroKE;EACE,c5BgF8D;E4B/E9D,yB5B+E8D;AlByjKlE;;AK7nKE;EyCPM,c5B2E0D;E4B1E1D,yBAAyC;A9CwoKjD;;A8C/oKE;EAWM,W3CPO;E2CQP,yB5BqE0D;E4BpE1D,qB5BoE0D;AlBokKlE;;A8CrpKE;EACE,c5BgF8D;E4B/E9D,yB5B+E8D;AlBykKlE;;AK7oKE;EyCPM,c5B2E0D;E4B1E1D,yBAAyC;A9CwpKjD;;A8C/pKE;EAWM,W3CPO;E2CQP,yB5BqE0D;E4BpE1D,qB5BoE0D;AlBolKlE;;A8CrqKE;EACE,c5BgF8D;E4B/E9D,yB5B+E8D;AlBylKlE;;AK7pKE;EyCPM,c5B2E0D;E4B1E1D,yBAAyC;A9CwqKjD;;A8C/qKE;EAWM,W3CPO;E2CQP,yB5BqE0D;E4BpE1D,qB5BoE0D;AlBomKlE;;A8CrrKE;EACE,c5BgF8D;E4B/E9D,yB5B+E8D;AlBymKlE;;AK7qKE;EyCPM,c5B2E0D;E4B1E1D,yBAAyC;A9CwrKjD;;A8C/rKE;EAWM,W3CPO;E2CQP,yB5BqE0D;E4BpE1D,qB5BoE0D;AlBonKlE;;A+CxsKA;EACE,YAAY;E3C8HR,iBAtCY;E2CtFhB,gB5CyR+B;E4CxR/B,cAAc;EACd,W5CYa;E4CXb,yB5CCa;E4CAb,WAAW;A/C2sKb;;AKtsKE;E0CDE,W5CMW;E4CLX,qBAAqB;A/C2sKzB;;AKvsKE;E0CCI,YAAY;A/C0sKlB;;A+C/rKA;EACE,UAAU;EACV,6BAA6B;EAC7B,SAAS;EACT,wBAAgB;EAAhB,qBAAgB;EAAhB,gBAAgB;A/CksKlB;;A+C5rKA;EACE,oBAAoB;A/C+rKtB;;AgDtuKA;EACE,gB7C43BuC;E6C33BvC,gBAAgB;E5C6HZ,mBAtCY;E4CpFhB,2C7CEa;E6CDb,4BAA4B;EAC5B,oC7C63BmD;E6C53BnD,gD7CSa;E6CRb,mCAA2B;EAA3B,2BAA2B;EAC3B,UAAU;EtCLR,sBPg4BsC;AH82I1C;;AgDnvKA;EAcI,sB7Cg3BsC;AHy3I1C;;AgDvvKA;EAkBI,UAAU;AhDyuKd;;AgD3vKA;EAsBI,cAAc;EACd,UAAU;AhDyuKd;;AgDhwKA;EA2BI,aAAa;AhDyuKjB;;AgDruKA;EACE,oBAAa;EAAb,aAAa;EACb,sBAAmB;EAAnB,mBAAmB;EACnB,wB7C41BwC;E6C31BxC,c7CtBgB;E6CuBhB,2C7C7Ba;E6C8Bb,4BAA4B;EAC5B,4C7Co2BoD;AHo4ItD;;AgDruKA;EACE,gB7Co1BwC;AHo5I1C;;AiD5wKA;EAEE,gBAAgB;AjD8wKlB;;AiDhxKA;EAKI,kBAAkB;EAClB,gBAAgB;AjD+wKpB;;AiD1wKA;EACE,eAAe;EACf,MAAM;EACN,OAAO;EACP,a9CopBsC;E8CnpBtC,aAAa;EACb,WAAW;EACX,YAAY;EACZ,gBAAgB;EAGhB,UAAU;AjD2wKZ;;AiDpwKA;EACE,kBAAkB;EAClB,WAAW;EACX,c9C63BuC;E8C33BvC,oBAAoB;AjDswKtB;;AiDnwKE;E7BrCI,2CjB27BoD;EiB37BpD,mCjB27BoD;EiB37BpD,oEjB27BoD;E8Cp5BtD,sC9Ck5BmD;E8Cl5BnD,8B9Ck5BmD;AHo3IvD;;AoBxyKI;E6BgCF;I7B/BI,gBAAgB;EpB4yKpB;AACF;;AiD1wKE;EACE,uB9Cg5BoC;E8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hLf;;AkD3+KA;EACE,iBAAgC;AlD8+KlC;;AkD/+KA;EAII,MAAM;AlD++KV;;AkDn/KA;EAOM,SAAS;EACT,6B/CgxBmC;E+C/wBnC,yB/CrDS;AHqiLf;;AkD3+KA;EACE,iB/CywBuC;AHquJzC;;AkD/+KA;EAII,QAAQ;EACR,a/CqwBqC;E+CpwBrC,c/CmwBqC;AH4uJzC;;AkDr/KA;EASM,OAAO;EACP,oC/CgwBmC;E+C/vBnC,uB/CrES;AHqjLf;;AkD39KA;EACE,gB/C+tBuC;E+C9tBvC,uB/CouBuC;E+CnuBvC,W/CvGa;E+CwGb,kBAAkB;EAClB,sB/C/Fa;EOZX,sBPqOgC;AHq2KpC;;AoD/kLA;EACE,kBAAkB;EAClB,MAAM;EACN,OAAO;EACP,ajDsqBsC;EiDrqBtC,cAAc;EACd,gBjD+1BuC;EgDp2BvC,kMhD+QiN;EgD7QjN,kBAAkB;EAClB,gBhDuR+B;EgDtR/B,gBhD2R+B;EgD1R/B,gBAAgB;EAChB,iBAAiB;EACjB,qBAAqB;EACrB,iBAAiB;EACjB,oBAAoB;EACpB,sBAAsB;EACtB,kBAAkB;EAClB,oBAAoB;EACpB,mBAAmB;EACnB,gBAAgB;E/CgHZ,mBAtCY;EgD7EhB,qBAAqB;EACrB,sBjDNa;EiDOb,4BAA4B;EAC5B,oCjDEa;EOZX,qBPsO+B;AHi4KnC;;AoD5mLA;EAoBI,kBAAkB;EAClB,cAAc;EACd,WjD81BoC;EiD71BpC,cjD81BqC;EiD71BrC,gBjDmN+B;AHy4KnC;;AoDpnLA;EA4BM,kBAAkB;EAClB,cAAc;EACd,WAAW;EACX,yBAAyB;EACzB,mBAAmB;ApD4lLzB;;AoDvlLA;EACE,qBjD+0BuC;AH2wJzC;;AoD3lLA;EAII,iCAAwE;ApD2lL5E;;AoD/lLA;EAOM,SAAS;EACT,6BAAgE;EAChE,qCjD00BiE;AHkxJvE;;AoDrmLA;EAaM,WjDqL2B;EiDpL3B,6BAAgE;EAChE,sBjD7CS;AHyoLf;;AoDvlLA;EACE,mBjD2zBuC;AH+xJzC;;AoD3lLA;EAII,+BAAsE;EACtE,ajDuzBqC;EiDtzBrC,YjDqzBoC;EiDpzBpC,gBAA2B;ApD2lL/B;;AoDlmLA;EAUM,OAAO;EACP,oCAA2F;EAC3F,uCjDmzBiE;AHyyJvE;;AoDxmLA;EAgBM,SjD8J2B;EiD7J3B,oCAA2F;EAC3F,wBjDpES;AHgqLf;;AoDvlLA;EACE,kBjDoyBuC;AHszJzC;;AoD3lLA;EAII,8BAAqE;ApD2lLzE;;AoD/lLA;EAOM,MAAM;EACN,oCAA2F;EAC3F,wCjD+xBiE;AH6zJvE;;AoDrmLA;EAaM,QjD0I2B;EiDzI3B,oCAA2F;EAC3F,yBjDxFS;AHorLf;;AoD3mLA;EAqBI,kBAAkB;EAClB,MAAM;EACN,SAAS;EACT,cAAc;EACd,WjD2wBoC;EiD1wBpC,oBAAsC;EACtC,WAAW;EACX,gCjD+vBuD;AH21J3D;;AoDtlLA;EACE,oBjDowBuC;AHq1JzC;;AoD1lLA;EAII,gCAAuE;EACvE,ajDgwBqC;EiD/vBrC,YjD8vBoC;EiD7vBpC,gBAA2B;ApD0lL/B;;AoDjmLA;EAUM,QAAQ;EACR,oCjD0vBmC;EiDzvBnC,sCjD4vBiE;AH+1JvE;;AoDvmLA;EAgBM,UjDuG2B;EiDtG3B,oCjDovBmC;EiDnvBnC,uBjD3HS;AHstLf;;AoDrkLA;EACE,uBjDqtBwC;EiDptBxC,gBAAgB;EhD3BZ,eAtCY;EgDoEhB,yBjD8sByD;EiD7sBzD,gCAAyE;E1ChJvE,0C0CiJyE;E1ChJzE,2C0CgJyE;ApDwkL7E;;AoD/kLA;EAWI,aAAa;ApDwkLjB;;AoDpkLA;EACE,uBjDssBwC;EiDrsBxC,cjDzJgB;AHguLlB;;AqDnuLA;EACE,kBAAkB;ArDsuLpB;;AqDnuLA;EACE,uBAAmB;EAAnB,mBAAmB;ArDsuLrB;;AqDnuLA;EACE,kBAAkB;EAClB,WAAW;EACX,gBAAgB;ArDsuLlB;;AsD7vLE;EACE,cAAc;EACd,WAAW;EACX,WAAW;AtDgwLf;;AqDxuLA;EACE,kBAAkB;EAClB,aAAa;EACb,WAAW;EACX,WAAW;EACX,mBAAmB;EACnB,mCAA2B;EAA3B,2BAA2B;EjC5BvB,8CjB6iCkF;EiB7iClF,sCjB6iCkF;EiB7iClF,0EjB6iCkF;AH2tJxF;;AoBnwLI;EiCiBJ;IjChBM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E,oCAAmC;AzD4/LvC;;AKl/LE;;;EoDLI,oCAAgD;AzD6/LtD;;AyDngME;EACE,oCAAmC;AzDsgMvC;;AK5/LE;;;EoDLI,oCAAgD;AzDugMtD;;AyD7gME;EACE,oCAAmC;AzDghMvC;;AKtgME;;;EoDLI,oCAAgD;AzDihMtD;;AyDvhME;EACE,oCAAmC;AzD0hMvC;;AKhhME;;;EoDLI,oCAAgD;AzD2hMtD;;AyDjiME;EACE,oCAAmC;AzDoiMvC;;AK1hME;;;EoDLI,oCAAgD;AzDqiMtD;;AyD3iME;EACE,oCAAmC;AzD8iMvC;;AKpiME;;;EoDLI,oCAAgD;AzD+iMtD;;AyDrjME;EACE,oCAAmC;AzDwjMvC;;AK9iME;;;EoDLI,oCAAgD;AzDyjMtD;;A0DxjMA;EACE,iCAAmC;A1D2jMrC;;A0DxjMA;EACE,wCAAwC;A1D2jM1C;;A2DtkMA;EAAkB,oCAAoD;A3D0kMtE;;A2DzkMA;EAAkB,wCAAwD;A3D6kM1E;;A2D5kMA;EAAkB,0CAA0D;A3DglM5E;;A2D/kMA;EAAkB,2CAA2D;A3DmlM7E;;A2DllMA;EAAkB,yCAAyD;A3DslM3E;;A2DplMA;EAAmB,oBAAoB;A3DwlMvC;;A2DvlMA;EAAmB,wBAAwB;A3D2lM3C;;A2D1lMA;EAAmB,0BAA0B;A3D8lM7C;;A2D7lMA;EAAmB,2BAA2B;A3DimM9C;;A2DhmMA;EAAmB,yBAAyB;A3DomM5C;;A2DjmME;EACE,gCAA+B;A3DomMnC;;A2DrmME;EACE,gCAA+B;A3DwmMnC;;A2DzmME;EACE,gCAA+B;A3D4mMnC;;A2D7mME;EACE,gCAA+B;A3DgnMnC;;A2DjnME;EACE,gCAA+B;A3DonMnC;;A2DrnME;EACE,gCAA+B;A3DwnMnC;;A2DznME;EACE,gCAA+B;A3D4nMnC;;A2D7nME;EACE,gCAA+B;A3DgoMnC;;A2D5nMA;EACE,6BAA+B;A3D+nMjC;;A2DxnMA;EACE,gCAA2C;A3D2nM7C;;A2DxnMA;EACE,iCAAwC;A3D2nM1C;;A2DxnMA;EACE,0CAAiD;EACjD,2CAAkD;A3D2nMpD;;A2DxnMA;EACE,2CAAkD;EAClD,8CAAqD;A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tOhD;;AuEjuOQ;EAAgC,yBAA4B;AvEquOpE;;AuEpuOQ;;EAEE,6BAAoC;AvEuuO9C;;AuEruOQ;;EAEE,+BAAwC;AvEwuOlD;;AuEtuOQ;;EAEE,gCAA0C;AvEyuOpD;;AuEvuOQ;;EAEE,8BAAsC;AvE0uOhD;;AuEzvOQ;EAAgC,uBAA4B;AvE6vOpE;;AuE5vOQ;;EAEE,2BAAoC;AvE+vO9C;;AuE7vOQ;;EAEE,6BAAwC;AvEgwOlD;;AuE9vOQ;;EAEE,8BAA0C;AvEiwOpD;;AuE/vOQ;;EAEE,4BAAsC;AvEkwOhD;;AuEjxOQ;EAAgC,yBAA4B;AvEqxOpE;;AuEpxOQ;;EAEE,6BAAoC;AvEuxO9C;;AuErxOQ;;EAEE,+BAAwC;AvEwxOlD;;AuEtxOQ;;EAEE,gCAA0C;AvEyxOpD;;AuEvxOQ;;EAEE,8BAAsC;AvE0xOhD;;AuEzyOQ;EAAgC,uBAA4B;AvE6yOpE;;AuE5yOQ;;EAEE,2BAAoC;AvE+yO9C;;AuE7yOQ;;EAEE,6BAAwC;AvEgzOlD;;AuE9yOQ;;EAEE,8BAA0C;AvEizOpD;;AuE/yOQ;;EAEE,4BAAsC;AvEkzOhD;;AuEj0OQ;EAAgC,qBAA4B;AvEq0OpE;;AuEp0OQ;;EAEE,yBAAoC;AvEu0O9C;;AuEr0OQ;;EAEE,2BAAwC;AvEw0OlD;;AuEt0OQ;;EAEE,4BAA0C;AvEy0OpD;;AuEv0OQ;;EAEE,0BAAsC;AvE00OhD;;AuEz1OQ;EAAgC,2BAA4B;AvE61OpE;;AuE51OQ;;EAEE,+BAAoC;AvE+1O9C;;AuE71OQ;;EAEE,iCAAwC;AvEg2OlD;;AuE91OQ;;EAEE,kCAA0C;AvEi2OpD;;AuE/1OQ;;EAEE,gCAAsC;AvEk2OhD;;AuEj3OQ;EAAgC,0BAA4B;AvEq3OpE;;AuEp3OQ;;EAEE,8BAAoC;AvEu3O9C;;AuEr3OQ;;EAEE,gCAAwC;AvEw3OlD;;AuEt3OQ;;EAEE,iCAA0C;AvEy3OpD;;AuEv3OQ;;EAEE,+BAAsC;AvE03OhD;;AuEz4OQ;EAAgC,wBAA4B;AvE64OpE;;AuE54OQ;;EAEE,4BAAoC;AvE+4O9C;;AuE74OQ;;EAEE,8BAAwC;AvEg5OlD;;AuE94OQ;;EAEE,+BAA0C;AvEi5OpD;;AuE/4OQ;;EAEE,6BAAsC;AvEk5OhD;;AuEj6OQ;EAAgC,0BAA4B;AvEq6OpE;;AuEp6OQ;;EAEE,8BAAoC;AvEu6O9C;;AuEr6OQ;;EAEE,gCAAwC;AvEw6OlD;;AuEt6OQ;;EAEE,iCAA0C;AvEy6OpD;;AuEv6OQ;;EAEE,+BAAsC;AvE06OhD;;AuEz7OQ;EAAgC,wBAA4B;AvE67OpE;;AuE57OQ;;EAEE,4BAAoC;AvE+7O9C;;AuE77OQ;;EAEE,8BAAwC;AvEg8OlD;;AuE97OQ;;EAEE,+BAA0C;AvEi8OpD;;AuE/7OQ;;EAEE,6BAAsC;AvEk8OhD;;AuE17OQ;EAAwB,2BAA2B;AvE87O3D;;AuE77OQ;;EAEE,+BAA+B;AvEg8OzC;;AuE97OQ;;EAEE,iCAAiC;AvEi8O3C;;AuE/7OQ;;EAEE,kCAAkC;AvEk8O5C;;AuEh8OQ;;EAEE,gCAAgC;AvEm8O1C;;AuEl9OQ;EAAwB,0BAA2B;AvEs9O3D;;AuEr9OQ;;EAEE,8BAA+B;AvEw9OzC;;AuEt9OQ;;EAEE,gCAAiC;AvEy9O3C;;AuEv9OQ;;EAEE,iCAAkC;AvE09O5C;;AuEx9OQ;;EAEE,+BAAgC;AvE29O1C;;AuE1+OQ;EAAwB,wBAA2B;AvE8+O3D;;AuE7+OQ;;EAEE,4BAA+B;AvEg/OzC;;AuE9+OQ;;EAEE,8BAAiC;AvEi/O3C;;AuE/+OQ;;EAEE,+BAAkC;AvEk/O5C;;AuEh/OQ;;EAEE,6BAAgC;AvEm/O1C;;AuElgPQ;EAAwB,0BAA2B;AvEsgP3D;;AuErgPQ;;EAEE,8BAA+B;AvEwgPzC;;AuEtgPQ;;EAEE,gCAAiC;AvEygP3C;;AuEvgPQ;;EAEE,iCAAkC;AvE0gP5C;;AuExgPQ;;EAEE,+BAAgC;AvE2gP1C;;AuE1hPQ;EAAwB,wBAA2B;AvE8hP3D;;AuE7hPQ;;EAEE,4BAA+B;AvEgiPzC;;AuE9hPQ;;EAEE,8BAAiC;AvEiiP3C;;AuE/hPQ;;EAEE,+BAAkC;AvEkiP5C;;AuEhiPQ;;EAEE,6BAAgC;AvEmiP1C;;AuE7hPI;EAAmB,uBAAuB;AvEiiP9C;;AuEhiPI;;EAEE,2BAA2B;AvEmiPjC;;AuEjiPI;;EAEE,6BAA6B;AvEoiPnC;;AuEliPI;;EAEE,8BAA8B;AvEqiPpC;;AuEniPI;;EAEE,4BAA4B;AvEsiPlC;;Ac/iPI;EyDlDI;IAAgC,oBAA4B;EvEsmPlE;EuErmPM;;IAEE,wBAAoC;EvEumP5C;EuErmPM;;IAEE,0BAAwC;EvEumPhD;EuErmPM;;IAEE,2BAA0C;EvEumPlD;EuErmPM;;IAEE,yBAAsC;EvEumP9C;EuEtnPM;IAAgC,0BAA4B;EvEynPlE;EuExnPM;;IAEE,8BAAoC;EvE0nP5C;EuExnPM;;IAEE,gCAAwC;EvE0nPhD;EuExnPM;;IAEE,iCAA0C;EvE0nPlD;EuExnPM;;IAEE,+BAAsC;EvE0nP9C;EuEzoPM;IAAgC,yBAA4B;EvE4oPlE;EuE3oPM;;IAEE,6BAAoC;EvE6oP5C;EuE3oPM;;IAEE,+BAAwC;EvE6oPhD;EuE3oPM;;IAEE,gCAA0C;EvE6oPlD;EuE3oPM;;IAEE,8BAAsC;EvE6oP9C;EuE5pPM;IAAgC,uBAA4B;EvE+pPlE;EuE9pPM;;IAEE,2BAAoC;EvEgqP5C;EuE9pPM;;IAEE,6BAAwC;EvEgqPhD;EuE9pPM;;IAEE,8BAA0C;EvEgqPlD;EuE9pPM;;IAEE,4BAAsC;EvEgqP9C;EuE/qPM;IAAgC,yBAA4B;EvEkrPlE;EuEjrPM;;IAEE,6BAAoC;EvEmrP5C;EuEjrPM;;IAEE,+BAAwC;EvEmrPhD;EuEjrPM;;IAEE,gCAA0C;EvEmrPlD;EuEjrPM;;IAEE,8BAAsC;EvEmrP9C;EuElsPM;IAAgC,uBAA4B;EvEqsPlE;EuEpsPM;;IAEE,2BAAoC;EvEssP5C;EuEpsPM;;IAEE,6BAAwC;EvEssPhD;EuEpsPM;;IAEE,8BAA0C;EvEssPlD;EuEpsPM;;IAEE,4BAAsC;EvEssP9C;EuErtPM;IAAgC,qBAA4B;EvEwtPlE;EuEvtPM;;IAEE,yBAAoC;EvEytP5C;EuEvtPM;;IAEE,2BAAwC;EvEytPhD;EuEvtPM;;IAEE,4BAA0C;EvEytPlD;EuEvtPM;;IAEE,0BAAsC;EvEytP9C;EuExuPM;IAAgC,2BAA4B;EvE2uPlE;EuE1uPM;;IAEE,+BAAoC;EvE4uP5C;EuE1uPM;;IAEE,iCAAwC;EvE4uPhD;EuE1uPM;;IAEE,kCAA0C;EvE4uPlD;EuE1uPM;;IAEE,gCAAsC;EvE4uP9C;EuE3vPM;IAAgC,0BAA4B;EvE8vPlE;EuE7vPM;;IAEE,8BAAoC;EvE+vP5C;EuE7vPM;;IAEE,gCAAwC;EvE+vPhD;EuE7vPM;;IAEE,iCAA0C;EvE+vPlD;EuE7vPM;;IAEE,+BAAsC;EvE+vP9C;EuE9wPM;IAAgC,wBAA4B;EvEixPlE;EuEhxPM;;IAEE,4BAAoC;EvEkxP5C;EuEhxPM;;IAEE,8BAAwC;EvEkxPhD;EuEhxPM;;IAEE,+BAA0C;EvEkxPlD;EuEhxPM;;IAEE,6BAAsC;EvEkxP9C;EuEjyPM;IAAgC,0BAA4B;EvEoyPlE;EuEnyPM;;IAEE,8BAAoC;EvEqyP5C;EuEnyPM;;IAEE,gCAAwC;EvEqyPhD;EuEnyPM;;IAEE,iCAA0C;EvEqyPlD;EuEnyPM;;IAEE,+BAAsC;EvEqyP9C;EuEpzPM;IAAgC,wBAA4B;EvEuzPlE;EuEtzPM;;IAEE,4BAAoC;EvEwzP5C;EuEtzPM;;IAEE,8BAAwC;EvEwzPhD;EuEtzPM;;IAEE,+BAA0C;EvEwzPlD;EuEtzPM;;IAEE,6BAAsC;EvEwzP9C;EuEhzPM;IAAwB,2BAA2B;EvEmzPzD;EuElzPM;;IAEE,+BAA+B;EvEozPvC;EuElzPM;;IAEE,iCAAiC;EvEozPzC;EuElzPM;;IAEE,kCAAkC;EvEozP1C;EuElzPM;;IAEE,gCAAgC;EvEozPxC;EuEn0PM;IAAwB,0BAA2B;EvEs0PzD;EuEr0PM;;IAEE,8BAA+B;EvEu0PvC;EuEr0PM;;IAEE,gCAAiC;EvEu0PzC;EuEr0PM;;IAEE,iCAAkC;EvEu0P1C;EuEr0PM;;IAEE,+BAAgC;EvEu0PxC;EuEt1PM;IAAwB,wBAA2B;EvEy1PzD;EuEx1PM;;IAEE,4BAA+B;EvE01PvC;EuEx1PM;;IAEE,8BAAiC;EvE01PzC;EuEx1PM;;IAEE,+BAAkC;EvE01P1C;EuEx1PM;;IAEE,6BAAgC;EvE01PxC;EuEz2PM;IAAwB,0BAA2B;EvE42PzD;EuE32PM;;IAEE,8BAA+B;EvE62PvC;EuE32PM;;IAEE,gCAAiC;EvE62PzC;EuE32PM;;IAEE,iCAAkC;EvE62P1C;EuE32PM;;IAEE,+BAAgC;EvE62PxC;EuE53PM;IAAwB,wBAA2B;EvE+3PzD;EuE93PM;;IAEE,4BAA+B;EvEg4PvC;EuE93PM;;IAEE,8BAAiC;EvEg4PzC;EuE93PM;;IAEE,+BAAkC;EvEg4P1C;EuE93PM;;IAEE,6BAAgC;EvEg4PxC;EuE13PE;IAAmB,uBAAuB;EvE63P5C;EuE53PE;;IAEE,2BAA2B;EvE83P/B;EuE53PE;;IAEE,6BAA6B;EvE83PjC;EuE53PE;;IAEE,8BAA8B;EvE83PlC;EuE53PE;;IAEE,4BAA4B;EvE83PhC;AACF;;Acx4PI;EyDlDI;IAAgC,oBAA4B;EvE+7PlE;EuE97PM;;IAEE,wBAAoC;EvEg8P5C;EuE97PM;;IAEE,0BAAwC;EvEg8PhD;EuE97PM;;IAEE,2BAA0C;EvEg8PlD;EuE97PM;;IAEE,yBAAsC;EvEg8P9C;EuE/8PM;IAAgC,0BAA4B;EvEk9PlE;EuEj9PM;;IAEE,8BAAoC;EvEm9P5C;EuEj9PM;;IAEE,gCAAwC;EvEm9PhD;EuEj9PM;;IAEE,iCAA0C;EvEm9PlD;EuEj9PM;;IAEE,+BAAsC;EvEm9P9C;EuEl+PM;IAAgC,yBAA4B;EvEq+PlE;EuEp+PM;;IAEE,6BAAoC;EvEs+P5C;EuEp+PM;;IAEE,+BAAwC;EvEs+PhD;EuEp+PM;;IAEE,gCAA0C;EvEs+PlD;EuEp+PM;;IAEE,8BAAsC;EvEs+P9C;EuEr/PM;IAAgC,uBAA4B;EvEw/PlE;EuEv/PM;;IAEE,2BAAoC;EvEy/P5C;EuEv/PM;;IAEE,6BAAwC;EvEy/PhD;EuEv/PM;;IAEE,8BAA0C;EvEy/PlD;EuEv/PM;;IAEE,4BAAsC;EvEy/P9C;EuExgQM;IAAgC,yBAA4B;EvE2gQlE;EuE1gQM;;IAEE,6BAAoC;EvE4gQ5C;EuE1gQM;;IAEE,+BAAwC;EvE4gQhD;EuE1gQM;;IAEE,gCAA0C;EvE4gQlD;EuE1gQM;;IAEE,8BAAsC;EvE4gQ9C;EuE3hQM;IAAgC,uBAA4B;EvE8hQlE;EuE7hQM;;IAEE,2BAAoC;EvE+hQ5C;EuE7hQM;;IAEE,6BAAwC;EvE+hQhD;EuE7hQM;;IAEE,8BAA0C;EvE+hQlD;EuE7hQM;;IAEE,4BAAsC;EvE+hQ9C;EuE9iQM;IAAgC,qBAA4B;EvEijQlE;EuEhjQM;;IAEE,yBAAoC;EvEkjQ5C;EuEhjQM;;IAEE,2BAAwC;EvEkjQhD;EuEhjQM;;IAEE,4BAA0C;EvEkjQlD;EuEhjQM;;IAEE,0BAAsC;EvEkjQ9C;EuEjkQM;IAAgC,2BAA4B;EvEokQlE;EuEnkQM;;IAEE,+BAAoC;EvEqkQ5C;EuEnkQM;;IAEE,iCAAwC;EvEqkQhD;EuEnkQM;;IAEE,kCAA0C;EvEqkQlD;EuEnkQM;;IAEE,gCAAsC;EvEqkQ9C;EuEplQM;IAAgC,0BAA4B;EvEulQlE;EuEtlQM;;IAEE,8BAAoC;EvEwlQ5C;EuEtlQM;;IAEE,gCAAwC;EvEwlQhD;EuEtlQM;;IAEE,iCAA0C;EvEwlQlD;EuEtlQM;;IAEE,+BAAsC;EvEwlQ9C;EuEvmQM;IAAgC,wBAA4B;EvE0mQlE;EuEzmQM;;IAEE,4BAAoC;EvE2mQ5C;EuEzmQM;;IAEE,8BAAwC;EvE2mQhD;EuEzmQM;;IAEE,+BAA0C;EvE2mQlD;EuEzmQM;;IAEE,6BAAsC;EvE2mQ9C;EuE1nQM;IAAgC,0BAA4B;EvE6nQlE;EuE5nQM;;IAEE,8BAAoC;EvE8nQ5C;EuE5nQM;;IAEE,gCAAwC;EvE8nQhD;EuE5nQM;;IAEE,iCAA0C;EvE8nQlD;EuE5nQM;;IAEE,+BAAsC;EvE8nQ9C;EuE7oQM;IAAgC,wBAA4B;EvEgpQlE;EuE/oQM;;IAEE,4BAAoC;EvEipQ5C;EuE/oQM;;IAEE,8BAAwC;EvEipQhD;EuE/oQM;;IAEE,+BAA0C;EvEipQlD;EuE/oQM;;IAEE,6BAAsC;EvEipQ9C;EuEzoQM;IAAwB,2BAA2B;EvE4oQzD;EuE3oQM;;IAEE,+BAA+B;EvE6oQvC;EuE3oQM;;IAEE,iCAAiC;EvE6oQzC;EuE3oQM;;IAEE,kCAAkC;EvE6oQ1C;EuE3oQM;;IAEE,gCAAgC;EvE6oQxC;EuE5pQM;IAAwB,0BAA2B;EvE+pQzD;EuE9pQM;;IAEE,8BAA+B;EvEgqQvC;EuE9pQM;;IAEE,gCAAiC;EvEgqQzC;EuE9pQM;;IAEE,iCAAkC;EvEgqQ1C;EuE9pQM;;IAEE,+BAAgC;EvEgqQxC;EuE/qQM;IAAwB,wBAA2B;EvEkrQzD;EuEjrQM;;IAEE,4BAA+B;EvEmrQvC;EuEjrQM;;IAEE,8BAAiC;EvEmrQzC;EuEjrQM;;IAEE,+BAAkC;EvEmrQ1C;EuEjrQM;;IAEE,6BAAgC;EvEmrQxC;EuElsQM;IAAwB,0BAA2B;EvEqsQzD;EuEpsQM;;IAEE,8BAA+B;EvEssQvC;EuEpsQM;;IAEE,gCAAiC;EvEssQzC;EuEpsQM;;IAEE,iCAAkC;EvEssQ1C;EuEpsQM;;IAEE,+BAAgC;EvEssQxC;EuErtQM;IAAwB,wBAA2B;EvEwtQzD;EuEvtQM;;IAEE,4BAA+B;EvEytQvC;EuEvtQM;;IAEE,8BAAiC;EvEytQzC;EuEvtQM;;IAEE,+BAAkC;EvEytQ1C;EuEvtQM;;IAEE,6BAAgC;EvEytQxC;EuEntQE;IAAmB,uBAAuB;EvEstQ5C;EuErtQE;;IAEE,2BAA2B;EvEutQ/B;EuErtQE;;IAEE,6BAA6B;EvEutQjC;EuErtQE;;IAEE,8BAA8B;EvEutQlC;EuErtQE;;IAEE,4BAA4B;EvEutQhC;AACF;;AcjuQI;EyDlDI;IAAgC,oBAA4B;EvEwxQlE;EuEvxQM;;IAEE,wBAAoC;EvEyxQ5C;EuEvxQM;;IAEE,0BAAwC;EvEyxQhD;EuEvxQM;;IAEE,2BAA0C;EvEyxQlD;EuEvxQM;;IAEE,yBAAsC;EvEyxQ9C;EuExyQM;IAAgC,0BAA4B;EvE2yQlE;EuE1yQM;;IAEE,8BAAoC;EvE4yQ5C;EuE1yQM;;IAEE,gCAAwC;EvE4yQhD;EuE1yQM;;IAEE,iCAA0C;EvE4yQlD;EuE1yQM;;IAEE,+BAAsC;EvE4yQ9C;EuE3zQM;IAAgC,yBAA4B;EvE8zQlE;EuE7zQM;;IAEE,6BAAoC;EvE+zQ5C;EuE7zQM;;IAEE,+BAAwC;EvE+zQhD;EuE7zQM;;IAEE,gCAA0C;EvE+zQlD;EuE7zQM;;IAEE,8BAAsC;EvE+zQ9C;EuE90QM;IAAgC,uBAA4B;EvEi1QlE;EuEh1QM;;IAEE,2BAAoC;EvEk1Q5C;EuEh1QM;;IAEE,6BAAwC;EvEk1QhD;EuEh1QM;;IAEE,8BAA0C;EvEk1QlD;EuEh1QM;;IAEE,4BAAsC;EvEk1Q9C;EuEj2QM;IAAgC,yBAA4B;EvEo2QlE;EuEn2QM;;IAEE,6BAAoC;EvEq2Q5C;EuEn2QM;;IAEE,+BAAwC;EvEq2QhD;EuEn2QM;;IAEE,gCAA0C;EvEq2QlD;EuEn2QM;;IAEE,8BAAsC;EvEq2Q9C;EuEp3QM;IAAgC,uBAA4B;EvEu3QlE;EuEt3QM;;IAEE,2BAAoC;EvEw3Q5C;EuEt3QM;;IAEE,6BAAwC;EvEw3QhD;EuEt3QM;;IAEE,8BAA0C;EvEw3QlD;EuEt3QM;;IAEE,4BAAsC;EvEw3Q9C;EuEv4QM;IAAgC,qBAA4B;EvE04QlE;EuEz4QM;;IAEE,yBAAoC;EvE24Q5C;EuEz4QM;;IAEE,2BAAwC;EvE24QhD;EuEz4QM;;IAEE,4BAA0C;EvE24QlD;EuEz4QM;;IAEE,0BAAsC;EvE24Q9C;EuE15QM;IAAgC,2BAA4B;EvE65QlE;EuE55QM;;IAEE,+BAAoC;EvE85Q5C;EuE55QM;;IAEE,iCAAwC;EvE85QhD;EuE55QM;;IAEE,kCAA0C;EvE85QlD;EuE55QM;;IAEE,gCAAsC;EvE85Q9C;EuE76QM;IAAgC,0BAA4B;EvEg7QlE;EuE/6QM;;IAEE,8BAAoC;EvEi7Q5C;EuE/6QM;;IAEE,gCAAwC;EvEi7QhD;EuE/6QM;;IAEE,iCAA0C;EvEi7QlD;EuE/6QM;;IAEE,+BAAsC;EvEi7Q9C;EuEh8QM;IAAgC,wBAA4B;EvEm8QlE;EuEl8QM;;IAEE,4BAAoC;EvEo8Q5C;EuEl8QM;;IAEE,8BAAwC;EvEo8QhD;EuEl8QM;;IAEE,+BAA0C;EvEo8QlD;EuEl8QM;;IAEE,6BAAsC;EvEo8Q9C;EuEn9QM;IAAgC,0BAA4B;EvEs9QlE;EuEr9QM;;IAEE,8BAAoC;EvEu9Q5C;EuEr9QM;;IAEE,gCAAwC;EvEu9QhD;EuEr9QM;;IAEE,iCAA0C;EvEu9QlD;EuEr9QM;;IAEE,+BAAsC;EvEu9Q9C;EuEt+QM;IAAgC,wBAA4B;EvEy+QlE;EuEx+QM;;IAEE,4BAAoC;EvE0+Q5C;EuEx+QM;;IAEE,8BAAwC;EvE0+QhD;EuEx+QM;;IAEE,+BAA0C;EvE0+QlD;EuEx+QM;;IAEE,6BAAsC;EvE0+Q9C;EuEl+QM;IAAwB,2BAA2B;EvEq+QzD;EuEp+QM;;IAEE,+BAA+B;EvEs+QvC;EuEp+QM;;IAEE,iCAAiC;EvEs+QzC;EuEp+QM;;IAEE,kCAAkC;EvEs+Q1C;EuEp+QM;;IAEE,gCAAgC;EvEs+QxC;EuEr/QM;IAAwB,0BAA2B;EvEw/QzD;EuEv/QM;;IAEE,8BAA+B;EvEy/QvC;EuEv/QM;;IAEE,gCAAiC;EvEy/QzC;EuEv/QM;;IAEE,iCAAkC;EvEy/Q1C;EuEv/QM;;IAEE,+BAAgC;EvEy/QxC;EuExgRM;IAAwB,wBAA2B;EvE2gRzD;EuE1gRM;;IAEE,4BAA+B;EvE4gRvC;EuE1gRM;;IAEE,8BAAiC;EvE4gRzC;EuE1gRM;;IAEE,+BAAkC;EvE4gR1C;EuE1gRM;;IAEE,6BAAgC;EvE4gRxC;EuE3hRM;IAAwB,0BAA2B;EvE8hRzD;EuE7hRM;;IAEE,8BAA+B;EvE+hRvC;EuE7hRM;;IAEE,gCAAiC;EvE+hRzC;EuE7hRM;;IAEE,iCAAkC;EvE+hR1C;EuE7hRM;;IAEE,+BAAgC;EvE+hRxC;EuE9iRM;IAAwB,wBAA2B;EvEijRzD;EuEhjRM;;IAEE,4BAA+B;EvEkjRvC;EuEhjRM;;IAEE,8BAAiC;EvEkjRzC;EuEhjRM;;IAEE,+BAAkC;EvEkjR1C;EuEhjRM;;IAEE,6BAAgC;EvEkjRxC;EuE5iRE;IAAmB,uBAAuB;EvE+iR5C;EuE9iRE;;IAEE,2BAA2B;EvEgjR/B;EuE9iRE;;IAEE,6BAA6B;EvEgjRjC;EuE9iRE;;IAEE,8BAA8B;EvEgjRlC;EuE9iRE;;IAEE,4BAA4B;EvEgjRhC;AACF;;Ac1jRI;EyDlDI;IAAgC,oBAA4B;EvEinRlE;EuEhnRM;;IAEE,wBAAoC;EvEknR5C;EuEhnRM;;IAEE,0BAAwC;EvEknRhD;EuEhnRM;;IAEE,2BAA0C;EvEknRlD;EuEhnRM;;IAEE,yBAAsC;EvEknR9C;EuEjoRM;IAAgC,0BAA4B;EvEooRlE;EuEnoRM;;IAEE,8BAAoC;EvEqoR5C;EuEnoRM;;IAEE,gCAAwC;EvEqoRhD;EuEnoRM;;IAEE,iCAA0C;EvEqoRlD;EuEnoRM;;IAEE,+BAAsC;EvEqoR9C;EuEppRM;IAAgC,yBAA4B;EvEupRlE;EuEtpRM;;IAEE,6BAAoC;EvEwpR5C;EuEtpRM;;IAEE,+BAAwC;EvEwpRhD;EuEtpRM;;IAEE,gCAA0C;EvEwpRlD;EuEtpRM;;IAEE,8BAAsC;EvEwpR9C;EuEvqRM;IAAgC,uBAA4B;EvE0qRlE;EuEzqRM;;IAEE,2BAAoC;EvE2qR5C;EuEzqRM;;IAEE,6BAAwC;EvE2qRhD;EuEzqRM;;IAEE,8BAA0C;EvE2qRlD;EuEzqRM;;IAEE,4BAAsC;EvE2qR9C;EuE1rRM;IAAgC,yBAA4B;EvE6rRlE;EuE5rRM;;IAEE,6BAAoC;EvE8rR5C;EuE5rRM;;IAEE,+BAAwC;EvE8rRhD;EuE5rRM;;IAEE,gCAA0C;EvE8rRlD;EuE5rRM;;IAEE,8BAAsC;EvE8rR9C;EuE7sRM;IAAgC,uBAA4B;EvEgtRlE;EuE/sRM;;IAEE,2BAAoC;EvEitR5C;EuE/sRM;;IAEE,6BAAwC;EvEitRhD;EuE/sRM;;IAEE,8BAA0C;EvEitRlD;EuE/sRM;;IAEE,4BAAsC;EvEitR9C;EuEhuRM;IAAgC,qBAA4B;EvEmuRlE;EuEluRM;;IAEE,yBAAoC;EvEouR5C;EuEluRM;;IAEE,2BAAwC;EvEouRhD;EuEluRM;;IAEE,4BAA0C;EvEouRlD;EuEluRM;;IAEE,0BAAsC;EvEouR9C;EuEnvRM;IAAgC,2BAA4B;EvEsvRlE;EuErvRM;;IAEE,+BAAoC;EvEuvR5C;EuErvRM;;IAEE,iCAAwC;EvEuvRhD;EuErvRM;;IAEE,kCAA0C;EvEuvRlD;EuErvRM;;IAEE,gCAAsC;EvEuvR9C;EuEtwRM;IAAgC,0BAA4B;EvEywRlE;EuExwRM;;IAEE,8BAAoC;EvE0wR5C;EuExwRM;;IAEE,gCAAwC;EvE0wRhD;EuExwRM;;IAEE,iCAA0C;EvE0wRlD;EuExwRM;;IAEE,+BAAsC;EvE0wR9C;EuEzxRM;IAAgC,wBAA4B;EvE4xRlE;EuE3xRM;;IAEE,4BAAoC;EvE6xR5C;EuE3xRM;;IAEE,8BAAwC;EvE6xRhD;EuE3xRM;;IAEE,+BAA0C;EvE6xRlD;EuE3xRM;;IAEE,6BAAsC;EvE6xR9C;EuE5yRM;IAAgC,0BAA4B;EvE+yRlE;EuE9yRM;;IAEE,8BAAoC;EvEgzR5C;EuE9yRM;;IAEE,gCAAwC;EvEgzRhD;EuE9yRM;;IAEE,iCAA0C;EvEgzRlD;EuE9yRM;;IAEE,+BAAsC;EvEgzR9C;EuE/zRM;IAAgC,wBAA4B;EvEk0RlE;EuEj0RM;;IAEE,4BAAoC;EvEm0R5C;EuEj0RM;;IAEE,8BAAwC;EvEm0RhD;EuEj0RM;;IAEE,+BAA0C;EvEm0RlD;EuEj0RM;;IAEE,6BAAsC;EvEm0R9C;EuE3zRM;IAAwB,2BAA2B;EvE8zRzD;EuE7zRM;;IAEE,+BAA+B;EvE+zRvC;EuE7zRM;;IAEE,iCAAiC;EvE+zRzC;EuE7zRM;;IAEE,kCAAkC;EvE+zR1C;EuE7zRM;;IAEE,gCAAgC;EvE+zRxC;EuE90RM;IAAwB,0BAA2B;EvEi1RzD;EuEh1RM;;IAEE,8BAA+B;EvEk1RvC;EuEh1RM;;IAEE,gCAAiC;EvEk1RzC;EuEh1RM;;IAEE,iCAAkC;EvEk1R1C;EuEh1RM;;IAEE,+BAAgC;EvEk1RxC;EuEj2RM;IAAwB,wBAA2B;EvEo2RzD;EuEn2RM;;IAEE,4BAA+B;EvEq2RvC;EuEn2RM;;IAEE,8BAAiC;EvEq2RzC;EuEn2RM;;IAEE,+BAAkC;EvEq2R1C;EuEn2RM;;IAEE,6BAAgC;EvEq2RxC;EuEp3RM;IAAwB,0BAA2B;EvEu3RzD;EuEt3RM;;IAEE,8BAA+B;EvEw3RvC;EuEt3RM;;IAEE,gCAAiC;EvEw3RzC;EuEt3RM;;IAEE,iCAAkC;EvEw3R1C;EuEt3RM;;IAEE,+BAAgC;EvEw3RxC;EuEv4RM;IAAwB,wBAA2B;EvE04RzD;EuEz4RM;;IAEE,4BAA+B;EvE24RvC;EuEz4RM;;IAEE,8BAAiC;EvE24RzC;EuEz4RM;;IAEE,+BAAkC;EvE24R1C;EuEz4RM;;IAEE,6BAAgC;EvE24RxC;EuEr4RE;IAAmB,uBAAuB;EvEw4R5C;EuEv4RE;;IAEE,2BAA2B;EvEy4R/B;EuEv4RE;;IAEE,6BAA6B;EvEy4RjC;EuEv4RE;;IAEE,8BAA8B;EvEy4RlC;EuEv4RE;;IAEE,4BAA4B;EvEy4RhC;AACF;;AwEz8RA;EAAkB,4GAA8C;AxE68RhE;;AwEz8RA;EAAiB,8BAA8B;AxE68R/C;;AwE58RA;EAAiB,8BAA8B;AxEg9R/C;;AwE/8RA;EAAiB,8BAA8B;AxEm9R/C;;AwEl9RA;ECTE,gBAAgB;EAChB,uBAAuB;EACvB,mBAAmB;AzE+9RrB;;AwEh9RI;EAAwB,2BAA2B;AxEo9RvD;;AwEn9RI;EAAwB,4BAA4B;AxEu9RxD;;AwEt9RI;EAAwB,6BAA6B;AxE09RzD;;Acr7RI;E0DvCA;IAAwB,2BAA2B;ExEi+RrD;EwEh+RE;IAAwB,4BAA4B;ExEm+RtD;EwEl+RE;IAAwB,6BAA6B;ExEq+RvD;AACF;;Acj8RI;E0DvCA;IAAwB,2BAA2B;ExE6+RrD;EwE5+RE;IAAwB,4BAA4B;ExE++RtD;EwE9+RE;IAAwB,6BAA6B;ExEi/RvD;AACF;;Ac78RI;E0DvCA;IAAwB,2BAA2B;ExEy/RrD;EwEx/RE;IAAwB,4BAA4B;ExE2/RtD;EwE1/RE;IAAwB,6BAA6B;ExE6/RvD;AACF;;Acz9RI;E0DvCA;IAAwB,2BAA2B;ExEqgSrD;EwEpgSE;IAAwB,4BAA4B;ExEugStD;EwEtgSE;IAAwB,6BAA6B;ExEygSvD;AACF;;AwEpgSA;EAAmB,oCAAoC;AxEwgSvD;;AwEvgSA;EAAmB,oCAAoC;AxE2gSvD;;AwE1gSA;EAAmB,qCAAqC;AxE8gSxD;;AwE1gSA;EAAuB,2BAA0C;AxE8gSjE;;AwE7gSA;EAAuB,+BAA4C;AxEihSnE;;AwEhhSA;EAAuB,2BAA2C;AxEohSlE;;AwEnhSA;EAAuB,2BAAyC;AxEuhShE;;AwEthSA;EAAuB,8BAA2C;AxE0hSlE;;AwEzhSA;EAAuB,6BAA6B;AxE6hSpD;;AwEzhSA;EAAc,sBAAwB;AxE6hStC;;A0EpkSE;EACE,yBAAwB;A1EukS5B;;AK7jSE;EqELM,yBAA0E;A1EskSlF;;A0E5kSE;EACE,yBAAwB;A1E+kS5B;;AKrkSE;EqELM,yBAA0E;A1E8kSlF;;A0EplSE;EACE,yBAAwB;A1EulS5B;;AK7kSE;EqELM,yBAA0E;A1EslSlF;;A0E5lSE;EACE,yBAAwB;A1E+lS5B;;AKrlSE;EqELM,yBAA0E;A1E8lSlF;;A0EpmSE;EACE,yBAAwB;A1EumS5B;;AK7lSE;EqELM,yBAA0E;A1EsmSlF;;A0E5mSE;EACE,yBAAwB;A1E+mS5B;;AKrmSE;EqELM,yBAA0E;A1E8mSlF;;A0EpnSE;EACE,yBAAwB;A1EunS5B;;AK7mSE;EqELM,yBAA0E;A1EsnSlF;;A0E5nSE;EACE,yBAAwB;A1E+nS5B;;AKrnSE;EqELM,yBAA0E;A1E8nSlF;;AwEvlSA;EAAa,yBAA6B;AxE2lS1C;;AwE1lSA;EAAc,yBAA6B;AxE8lS3C;;AwE5lSA;EAAiB,oCAAkC;AxEgmSnD;;AwE/lSA;EAAiB,0CAAkC;AxEmmSnD;;AwE/lSA;EGvDE,WAAW;EACX,kBAAkB;EAClB,iBAAiB;EACjB,6BAA6B;EAC7B,SAAS;A3E0pSX;;AwEnmSA;EAAwB,gCAAgC;AxEumSxD;;AwErmSA;EACE,iCAAiC;EACjC,oCAAoC;AxEwmStC;;AwEnmSA;EAAc,yBAAyB;AxEumSvC;;A4ExqSA;EACE,8BAA8B;A5E2qShC;;A4ExqSA;EACE,6BAA6B;A5E2qS/B;;A6E3qSE;E3EOF;;;I2EDM,4BAA4B;IAE5B,2BAA2B;E7E2qS/B;E6ExqSE;IAEI,0BAA0B;E7EyqShC;E6EhqSE;IACE,6BAA6B;E7EkqSjC;EEn+RF;I2EhLM,gCAAgC;E7EspSpC;E6EppSE;;IAEE,yB1EzCY;I0E0CZ,wBAAwB;E7EspS5B;E6E9oSE;IACE,2BAA2B;E7EgpS/B;E6E7oSE;;IAEE,wBAAwB;E7E+oS5B;E6E5oSE;;;IAGE,UAAU;IACV,SAAS;E7E8oSb;E6E3oSE;;IAEE,uBAAuB;E7E6oS3B;E6EroSE;IACE,Q1EwgCgC;EH+nQpC;EEnrSF;I2E+CM,2BAA2C;E7EuoS/C;EY9tSA;IiE0FI,2BAA2C;E7EuoS/C;EiCrtSF;I4CmFM,aAAa;E7EqoSjB;EsCpuSF;IuCkGM,sB1EtFS;EH2tSb;EgBxuSF;I6DuGM,oCAAoC;E7EooSxC;E6EroSE;;IAKI,iCAAmC;E7EooSzC;EgBvsSF;;I6D0EQ,oCAAsC;E7EioS5C;EgBtnSF;I6DNM,cAAc;E7E+nSlB;EiBrvSA;;;;I4D4HM,qB1EvHU;EHsvShB;EgBjpSF;I6DuBM,cAAc;IACd,qB1E7HY;EH0vShB;AACF","file":"bootstrap.css","sourcesContent":["/*!\n * Bootstrap v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n@import \"functions\";\n@import \"variables\";\n@import \"mixins\";\n@import \"root\";\n@import \"reboot\";\n@import \"type\";\n@import \"images\";\n@import \"code\";\n@import \"grid\";\n@import \"tables\";\n@import \"forms\";\n@import \"buttons\";\n@import \"transitions\";\n@import \"dropdown\";\n@import \"button-group\";\n@import \"input-group\";\n@import \"custom-forms\";\n@import \"nav\";\n@import \"navbar\";\n@import \"card\";\n@import \"breadcrumb\";\n@import \"pagination\";\n@import \"badge\";\n@import \"jumbotron\";\n@import \"alert\";\n@import \"progress\";\n@import \"media\";\n@import \"list-group\";\n@import \"close\";\n@import \"toasts\";\n@import \"modal\";\n@import \"tooltip\";\n@import \"popover\";\n@import \"carousel\";\n@import \"spinners\";\n@import \"utilities\";\n@import \"print\";\n","/*!\n * Bootstrap v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n:root {\n --blue: #007bff;\n --indigo: #6610f2;\n --purple: #6f42c1;\n --pink: #e83e8c;\n --red: #dc3545;\n --orange: #fd7e14;\n --yellow: #ffc107;\n --green: #28a745;\n --teal: #20c997;\n --cyan: #17a2b8;\n --white: #fff;\n --gray: #6c757d;\n --gray-dark: #343a40;\n --primary: #007bff;\n --secondary: #6c757d;\n --success: #28a745;\n --info: #17a2b8;\n --warning: #ffc107;\n --danger: #dc3545;\n --light: #f8f9fa;\n --dark: #343a40;\n --breakpoint-xs: 0;\n --breakpoint-sm: 576px;\n --breakpoint-md: 768px;\n --breakpoint-lg: 992px;\n --breakpoint-xl: 1200px;\n --font-family-sans-serif: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\nhtml {\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\nbody {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #212529;\n text-align: left;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: 0.5rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n text-decoration-skip-ink: none;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #007bff;\n text-decoration: none;\n background-color: transparent;\n}\n\na:hover {\n color: #0056b3;\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg {\n overflow: hidden;\n vertical-align: middle;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n color: #6c757d;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: inherit;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: 0.5rem;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nselect {\n word-wrap: normal;\n}\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton:not(:disabled),\n[type=\"button\"]:not(:disabled),\n[type=\"reset\"]:not(:disabled),\n[type=\"submit\"]:not(:disabled) {\n cursor: pointer;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n cursor: pointer;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n margin-bottom: 0.5rem;\n font-weight: 500;\n line-height: 1.2;\n}\n\nh1, .h1 {\n font-size: 2.5rem;\n}\n\nh2, .h2 {\n font-size: 2rem;\n}\n\nh3, .h3 {\n font-size: 1.75rem;\n}\n\nh4, .h4 {\n font-size: 1.5rem;\n}\n\nh5, .h5 {\n font-size: 1.25rem;\n}\n\nh6, .h6 {\n font-size: 1rem;\n}\n\n.lead {\n font-size: 1.25rem;\n font-weight: 300;\n}\n\n.display-1 {\n font-size: 6rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\n.display-2 {\n font-size: 5.5rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\n.display-3 {\n font-size: 4.5rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\n.display-4 {\n font-size: 3.5rem;\n font-weight: 300;\n line-height: 1.2;\n}\n\nhr {\n margin-top: 1rem;\n margin-bottom: 1rem;\n border: 0;\n border-top: 1px solid rgba(0, 0, 0, 0.1);\n}\n\nsmall,\n.small {\n font-size: 80%;\n font-weight: 400;\n}\n\nmark,\n.mark {\n padding: 0.2em;\n background-color: #fcf8e3;\n}\n\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline-item {\n display: inline-block;\n}\n\n.list-inline-item:not(:last-child) {\n margin-right: 0.5rem;\n}\n\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\n\n.blockquote {\n margin-bottom: 1rem;\n font-size: 1.25rem;\n}\n\n.blockquote-footer {\n display: block;\n font-size: 80%;\n color: #6c757d;\n}\n\n.blockquote-footer::before {\n content: \"\\2014\\00A0\";\n}\n\n.img-fluid {\n max-width: 100%;\n height: auto;\n}\n\n.img-thumbnail {\n padding: 0.25rem;\n background-color: #fff;\n border: 1px solid #dee2e6;\n border-radius: 0.25rem;\n max-width: 100%;\n height: auto;\n}\n\n.figure {\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: 0.5rem;\n line-height: 1;\n}\n\n.figure-caption {\n font-size: 90%;\n color: #6c757d;\n}\n\ncode {\n font-size: 87.5%;\n color: #e83e8c;\n word-break: break-word;\n}\n\na > code {\n color: inherit;\n}\n\nkbd {\n padding: 0.2rem 0.4rem;\n font-size: 87.5%;\n color: #fff;\n background-color: #212529;\n border-radius: 0.2rem;\n}\n\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: 700;\n}\n\npre {\n display: block;\n font-size: 87.5%;\n color: #212529;\n}\n\npre code {\n font-size: inherit;\n color: inherit;\n word-break: normal;\n}\n\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n\n.container {\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 576px) {\n .container {\n max-width: 540px;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n max-width: 720px;\n }\n}\n\n@media (min-width: 992px) {\n .container {\n max-width: 960px;\n }\n}\n\n@media (min-width: 1200px) {\n .container {\n max-width: 1140px;\n }\n}\n\n.container-fluid {\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n\n.row {\n display: flex;\n flex-wrap: wrap;\n margin-right: -15px;\n margin-left: -15px;\n}\n\n.no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .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, .col-sm,\n.col-sm-auto, .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, .col-md,\n.col-md-auto, .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, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto {\n position: relative;\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n}\n\n.col {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n}\n\n.col-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n}\n\n.col-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n}\n\n.col-3 {\n flex: 0 0 25%;\n max-width: 25%;\n}\n\n.col-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n}\n\n.col-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n}\n\n.col-6 {\n flex: 0 0 50%;\n max-width: 50%;\n}\n\n.col-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n}\n\n.col-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n}\n\n.col-9 {\n flex: 0 0 75%;\n max-width: 75%;\n}\n\n.col-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n}\n\n.col-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n}\n\n.col-12 {\n flex: 0 0 100%;\n max-width: 100%;\n}\n\n.order-first {\n order: -1;\n}\n\n.order-last {\n order: 13;\n}\n\n.order-0 {\n order: 0;\n}\n\n.order-1 {\n order: 1;\n}\n\n.order-2 {\n order: 2;\n}\n\n.order-3 {\n order: 3;\n}\n\n.order-4 {\n order: 4;\n}\n\n.order-5 {\n order: 5;\n}\n\n.order-6 {\n order: 6;\n}\n\n.order-7 {\n order: 7;\n}\n\n.order-8 {\n order: 8;\n}\n\n.order-9 {\n order: 9;\n}\n\n.order-10 {\n order: 10;\n}\n\n.order-11 {\n order: 11;\n}\n\n.order-12 {\n order: 12;\n}\n\n.offset-1 {\n margin-left: 8.333333%;\n}\n\n.offset-2 {\n margin-left: 16.666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.333333%;\n}\n\n.offset-5 {\n margin-left: 41.666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.333333%;\n}\n\n.offset-8 {\n margin-left: 66.666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.333333%;\n}\n\n.offset-11 {\n margin-left: 91.666667%;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-sm-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-sm-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-sm-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-sm-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-sm-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-sm-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-sm-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-sm-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-sm-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-sm-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-sm-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-sm-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-sm-first {\n order: -1;\n }\n .order-sm-last {\n order: 13;\n }\n .order-sm-0 {\n order: 0;\n }\n .order-sm-1 {\n order: 1;\n }\n .order-sm-2 {\n order: 2;\n }\n .order-sm-3 {\n order: 3;\n }\n .order-sm-4 {\n order: 4;\n }\n .order-sm-5 {\n order: 5;\n }\n .order-sm-6 {\n order: 6;\n }\n .order-sm-7 {\n order: 7;\n }\n .order-sm-8 {\n order: 8;\n }\n .order-sm-9 {\n order: 9;\n }\n .order-sm-10 {\n order: 10;\n }\n .order-sm-11 {\n order: 11;\n }\n .order-sm-12 {\n order: 12;\n }\n .offset-sm-0 {\n margin-left: 0;\n }\n .offset-sm-1 {\n margin-left: 8.333333%;\n }\n .offset-sm-2 {\n margin-left: 16.666667%;\n }\n .offset-sm-3 {\n margin-left: 25%;\n }\n .offset-sm-4 {\n margin-left: 33.333333%;\n }\n .offset-sm-5 {\n margin-left: 41.666667%;\n }\n .offset-sm-6 {\n margin-left: 50%;\n }\n .offset-sm-7 {\n margin-left: 58.333333%;\n }\n .offset-sm-8 {\n margin-left: 66.666667%;\n }\n .offset-sm-9 {\n margin-left: 75%;\n }\n .offset-sm-10 {\n margin-left: 83.333333%;\n }\n .offset-sm-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 768px) {\n .col-md {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-md-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-md-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-md-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-md-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-md-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-md-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-md-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-md-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-md-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-md-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-md-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-md-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-md-first {\n order: -1;\n }\n .order-md-last {\n order: 13;\n }\n .order-md-0 {\n order: 0;\n }\n .order-md-1 {\n order: 1;\n }\n .order-md-2 {\n order: 2;\n }\n .order-md-3 {\n order: 3;\n }\n .order-md-4 {\n order: 4;\n }\n .order-md-5 {\n order: 5;\n }\n .order-md-6 {\n order: 6;\n }\n .order-md-7 {\n order: 7;\n }\n .order-md-8 {\n order: 8;\n }\n .order-md-9 {\n order: 9;\n }\n .order-md-10 {\n order: 10;\n }\n .order-md-11 {\n order: 11;\n }\n .order-md-12 {\n order: 12;\n }\n .offset-md-0 {\n margin-left: 0;\n }\n .offset-md-1 {\n margin-left: 8.333333%;\n }\n .offset-md-2 {\n margin-left: 16.666667%;\n }\n .offset-md-3 {\n margin-left: 25%;\n }\n .offset-md-4 {\n margin-left: 33.333333%;\n }\n .offset-md-5 {\n margin-left: 41.666667%;\n }\n .offset-md-6 {\n margin-left: 50%;\n }\n .offset-md-7 {\n margin-left: 58.333333%;\n }\n .offset-md-8 {\n margin-left: 66.666667%;\n }\n .offset-md-9 {\n margin-left: 75%;\n }\n .offset-md-10 {\n margin-left: 83.333333%;\n }\n .offset-md-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 992px) {\n .col-lg {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-lg-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-lg-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-lg-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-lg-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-lg-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-lg-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-lg-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-lg-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-lg-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-lg-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-lg-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-lg-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-lg-first {\n order: -1;\n }\n .order-lg-last {\n order: 13;\n }\n .order-lg-0 {\n order: 0;\n }\n .order-lg-1 {\n order: 1;\n }\n .order-lg-2 {\n order: 2;\n }\n .order-lg-3 {\n order: 3;\n }\n .order-lg-4 {\n order: 4;\n }\n .order-lg-5 {\n order: 5;\n }\n .order-lg-6 {\n order: 6;\n }\n .order-lg-7 {\n order: 7;\n }\n .order-lg-8 {\n order: 8;\n }\n .order-lg-9 {\n order: 9;\n }\n .order-lg-10 {\n order: 10;\n }\n .order-lg-11 {\n order: 11;\n }\n .order-lg-12 {\n order: 12;\n }\n .offset-lg-0 {\n margin-left: 0;\n }\n .offset-lg-1 {\n margin-left: 8.333333%;\n }\n .offset-lg-2 {\n margin-left: 16.666667%;\n }\n .offset-lg-3 {\n margin-left: 25%;\n }\n .offset-lg-4 {\n margin-left: 33.333333%;\n }\n .offset-lg-5 {\n margin-left: 41.666667%;\n }\n .offset-lg-6 {\n margin-left: 50%;\n }\n .offset-lg-7 {\n margin-left: 58.333333%;\n }\n .offset-lg-8 {\n margin-left: 66.666667%;\n }\n .offset-lg-9 {\n margin-left: 75%;\n }\n .offset-lg-10 {\n margin-left: 83.333333%;\n }\n .offset-lg-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 1200px) {\n .col-xl {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-xl-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-xl-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xl-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-xl-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-xl-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-xl-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-xl-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-xl-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-xl-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-xl-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-xl-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-xl-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-xl-first {\n order: -1;\n }\n .order-xl-last {\n order: 13;\n }\n .order-xl-0 {\n order: 0;\n }\n .order-xl-1 {\n order: 1;\n }\n .order-xl-2 {\n order: 2;\n }\n .order-xl-3 {\n order: 3;\n }\n .order-xl-4 {\n order: 4;\n }\n .order-xl-5 {\n order: 5;\n }\n .order-xl-6 {\n order: 6;\n }\n .order-xl-7 {\n order: 7;\n }\n .order-xl-8 {\n order: 8;\n }\n .order-xl-9 {\n order: 9;\n }\n .order-xl-10 {\n order: 10;\n }\n .order-xl-11 {\n order: 11;\n }\n .order-xl-12 {\n order: 12;\n }\n .offset-xl-0 {\n margin-left: 0;\n }\n .offset-xl-1 {\n margin-left: 8.333333%;\n }\n .offset-xl-2 {\n margin-left: 16.666667%;\n }\n .offset-xl-3 {\n margin-left: 25%;\n }\n .offset-xl-4 {\n margin-left: 33.333333%;\n }\n .offset-xl-5 {\n margin-left: 41.666667%;\n }\n .offset-xl-6 {\n margin-left: 50%;\n }\n .offset-xl-7 {\n margin-left: 58.333333%;\n }\n .offset-xl-8 {\n margin-left: 66.666667%;\n }\n .offset-xl-9 {\n margin-left: 75%;\n }\n .offset-xl-10 {\n margin-left: 83.333333%;\n }\n .offset-xl-11 {\n margin-left: 91.666667%;\n }\n}\n\n.table {\n width: 100%;\n margin-bottom: 1rem;\n color: #212529;\n}\n\n.table th,\n.table td {\n padding: 0.75rem;\n vertical-align: top;\n border-top: 1px solid #dee2e6;\n}\n\n.table thead th {\n vertical-align: bottom;\n border-bottom: 2px solid #dee2e6;\n}\n\n.table tbody + tbody {\n border-top: 2px solid #dee2e6;\n}\n\n.table-sm th,\n.table-sm td {\n padding: 0.3rem;\n}\n\n.table-bordered {\n border: 1px solid #dee2e6;\n}\n\n.table-bordered th,\n.table-bordered td {\n border: 1px solid #dee2e6;\n}\n\n.table-bordered thead th,\n.table-bordered thead td {\n border-bottom-width: 2px;\n}\n\n.table-borderless th,\n.table-borderless td,\n.table-borderless thead th,\n.table-borderless tbody + tbody {\n border: 0;\n}\n\n.table-striped tbody tr:nth-of-type(odd) {\n background-color: rgba(0, 0, 0, 0.05);\n}\n\n.table-hover tbody tr:hover {\n color: #212529;\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-primary,\n.table-primary > th,\n.table-primary > td {\n background-color: #b8daff;\n}\n\n.table-primary th,\n.table-primary td,\n.table-primary thead th,\n.table-primary tbody + tbody {\n border-color: #7abaff;\n}\n\n.table-hover .table-primary:hover {\n background-color: #9fcdff;\n}\n\n.table-hover .table-primary:hover > td,\n.table-hover .table-primary:hover > th {\n background-color: #9fcdff;\n}\n\n.table-secondary,\n.table-secondary > th,\n.table-secondary > td {\n background-color: #d6d8db;\n}\n\n.table-secondary th,\n.table-secondary td,\n.table-secondary thead th,\n.table-secondary tbody + tbody {\n border-color: #b3b7bb;\n}\n\n.table-hover .table-secondary:hover {\n background-color: #c8cbcf;\n}\n\n.table-hover .table-secondary:hover > td,\n.table-hover .table-secondary:hover > th {\n background-color: #c8cbcf;\n}\n\n.table-success,\n.table-success > th,\n.table-success > td {\n background-color: #c3e6cb;\n}\n\n.table-success th,\n.table-success td,\n.table-success thead th,\n.table-success tbody + tbody {\n border-color: #8fd19e;\n}\n\n.table-hover .table-success:hover {\n background-color: #b1dfbb;\n}\n\n.table-hover .table-success:hover > td,\n.table-hover .table-success:hover > th {\n background-color: #b1dfbb;\n}\n\n.table-info,\n.table-info > th,\n.table-info > td {\n background-color: #bee5eb;\n}\n\n.table-info th,\n.table-info td,\n.table-info thead th,\n.table-info tbody + tbody {\n border-color: #86cfda;\n}\n\n.table-hover .table-info:hover {\n background-color: #abdde5;\n}\n\n.table-hover .table-info:hover > td,\n.table-hover .table-info:hover > th {\n background-color: #abdde5;\n}\n\n.table-warning,\n.table-warning > th,\n.table-warning > td {\n background-color: #ffeeba;\n}\n\n.table-warning th,\n.table-warning td,\n.table-warning thead th,\n.table-warning tbody + tbody {\n border-color: #ffdf7e;\n}\n\n.table-hover .table-warning:hover {\n background-color: #ffe8a1;\n}\n\n.table-hover .table-warning:hover > td,\n.table-hover .table-warning:hover > th {\n background-color: #ffe8a1;\n}\n\n.table-danger,\n.table-danger > th,\n.table-danger > td {\n background-color: #f5c6cb;\n}\n\n.table-danger th,\n.table-danger td,\n.table-danger thead th,\n.table-danger tbody + tbody {\n border-color: #ed969e;\n}\n\n.table-hover .table-danger:hover {\n background-color: #f1b0b7;\n}\n\n.table-hover .table-danger:hover > td,\n.table-hover .table-danger:hover > th {\n background-color: #f1b0b7;\n}\n\n.table-light,\n.table-light > th,\n.table-light > td {\n background-color: #fdfdfe;\n}\n\n.table-light th,\n.table-light td,\n.table-light thead th,\n.table-light tbody + tbody {\n border-color: #fbfcfc;\n}\n\n.table-hover .table-light:hover {\n background-color: #ececf6;\n}\n\n.table-hover .table-light:hover > td,\n.table-hover .table-light:hover > th {\n background-color: #ececf6;\n}\n\n.table-dark,\n.table-dark > th,\n.table-dark > td {\n background-color: #c6c8ca;\n}\n\n.table-dark th,\n.table-dark td,\n.table-dark thead th,\n.table-dark tbody + tbody {\n border-color: #95999c;\n}\n\n.table-hover .table-dark:hover {\n background-color: #b9bbbe;\n}\n\n.table-hover .table-dark:hover > td,\n.table-hover .table-dark:hover > th {\n background-color: #b9bbbe;\n}\n\n.table-active,\n.table-active > th,\n.table-active > td {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover > td,\n.table-hover .table-active:hover > th {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table .thead-dark th {\n color: #fff;\n background-color: #343a40;\n border-color: #454d55;\n}\n\n.table .thead-light th {\n color: #495057;\n background-color: #e9ecef;\n border-color: #dee2e6;\n}\n\n.table-dark {\n color: #fff;\n background-color: #343a40;\n}\n\n.table-dark th,\n.table-dark td,\n.table-dark thead th {\n border-color: #454d55;\n}\n\n.table-dark.table-bordered {\n border: 0;\n}\n\n.table-dark.table-striped tbody tr:nth-of-type(odd) {\n background-color: rgba(255, 255, 255, 0.05);\n}\n\n.table-dark.table-hover tbody tr:hover {\n color: #fff;\n background-color: rgba(255, 255, 255, 0.075);\n}\n\n@media (max-width: 575.98px) {\n .table-responsive-sm {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-sm > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 767.98px) {\n .table-responsive-md {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-md > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 991.98px) {\n .table-responsive-lg {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-lg > .table-bordered {\n border: 0;\n }\n}\n\n@media (max-width: 1199.98px) {\n .table-responsive-xl {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n .table-responsive-xl > .table-bordered {\n border: 0;\n }\n}\n\n.table-responsive {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n}\n\n.table-responsive > .table-bordered {\n border: 0;\n}\n\n.form-control {\n display: block;\n width: 100%;\n height: calc(1.5em + 0.75rem + 2px);\n padding: 0.375rem 0.75rem;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #495057;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .form-control {\n transition: none;\n }\n}\n\n.form-control::-ms-expand {\n background-color: transparent;\n border: 0;\n}\n\n.form-control:focus {\n color: #495057;\n background-color: #fff;\n border-color: #80bdff;\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.form-control::placeholder {\n color: #6c757d;\n opacity: 1;\n}\n\n.form-control:disabled, .form-control[readonly] {\n background-color: #e9ecef;\n opacity: 1;\n}\n\nselect.form-control:focus::-ms-value {\n color: #495057;\n background-color: #fff;\n}\n\n.form-control-file,\n.form-control-range {\n display: block;\n width: 100%;\n}\n\n.col-form-label {\n padding-top: calc(0.375rem + 1px);\n padding-bottom: calc(0.375rem + 1px);\n margin-bottom: 0;\n font-size: inherit;\n line-height: 1.5;\n}\n\n.col-form-label-lg {\n padding-top: calc(0.5rem + 1px);\n padding-bottom: calc(0.5rem + 1px);\n font-size: 1.25rem;\n line-height: 1.5;\n}\n\n.col-form-label-sm {\n padding-top: calc(0.25rem + 1px);\n padding-bottom: calc(0.25rem + 1px);\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.form-control-plaintext {\n display: block;\n width: 100%;\n padding-top: 0.375rem;\n padding-bottom: 0.375rem;\n margin-bottom: 0;\n line-height: 1.5;\n color: #212529;\n background-color: transparent;\n border: solid transparent;\n border-width: 1px 0;\n}\n\n.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg {\n padding-right: 0;\n padding-left: 0;\n}\n\n.form-control-sm {\n height: calc(1.5em + 0.5rem + 2px);\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0.2rem;\n}\n\n.form-control-lg {\n height: calc(1.5em + 1rem + 2px);\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0.3rem;\n}\n\nselect.form-control[size], select.form-control[multiple] {\n height: auto;\n}\n\ntextarea.form-control {\n height: auto;\n}\n\n.form-group {\n margin-bottom: 1rem;\n}\n\n.form-text {\n display: block;\n margin-top: 0.25rem;\n}\n\n.form-row {\n display: flex;\n flex-wrap: wrap;\n margin-right: -5px;\n margin-left: -5px;\n}\n\n.form-row > .col,\n.form-row > [class*=\"col-\"] {\n padding-right: 5px;\n padding-left: 5px;\n}\n\n.form-check {\n position: relative;\n display: block;\n padding-left: 1.25rem;\n}\n\n.form-check-input {\n position: absolute;\n margin-top: 0.3rem;\n margin-left: -1.25rem;\n}\n\n.form-check-input:disabled ~ .form-check-label {\n color: #6c757d;\n}\n\n.form-check-label {\n margin-bottom: 0;\n}\n\n.form-check-inline {\n display: inline-flex;\n align-items: center;\n padding-left: 0;\n margin-right: 0.75rem;\n}\n\n.form-check-inline .form-check-input {\n position: static;\n margin-top: 0;\n margin-right: 0.3125rem;\n margin-left: 0;\n}\n\n.valid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.25rem;\n font-size: 80%;\n color: #28a745;\n}\n\n.valid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.25rem 0.5rem;\n margin-top: .1rem;\n font-size: 0.875rem;\n line-height: 1.5;\n color: #fff;\n background-color: rgba(40, 167, 69, 0.9);\n border-radius: 0.25rem;\n}\n\n.was-validated .form-control:valid, .form-control.is-valid {\n border-color: #28a745;\n padding-right: calc(1.5em + 0.75rem);\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\");\n background-repeat: no-repeat;\n background-position: center right calc(0.375em + 0.1875rem);\n background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .form-control:valid:focus, .form-control.is-valid:focus {\n border-color: #28a745;\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .form-control:valid ~ .valid-feedback,\n.was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-feedback,\n.form-control.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated textarea.form-control:valid, textarea.form-control.is-valid {\n padding-right: calc(1.5em + 0.75rem);\n background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\n}\n\n.was-validated .custom-select:valid, .custom-select.is-valid {\n border-color: #28a745;\n padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem);\n background: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") no-repeat right 0.75rem center/8px 10px, url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .custom-select:valid:focus, .custom-select.is-valid:focus {\n border-color: #28a745;\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .custom-select:valid ~ .valid-feedback,\n.was-validated .custom-select:valid ~ .valid-tooltip, .custom-select.is-valid ~ .valid-feedback,\n.custom-select.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .form-control-file:valid ~ .valid-feedback,\n.was-validated .form-control-file:valid ~ .valid-tooltip, .form-control-file.is-valid ~ .valid-feedback,\n.form-control-file.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {\n color: #28a745;\n}\n\n.was-validated .form-check-input:valid ~ .valid-feedback,\n.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback,\n.form-check-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label {\n color: #28a745;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before {\n border-color: #28a745;\n}\n\n.was-validated .custom-control-input:valid ~ .valid-feedback,\n.was-validated .custom-control-input:valid ~ .valid-tooltip, .custom-control-input.is-valid ~ .valid-feedback,\n.custom-control-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before {\n border-color: #34ce57;\n background-color: #34ce57;\n}\n\n.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before {\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before {\n border-color: #28a745;\n}\n\n.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label {\n border-color: #28a745;\n}\n\n.was-validated .custom-file-input:valid ~ .valid-feedback,\n.was-validated .custom-file-input:valid ~ .valid-tooltip, .custom-file-input.is-valid ~ .valid-feedback,\n.custom-file-input.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label {\n border-color: #28a745;\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.invalid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.25rem;\n font-size: 80%;\n color: #dc3545;\n}\n\n.invalid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.25rem 0.5rem;\n margin-top: .1rem;\n font-size: 0.875rem;\n line-height: 1.5;\n color: #fff;\n background-color: rgba(220, 53, 69, 0.9);\n border-radius: 0.25rem;\n}\n\n.was-validated .form-control:invalid, .form-control.is-invalid {\n border-color: #dc3545;\n padding-right: calc(1.5em + 0.75rem);\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\");\n background-repeat: no-repeat;\n background-position: center right calc(0.375em + 0.1875rem);\n background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus {\n border-color: #dc3545;\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .form-control:invalid ~ .invalid-feedback,\n.was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-feedback,\n.form-control.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {\n padding-right: calc(1.5em + 0.75rem);\n background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\n}\n\n.was-validated .custom-select:invalid, .custom-select.is-invalid {\n border-color: #dc3545;\n padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem);\n background: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") no-repeat right 0.75rem center/8px 10px, url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus {\n border-color: #dc3545;\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .custom-select:invalid ~ .invalid-feedback,\n.was-validated .custom-select:invalid ~ .invalid-tooltip, .custom-select.is-invalid ~ .invalid-feedback,\n.custom-select.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-control-file:invalid ~ .invalid-feedback,\n.was-validated .form-control-file:invalid ~ .invalid-tooltip, .form-control-file.is-invalid ~ .invalid-feedback,\n.form-control-file.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {\n color: #dc3545;\n}\n\n.was-validated .form-check-input:invalid ~ .invalid-feedback,\n.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback,\n.form-check-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label {\n color: #dc3545;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before {\n border-color: #dc3545;\n}\n\n.was-validated .custom-control-input:invalid ~ .invalid-feedback,\n.was-validated .custom-control-input:invalid ~ .invalid-tooltip, .custom-control-input.is-invalid ~ .invalid-feedback,\n.custom-control-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before {\n border-color: #e4606d;\n background-color: #e4606d;\n}\n\n.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before {\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before {\n border-color: #dc3545;\n}\n\n.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label {\n border-color: #dc3545;\n}\n\n.was-validated .custom-file-input:invalid ~ .invalid-feedback,\n.was-validated .custom-file-input:invalid ~ .invalid-tooltip, .custom-file-input.is-invalid ~ .invalid-feedback,\n.custom-file-input.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label {\n border-color: #dc3545;\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.form-inline {\n display: flex;\n flex-flow: row wrap;\n align-items: center;\n}\n\n.form-inline .form-check {\n width: 100%;\n}\n\n@media (min-width: 576px) {\n .form-inline label {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 0;\n }\n .form-inline .form-group {\n display: flex;\n flex: 0 0 auto;\n flex-flow: row wrap;\n align-items: center;\n margin-bottom: 0;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-plaintext {\n display: inline-block;\n }\n .form-inline .input-group,\n .form-inline .custom-select {\n width: auto;\n }\n .form-inline .form-check {\n display: flex;\n align-items: center;\n justify-content: center;\n width: auto;\n padding-left: 0;\n }\n .form-inline .form-check-input {\n position: relative;\n flex-shrink: 0;\n margin-top: 0;\n margin-right: 0.25rem;\n margin-left: 0;\n }\n .form-inline .custom-control {\n align-items: center;\n justify-content: center;\n }\n .form-inline .custom-control-label {\n margin-bottom: 0;\n }\n}\n\n.btn {\n display: inline-block;\n font-weight: 400;\n color: #212529;\n text-align: center;\n vertical-align: middle;\n user-select: none;\n background-color: transparent;\n border: 1px solid transparent;\n padding: 0.375rem 0.75rem;\n font-size: 1rem;\n line-height: 1.5;\n border-radius: 0.25rem;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .btn {\n transition: none;\n }\n}\n\n.btn:hover {\n color: #212529;\n text-decoration: none;\n}\n\n.btn:focus, .btn.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.btn.disabled, .btn:disabled {\n opacity: 0.65;\n}\n\na.btn.disabled,\nfieldset:disabled a.btn {\n pointer-events: none;\n}\n\n.btn-primary {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-primary:hover {\n color: #fff;\n background-color: #0069d9;\n border-color: #0062cc;\n}\n\n.btn-primary:focus, .btn-primary.focus {\n box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5);\n}\n\n.btn-primary.disabled, .btn-primary:disabled {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active,\n.show > .btn-primary.dropdown-toggle {\n color: #fff;\n background-color: #0062cc;\n border-color: #005cbf;\n}\n\n.btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-primary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5);\n}\n\n.btn-secondary {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-secondary:hover {\n color: #fff;\n background-color: #5a6268;\n border-color: #545b62;\n}\n\n.btn-secondary:focus, .btn-secondary.focus {\n box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);\n}\n\n.btn-secondary.disabled, .btn-secondary:disabled {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-secondary.dropdown-toggle {\n color: #fff;\n background-color: #545b62;\n border-color: #4e555b;\n}\n\n.btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-secondary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);\n}\n\n.btn-success {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-success:hover {\n color: #fff;\n background-color: #218838;\n border-color: #1e7e34;\n}\n\n.btn-success:focus, .btn-success.focus {\n box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);\n}\n\n.btn-success.disabled, .btn-success:disabled {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active,\n.show > .btn-success.dropdown-toggle {\n color: #fff;\n background-color: #1e7e34;\n border-color: #1c7430;\n}\n\n.btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus,\n.show > .btn-success.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);\n}\n\n.btn-info {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-info:hover {\n color: #fff;\n background-color: #138496;\n border-color: #117a8b;\n}\n\n.btn-info:focus, .btn-info.focus {\n box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);\n}\n\n.btn-info.disabled, .btn-info:disabled {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active,\n.show > .btn-info.dropdown-toggle {\n color: #fff;\n background-color: #117a8b;\n border-color: #10707f;\n}\n\n.btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus,\n.show > .btn-info.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);\n}\n\n.btn-warning {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-warning:hover {\n color: #212529;\n background-color: #e0a800;\n border-color: #d39e00;\n}\n\n.btn-warning:focus, .btn-warning.focus {\n box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);\n}\n\n.btn-warning.disabled, .btn-warning:disabled {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active,\n.show > .btn-warning.dropdown-toggle {\n color: #212529;\n background-color: #d39e00;\n border-color: #c69500;\n}\n\n.btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus,\n.show > .btn-warning.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);\n}\n\n.btn-danger {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-danger:hover {\n color: #fff;\n background-color: #c82333;\n border-color: #bd2130;\n}\n\n.btn-danger:focus, .btn-danger.focus {\n box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);\n}\n\n.btn-danger.disabled, .btn-danger:disabled {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active,\n.show > .btn-danger.dropdown-toggle {\n color: #fff;\n background-color: #bd2130;\n border-color: #b21f2d;\n}\n\n.btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus,\n.show > .btn-danger.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);\n}\n\n.btn-light {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-light:hover {\n color: #212529;\n background-color: #e2e6ea;\n border-color: #dae0e5;\n}\n\n.btn-light:focus, .btn-light.focus {\n box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);\n}\n\n.btn-light.disabled, .btn-light:disabled {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active,\n.show > .btn-light.dropdown-toggle {\n color: #212529;\n background-color: #dae0e5;\n border-color: #d3d9df;\n}\n\n.btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus,\n.show > .btn-light.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);\n}\n\n.btn-dark {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-dark:hover {\n color: #fff;\n background-color: #23272b;\n border-color: #1d2124;\n}\n\n.btn-dark:focus, .btn-dark.focus {\n box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);\n}\n\n.btn-dark.disabled, .btn-dark:disabled {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active,\n.show > .btn-dark.dropdown-toggle {\n color: #fff;\n background-color: #1d2124;\n border-color: #171a1d;\n}\n\n.btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus,\n.show > .btn-dark.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);\n}\n\n.btn-outline-primary {\n color: #007bff;\n border-color: #007bff;\n}\n\n.btn-outline-primary:hover {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-outline-primary:focus, .btn-outline-primary.focus {\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.btn-outline-primary.disabled, .btn-outline-primary:disabled {\n color: #007bff;\n background-color: transparent;\n}\n\n.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-primary.dropdown-toggle {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-primary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.btn-outline-secondary {\n color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-outline-secondary:hover {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-outline-secondary:focus, .btn-outline-secondary.focus {\n box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {\n color: #6c757d;\n background-color: transparent;\n}\n\n.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-secondary.dropdown-toggle {\n color: #fff;\n background-color: #6c757d;\n border-color: #6c757d;\n}\n\n.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-secondary.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.btn-outline-success {\n color: #28a745;\n border-color: #28a745;\n}\n\n.btn-outline-success:hover {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-outline-success:focus, .btn-outline-success.focus {\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.btn-outline-success.disabled, .btn-outline-success:disabled {\n color: #28a745;\n background-color: transparent;\n}\n\n.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active,\n.show > .btn-outline-success.dropdown-toggle {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-success.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.btn-outline-info {\n color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-outline-info:hover {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-outline-info:focus, .btn-outline-info.focus {\n box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-outline-info.disabled, .btn-outline-info:disabled {\n color: #17a2b8;\n background-color: transparent;\n}\n\n.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active,\n.show > .btn-outline-info.dropdown-toggle {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-info.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-outline-warning {\n color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-outline-warning:hover {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-outline-warning:focus, .btn-outline-warning.focus {\n box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.btn-outline-warning.disabled, .btn-outline-warning:disabled {\n color: #ffc107;\n background-color: transparent;\n}\n\n.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active,\n.show > .btn-outline-warning.dropdown-toggle {\n color: #212529;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-warning.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.btn-outline-danger {\n color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-outline-danger:hover {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-outline-danger:focus, .btn-outline-danger.focus {\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.btn-outline-danger.disabled, .btn-outline-danger:disabled {\n color: #dc3545;\n background-color: transparent;\n}\n\n.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active,\n.show > .btn-outline-danger.dropdown-toggle {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-danger.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.btn-outline-light {\n color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-outline-light:hover {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-outline-light:focus, .btn-outline-light.focus {\n box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-outline-light.disabled, .btn-outline-light:disabled {\n color: #f8f9fa;\n background-color: transparent;\n}\n\n.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active,\n.show > .btn-outline-light.dropdown-toggle {\n color: #212529;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-light.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-outline-dark {\n color: #343a40;\n border-color: #343a40;\n}\n\n.btn-outline-dark:hover {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-outline-dark:focus, .btn-outline-dark.focus {\n box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-outline-dark.disabled, .btn-outline-dark:disabled {\n color: #343a40;\n background-color: transparent;\n}\n\n.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active,\n.show > .btn-outline-dark.dropdown-toggle {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-dark.dropdown-toggle:focus {\n box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-link {\n font-weight: 400;\n color: #007bff;\n text-decoration: none;\n}\n\n.btn-link:hover {\n color: #0056b3;\n text-decoration: underline;\n}\n\n.btn-link:focus, .btn-link.focus {\n text-decoration: underline;\n box-shadow: none;\n}\n\n.btn-link:disabled, .btn-link.disabled {\n color: #6c757d;\n pointer-events: none;\n}\n\n.btn-lg, .btn-group-lg > .btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0.3rem;\n}\n\n.btn-sm, .btn-group-sm > .btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0.2rem;\n}\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n.btn-block + .btn-block {\n margin-top: 0.5rem;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n\n.fade {\n transition: opacity 0.15s linear;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .fade {\n transition: none;\n }\n}\n\n.fade:not(.show) {\n opacity: 0;\n}\n\n.collapse:not(.show) {\n display: none;\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n transition: height 0.35s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .collapsing {\n transition: none;\n }\n}\n\n.dropup,\n.dropright,\n.dropdown,\n.dropleft {\n position: relative;\n}\n\n.dropdown-toggle {\n white-space: nowrap;\n}\n\n.dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid;\n border-right: 0.3em solid transparent;\n border-bottom: 0;\n border-left: 0.3em solid transparent;\n}\n\n.dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 10rem;\n padding: 0.5rem 0;\n margin: 0.125rem 0 0;\n font-size: 1rem;\n color: #212529;\n text-align: left;\n list-style: none;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem;\n}\n\n.dropdown-menu-left {\n right: auto;\n left: 0;\n}\n\n.dropdown-menu-right {\n right: 0;\n left: auto;\n}\n\n@media (min-width: 576px) {\n .dropdown-menu-sm-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-sm-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 768px) {\n .dropdown-menu-md-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-md-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 992px) {\n .dropdown-menu-lg-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-lg-right {\n right: 0;\n left: auto;\n }\n}\n\n@media (min-width: 1200px) {\n .dropdown-menu-xl-left {\n right: auto;\n left: 0;\n }\n .dropdown-menu-xl-right {\n right: 0;\n left: auto;\n }\n}\n\n.dropup .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-top: 0;\n margin-bottom: 0.125rem;\n}\n\n.dropup .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0;\n border-right: 0.3em solid transparent;\n border-bottom: 0.3em solid;\n border-left: 0.3em solid transparent;\n}\n\n.dropup .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropright .dropdown-menu {\n top: 0;\n right: auto;\n left: 100%;\n margin-top: 0;\n margin-left: 0.125rem;\n}\n\n.dropright .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid transparent;\n border-right: 0;\n border-bottom: 0.3em solid transparent;\n border-left: 0.3em solid;\n}\n\n.dropright .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropright .dropdown-toggle::after {\n vertical-align: 0;\n}\n\n.dropleft .dropdown-menu {\n top: 0;\n right: 100%;\n left: auto;\n margin-top: 0;\n margin-right: 0.125rem;\n}\n\n.dropleft .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n}\n\n.dropleft .dropdown-toggle::after {\n display: none;\n}\n\n.dropleft .dropdown-toggle::before {\n display: inline-block;\n margin-right: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid transparent;\n border-right: 0.3em solid;\n border-bottom: 0.3em solid transparent;\n}\n\n.dropleft .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropleft .dropdown-toggle::before {\n vertical-align: 0;\n}\n\n.dropdown-menu[x-placement^=\"top\"], .dropdown-menu[x-placement^=\"right\"], .dropdown-menu[x-placement^=\"bottom\"], .dropdown-menu[x-placement^=\"left\"] {\n right: auto;\n bottom: auto;\n}\n\n.dropdown-divider {\n height: 0;\n margin: 0.5rem 0;\n overflow: hidden;\n border-top: 1px solid #e9ecef;\n}\n\n.dropdown-item {\n display: block;\n width: 100%;\n padding: 0.25rem 1.5rem;\n clear: both;\n font-weight: 400;\n color: #212529;\n text-align: inherit;\n white-space: nowrap;\n background-color: transparent;\n border: 0;\n}\n\n.dropdown-item:hover, .dropdown-item:focus {\n color: #16181b;\n text-decoration: none;\n background-color: #f8f9fa;\n}\n\n.dropdown-item.active, .dropdown-item:active {\n color: #fff;\n text-decoration: none;\n background-color: #007bff;\n}\n\n.dropdown-item.disabled, .dropdown-item:disabled {\n color: #6c757d;\n pointer-events: none;\n background-color: transparent;\n}\n\n.dropdown-menu.show {\n display: block;\n}\n\n.dropdown-header {\n display: block;\n padding: 0.5rem 1.5rem;\n margin-bottom: 0;\n font-size: 0.875rem;\n color: #6c757d;\n white-space: nowrap;\n}\n\n.dropdown-item-text {\n display: block;\n padding: 0.25rem 1.5rem;\n color: #212529;\n}\n\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-flex;\n vertical-align: middle;\n}\n\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n flex: 1 1 auto;\n}\n\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover {\n z-index: 1;\n}\n\n.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,\n.btn-group-vertical > .btn:focus,\n.btn-group-vertical > .btn:active,\n.btn-group-vertical > .btn.active {\n z-index: 1;\n}\n\n.btn-toolbar {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-start;\n}\n\n.btn-toolbar .input-group {\n width: auto;\n}\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) {\n margin-left: -1px;\n}\n\n.btn-group > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group > .btn-group:not(:last-child) > .btn {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.dropdown-toggle-split {\n padding-right: 0.5625rem;\n padding-left: 0.5625rem;\n}\n\n.dropdown-toggle-split::after,\n.dropup .dropdown-toggle-split::after,\n.dropright .dropdown-toggle-split::after {\n margin-left: 0;\n}\n\n.dropleft .dropdown-toggle-split::before {\n margin-right: 0;\n}\n\n.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {\n padding-right: 0.375rem;\n padding-left: 0.375rem;\n}\n\n.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {\n padding-right: 0.75rem;\n padding-left: 0.75rem;\n}\n\n.btn-group-vertical {\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n}\n\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group {\n width: 100%;\n}\n\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) {\n margin-top: -1px;\n}\n\n.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group-vertical > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.btn-group-toggle > .btn,\n.btn-group-toggle > .btn-group > .btn {\n margin-bottom: 0;\n}\n\n.btn-group-toggle > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn input[type=\"checkbox\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n\n.input-group {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: stretch;\n width: 100%;\n}\n\n.input-group > .form-control,\n.input-group > .form-control-plaintext,\n.input-group > .custom-select,\n.input-group > .custom-file {\n position: relative;\n flex: 1 1 auto;\n width: 1%;\n margin-bottom: 0;\n}\n\n.input-group > .form-control + .form-control,\n.input-group > .form-control + .custom-select,\n.input-group > .form-control + .custom-file,\n.input-group > .form-control-plaintext + .form-control,\n.input-group > .form-control-plaintext + .custom-select,\n.input-group > .form-control-plaintext + .custom-file,\n.input-group > .custom-select + .form-control,\n.input-group > .custom-select + .custom-select,\n.input-group > .custom-select + .custom-file,\n.input-group > .custom-file + .form-control,\n.input-group > .custom-file + .custom-select,\n.input-group > .custom-file + .custom-file {\n margin-left: -1px;\n}\n\n.input-group > .form-control:focus,\n.input-group > .custom-select:focus,\n.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label {\n z-index: 3;\n}\n\n.input-group > .custom-file .custom-file-input:focus {\n z-index: 4;\n}\n\n.input-group > .form-control:not(:last-child),\n.input-group > .custom-select:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.input-group > .form-control:not(:first-child),\n.input-group > .custom-select:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.input-group > .custom-file {\n display: flex;\n align-items: center;\n}\n\n.input-group > .custom-file:not(:last-child) .custom-file-label,\n.input-group > .custom-file:not(:last-child) .custom-file-label::after {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.input-group > .custom-file:not(:first-child) .custom-file-label {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.input-group-prepend,\n.input-group-append {\n display: flex;\n}\n\n.input-group-prepend .btn,\n.input-group-append .btn {\n position: relative;\n z-index: 2;\n}\n\n.input-group-prepend .btn:focus,\n.input-group-append .btn:focus {\n z-index: 3;\n}\n\n.input-group-prepend .btn + .btn,\n.input-group-prepend .btn + .input-group-text,\n.input-group-prepend .input-group-text + .input-group-text,\n.input-group-prepend .input-group-text + .btn,\n.input-group-append .btn + .btn,\n.input-group-append .btn + .input-group-text,\n.input-group-append .input-group-text + .input-group-text,\n.input-group-append .input-group-text + .btn {\n margin-left: -1px;\n}\n\n.input-group-prepend {\n margin-right: -1px;\n}\n\n.input-group-append {\n margin-left: -1px;\n}\n\n.input-group-text {\n display: flex;\n align-items: center;\n padding: 0.375rem 0.75rem;\n margin-bottom: 0;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #495057;\n text-align: center;\n white-space: nowrap;\n background-color: #e9ecef;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n}\n\n.input-group-text input[type=\"radio\"],\n.input-group-text input[type=\"checkbox\"] {\n margin-top: 0;\n}\n\n.input-group-lg > .form-control:not(textarea),\n.input-group-lg > .custom-select {\n height: calc(1.5em + 1rem + 2px);\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .custom-select,\n.input-group-lg > .input-group-prepend > .input-group-text,\n.input-group-lg > .input-group-append > .input-group-text,\n.input-group-lg > .input-group-prepend > .btn,\n.input-group-lg > .input-group-append > .btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0.3rem;\n}\n\n.input-group-sm > .form-control:not(textarea),\n.input-group-sm > .custom-select {\n height: calc(1.5em + 0.5rem + 2px);\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .custom-select,\n.input-group-sm > .input-group-prepend > .input-group-text,\n.input-group-sm > .input-group-append > .input-group-text,\n.input-group-sm > .input-group-prepend > .btn,\n.input-group-sm > .input-group-append > .btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0.2rem;\n}\n\n.input-group-lg > .custom-select,\n.input-group-sm > .custom-select {\n padding-right: 1.75rem;\n}\n\n.input-group > .input-group-prepend > .btn,\n.input-group > .input-group-prepend > .input-group-text,\n.input-group > .input-group-append:not(:last-child) > .btn,\n.input-group > .input-group-append:not(:last-child) > .input-group-text,\n.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.input-group > .input-group-append > .btn,\n.input-group > .input-group-append > .input-group-text,\n.input-group > .input-group-prepend:not(:first-child) > .btn,\n.input-group > .input-group-prepend:not(:first-child) > .input-group-text,\n.input-group > .input-group-prepend:first-child > .btn:not(:first-child),\n.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.custom-control {\n position: relative;\n display: block;\n min-height: 1.5rem;\n padding-left: 1.5rem;\n}\n\n.custom-control-inline {\n display: inline-flex;\n margin-right: 1rem;\n}\n\n.custom-control-input {\n position: absolute;\n z-index: -1;\n opacity: 0;\n}\n\n.custom-control-input:checked ~ .custom-control-label::before {\n color: #fff;\n border-color: #007bff;\n background-color: #007bff;\n}\n\n.custom-control-input:focus ~ .custom-control-label::before {\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-control-input:focus:not(:checked) ~ .custom-control-label::before {\n border-color: #80bdff;\n}\n\n.custom-control-input:not(:disabled):active ~ .custom-control-label::before {\n color: #fff;\n background-color: #b3d7ff;\n border-color: #b3d7ff;\n}\n\n.custom-control-input:disabled ~ .custom-control-label {\n color: #6c757d;\n}\n\n.custom-control-input:disabled ~ .custom-control-label::before {\n background-color: #e9ecef;\n}\n\n.custom-control-label {\n position: relative;\n margin-bottom: 0;\n vertical-align: top;\n}\n\n.custom-control-label::before {\n position: absolute;\n top: 0.25rem;\n left: -1.5rem;\n display: block;\n width: 1rem;\n height: 1rem;\n pointer-events: none;\n content: \"\";\n background-color: #fff;\n border: #adb5bd solid 1px;\n}\n\n.custom-control-label::after {\n position: absolute;\n top: 0.25rem;\n left: -1.5rem;\n display: block;\n width: 1rem;\n height: 1rem;\n content: \"\";\n background: no-repeat 50% / 50% 50%;\n}\n\n.custom-checkbox .custom-control-label::before {\n border-radius: 0.25rem;\n}\n\n.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e\");\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {\n border-color: #007bff;\n background-color: #007bff;\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e\");\n}\n\n.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-radio .custom-control-label::before {\n border-radius: 50%;\n}\n\n.custom-radio .custom-control-input:checked ~ .custom-control-label::after {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-switch {\n padding-left: 2.25rem;\n}\n\n.custom-switch .custom-control-label::before {\n left: -2.25rem;\n width: 1.75rem;\n pointer-events: all;\n border-radius: 0.5rem;\n}\n\n.custom-switch .custom-control-label::after {\n top: calc(0.25rem + 2px);\n left: calc(-2.25rem + 2px);\n width: calc(1rem - 4px);\n height: calc(1rem - 4px);\n background-color: #adb5bd;\n border-radius: 0.5rem;\n transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-switch .custom-control-label::after {\n transition: none;\n }\n}\n\n.custom-switch .custom-control-input:checked ~ .custom-control-label::after {\n background-color: #fff;\n transform: translateX(0.75rem);\n}\n\n.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before {\n background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-select {\n display: inline-block;\n width: 100%;\n height: calc(1.5em + 0.75rem + 2px);\n padding: 0.375rem 1.75rem 0.375rem 0.75rem;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #495057;\n vertical-align: middle;\n background: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") no-repeat right 0.75rem center/8px 10px;\n background-color: #fff;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n appearance: none;\n}\n\n.custom-select:focus {\n border-color: #80bdff;\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-select:focus::-ms-value {\n color: #495057;\n background-color: #fff;\n}\n\n.custom-select[multiple], .custom-select[size]:not([size=\"1\"]) {\n height: auto;\n padding-right: 0.75rem;\n background-image: none;\n}\n\n.custom-select:disabled {\n color: #6c757d;\n background-color: #e9ecef;\n}\n\n.custom-select::-ms-expand {\n display: none;\n}\n\n.custom-select-sm {\n height: calc(1.5em + 0.5rem + 2px);\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n padding-left: 0.5rem;\n font-size: 0.875rem;\n}\n\n.custom-select-lg {\n height: calc(1.5em + 1rem + 2px);\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n padding-left: 1rem;\n font-size: 1.25rem;\n}\n\n.custom-file {\n position: relative;\n display: inline-block;\n width: 100%;\n height: calc(1.5em + 0.75rem + 2px);\n margin-bottom: 0;\n}\n\n.custom-file-input {\n position: relative;\n z-index: 2;\n width: 100%;\n height: calc(1.5em + 0.75rem + 2px);\n margin: 0;\n opacity: 0;\n}\n\n.custom-file-input:focus ~ .custom-file-label {\n border-color: #80bdff;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-file-input:disabled ~ .custom-file-label {\n background-color: #e9ecef;\n}\n\n.custom-file-input:lang(en) ~ .custom-file-label::after {\n content: \"Browse\";\n}\n\n.custom-file-input ~ .custom-file-label[data-browse]::after {\n content: attr(data-browse);\n}\n\n.custom-file-label {\n position: absolute;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1;\n height: calc(1.5em + 0.75rem + 2px);\n padding: 0.375rem 0.75rem;\n font-weight: 400;\n line-height: 1.5;\n color: #495057;\n background-color: #fff;\n border: 1px solid #ced4da;\n border-radius: 0.25rem;\n}\n\n.custom-file-label::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n z-index: 3;\n display: block;\n height: calc(1.5em + 0.75rem);\n padding: 0.375rem 0.75rem;\n line-height: 1.5;\n color: #495057;\n content: \"Browse\";\n background-color: #e9ecef;\n border-left: inherit;\n border-radius: 0 0.25rem 0.25rem 0;\n}\n\n.custom-range {\n width: 100%;\n height: calc(1rem + 0.4rem);\n padding: 0;\n background-color: transparent;\n appearance: none;\n}\n\n.custom-range:focus {\n outline: none;\n}\n\n.custom-range:focus::-webkit-slider-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range:focus::-moz-range-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range:focus::-ms-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range::-moz-focus-outer {\n border: 0;\n}\n\n.custom-range::-webkit-slider-thumb {\n width: 1rem;\n height: 1rem;\n margin-top: -0.25rem;\n background-color: #007bff;\n border: 0;\n border-radius: 1rem;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-webkit-slider-thumb {\n transition: none;\n }\n}\n\n.custom-range::-webkit-slider-thumb:active {\n background-color: #b3d7ff;\n}\n\n.custom-range::-webkit-slider-runnable-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #dee2e6;\n border-color: transparent;\n border-radius: 1rem;\n}\n\n.custom-range::-moz-range-thumb {\n width: 1rem;\n height: 1rem;\n background-color: #007bff;\n border: 0;\n border-radius: 1rem;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-moz-range-thumb {\n transition: none;\n }\n}\n\n.custom-range::-moz-range-thumb:active {\n background-color: #b3d7ff;\n}\n\n.custom-range::-moz-range-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: #dee2e6;\n border-color: transparent;\n border-radius: 1rem;\n}\n\n.custom-range::-ms-thumb {\n width: 1rem;\n height: 1rem;\n margin-top: 0;\n margin-right: 0.2rem;\n margin-left: 0.2rem;\n background-color: #007bff;\n border: 0;\n border-radius: 1rem;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-range::-ms-thumb {\n transition: none;\n }\n}\n\n.custom-range::-ms-thumb:active {\n background-color: #b3d7ff;\n}\n\n.custom-range::-ms-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: transparent;\n border-color: transparent;\n border-width: 0.5rem;\n}\n\n.custom-range::-ms-fill-lower {\n background-color: #dee2e6;\n border-radius: 1rem;\n}\n\n.custom-range::-ms-fill-upper {\n margin-right: 15px;\n background-color: #dee2e6;\n border-radius: 1rem;\n}\n\n.custom-range:disabled::-webkit-slider-thumb {\n background-color: #adb5bd;\n}\n\n.custom-range:disabled::-webkit-slider-runnable-track {\n cursor: default;\n}\n\n.custom-range:disabled::-moz-range-thumb {\n background-color: #adb5bd;\n}\n\n.custom-range:disabled::-moz-range-track {\n cursor: default;\n}\n\n.custom-range:disabled::-ms-thumb {\n background-color: #adb5bd;\n}\n\n.custom-control-label::before,\n.custom-file-label,\n.custom-select {\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .custom-control-label::before,\n .custom-file-label,\n .custom-select {\n transition: none;\n }\n}\n\n.nav {\n display: flex;\n flex-wrap: wrap;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: 0.5rem 1rem;\n}\n\n.nav-link:hover, .nav-link:focus {\n text-decoration: none;\n}\n\n.nav-link.disabled {\n color: #6c757d;\n pointer-events: none;\n cursor: default;\n}\n\n.nav-tabs {\n border-bottom: 1px solid #dee2e6;\n}\n\n.nav-tabs .nav-item {\n margin-bottom: -1px;\n}\n\n.nav-tabs .nav-link {\n border: 1px solid transparent;\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {\n border-color: #e9ecef #e9ecef #dee2e6;\n}\n\n.nav-tabs .nav-link.disabled {\n color: #6c757d;\n background-color: transparent;\n border-color: transparent;\n}\n\n.nav-tabs .nav-link.active,\n.nav-tabs .nav-item.show .nav-link {\n color: #495057;\n background-color: #fff;\n border-color: #dee2e6 #dee2e6 #fff;\n}\n\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.nav-pills .nav-link {\n border-radius: 0.25rem;\n}\n\n.nav-pills .nav-link.active,\n.nav-pills .show > .nav-link {\n color: #fff;\n background-color: #007bff;\n}\n\n.nav-fill .nav-item {\n flex: 1 1 auto;\n text-align: center;\n}\n\n.nav-justified .nav-item {\n flex-basis: 0;\n flex-grow: 1;\n text-align: center;\n}\n\n.tab-content > .tab-pane {\n display: none;\n}\n\n.tab-content > .active {\n display: block;\n}\n\n.navbar {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n padding: 0.5rem 1rem;\n}\n\n.navbar > .container,\n.navbar > .container-fluid {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n}\n\n.navbar-brand {\n display: inline-block;\n padding-top: 0.3125rem;\n padding-bottom: 0.3125rem;\n margin-right: 1rem;\n font-size: 1.25rem;\n line-height: inherit;\n white-space: nowrap;\n}\n\n.navbar-brand:hover, .navbar-brand:focus {\n text-decoration: none;\n}\n\n.navbar-nav {\n display: flex;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.navbar-nav .nav-link {\n padding-right: 0;\n padding-left: 0;\n}\n\n.navbar-nav .dropdown-menu {\n position: static;\n float: none;\n}\n\n.navbar-text {\n display: inline-block;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n\n.navbar-collapse {\n flex-basis: 100%;\n flex-grow: 1;\n align-items: center;\n}\n\n.navbar-toggler {\n padding: 0.25rem 0.75rem;\n font-size: 1.25rem;\n line-height: 1;\n background-color: transparent;\n border: 1px solid transparent;\n border-radius: 0.25rem;\n}\n\n.navbar-toggler:hover, .navbar-toggler:focus {\n text-decoration: none;\n}\n\n.navbar-toggler-icon {\n display: inline-block;\n width: 1.5em;\n height: 1.5em;\n vertical-align: middle;\n content: \"\";\n background: no-repeat center center;\n background-size: 100% 100%;\n}\n\n@media (max-width: 575.98px) {\n .navbar-expand-sm > .container,\n .navbar-expand-sm > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 576px) {\n .navbar-expand-sm {\n flex-flow: row nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-sm .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-sm .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-sm .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-sm > .container,\n .navbar-expand-sm > .container-fluid {\n flex-wrap: nowrap;\n }\n .navbar-expand-sm .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-sm .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 767.98px) {\n .navbar-expand-md > .container,\n .navbar-expand-md > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 768px) {\n .navbar-expand-md {\n flex-flow: row nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-md .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-md .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-md .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-md > .container,\n .navbar-expand-md > .container-fluid {\n flex-wrap: nowrap;\n }\n .navbar-expand-md .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-md .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 991.98px) {\n .navbar-expand-lg > .container,\n .navbar-expand-lg > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 992px) {\n .navbar-expand-lg {\n flex-flow: row nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-lg .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-lg .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-lg .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-lg > .container,\n .navbar-expand-lg > .container-fluid {\n flex-wrap: nowrap;\n }\n .navbar-expand-lg .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-lg .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 1199.98px) {\n .navbar-expand-xl > .container,\n .navbar-expand-xl > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 1200px) {\n .navbar-expand-xl {\n flex-flow: row nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-xl .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-xl .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-xl .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n }\n .navbar-expand-xl > .container,\n .navbar-expand-xl > .container-fluid {\n flex-wrap: nowrap;\n }\n .navbar-expand-xl .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-xl .navbar-toggler {\n display: none;\n }\n}\n\n.navbar-expand {\n flex-flow: row nowrap;\n justify-content: flex-start;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n}\n\n.navbar-expand .navbar-nav {\n flex-direction: row;\n}\n\n.navbar-expand .navbar-nav .dropdown-menu {\n position: absolute;\n}\n\n.navbar-expand .navbar-nav .nav-link {\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n flex-wrap: nowrap;\n}\n\n.navbar-expand .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n}\n\n.navbar-expand .navbar-toggler {\n display: none;\n}\n\n.navbar-light .navbar-brand {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-nav .nav-link {\n color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus {\n color: rgba(0, 0, 0, 0.7);\n}\n\n.navbar-light .navbar-nav .nav-link.disabled {\n color: rgba(0, 0, 0, 0.3);\n}\n\n.navbar-light .navbar-nav .show > .nav-link,\n.navbar-light .navbar-nav .active > .nav-link,\n.navbar-light .navbar-nav .nav-link.show,\n.navbar-light .navbar-nav .nav-link.active {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-toggler {\n color: rgba(0, 0, 0, 0.5);\n border-color: rgba(0, 0, 0, 0.1);\n}\n\n.navbar-light .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n}\n\n.navbar-light .navbar-text {\n color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-light .navbar-text a {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-dark .navbar-brand {\n color: #fff;\n}\n\n.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus {\n color: #fff;\n}\n\n.navbar-dark .navbar-nav .nav-link {\n color: rgba(255, 255, 255, 0.5);\n}\n\n.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus {\n color: rgba(255, 255, 255, 0.75);\n}\n\n.navbar-dark .navbar-nav .nav-link.disabled {\n color: rgba(255, 255, 255, 0.25);\n}\n\n.navbar-dark .navbar-nav .show > .nav-link,\n.navbar-dark .navbar-nav .active > .nav-link,\n.navbar-dark .navbar-nav .nav-link.show,\n.navbar-dark .navbar-nav .nav-link.active {\n color: #fff;\n}\n\n.navbar-dark .navbar-toggler {\n color: rgba(255, 255, 255, 0.5);\n border-color: rgba(255, 255, 255, 0.1);\n}\n\n.navbar-dark .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n}\n\n.navbar-dark .navbar-text {\n color: rgba(255, 255, 255, 0.5);\n}\n\n.navbar-dark .navbar-text a {\n color: #fff;\n}\n\n.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus {\n color: #fff;\n}\n\n.card {\n position: relative;\n display: flex;\n flex-direction: column;\n min-width: 0;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: border-box;\n border: 1px solid rgba(0, 0, 0, 0.125);\n border-radius: 0.25rem;\n}\n\n.card > hr {\n margin-right: 0;\n margin-left: 0;\n}\n\n.card > .list-group:first-child .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.card > .list-group:last-child .list-group-item:last-child {\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.card-body {\n flex: 1 1 auto;\n padding: 1.25rem;\n}\n\n.card-title {\n margin-bottom: 0.75rem;\n}\n\n.card-subtitle {\n margin-top: -0.375rem;\n margin-bottom: 0;\n}\n\n.card-text:last-child {\n margin-bottom: 0;\n}\n\n.card-link:hover {\n text-decoration: none;\n}\n\n.card-link + .card-link {\n margin-left: 1.25rem;\n}\n\n.card-header {\n padding: 0.75rem 1.25rem;\n margin-bottom: 0;\n background-color: rgba(0, 0, 0, 0.03);\n border-bottom: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-header:first-child {\n border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;\n}\n\n.card-header + .list-group .list-group-item:first-child {\n border-top: 0;\n}\n\n.card-footer {\n padding: 0.75rem 1.25rem;\n background-color: rgba(0, 0, 0, 0.03);\n border-top: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-footer:last-child {\n border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px);\n}\n\n.card-header-tabs {\n margin-right: -0.625rem;\n margin-bottom: -0.75rem;\n margin-left: -0.625rem;\n border-bottom: 0;\n}\n\n.card-header-pills {\n margin-right: -0.625rem;\n margin-left: -0.625rem;\n}\n\n.card-img-overlay {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n padding: 1.25rem;\n}\n\n.card-img {\n width: 100%;\n border-radius: calc(0.25rem - 1px);\n}\n\n.card-img-top {\n width: 100%;\n border-top-left-radius: calc(0.25rem - 1px);\n border-top-right-radius: calc(0.25rem - 1px);\n}\n\n.card-img-bottom {\n width: 100%;\n border-bottom-right-radius: calc(0.25rem - 1px);\n border-bottom-left-radius: calc(0.25rem - 1px);\n}\n\n.card-deck {\n display: flex;\n flex-direction: column;\n}\n\n.card-deck .card {\n margin-bottom: 15px;\n}\n\n@media (min-width: 576px) {\n .card-deck {\n flex-flow: row wrap;\n margin-right: -15px;\n margin-left: -15px;\n }\n .card-deck .card {\n display: flex;\n flex: 1 0 0%;\n flex-direction: column;\n margin-right: 15px;\n margin-bottom: 0;\n margin-left: 15px;\n }\n}\n\n.card-group {\n display: flex;\n flex-direction: column;\n}\n\n.card-group > .card {\n margin-bottom: 15px;\n}\n\n@media (min-width: 576px) {\n .card-group {\n flex-flow: row wrap;\n }\n .card-group > .card {\n flex: 1 0 0%;\n margin-bottom: 0;\n }\n .card-group > .card + .card {\n margin-left: 0;\n border-left: 0;\n }\n .card-group > .card:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n .card-group > .card:not(:last-child) .card-img-top,\n .card-group > .card:not(:last-child) .card-header {\n border-top-right-radius: 0;\n }\n .card-group > .card:not(:last-child) .card-img-bottom,\n .card-group > .card:not(:last-child) .card-footer {\n border-bottom-right-radius: 0;\n }\n .card-group > .card:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n .card-group > .card:not(:first-child) .card-img-top,\n .card-group > .card:not(:first-child) .card-header {\n border-top-left-radius: 0;\n }\n .card-group > .card:not(:first-child) .card-img-bottom,\n .card-group > .card:not(:first-child) .card-footer {\n border-bottom-left-radius: 0;\n }\n}\n\n.card-columns .card {\n margin-bottom: 0.75rem;\n}\n\n@media (min-width: 576px) {\n .card-columns {\n column-count: 3;\n column-gap: 1.25rem;\n orphans: 1;\n widows: 1;\n }\n .card-columns .card {\n display: inline-block;\n width: 100%;\n }\n}\n\n.accordion > .card {\n overflow: hidden;\n}\n\n.accordion > .card:not(:first-of-type) .card-header:first-child {\n border-radius: 0;\n}\n\n.accordion > .card:not(:first-of-type):not(:last-of-type) {\n border-bottom: 0;\n border-radius: 0;\n}\n\n.accordion > .card:first-of-type {\n border-bottom: 0;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.accordion > .card:last-of-type {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.accordion > .card .card-header {\n margin-bottom: -1px;\n}\n\n.breadcrumb {\n display: flex;\n flex-wrap: wrap;\n padding: 0.75rem 1rem;\n margin-bottom: 1rem;\n list-style: none;\n background-color: #e9ecef;\n border-radius: 0.25rem;\n}\n\n.breadcrumb-item + .breadcrumb-item {\n padding-left: 0.5rem;\n}\n\n.breadcrumb-item + .breadcrumb-item::before {\n display: inline-block;\n padding-right: 0.5rem;\n color: #6c757d;\n content: \"/\";\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: underline;\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: none;\n}\n\n.breadcrumb-item.active {\n color: #6c757d;\n}\n\n.pagination {\n display: flex;\n padding-left: 0;\n list-style: none;\n border-radius: 0.25rem;\n}\n\n.page-link {\n position: relative;\n display: block;\n padding: 0.5rem 0.75rem;\n margin-left: -1px;\n line-height: 1.25;\n color: #007bff;\n background-color: #fff;\n border: 1px solid #dee2e6;\n}\n\n.page-link:hover {\n z-index: 2;\n color: #0056b3;\n text-decoration: none;\n background-color: #e9ecef;\n border-color: #dee2e6;\n}\n\n.page-link:focus {\n z-index: 2;\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.page-item:first-child .page-link {\n margin-left: 0;\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.page-item:last-child .page-link {\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n}\n\n.page-item.active .page-link {\n z-index: 1;\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.page-item.disabled .page-link {\n color: #6c757d;\n pointer-events: none;\n cursor: auto;\n background-color: #fff;\n border-color: #dee2e6;\n}\n\n.pagination-lg .page-link {\n padding: 0.75rem 1.5rem;\n font-size: 1.25rem;\n line-height: 1.5;\n}\n\n.pagination-lg .page-item:first-child .page-link {\n border-top-left-radius: 0.3rem;\n border-bottom-left-radius: 0.3rem;\n}\n\n.pagination-lg .page-item:last-child .page-link {\n border-top-right-radius: 0.3rem;\n border-bottom-right-radius: 0.3rem;\n}\n\n.pagination-sm .page-link {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.pagination-sm .page-item:first-child .page-link {\n border-top-left-radius: 0.2rem;\n border-bottom-left-radius: 0.2rem;\n}\n\n.pagination-sm .page-item:last-child .page-link {\n border-top-right-radius: 0.2rem;\n border-bottom-right-radius: 0.2rem;\n}\n\n.badge {\n display: inline-block;\n padding: 0.25em 0.4em;\n font-size: 75%;\n font-weight: 700;\n line-height: 1;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: 0.25rem;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .badge {\n transition: none;\n }\n}\n\na.badge:hover, a.badge:focus {\n text-decoration: none;\n}\n\n.badge:empty {\n display: none;\n}\n\n.btn .badge {\n position: relative;\n top: -1px;\n}\n\n.badge-pill {\n padding-right: 0.6em;\n padding-left: 0.6em;\n border-radius: 10rem;\n}\n\n.badge-primary {\n color: #fff;\n background-color: #007bff;\n}\n\na.badge-primary:hover, a.badge-primary:focus {\n color: #fff;\n background-color: #0062cc;\n}\n\na.badge-primary:focus, a.badge-primary.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.badge-secondary {\n color: #fff;\n background-color: #6c757d;\n}\n\na.badge-secondary:hover, a.badge-secondary:focus {\n color: #fff;\n background-color: #545b62;\n}\n\na.badge-secondary:focus, a.badge-secondary.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.badge-success {\n color: #fff;\n background-color: #28a745;\n}\n\na.badge-success:hover, a.badge-success:focus {\n color: #fff;\n background-color: #1e7e34;\n}\n\na.badge-success:focus, a.badge-success.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.badge-info {\n color: #fff;\n background-color: #17a2b8;\n}\n\na.badge-info:hover, a.badge-info:focus {\n color: #fff;\n background-color: #117a8b;\n}\n\na.badge-info:focus, a.badge-info.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.badge-warning {\n color: #212529;\n background-color: #ffc107;\n}\n\na.badge-warning:hover, a.badge-warning:focus {\n color: #212529;\n background-color: #d39e00;\n}\n\na.badge-warning:focus, a.badge-warning.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.badge-danger {\n color: #fff;\n background-color: #dc3545;\n}\n\na.badge-danger:hover, a.badge-danger:focus {\n color: #fff;\n background-color: #bd2130;\n}\n\na.badge-danger:focus, a.badge-danger.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.badge-light {\n color: #212529;\n background-color: #f8f9fa;\n}\n\na.badge-light:hover, a.badge-light:focus {\n color: #212529;\n background-color: #dae0e5;\n}\n\na.badge-light:focus, a.badge-light.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.badge-dark {\n color: #fff;\n background-color: #343a40;\n}\n\na.badge-dark:hover, a.badge-dark:focus {\n color: #fff;\n background-color: #1d2124;\n}\n\na.badge-dark:focus, a.badge-dark.focus {\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.jumbotron {\n padding: 2rem 1rem;\n margin-bottom: 2rem;\n background-color: #e9ecef;\n border-radius: 0.3rem;\n}\n\n@media (min-width: 576px) {\n .jumbotron {\n padding: 4rem 2rem;\n }\n}\n\n.jumbotron-fluid {\n padding-right: 0;\n padding-left: 0;\n border-radius: 0;\n}\n\n.alert {\n position: relative;\n padding: 0.75rem 1.25rem;\n margin-bottom: 1rem;\n border: 1px solid transparent;\n border-radius: 0.25rem;\n}\n\n.alert-heading {\n color: inherit;\n}\n\n.alert-link {\n font-weight: 700;\n}\n\n.alert-dismissible {\n padding-right: 4rem;\n}\n\n.alert-dismissible .close {\n position: absolute;\n top: 0;\n right: 0;\n padding: 0.75rem 1.25rem;\n color: inherit;\n}\n\n.alert-primary {\n color: #004085;\n background-color: #cce5ff;\n border-color: #b8daff;\n}\n\n.alert-primary hr {\n border-top-color: #9fcdff;\n}\n\n.alert-primary .alert-link {\n color: #002752;\n}\n\n.alert-secondary {\n color: #383d41;\n background-color: #e2e3e5;\n border-color: #d6d8db;\n}\n\n.alert-secondary hr {\n border-top-color: #c8cbcf;\n}\n\n.alert-secondary .alert-link {\n color: #202326;\n}\n\n.alert-success {\n color: #155724;\n background-color: #d4edda;\n border-color: #c3e6cb;\n}\n\n.alert-success hr {\n border-top-color: #b1dfbb;\n}\n\n.alert-success .alert-link {\n color: #0b2e13;\n}\n\n.alert-info {\n color: #0c5460;\n background-color: #d1ecf1;\n border-color: #bee5eb;\n}\n\n.alert-info hr {\n border-top-color: #abdde5;\n}\n\n.alert-info .alert-link {\n color: #062c33;\n}\n\n.alert-warning {\n color: #856404;\n background-color: #fff3cd;\n border-color: #ffeeba;\n}\n\n.alert-warning hr {\n border-top-color: #ffe8a1;\n}\n\n.alert-warning .alert-link {\n color: #533f03;\n}\n\n.alert-danger {\n color: #721c24;\n background-color: #f8d7da;\n border-color: #f5c6cb;\n}\n\n.alert-danger hr {\n border-top-color: #f1b0b7;\n}\n\n.alert-danger .alert-link {\n color: #491217;\n}\n\n.alert-light {\n color: #818182;\n background-color: #fefefe;\n border-color: #fdfdfe;\n}\n\n.alert-light hr {\n border-top-color: #ececf6;\n}\n\n.alert-light .alert-link {\n color: #686868;\n}\n\n.alert-dark {\n color: #1b1e21;\n background-color: #d6d8d9;\n border-color: #c6c8ca;\n}\n\n.alert-dark hr {\n border-top-color: #b9bbbe;\n}\n\n.alert-dark .alert-link {\n color: #040505;\n}\n\n@keyframes progress-bar-stripes {\n from {\n background-position: 1rem 0;\n }\n to {\n background-position: 0 0;\n }\n}\n\n.progress {\n display: flex;\n height: 1rem;\n overflow: hidden;\n font-size: 0.75rem;\n background-color: #e9ecef;\n border-radius: 0.25rem;\n}\n\n.progress-bar {\n display: flex;\n flex-direction: column;\n justify-content: center;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n background-color: #007bff;\n transition: width 0.6s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .progress-bar {\n transition: none;\n }\n}\n\n.progress-bar-striped {\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 1rem 1rem;\n}\n\n.progress-bar-animated {\n animation: progress-bar-stripes 1s linear infinite;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .progress-bar-animated {\n animation: none;\n }\n}\n\n.media {\n display: flex;\n align-items: flex-start;\n}\n\n.media-body {\n flex: 1;\n}\n\n.list-group {\n display: flex;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n}\n\n.list-group-item-action {\n width: 100%;\n color: #495057;\n text-align: inherit;\n}\n\n.list-group-item-action:hover, .list-group-item-action:focus {\n z-index: 1;\n color: #495057;\n text-decoration: none;\n background-color: #f8f9fa;\n}\n\n.list-group-item-action:active {\n color: #212529;\n background-color: #e9ecef;\n}\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 0.75rem 1.25rem;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.list-group-item.disabled, .list-group-item:disabled {\n color: #6c757d;\n pointer-events: none;\n background-color: #fff;\n}\n\n.list-group-item.active {\n z-index: 2;\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.list-group-horizontal {\n flex-direction: row;\n}\n\n.list-group-horizontal .list-group-item {\n margin-right: -1px;\n margin-bottom: 0;\n}\n\n.list-group-horizontal .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n}\n\n.list-group-horizontal .list-group-item:last-child {\n margin-right: 0;\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n}\n\n@media (min-width: 576px) {\n .list-group-horizontal-sm {\n flex-direction: row;\n }\n .list-group-horizontal-sm .list-group-item {\n margin-right: -1px;\n margin-bottom: 0;\n }\n .list-group-horizontal-sm .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-sm .list-group-item:last-child {\n margin-right: 0;\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n}\n\n@media (min-width: 768px) {\n .list-group-horizontal-md {\n flex-direction: row;\n }\n .list-group-horizontal-md .list-group-item {\n margin-right: -1px;\n margin-bottom: 0;\n }\n .list-group-horizontal-md .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-md .list-group-item:last-child {\n margin-right: 0;\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n}\n\n@media (min-width: 992px) {\n .list-group-horizontal-lg {\n flex-direction: row;\n }\n .list-group-horizontal-lg .list-group-item {\n margin-right: -1px;\n margin-bottom: 0;\n }\n .list-group-horizontal-lg .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-lg .list-group-item:last-child {\n margin-right: 0;\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n}\n\n@media (min-width: 1200px) {\n .list-group-horizontal-xl {\n flex-direction: row;\n }\n .list-group-horizontal-xl .list-group-item {\n margin-right: -1px;\n margin-bottom: 0;\n }\n .list-group-horizontal-xl .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n border-top-right-radius: 0;\n }\n .list-group-horizontal-xl .list-group-item:last-child {\n margin-right: 0;\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0;\n }\n}\n\n.list-group-flush .list-group-item {\n border-right: 0;\n border-left: 0;\n border-radius: 0;\n}\n\n.list-group-flush .list-group-item:last-child {\n margin-bottom: -1px;\n}\n\n.list-group-flush:first-child .list-group-item:first-child {\n border-top: 0;\n}\n\n.list-group-flush:last-child .list-group-item:last-child {\n margin-bottom: 0;\n border-bottom: 0;\n}\n\n.list-group-item-primary {\n color: #004085;\n background-color: #b8daff;\n}\n\n.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus {\n color: #004085;\n background-color: #9fcdff;\n}\n\n.list-group-item-primary.list-group-item-action.active {\n color: #fff;\n background-color: #004085;\n border-color: #004085;\n}\n\n.list-group-item-secondary {\n color: #383d41;\n background-color: #d6d8db;\n}\n\n.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus {\n color: #383d41;\n background-color: #c8cbcf;\n}\n\n.list-group-item-secondary.list-group-item-action.active {\n color: #fff;\n background-color: #383d41;\n border-color: #383d41;\n}\n\n.list-group-item-success {\n color: #155724;\n background-color: #c3e6cb;\n}\n\n.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus {\n color: #155724;\n background-color: #b1dfbb;\n}\n\n.list-group-item-success.list-group-item-action.active {\n color: #fff;\n background-color: #155724;\n border-color: #155724;\n}\n\n.list-group-item-info {\n color: #0c5460;\n background-color: #bee5eb;\n}\n\n.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus {\n color: #0c5460;\n background-color: #abdde5;\n}\n\n.list-group-item-info.list-group-item-action.active {\n color: #fff;\n background-color: #0c5460;\n border-color: #0c5460;\n}\n\n.list-group-item-warning {\n color: #856404;\n background-color: #ffeeba;\n}\n\n.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus {\n color: #856404;\n background-color: #ffe8a1;\n}\n\n.list-group-item-warning.list-group-item-action.active {\n color: #fff;\n background-color: #856404;\n border-color: #856404;\n}\n\n.list-group-item-danger {\n color: #721c24;\n background-color: #f5c6cb;\n}\n\n.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus {\n color: #721c24;\n background-color: #f1b0b7;\n}\n\n.list-group-item-danger.list-group-item-action.active {\n color: #fff;\n background-color: #721c24;\n border-color: #721c24;\n}\n\n.list-group-item-light {\n color: #818182;\n background-color: #fdfdfe;\n}\n\n.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus {\n color: #818182;\n background-color: #ececf6;\n}\n\n.list-group-item-light.list-group-item-action.active {\n color: #fff;\n background-color: #818182;\n border-color: #818182;\n}\n\n.list-group-item-dark {\n color: #1b1e21;\n background-color: #c6c8ca;\n}\n\n.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus {\n color: #1b1e21;\n background-color: #b9bbbe;\n}\n\n.list-group-item-dark.list-group-item-action.active {\n color: #fff;\n background-color: #1b1e21;\n border-color: #1b1e21;\n}\n\n.close {\n float: right;\n font-size: 1.5rem;\n font-weight: 700;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n opacity: .5;\n}\n\n.close:hover {\n color: #000;\n text-decoration: none;\n}\n\n.close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus {\n opacity: .75;\n}\n\nbutton.close {\n padding: 0;\n background-color: transparent;\n border: 0;\n appearance: none;\n}\n\na.close.disabled {\n pointer-events: none;\n}\n\n.toast {\n max-width: 350px;\n overflow: hidden;\n font-size: 0.875rem;\n background-color: rgba(255, 255, 255, 0.85);\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.1);\n box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1);\n backdrop-filter: blur(10px);\n opacity: 0;\n border-radius: 0.25rem;\n}\n\n.toast:not(:last-child) {\n margin-bottom: 0.75rem;\n}\n\n.toast.showing {\n opacity: 1;\n}\n\n.toast.show {\n display: block;\n opacity: 1;\n}\n\n.toast.hide {\n display: none;\n}\n\n.toast-header {\n display: flex;\n align-items: center;\n padding: 0.25rem 0.75rem;\n color: #6c757d;\n background-color: rgba(255, 255, 255, 0.85);\n background-clip: padding-box;\n border-bottom: 1px solid rgba(0, 0, 0, 0.05);\n}\n\n.toast-body {\n padding: 0.75rem;\n}\n\n.modal-open {\n overflow: hidden;\n}\n\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n.modal {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1050;\n display: none;\n width: 100%;\n height: 100%;\n overflow: hidden;\n outline: 0;\n}\n\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 0.5rem;\n pointer-events: none;\n}\n\n.modal.fade .modal-dialog {\n transition: transform 0.3s ease-out;\n transform: translate(0, -50px);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .modal.fade .modal-dialog {\n transition: none;\n }\n}\n\n.modal.show .modal-dialog {\n transform: none;\n}\n\n.modal-dialog-scrollable {\n display: flex;\n max-height: calc(100% - 1rem);\n}\n\n.modal-dialog-scrollable .modal-content {\n max-height: calc(100vh - 1rem);\n overflow: hidden;\n}\n\n.modal-dialog-scrollable .modal-header,\n.modal-dialog-scrollable .modal-footer {\n flex-shrink: 0;\n}\n\n.modal-dialog-scrollable .modal-body {\n overflow-y: auto;\n}\n\n.modal-dialog-centered {\n display: flex;\n align-items: center;\n min-height: calc(100% - 1rem);\n}\n\n.modal-dialog-centered::before {\n display: block;\n height: calc(100vh - 1rem);\n content: \"\";\n}\n\n.modal-dialog-centered.modal-dialog-scrollable {\n flex-direction: column;\n justify-content: center;\n height: 100%;\n}\n\n.modal-dialog-centered.modal-dialog-scrollable .modal-content {\n max-height: none;\n}\n\n.modal-dialog-centered.modal-dialog-scrollable::before {\n content: none;\n}\n\n.modal-content {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n pointer-events: auto;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.3rem;\n outline: 0;\n}\n\n.modal-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1040;\n width: 100vw;\n height: 100vh;\n background-color: #000;\n}\n\n.modal-backdrop.fade {\n opacity: 0;\n}\n\n.modal-backdrop.show {\n opacity: 0.5;\n}\n\n.modal-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n padding: 1rem 1rem;\n border-bottom: 1px solid #dee2e6;\n border-top-left-radius: 0.3rem;\n border-top-right-radius: 0.3rem;\n}\n\n.modal-header .close {\n padding: 1rem 1rem;\n margin: -1rem -1rem -1rem auto;\n}\n\n.modal-title {\n margin-bottom: 0;\n line-height: 1.5;\n}\n\n.modal-body {\n position: relative;\n flex: 1 1 auto;\n padding: 1rem;\n}\n\n.modal-footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n padding: 1rem;\n border-top: 1px solid #dee2e6;\n border-bottom-right-radius: 0.3rem;\n border-bottom-left-radius: 0.3rem;\n}\n\n.modal-footer > :not(:first-child) {\n margin-left: .25rem;\n}\n\n.modal-footer > :not(:last-child) {\n margin-right: .25rem;\n}\n\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n@media (min-width: 576px) {\n .modal-dialog {\n max-width: 500px;\n margin: 1.75rem auto;\n }\n .modal-dialog-scrollable {\n max-height: calc(100% - 3.5rem);\n }\n .modal-dialog-scrollable .modal-content {\n max-height: calc(100vh - 3.5rem);\n }\n .modal-dialog-centered {\n min-height: calc(100% - 3.5rem);\n }\n .modal-dialog-centered::before {\n height: calc(100vh - 3.5rem);\n }\n .modal-sm {\n max-width: 300px;\n }\n}\n\n@media (min-width: 992px) {\n .modal-lg,\n .modal-xl {\n max-width: 800px;\n }\n}\n\n@media (min-width: 1200px) {\n .modal-xl {\n max-width: 1140px;\n }\n}\n\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-style: normal;\n font-weight: 400;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n word-wrap: break-word;\n opacity: 0;\n}\n\n.tooltip.show {\n opacity: 0.9;\n}\n\n.tooltip .arrow {\n position: absolute;\n display: block;\n width: 0.8rem;\n height: 0.4rem;\n}\n\n.tooltip .arrow::before {\n position: absolute;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-tooltip-top, .bs-tooltip-auto[x-placement^=\"top\"] {\n padding: 0.4rem 0;\n}\n\n.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^=\"top\"] .arrow {\n bottom: 0;\n}\n\n.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^=\"top\"] .arrow::before {\n top: 0;\n border-width: 0.4rem 0.4rem 0;\n border-top-color: #000;\n}\n\n.bs-tooltip-right, .bs-tooltip-auto[x-placement^=\"right\"] {\n padding: 0 0.4rem;\n}\n\n.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^=\"right\"] .arrow {\n left: 0;\n width: 0.4rem;\n height: 0.8rem;\n}\n\n.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^=\"right\"] .arrow::before {\n right: 0;\n border-width: 0.4rem 0.4rem 0.4rem 0;\n border-right-color: #000;\n}\n\n.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^=\"bottom\"] {\n padding: 0.4rem 0;\n}\n\n.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow {\n top: 0;\n}\n\n.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow::before {\n bottom: 0;\n border-width: 0 0.4rem 0.4rem;\n border-bottom-color: #000;\n}\n\n.bs-tooltip-left, .bs-tooltip-auto[x-placement^=\"left\"] {\n padding: 0 0.4rem;\n}\n\n.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^=\"left\"] .arrow {\n right: 0;\n width: 0.4rem;\n height: 0.8rem;\n}\n\n.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^=\"left\"] .arrow::before {\n left: 0;\n border-width: 0.4rem 0 0.4rem 0.4rem;\n border-left-color: #000;\n}\n\n.tooltip-inner {\n max-width: 200px;\n padding: 0.25rem 0.5rem;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 0.25rem;\n}\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: block;\n max-width: 276px;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-style: normal;\n font-weight: 400;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.3rem;\n}\n\n.popover .arrow {\n position: absolute;\n display: block;\n width: 1rem;\n height: 0.5rem;\n margin: 0 0.3rem;\n}\n\n.popover .arrow::before, .popover .arrow::after {\n position: absolute;\n display: block;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-popover-top, .bs-popover-auto[x-placement^=\"top\"] {\n margin-bottom: 0.5rem;\n}\n\n.bs-popover-top > .arrow, .bs-popover-auto[x-placement^=\"top\"] > .arrow {\n bottom: calc((0.5rem + 1px) * -1);\n}\n\n.bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^=\"top\"] > .arrow::before {\n bottom: 0;\n border-width: 0.5rem 0.5rem 0;\n border-top-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-top > .arrow::after, .bs-popover-auto[x-placement^=\"top\"] > .arrow::after {\n bottom: 1px;\n border-width: 0.5rem 0.5rem 0;\n border-top-color: #fff;\n}\n\n.bs-popover-right, .bs-popover-auto[x-placement^=\"right\"] {\n margin-left: 0.5rem;\n}\n\n.bs-popover-right > .arrow, .bs-popover-auto[x-placement^=\"right\"] > .arrow {\n left: calc((0.5rem + 1px) * -1);\n width: 0.5rem;\n height: 1rem;\n margin: 0.3rem 0;\n}\n\n.bs-popover-right > .arrow::before, .bs-popover-auto[x-placement^=\"right\"] > .arrow::before {\n left: 0;\n border-width: 0.5rem 0.5rem 0.5rem 0;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-right > .arrow::after, .bs-popover-auto[x-placement^=\"right\"] > .arrow::after {\n left: 1px;\n border-width: 0.5rem 0.5rem 0.5rem 0;\n border-right-color: #fff;\n}\n\n.bs-popover-bottom, .bs-popover-auto[x-placement^=\"bottom\"] {\n margin-top: 0.5rem;\n}\n\n.bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow {\n top: calc((0.5rem + 1px) * -1);\n}\n\n.bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow::before {\n top: 0;\n border-width: 0 0.5rem 0.5rem 0.5rem;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow::after {\n top: 1px;\n border-width: 0 0.5rem 0.5rem 0.5rem;\n border-bottom-color: #fff;\n}\n\n.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^=\"bottom\"] .popover-header::before {\n position: absolute;\n top: 0;\n left: 50%;\n display: block;\n width: 1rem;\n margin-left: -0.5rem;\n content: \"\";\n border-bottom: 1px solid #f7f7f7;\n}\n\n.bs-popover-left, .bs-popover-auto[x-placement^=\"left\"] {\n margin-right: 0.5rem;\n}\n\n.bs-popover-left > .arrow, .bs-popover-auto[x-placement^=\"left\"] > .arrow {\n right: calc((0.5rem + 1px) * -1);\n width: 0.5rem;\n height: 1rem;\n margin: 0.3rem 0;\n}\n\n.bs-popover-left > .arrow::before, .bs-popover-auto[x-placement^=\"left\"] > .arrow::before {\n right: 0;\n border-width: 0.5rem 0 0.5rem 0.5rem;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-left > .arrow::after, .bs-popover-auto[x-placement^=\"left\"] > .arrow::after {\n right: 1px;\n border-width: 0.5rem 0 0.5rem 0.5rem;\n border-left-color: #fff;\n}\n\n.popover-header {\n padding: 0.5rem 0.75rem;\n margin-bottom: 0;\n font-size: 1rem;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-top-left-radius: calc(0.3rem - 1px);\n border-top-right-radius: calc(0.3rem - 1px);\n}\n\n.popover-header:empty {\n display: none;\n}\n\n.popover-body {\n padding: 0.5rem 0.75rem;\n color: #212529;\n}\n\n.carousel {\n position: relative;\n}\n\n.carousel.pointer-event {\n touch-action: pan-y;\n}\n\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n\n.carousel-inner::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.carousel-item {\n position: relative;\n display: none;\n float: left;\n width: 100%;\n margin-right: -100%;\n backface-visibility: hidden;\n transition: transform 0.6s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-item {\n transition: none;\n }\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n display: block;\n}\n\n.carousel-item-next:not(.carousel-item-left),\n.active.carousel-item-right {\n transform: translateX(100%);\n}\n\n.carousel-item-prev:not(.carousel-item-right),\n.active.carousel-item-left {\n transform: translateX(-100%);\n}\n\n.carousel-fade .carousel-item {\n opacity: 0;\n transition-property: opacity;\n transform: none;\n}\n\n.carousel-fade .carousel-item.active,\n.carousel-fade .carousel-item-next.carousel-item-left,\n.carousel-fade .carousel-item-prev.carousel-item-right {\n z-index: 1;\n opacity: 1;\n}\n\n.carousel-fade .active.carousel-item-left,\n.carousel-fade .active.carousel-item-right {\n z-index: 0;\n opacity: 0;\n transition: 0s 0.6s opacity;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-fade .active.carousel-item-left,\n .carousel-fade .active.carousel-item-right {\n transition: none;\n }\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n position: absolute;\n top: 0;\n bottom: 0;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 15%;\n color: #fff;\n text-align: center;\n opacity: 0.5;\n transition: opacity 0.15s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-control-prev,\n .carousel-control-next {\n transition: none;\n }\n}\n\n.carousel-control-prev:hover, .carousel-control-prev:focus,\n.carousel-control-next:hover,\n.carousel-control-next:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n opacity: 0.9;\n}\n\n.carousel-control-prev {\n left: 0;\n}\n\n.carousel-control-next {\n right: 0;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n display: inline-block;\n width: 20px;\n height: 20px;\n background: no-repeat 50% / 100% 100%;\n}\n\n.carousel-control-prev-icon {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e\");\n}\n\n.carousel-control-next-icon {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e\");\n}\n\n.carousel-indicators {\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 15;\n display: flex;\n justify-content: center;\n padding-left: 0;\n margin-right: 15%;\n margin-left: 15%;\n list-style: none;\n}\n\n.carousel-indicators li {\n box-sizing: content-box;\n flex: 0 1 auto;\n width: 30px;\n height: 3px;\n margin-right: 3px;\n margin-left: 3px;\n text-indent: -999px;\n cursor: pointer;\n background-color: #fff;\n background-clip: padding-box;\n border-top: 10px solid transparent;\n border-bottom: 10px solid transparent;\n opacity: .5;\n transition: opacity 0.6s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .carousel-indicators li {\n transition: none;\n }\n}\n\n.carousel-indicators .active {\n opacity: 1;\n}\n\n.carousel-caption {\n position: absolute;\n right: 15%;\n bottom: 20px;\n left: 15%;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n}\n\n@keyframes spinner-border {\n to {\n transform: rotate(360deg);\n }\n}\n\n.spinner-border {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n vertical-align: text-bottom;\n border: 0.25em solid currentColor;\n border-right-color: transparent;\n border-radius: 50%;\n animation: spinner-border .75s linear infinite;\n}\n\n.spinner-border-sm {\n width: 1rem;\n height: 1rem;\n border-width: 0.2em;\n}\n\n@keyframes spinner-grow {\n 0% {\n transform: scale(0);\n }\n 50% {\n opacity: 1;\n }\n}\n\n.spinner-grow {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n vertical-align: text-bottom;\n background-color: currentColor;\n border-radius: 50%;\n opacity: 0;\n animation: spinner-grow .75s linear infinite;\n}\n\n.spinner-grow-sm {\n width: 1rem;\n height: 1rem;\n}\n\n.align-baseline {\n vertical-align: baseline !important;\n}\n\n.align-top {\n vertical-align: top !important;\n}\n\n.align-middle {\n vertical-align: middle !important;\n}\n\n.align-bottom {\n vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n vertical-align: text-top !important;\n}\n\n.bg-primary {\n background-color: #007bff !important;\n}\n\na.bg-primary:hover, a.bg-primary:focus,\nbutton.bg-primary:hover,\nbutton.bg-primary:focus {\n background-color: #0062cc !important;\n}\n\n.bg-secondary {\n background-color: #6c757d !important;\n}\n\na.bg-secondary:hover, a.bg-secondary:focus,\nbutton.bg-secondary:hover,\nbutton.bg-secondary:focus {\n background-color: #545b62 !important;\n}\n\n.bg-success {\n background-color: #28a745 !important;\n}\n\na.bg-success:hover, a.bg-success:focus,\nbutton.bg-success:hover,\nbutton.bg-success:focus {\n background-color: #1e7e34 !important;\n}\n\n.bg-info {\n background-color: #17a2b8 !important;\n}\n\na.bg-info:hover, a.bg-info:focus,\nbutton.bg-info:hover,\nbutton.bg-info:focus {\n background-color: #117a8b !important;\n}\n\n.bg-warning {\n background-color: #ffc107 !important;\n}\n\na.bg-warning:hover, a.bg-warning:focus,\nbutton.bg-warning:hover,\nbutton.bg-warning:focus {\n background-color: #d39e00 !important;\n}\n\n.bg-danger {\n background-color: #dc3545 !important;\n}\n\na.bg-danger:hover, a.bg-danger:focus,\nbutton.bg-danger:hover,\nbutton.bg-danger:focus {\n background-color: #bd2130 !important;\n}\n\n.bg-light {\n background-color: #f8f9fa !important;\n}\n\na.bg-light:hover, a.bg-light:focus,\nbutton.bg-light:hover,\nbutton.bg-light:focus {\n background-color: #dae0e5 !important;\n}\n\n.bg-dark {\n background-color: #343a40 !important;\n}\n\na.bg-dark:hover, a.bg-dark:focus,\nbutton.bg-dark:hover,\nbutton.bg-dark:focus {\n background-color: #1d2124 !important;\n}\n\n.bg-white {\n background-color: #fff !important;\n}\n\n.bg-transparent {\n background-color: transparent !important;\n}\n\n.border {\n border: 1px solid #dee2e6 !important;\n}\n\n.border-top {\n border-top: 1px solid #dee2e6 !important;\n}\n\n.border-right {\n border-right: 1px solid #dee2e6 !important;\n}\n\n.border-bottom {\n border-bottom: 1px solid #dee2e6 !important;\n}\n\n.border-left {\n border-left: 1px solid #dee2e6 !important;\n}\n\n.border-0 {\n border: 0 !important;\n}\n\n.border-top-0 {\n border-top: 0 !important;\n}\n\n.border-right-0 {\n border-right: 0 !important;\n}\n\n.border-bottom-0 {\n border-bottom: 0 !important;\n}\n\n.border-left-0 {\n border-left: 0 !important;\n}\n\n.border-primary {\n border-color: #007bff !important;\n}\n\n.border-secondary {\n border-color: #6c757d !important;\n}\n\n.border-success {\n border-color: #28a745 !important;\n}\n\n.border-info {\n border-color: #17a2b8 !important;\n}\n\n.border-warning {\n border-color: #ffc107 !important;\n}\n\n.border-danger {\n border-color: #dc3545 !important;\n}\n\n.border-light {\n border-color: #f8f9fa !important;\n}\n\n.border-dark {\n border-color: #343a40 !important;\n}\n\n.border-white {\n border-color: #fff !important;\n}\n\n.rounded-sm {\n border-radius: 0.2rem !important;\n}\n\n.rounded {\n border-radius: 0.25rem !important;\n}\n\n.rounded-top {\n border-top-left-radius: 0.25rem !important;\n border-top-right-radius: 0.25rem !important;\n}\n\n.rounded-right {\n border-top-right-radius: 0.25rem !important;\n border-bottom-right-radius: 0.25rem !important;\n}\n\n.rounded-bottom {\n border-bottom-right-radius: 0.25rem !important;\n border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-left {\n border-top-left-radius: 0.25rem !important;\n border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-lg {\n border-radius: 0.3rem !important;\n}\n\n.rounded-circle {\n border-radius: 50% !important;\n}\n\n.rounded-pill {\n border-radius: 50rem !important;\n}\n\n.rounded-0 {\n border-radius: 0 !important;\n}\n\n.clearfix::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.d-none {\n display: none !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline-flex {\n display: inline-flex !important;\n}\n\n@media (min-width: 576px) {\n .d-sm-none {\n display: none !important;\n }\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 768px) {\n .d-md-none {\n display: none !important;\n }\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: flex !important;\n }\n .d-md-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 992px) {\n .d-lg-none {\n display: none !important;\n }\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 1200px) {\n .d-xl-none {\n display: none !important;\n }\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media print {\n .d-print-none {\n display: none !important;\n }\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: flex !important;\n }\n .d-print-inline-flex {\n display: inline-flex !important;\n }\n}\n\n.embed-responsive {\n position: relative;\n display: block;\n width: 100%;\n padding: 0;\n overflow: hidden;\n}\n\n.embed-responsive::before {\n display: block;\n content: \"\";\n}\n\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n}\n\n.embed-responsive-21by9::before {\n padding-top: 42.857143%;\n}\n\n.embed-responsive-16by9::before {\n padding-top: 56.25%;\n}\n\n.embed-responsive-4by3::before {\n padding-top: 75%;\n}\n\n.embed-responsive-1by1::before {\n padding-top: 100%;\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.flex-fill {\n flex: 1 1 auto !important;\n}\n\n.flex-grow-0 {\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n flex-shrink: 1 !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n@media (min-width: 576px) {\n .flex-sm-row {\n flex-direction: row !important;\n }\n .flex-sm-column {\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-sm-fill {\n flex: 1 1 auto !important;\n }\n .flex-sm-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n justify-content: center !important;\n }\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n align-items: center !important;\n }\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n align-content: center !important;\n }\n .align-content-sm-between {\n align-content: space-between !important;\n }\n .align-content-sm-around {\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n align-self: auto !important;\n }\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n align-self: center !important;\n }\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 768px) {\n .flex-md-row {\n flex-direction: row !important;\n }\n .flex-md-column {\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-md-fill {\n flex: 1 1 auto !important;\n }\n .flex-md-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n justify-content: center !important;\n }\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n .align-items-md-start {\n align-items: flex-start !important;\n }\n .align-items-md-end {\n align-items: flex-end !important;\n }\n .align-items-md-center {\n align-items: center !important;\n }\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n .align-content-md-start {\n align-content: flex-start !important;\n }\n .align-content-md-end {\n align-content: flex-end !important;\n }\n .align-content-md-center {\n align-content: center !important;\n }\n .align-content-md-between {\n align-content: space-between !important;\n }\n .align-content-md-around {\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n .align-self-md-auto {\n align-self: auto !important;\n }\n .align-self-md-start {\n align-self: flex-start !important;\n }\n .align-self-md-end {\n align-self: flex-end !important;\n }\n .align-self-md-center {\n align-self: center !important;\n }\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 992px) {\n .flex-lg-row {\n flex-direction: row !important;\n }\n .flex-lg-column {\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-lg-fill {\n flex: 1 1 auto !important;\n }\n .flex-lg-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n justify-content: center !important;\n }\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n align-items: center !important;\n }\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n align-content: center !important;\n }\n .align-content-lg-between {\n align-content: space-between !important;\n }\n .align-content-lg-around {\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n align-self: auto !important;\n }\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n align-self: center !important;\n }\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1200px) {\n .flex-xl-row {\n flex-direction: row !important;\n }\n .flex-xl-column {\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-xl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n justify-content: center !important;\n }\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n align-items: center !important;\n }\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n align-content: center !important;\n }\n .align-content-xl-between {\n align-content: space-between !important;\n }\n .align-content-xl-around {\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n align-self: auto !important;\n }\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n align-self: center !important;\n }\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n}\n\n.float-left {\n float: left !important;\n}\n\n.float-right {\n float: right !important;\n}\n\n.float-none {\n float: none !important;\n}\n\n@media (min-width: 576px) {\n .float-sm-left {\n float: left !important;\n }\n .float-sm-right {\n float: right !important;\n }\n .float-sm-none {\n float: none !important;\n }\n}\n\n@media (min-width: 768px) {\n .float-md-left {\n float: left !important;\n }\n .float-md-right {\n float: right !important;\n }\n .float-md-none {\n float: none !important;\n }\n}\n\n@media (min-width: 992px) {\n .float-lg-left {\n float: left !important;\n }\n .float-lg-right {\n float: right !important;\n }\n .float-lg-none {\n float: none !important;\n }\n}\n\n@media (min-width: 1200px) {\n .float-xl-left {\n float: left !important;\n }\n .float-xl-right {\n float: right !important;\n }\n .float-xl-none {\n float: none !important;\n }\n}\n\n.overflow-auto {\n overflow: auto !important;\n}\n\n.overflow-hidden {\n overflow: hidden !important;\n}\n\n.position-static {\n position: static !important;\n}\n\n.position-relative {\n position: relative !important;\n}\n\n.position-absolute {\n position: absolute !important;\n}\n\n.position-fixed {\n position: fixed !important;\n}\n\n.position-sticky {\n position: sticky !important;\n}\n\n.fixed-top {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n\n.fixed-bottom {\n position: fixed;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1030;\n}\n\n@supports (position: sticky) {\n .sticky-top {\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n}\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n overflow: visible;\n clip: auto;\n white-space: normal;\n}\n\n.shadow-sm {\n box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;\n}\n\n.shadow {\n box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;\n}\n\n.shadow-lg {\n box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;\n}\n\n.shadow-none {\n box-shadow: none !important;\n}\n\n.w-25 {\n width: 25% !important;\n}\n\n.w-50 {\n width: 50% !important;\n}\n\n.w-75 {\n width: 75% !important;\n}\n\n.w-100 {\n width: 100% !important;\n}\n\n.w-auto {\n width: auto !important;\n}\n\n.h-25 {\n height: 25% !important;\n}\n\n.h-50 {\n height: 50% !important;\n}\n\n.h-75 {\n height: 75% !important;\n}\n\n.h-100 {\n height: 100% !important;\n}\n\n.h-auto {\n height: auto !important;\n}\n\n.mw-100 {\n max-width: 100% !important;\n}\n\n.mh-100 {\n max-height: 100% !important;\n}\n\n.min-vw-100 {\n min-width: 100vw !important;\n}\n\n.min-vh-100 {\n min-height: 100vh !important;\n}\n\n.vw-100 {\n width: 100vw !important;\n}\n\n.vh-100 {\n height: 100vh !important;\n}\n\n.stretched-link::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1;\n pointer-events: auto;\n content: \"\";\n background-color: rgba(0, 0, 0, 0);\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.mt-0,\n.my-0 {\n margin-top: 0 !important;\n}\n\n.mr-0,\n.mx-0 {\n margin-right: 0 !important;\n}\n\n.mb-0,\n.my-0 {\n margin-bottom: 0 !important;\n}\n\n.ml-0,\n.mx-0 {\n margin-left: 0 !important;\n}\n\n.m-1 {\n margin: 0.25rem !important;\n}\n\n.mt-1,\n.my-1 {\n margin-top: 0.25rem !important;\n}\n\n.mr-1,\n.mx-1 {\n margin-right: 0.25rem !important;\n}\n\n.mb-1,\n.my-1 {\n margin-bottom: 0.25rem !important;\n}\n\n.ml-1,\n.mx-1 {\n margin-left: 0.25rem !important;\n}\n\n.m-2 {\n margin: 0.5rem !important;\n}\n\n.mt-2,\n.my-2 {\n margin-top: 0.5rem !important;\n}\n\n.mr-2,\n.mx-2 {\n margin-right: 0.5rem !important;\n}\n\n.mb-2,\n.my-2 {\n margin-bottom: 0.5rem !important;\n}\n\n.ml-2,\n.mx-2 {\n margin-left: 0.5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.mt-3,\n.my-3 {\n margin-top: 1rem !important;\n}\n\n.mr-3,\n.mx-3 {\n margin-right: 1rem !important;\n}\n\n.mb-3,\n.my-3 {\n margin-bottom: 1rem !important;\n}\n\n.ml-3,\n.mx-3 {\n margin-left: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.mt-4,\n.my-4 {\n margin-top: 1.5rem !important;\n}\n\n.mr-4,\n.mx-4 {\n margin-right: 1.5rem !important;\n}\n\n.mb-4,\n.my-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.ml-4,\n.mx-4 {\n margin-left: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.mt-5,\n.my-5 {\n margin-top: 3rem !important;\n}\n\n.mr-5,\n.mx-5 {\n margin-right: 3rem !important;\n}\n\n.mb-5,\n.my-5 {\n margin-bottom: 3rem !important;\n}\n\n.ml-5,\n.mx-5 {\n margin-left: 3rem !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.pt-0,\n.py-0 {\n padding-top: 0 !important;\n}\n\n.pr-0,\n.px-0 {\n padding-right: 0 !important;\n}\n\n.pb-0,\n.py-0 {\n padding-bottom: 0 !important;\n}\n\n.pl-0,\n.px-0 {\n padding-left: 0 !important;\n}\n\n.p-1 {\n padding: 0.25rem !important;\n}\n\n.pt-1,\n.py-1 {\n padding-top: 0.25rem !important;\n}\n\n.pr-1,\n.px-1 {\n padding-right: 0.25rem !important;\n}\n\n.pb-1,\n.py-1 {\n padding-bottom: 0.25rem !important;\n}\n\n.pl-1,\n.px-1 {\n padding-left: 0.25rem !important;\n}\n\n.p-2 {\n padding: 0.5rem !important;\n}\n\n.pt-2,\n.py-2 {\n padding-top: 0.5rem !important;\n}\n\n.pr-2,\n.px-2 {\n padding-right: 0.5rem !important;\n}\n\n.pb-2,\n.py-2 {\n padding-bottom: 0.5rem !important;\n}\n\n.pl-2,\n.px-2 {\n padding-left: 0.5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.pt-3,\n.py-3 {\n padding-top: 1rem !important;\n}\n\n.pr-3,\n.px-3 {\n padding-right: 1rem !important;\n}\n\n.pb-3,\n.py-3 {\n padding-bottom: 1rem !important;\n}\n\n.pl-3,\n.px-3 {\n padding-left: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.pt-4,\n.py-4 {\n padding-top: 1.5rem !important;\n}\n\n.pr-4,\n.px-4 {\n padding-right: 1.5rem !important;\n}\n\n.pb-4,\n.py-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pl-4,\n.px-4 {\n padding-left: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.pt-5,\n.py-5 {\n padding-top: 3rem !important;\n}\n\n.pr-5,\n.px-5 {\n padding-right: 3rem !important;\n}\n\n.pb-5,\n.py-5 {\n padding-bottom: 3rem !important;\n}\n\n.pl-5,\n.px-5 {\n padding-left: 3rem !important;\n}\n\n.m-n1 {\n margin: -0.25rem !important;\n}\n\n.mt-n1,\n.my-n1 {\n margin-top: -0.25rem !important;\n}\n\n.mr-n1,\n.mx-n1 {\n margin-right: -0.25rem !important;\n}\n\n.mb-n1,\n.my-n1 {\n margin-bottom: -0.25rem !important;\n}\n\n.ml-n1,\n.mx-n1 {\n margin-left: -0.25rem !important;\n}\n\n.m-n2 {\n margin: -0.5rem !important;\n}\n\n.mt-n2,\n.my-n2 {\n margin-top: -0.5rem !important;\n}\n\n.mr-n2,\n.mx-n2 {\n margin-right: -0.5rem !important;\n}\n\n.mb-n2,\n.my-n2 {\n margin-bottom: -0.5rem !important;\n}\n\n.ml-n2,\n.mx-n2 {\n margin-left: -0.5rem !important;\n}\n\n.m-n3 {\n margin: -1rem !important;\n}\n\n.mt-n3,\n.my-n3 {\n margin-top: -1rem !important;\n}\n\n.mr-n3,\n.mx-n3 {\n margin-right: -1rem !important;\n}\n\n.mb-n3,\n.my-n3 {\n margin-bottom: -1rem !important;\n}\n\n.ml-n3,\n.mx-n3 {\n margin-left: -1rem !important;\n}\n\n.m-n4 {\n margin: -1.5rem !important;\n}\n\n.mt-n4,\n.my-n4 {\n margin-top: -1.5rem !important;\n}\n\n.mr-n4,\n.mx-n4 {\n margin-right: -1.5rem !important;\n}\n\n.mb-n4,\n.my-n4 {\n margin-bottom: -1.5rem !important;\n}\n\n.ml-n4,\n.mx-n4 {\n margin-left: -1.5rem !important;\n}\n\n.m-n5 {\n margin: -3rem !important;\n}\n\n.mt-n5,\n.my-n5 {\n margin-top: -3rem !important;\n}\n\n.mr-n5,\n.mx-n5 {\n margin-right: -3rem !important;\n}\n\n.mb-n5,\n.my-n5 {\n margin-bottom: -3rem !important;\n}\n\n.ml-n5,\n.mx-n5 {\n margin-left: -3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mt-auto,\n.my-auto {\n margin-top: auto !important;\n}\n\n.mr-auto,\n.mx-auto {\n margin-right: auto !important;\n}\n\n.mb-auto,\n.my-auto {\n margin-bottom: auto !important;\n}\n\n.ml-auto,\n.mx-auto {\n margin-left: auto !important;\n}\n\n@media (min-width: 576px) {\n .m-sm-0 {\n margin: 0 !important;\n }\n .mt-sm-0,\n .my-sm-0 {\n margin-top: 0 !important;\n }\n .mr-sm-0,\n .mx-sm-0 {\n margin-right: 0 !important;\n }\n .mb-sm-0,\n .my-sm-0 {\n margin-bottom: 0 !important;\n }\n .ml-sm-0,\n .mx-sm-0 {\n margin-left: 0 !important;\n }\n .m-sm-1 {\n margin: 0.25rem !important;\n }\n .mt-sm-1,\n .my-sm-1 {\n margin-top: 0.25rem !important;\n }\n .mr-sm-1,\n .mx-sm-1 {\n margin-right: 0.25rem !important;\n }\n .mb-sm-1,\n .my-sm-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-sm-1,\n .mx-sm-1 {\n margin-left: 0.25rem !important;\n }\n .m-sm-2 {\n margin: 0.5rem !important;\n }\n .mt-sm-2,\n .my-sm-2 {\n margin-top: 0.5rem !important;\n }\n .mr-sm-2,\n .mx-sm-2 {\n margin-right: 0.5rem !important;\n }\n .mb-sm-2,\n .my-sm-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-sm-2,\n .mx-sm-2 {\n margin-left: 0.5rem !important;\n }\n .m-sm-3 {\n margin: 1rem !important;\n }\n .mt-sm-3,\n .my-sm-3 {\n margin-top: 1rem !important;\n }\n .mr-sm-3,\n .mx-sm-3 {\n margin-right: 1rem !important;\n }\n .mb-sm-3,\n .my-sm-3 {\n margin-bottom: 1rem !important;\n }\n .ml-sm-3,\n .mx-sm-3 {\n margin-left: 1rem !important;\n }\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n .mt-sm-4,\n .my-sm-4 {\n margin-top: 1.5rem !important;\n }\n .mr-sm-4,\n .mx-sm-4 {\n margin-right: 1.5rem !important;\n }\n .mb-sm-4,\n .my-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-sm-4,\n .mx-sm-4 {\n margin-left: 1.5rem !important;\n }\n .m-sm-5 {\n margin: 3rem !important;\n }\n .mt-sm-5,\n .my-sm-5 {\n margin-top: 3rem !important;\n }\n .mr-sm-5,\n .mx-sm-5 {\n margin-right: 3rem !important;\n }\n .mb-sm-5,\n .my-sm-5 {\n margin-bottom: 3rem !important;\n }\n .ml-sm-5,\n .mx-sm-5 {\n margin-left: 3rem !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .pt-sm-0,\n .py-sm-0 {\n padding-top: 0 !important;\n }\n .pr-sm-0,\n .px-sm-0 {\n padding-right: 0 !important;\n }\n .pb-sm-0,\n .py-sm-0 {\n padding-bottom: 0 !important;\n }\n .pl-sm-0,\n .px-sm-0 {\n padding-left: 0 !important;\n }\n .p-sm-1 {\n padding: 0.25rem !important;\n }\n .pt-sm-1,\n .py-sm-1 {\n padding-top: 0.25rem !important;\n }\n .pr-sm-1,\n .px-sm-1 {\n padding-right: 0.25rem !important;\n }\n .pb-sm-1,\n .py-sm-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-sm-1,\n .px-sm-1 {\n padding-left: 0.25rem !important;\n }\n .p-sm-2 {\n padding: 0.5rem !important;\n }\n .pt-sm-2,\n .py-sm-2 {\n padding-top: 0.5rem !important;\n }\n .pr-sm-2,\n .px-sm-2 {\n padding-right: 0.5rem !important;\n }\n .pb-sm-2,\n .py-sm-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-sm-2,\n .px-sm-2 {\n padding-left: 0.5rem !important;\n }\n .p-sm-3 {\n padding: 1rem !important;\n }\n .pt-sm-3,\n .py-sm-3 {\n padding-top: 1rem !important;\n }\n .pr-sm-3,\n .px-sm-3 {\n padding-right: 1rem !important;\n }\n .pb-sm-3,\n .py-sm-3 {\n padding-bottom: 1rem !important;\n }\n .pl-sm-3,\n .px-sm-3 {\n padding-left: 1rem !important;\n }\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n .pt-sm-4,\n .py-sm-4 {\n padding-top: 1.5rem !important;\n }\n .pr-sm-4,\n .px-sm-4 {\n padding-right: 1.5rem !important;\n }\n .pb-sm-4,\n .py-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-sm-4,\n .px-sm-4 {\n padding-left: 1.5rem !important;\n }\n .p-sm-5 {\n padding: 3rem !important;\n }\n .pt-sm-5,\n .py-sm-5 {\n padding-top: 3rem !important;\n }\n .pr-sm-5,\n .px-sm-5 {\n padding-right: 3rem !important;\n }\n .pb-sm-5,\n .py-sm-5 {\n padding-bottom: 3rem !important;\n }\n .pl-sm-5,\n .px-sm-5 {\n padding-left: 3rem !important;\n }\n .m-sm-n1 {\n margin: -0.25rem !important;\n }\n .mt-sm-n1,\n .my-sm-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-sm-n1,\n .mx-sm-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-sm-n1,\n .my-sm-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-sm-n1,\n .mx-sm-n1 {\n margin-left: -0.25rem !important;\n }\n .m-sm-n2 {\n margin: -0.5rem !important;\n }\n .mt-sm-n2,\n .my-sm-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-sm-n2,\n .mx-sm-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-sm-n2,\n .my-sm-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-sm-n2,\n .mx-sm-n2 {\n margin-left: -0.5rem !important;\n }\n .m-sm-n3 {\n margin: -1rem !important;\n }\n .mt-sm-n3,\n .my-sm-n3 {\n margin-top: -1rem !important;\n }\n .mr-sm-n3,\n .mx-sm-n3 {\n margin-right: -1rem !important;\n }\n .mb-sm-n3,\n .my-sm-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-sm-n3,\n .mx-sm-n3 {\n margin-left: -1rem !important;\n }\n .m-sm-n4 {\n margin: -1.5rem !important;\n }\n .mt-sm-n4,\n .my-sm-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-sm-n4,\n .mx-sm-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-sm-n4,\n .my-sm-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-sm-n4,\n .mx-sm-n4 {\n margin-left: -1.5rem !important;\n }\n .m-sm-n5 {\n margin: -3rem !important;\n }\n .mt-sm-n5,\n .my-sm-n5 {\n margin-top: -3rem !important;\n }\n .mr-sm-n5,\n .mx-sm-n5 {\n margin-right: -3rem !important;\n }\n .mb-sm-n5,\n .my-sm-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-sm-n5,\n .mx-sm-n5 {\n margin-left: -3rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mt-sm-auto,\n .my-sm-auto {\n margin-top: auto !important;\n }\n .mr-sm-auto,\n .mx-sm-auto {\n margin-right: auto !important;\n }\n .mb-sm-auto,\n .my-sm-auto {\n margin-bottom: auto !important;\n }\n .ml-sm-auto,\n .mx-sm-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 768px) {\n .m-md-0 {\n margin: 0 !important;\n }\n .mt-md-0,\n .my-md-0 {\n margin-top: 0 !important;\n }\n .mr-md-0,\n .mx-md-0 {\n margin-right: 0 !important;\n }\n .mb-md-0,\n .my-md-0 {\n margin-bottom: 0 !important;\n }\n .ml-md-0,\n .mx-md-0 {\n margin-left: 0 !important;\n }\n .m-md-1 {\n margin: 0.25rem !important;\n }\n .mt-md-1,\n .my-md-1 {\n margin-top: 0.25rem !important;\n }\n .mr-md-1,\n .mx-md-1 {\n margin-right: 0.25rem !important;\n }\n .mb-md-1,\n .my-md-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-md-1,\n .mx-md-1 {\n margin-left: 0.25rem !important;\n }\n .m-md-2 {\n margin: 0.5rem !important;\n }\n .mt-md-2,\n .my-md-2 {\n margin-top: 0.5rem !important;\n }\n .mr-md-2,\n .mx-md-2 {\n margin-right: 0.5rem !important;\n }\n .mb-md-2,\n .my-md-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-md-2,\n .mx-md-2 {\n margin-left: 0.5rem !important;\n }\n .m-md-3 {\n margin: 1rem !important;\n }\n .mt-md-3,\n .my-md-3 {\n margin-top: 1rem !important;\n }\n .mr-md-3,\n .mx-md-3 {\n margin-right: 1rem !important;\n }\n .mb-md-3,\n .my-md-3 {\n margin-bottom: 1rem !important;\n }\n .ml-md-3,\n .mx-md-3 {\n margin-left: 1rem !important;\n }\n .m-md-4 {\n margin: 1.5rem !important;\n }\n .mt-md-4,\n .my-md-4 {\n margin-top: 1.5rem !important;\n }\n .mr-md-4,\n .mx-md-4 {\n margin-right: 1.5rem !important;\n }\n .mb-md-4,\n .my-md-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-md-4,\n .mx-md-4 {\n margin-left: 1.5rem !important;\n }\n .m-md-5 {\n margin: 3rem !important;\n }\n .mt-md-5,\n .my-md-5 {\n margin-top: 3rem !important;\n }\n .mr-md-5,\n .mx-md-5 {\n margin-right: 3rem !important;\n }\n .mb-md-5,\n .my-md-5 {\n margin-bottom: 3rem !important;\n }\n .ml-md-5,\n .mx-md-5 {\n margin-left: 3rem !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .pt-md-0,\n .py-md-0 {\n padding-top: 0 !important;\n }\n .pr-md-0,\n .px-md-0 {\n padding-right: 0 !important;\n }\n .pb-md-0,\n .py-md-0 {\n padding-bottom: 0 !important;\n }\n .pl-md-0,\n .px-md-0 {\n padding-left: 0 !important;\n }\n .p-md-1 {\n padding: 0.25rem !important;\n }\n .pt-md-1,\n .py-md-1 {\n padding-top: 0.25rem !important;\n }\n .pr-md-1,\n .px-md-1 {\n padding-right: 0.25rem !important;\n }\n .pb-md-1,\n .py-md-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-md-1,\n .px-md-1 {\n padding-left: 0.25rem !important;\n }\n .p-md-2 {\n padding: 0.5rem !important;\n }\n .pt-md-2,\n .py-md-2 {\n padding-top: 0.5rem !important;\n }\n .pr-md-2,\n .px-md-2 {\n padding-right: 0.5rem !important;\n }\n .pb-md-2,\n .py-md-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-md-2,\n .px-md-2 {\n padding-left: 0.5rem !important;\n }\n .p-md-3 {\n padding: 1rem !important;\n }\n .pt-md-3,\n .py-md-3 {\n padding-top: 1rem !important;\n }\n .pr-md-3,\n .px-md-3 {\n padding-right: 1rem !important;\n }\n .pb-md-3,\n .py-md-3 {\n padding-bottom: 1rem !important;\n }\n .pl-md-3,\n .px-md-3 {\n padding-left: 1rem !important;\n }\n .p-md-4 {\n padding: 1.5rem !important;\n }\n .pt-md-4,\n .py-md-4 {\n padding-top: 1.5rem !important;\n }\n .pr-md-4,\n .px-md-4 {\n padding-right: 1.5rem !important;\n }\n .pb-md-4,\n .py-md-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-md-4,\n .px-md-4 {\n padding-left: 1.5rem !important;\n }\n .p-md-5 {\n padding: 3rem !important;\n }\n .pt-md-5,\n .py-md-5 {\n padding-top: 3rem !important;\n }\n .pr-md-5,\n .px-md-5 {\n padding-right: 3rem !important;\n }\n .pb-md-5,\n .py-md-5 {\n padding-bottom: 3rem !important;\n }\n .pl-md-5,\n .px-md-5 {\n padding-left: 3rem !important;\n }\n .m-md-n1 {\n margin: -0.25rem !important;\n }\n .mt-md-n1,\n .my-md-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-md-n1,\n .mx-md-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-md-n1,\n .my-md-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-md-n1,\n .mx-md-n1 {\n margin-left: -0.25rem !important;\n }\n .m-md-n2 {\n margin: -0.5rem !important;\n }\n .mt-md-n2,\n .my-md-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-md-n2,\n .mx-md-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-md-n2,\n .my-md-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-md-n2,\n .mx-md-n2 {\n margin-left: -0.5rem !important;\n }\n .m-md-n3 {\n margin: -1rem !important;\n }\n .mt-md-n3,\n .my-md-n3 {\n margin-top: -1rem !important;\n }\n .mr-md-n3,\n .mx-md-n3 {\n margin-right: -1rem !important;\n }\n .mb-md-n3,\n .my-md-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-md-n3,\n .mx-md-n3 {\n margin-left: -1rem !important;\n }\n .m-md-n4 {\n margin: -1.5rem !important;\n }\n .mt-md-n4,\n .my-md-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-md-n4,\n .mx-md-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-md-n4,\n .my-md-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-md-n4,\n .mx-md-n4 {\n margin-left: -1.5rem !important;\n }\n .m-md-n5 {\n margin: -3rem !important;\n }\n .mt-md-n5,\n .my-md-n5 {\n margin-top: -3rem !important;\n }\n .mr-md-n5,\n .mx-md-n5 {\n margin-right: -3rem !important;\n }\n .mb-md-n5,\n .my-md-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-md-n5,\n .mx-md-n5 {\n margin-left: -3rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mt-md-auto,\n .my-md-auto {\n margin-top: auto !important;\n }\n .mr-md-auto,\n .mx-md-auto {\n margin-right: auto !important;\n }\n .mb-md-auto,\n .my-md-auto {\n margin-bottom: auto !important;\n }\n .ml-md-auto,\n .mx-md-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 992px) {\n .m-lg-0 {\n margin: 0 !important;\n }\n .mt-lg-0,\n .my-lg-0 {\n margin-top: 0 !important;\n }\n .mr-lg-0,\n .mx-lg-0 {\n margin-right: 0 !important;\n }\n .mb-lg-0,\n .my-lg-0 {\n margin-bottom: 0 !important;\n }\n .ml-lg-0,\n .mx-lg-0 {\n margin-left: 0 !important;\n }\n .m-lg-1 {\n margin: 0.25rem !important;\n }\n .mt-lg-1,\n .my-lg-1 {\n margin-top: 0.25rem !important;\n }\n .mr-lg-1,\n .mx-lg-1 {\n margin-right: 0.25rem !important;\n }\n .mb-lg-1,\n .my-lg-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-lg-1,\n .mx-lg-1 {\n margin-left: 0.25rem !important;\n }\n .m-lg-2 {\n margin: 0.5rem !important;\n }\n .mt-lg-2,\n .my-lg-2 {\n margin-top: 0.5rem !important;\n }\n .mr-lg-2,\n .mx-lg-2 {\n margin-right: 0.5rem !important;\n }\n .mb-lg-2,\n .my-lg-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-lg-2,\n .mx-lg-2 {\n margin-left: 0.5rem !important;\n }\n .m-lg-3 {\n margin: 1rem !important;\n }\n .mt-lg-3,\n .my-lg-3 {\n margin-top: 1rem !important;\n }\n .mr-lg-3,\n .mx-lg-3 {\n margin-right: 1rem !important;\n }\n .mb-lg-3,\n .my-lg-3 {\n margin-bottom: 1rem !important;\n }\n .ml-lg-3,\n .mx-lg-3 {\n margin-left: 1rem !important;\n }\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n .mt-lg-4,\n .my-lg-4 {\n margin-top: 1.5rem !important;\n }\n .mr-lg-4,\n .mx-lg-4 {\n margin-right: 1.5rem !important;\n }\n .mb-lg-4,\n .my-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-lg-4,\n .mx-lg-4 {\n margin-left: 1.5rem !important;\n }\n .m-lg-5 {\n margin: 3rem !important;\n }\n .mt-lg-5,\n .my-lg-5 {\n margin-top: 3rem !important;\n }\n .mr-lg-5,\n .mx-lg-5 {\n margin-right: 3rem !important;\n }\n .mb-lg-5,\n .my-lg-5 {\n margin-bottom: 3rem !important;\n }\n .ml-lg-5,\n .mx-lg-5 {\n margin-left: 3rem !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .pt-lg-0,\n .py-lg-0 {\n padding-top: 0 !important;\n }\n .pr-lg-0,\n .px-lg-0 {\n padding-right: 0 !important;\n }\n .pb-lg-0,\n .py-lg-0 {\n padding-bottom: 0 !important;\n }\n .pl-lg-0,\n .px-lg-0 {\n padding-left: 0 !important;\n }\n .p-lg-1 {\n padding: 0.25rem !important;\n }\n .pt-lg-1,\n .py-lg-1 {\n padding-top: 0.25rem !important;\n }\n .pr-lg-1,\n .px-lg-1 {\n padding-right: 0.25rem !important;\n }\n .pb-lg-1,\n .py-lg-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-lg-1,\n .px-lg-1 {\n padding-left: 0.25rem !important;\n }\n .p-lg-2 {\n padding: 0.5rem !important;\n }\n .pt-lg-2,\n .py-lg-2 {\n padding-top: 0.5rem !important;\n }\n .pr-lg-2,\n .px-lg-2 {\n padding-right: 0.5rem !important;\n }\n .pb-lg-2,\n .py-lg-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-lg-2,\n .px-lg-2 {\n padding-left: 0.5rem !important;\n }\n .p-lg-3 {\n padding: 1rem !important;\n }\n .pt-lg-3,\n .py-lg-3 {\n padding-top: 1rem !important;\n }\n .pr-lg-3,\n .px-lg-3 {\n padding-right: 1rem !important;\n }\n .pb-lg-3,\n .py-lg-3 {\n padding-bottom: 1rem !important;\n }\n .pl-lg-3,\n .px-lg-3 {\n padding-left: 1rem !important;\n }\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n .pt-lg-4,\n .py-lg-4 {\n padding-top: 1.5rem !important;\n }\n .pr-lg-4,\n .px-lg-4 {\n padding-right: 1.5rem !important;\n }\n .pb-lg-4,\n .py-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-lg-4,\n .px-lg-4 {\n padding-left: 1.5rem !important;\n }\n .p-lg-5 {\n padding: 3rem !important;\n }\n .pt-lg-5,\n .py-lg-5 {\n padding-top: 3rem !important;\n }\n .pr-lg-5,\n .px-lg-5 {\n padding-right: 3rem !important;\n }\n .pb-lg-5,\n .py-lg-5 {\n padding-bottom: 3rem !important;\n }\n .pl-lg-5,\n .px-lg-5 {\n padding-left: 3rem !important;\n }\n .m-lg-n1 {\n margin: -0.25rem !important;\n }\n .mt-lg-n1,\n .my-lg-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-lg-n1,\n .mx-lg-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-lg-n1,\n .my-lg-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-lg-n1,\n .mx-lg-n1 {\n margin-left: -0.25rem !important;\n }\n .m-lg-n2 {\n margin: -0.5rem !important;\n }\n .mt-lg-n2,\n .my-lg-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-lg-n2,\n .mx-lg-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-lg-n2,\n .my-lg-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-lg-n2,\n .mx-lg-n2 {\n margin-left: -0.5rem !important;\n }\n .m-lg-n3 {\n margin: -1rem !important;\n }\n .mt-lg-n3,\n .my-lg-n3 {\n margin-top: -1rem !important;\n }\n .mr-lg-n3,\n .mx-lg-n3 {\n margin-right: -1rem !important;\n }\n .mb-lg-n3,\n .my-lg-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-lg-n3,\n .mx-lg-n3 {\n margin-left: -1rem !important;\n }\n .m-lg-n4 {\n margin: -1.5rem !important;\n }\n .mt-lg-n4,\n .my-lg-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-lg-n4,\n .mx-lg-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-lg-n4,\n .my-lg-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-lg-n4,\n .mx-lg-n4 {\n margin-left: -1.5rem !important;\n }\n .m-lg-n5 {\n margin: -3rem !important;\n }\n .mt-lg-n5,\n .my-lg-n5 {\n margin-top: -3rem !important;\n }\n .mr-lg-n5,\n .mx-lg-n5 {\n margin-right: -3rem !important;\n }\n .mb-lg-n5,\n .my-lg-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-lg-n5,\n .mx-lg-n5 {\n margin-left: -3rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mt-lg-auto,\n .my-lg-auto {\n margin-top: auto !important;\n }\n .mr-lg-auto,\n .mx-lg-auto {\n margin-right: auto !important;\n }\n .mb-lg-auto,\n .my-lg-auto {\n margin-bottom: auto !important;\n }\n .ml-lg-auto,\n .mx-lg-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 1200px) {\n .m-xl-0 {\n margin: 0 !important;\n }\n .mt-xl-0,\n .my-xl-0 {\n margin-top: 0 !important;\n }\n .mr-xl-0,\n .mx-xl-0 {\n margin-right: 0 !important;\n }\n .mb-xl-0,\n .my-xl-0 {\n margin-bottom: 0 !important;\n }\n .ml-xl-0,\n .mx-xl-0 {\n margin-left: 0 !important;\n }\n .m-xl-1 {\n margin: 0.25rem !important;\n }\n .mt-xl-1,\n .my-xl-1 {\n margin-top: 0.25rem !important;\n }\n .mr-xl-1,\n .mx-xl-1 {\n margin-right: 0.25rem !important;\n }\n .mb-xl-1,\n .my-xl-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-xl-1,\n .mx-xl-1 {\n margin-left: 0.25rem !important;\n }\n .m-xl-2 {\n margin: 0.5rem !important;\n }\n .mt-xl-2,\n .my-xl-2 {\n margin-top: 0.5rem !important;\n }\n .mr-xl-2,\n .mx-xl-2 {\n margin-right: 0.5rem !important;\n }\n .mb-xl-2,\n .my-xl-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-xl-2,\n .mx-xl-2 {\n margin-left: 0.5rem !important;\n }\n .m-xl-3 {\n margin: 1rem !important;\n }\n .mt-xl-3,\n .my-xl-3 {\n margin-top: 1rem !important;\n }\n .mr-xl-3,\n .mx-xl-3 {\n margin-right: 1rem !important;\n }\n .mb-xl-3,\n .my-xl-3 {\n margin-bottom: 1rem !important;\n }\n .ml-xl-3,\n .mx-xl-3 {\n margin-left: 1rem !important;\n }\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n .mt-xl-4,\n .my-xl-4 {\n margin-top: 1.5rem !important;\n }\n .mr-xl-4,\n .mx-xl-4 {\n margin-right: 1.5rem !important;\n }\n .mb-xl-4,\n .my-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-xl-4,\n .mx-xl-4 {\n margin-left: 1.5rem !important;\n }\n .m-xl-5 {\n margin: 3rem !important;\n }\n .mt-xl-5,\n .my-xl-5 {\n margin-top: 3rem !important;\n }\n .mr-xl-5,\n .mx-xl-5 {\n margin-right: 3rem !important;\n }\n .mb-xl-5,\n .my-xl-5 {\n margin-bottom: 3rem !important;\n }\n .ml-xl-5,\n .mx-xl-5 {\n margin-left: 3rem !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .pt-xl-0,\n .py-xl-0 {\n padding-top: 0 !important;\n }\n .pr-xl-0,\n .px-xl-0 {\n padding-right: 0 !important;\n }\n .pb-xl-0,\n .py-xl-0 {\n padding-bottom: 0 !important;\n }\n .pl-xl-0,\n .px-xl-0 {\n padding-left: 0 !important;\n }\n .p-xl-1 {\n padding: 0.25rem !important;\n }\n .pt-xl-1,\n .py-xl-1 {\n padding-top: 0.25rem !important;\n }\n .pr-xl-1,\n .px-xl-1 {\n padding-right: 0.25rem !important;\n }\n .pb-xl-1,\n .py-xl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-xl-1,\n .px-xl-1 {\n padding-left: 0.25rem !important;\n }\n .p-xl-2 {\n padding: 0.5rem !important;\n }\n .pt-xl-2,\n .py-xl-2 {\n padding-top: 0.5rem !important;\n }\n .pr-xl-2,\n .px-xl-2 {\n padding-right: 0.5rem !important;\n }\n .pb-xl-2,\n .py-xl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-xl-2,\n .px-xl-2 {\n padding-left: 0.5rem !important;\n }\n .p-xl-3 {\n padding: 1rem !important;\n }\n .pt-xl-3,\n .py-xl-3 {\n padding-top: 1rem !important;\n }\n .pr-xl-3,\n .px-xl-3 {\n padding-right: 1rem !important;\n }\n .pb-xl-3,\n .py-xl-3 {\n padding-bottom: 1rem !important;\n }\n .pl-xl-3,\n .px-xl-3 {\n padding-left: 1rem !important;\n }\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n .pt-xl-4,\n .py-xl-4 {\n padding-top: 1.5rem !important;\n }\n .pr-xl-4,\n .px-xl-4 {\n padding-right: 1.5rem !important;\n }\n .pb-xl-4,\n .py-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-xl-4,\n .px-xl-4 {\n padding-left: 1.5rem !important;\n }\n .p-xl-5 {\n padding: 3rem !important;\n }\n .pt-xl-5,\n .py-xl-5 {\n padding-top: 3rem !important;\n }\n .pr-xl-5,\n .px-xl-5 {\n padding-right: 3rem !important;\n }\n .pb-xl-5,\n .py-xl-5 {\n padding-bottom: 3rem !important;\n }\n .pl-xl-5,\n .px-xl-5 {\n padding-left: 3rem !important;\n }\n .m-xl-n1 {\n margin: -0.25rem !important;\n }\n .mt-xl-n1,\n .my-xl-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-xl-n1,\n .mx-xl-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-xl-n1,\n .my-xl-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-xl-n1,\n .mx-xl-n1 {\n margin-left: -0.25rem !important;\n }\n .m-xl-n2 {\n margin: -0.5rem !important;\n }\n .mt-xl-n2,\n .my-xl-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-xl-n2,\n .mx-xl-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-xl-n2,\n .my-xl-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-xl-n2,\n .mx-xl-n2 {\n margin-left: -0.5rem !important;\n }\n .m-xl-n3 {\n margin: -1rem !important;\n }\n .mt-xl-n3,\n .my-xl-n3 {\n margin-top: -1rem !important;\n }\n .mr-xl-n3,\n .mx-xl-n3 {\n margin-right: -1rem !important;\n }\n .mb-xl-n3,\n .my-xl-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-xl-n3,\n .mx-xl-n3 {\n margin-left: -1rem !important;\n }\n .m-xl-n4 {\n margin: -1.5rem !important;\n }\n .mt-xl-n4,\n .my-xl-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-xl-n4,\n .mx-xl-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-xl-n4,\n .my-xl-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-xl-n4,\n .mx-xl-n4 {\n margin-left: -1.5rem !important;\n }\n .m-xl-n5 {\n margin: -3rem !important;\n }\n .mt-xl-n5,\n .my-xl-n5 {\n margin-top: -3rem !important;\n }\n .mr-xl-n5,\n .mx-xl-n5 {\n margin-right: -3rem !important;\n }\n .mb-xl-n5,\n .my-xl-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-xl-n5,\n .mx-xl-n5 {\n margin-left: -3rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mt-xl-auto,\n .my-xl-auto {\n margin-top: auto !important;\n }\n .mr-xl-auto,\n .mx-xl-auto {\n margin-right: auto !important;\n }\n .mb-xl-auto,\n .my-xl-auto {\n margin-bottom: auto !important;\n }\n .ml-xl-auto,\n .mx-xl-auto {\n margin-left: auto !important;\n }\n}\n\n.text-monospace {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !important;\n}\n\n.text-justify {\n text-align: justify !important;\n}\n\n.text-wrap {\n white-space: normal !important;\n}\n\n.text-nowrap {\n white-space: nowrap !important;\n}\n\n.text-truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.text-left {\n text-align: left !important;\n}\n\n.text-right {\n text-align: right !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n@media (min-width: 576px) {\n .text-sm-left {\n text-align: left !important;\n }\n .text-sm-right {\n text-align: right !important;\n }\n .text-sm-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 768px) {\n .text-md-left {\n text-align: left !important;\n }\n .text-md-right {\n text-align: right !important;\n }\n .text-md-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 992px) {\n .text-lg-left {\n text-align: left !important;\n }\n .text-lg-right {\n text-align: right !important;\n }\n .text-lg-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 1200px) {\n .text-xl-left {\n text-align: left !important;\n }\n .text-xl-right {\n text-align: right !important;\n }\n .text-xl-center {\n text-align: center !important;\n }\n}\n\n.text-lowercase {\n text-transform: lowercase !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n\n.text-capitalize {\n text-transform: capitalize !important;\n}\n\n.font-weight-light {\n font-weight: 300 !important;\n}\n\n.font-weight-lighter {\n font-weight: lighter !important;\n}\n\n.font-weight-normal {\n font-weight: 400 !important;\n}\n\n.font-weight-bold {\n font-weight: 700 !important;\n}\n\n.font-weight-bolder {\n font-weight: bolder !important;\n}\n\n.font-italic {\n font-style: italic !important;\n}\n\n.text-white {\n color: #fff !important;\n}\n\n.text-primary {\n color: #007bff !important;\n}\n\na.text-primary:hover, a.text-primary:focus {\n color: #0056b3 !important;\n}\n\n.text-secondary {\n color: #6c757d !important;\n}\n\na.text-secondary:hover, a.text-secondary:focus {\n color: #494f54 !important;\n}\n\n.text-success {\n color: #28a745 !important;\n}\n\na.text-success:hover, a.text-success:focus {\n color: #19692c !important;\n}\n\n.text-info {\n color: #17a2b8 !important;\n}\n\na.text-info:hover, a.text-info:focus {\n color: #0f6674 !important;\n}\n\n.text-warning {\n color: #ffc107 !important;\n}\n\na.text-warning:hover, a.text-warning:focus {\n color: #ba8b00 !important;\n}\n\n.text-danger {\n color: #dc3545 !important;\n}\n\na.text-danger:hover, a.text-danger:focus {\n color: #a71d2a !important;\n}\n\n.text-light {\n color: #f8f9fa !important;\n}\n\na.text-light:hover, a.text-light:focus {\n color: #cbd3da !important;\n}\n\n.text-dark {\n color: #343a40 !important;\n}\n\na.text-dark:hover, a.text-dark:focus {\n color: #121416 !important;\n}\n\n.text-body {\n color: #212529 !important;\n}\n\n.text-muted {\n color: #6c757d !important;\n}\n\n.text-black-50 {\n color: rgba(0, 0, 0, 0.5) !important;\n}\n\n.text-white-50 {\n color: rgba(255, 255, 255, 0.5) !important;\n}\n\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n.text-decoration-none {\n text-decoration: none !important;\n}\n\n.text-break {\n word-break: break-word !important;\n overflow-wrap: break-word !important;\n}\n\n.text-reset {\n color: inherit !important;\n}\n\n.visible {\n visibility: visible !important;\n}\n\n.invisible {\n visibility: hidden !important;\n}\n\n@media print {\n *,\n *::before,\n *::after {\n text-shadow: none !important;\n box-shadow: none !important;\n }\n a:not(.btn) {\n text-decoration: underline;\n }\n abbr[title]::after {\n content: \" (\" attr(title) \")\";\n }\n pre {\n white-space: pre-wrap !important;\n }\n pre,\n blockquote {\n border: 1px solid #adb5bd;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n @page {\n size: a3;\n }\n body {\n min-width: 992px !important;\n }\n .container {\n min-width: 992px !important;\n }\n .navbar {\n display: none;\n }\n .badge {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #dee2e6 !important;\n }\n .table-dark {\n color: inherit;\n }\n .table-dark th,\n .table-dark td,\n .table-dark thead th,\n .table-dark tbody + tbody {\n border-color: #dee2e6;\n }\n .table .thead-dark th {\n color: inherit;\n border-color: #dee2e6;\n }\n}\n\n/*# sourceMappingURL=bootstrap.css.map */",":root {\n // Custom variable values only support SassScript inside `#{}`.\n @each $color, $value in $colors {\n --#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$color}: #{$value};\n }\n\n @each $bp, $value in $grid-breakpoints {\n --breakpoint-#{$bp}: #{$value};\n }\n\n // Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --font-family-sans-serif: #{inspect($font-family-sans-serif)};\n --font-family-monospace: #{inspect($font-family-monospace)};\n}\n","// stylelint-disable at-rule-no-vendor-prefix, declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// 1. Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n// 2. Change the default font family in all browsers.\n// 3. Correct the line height in all browsers.\n// 4. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS.\n// 5. Change the default tap highlight to be completely transparent in iOS.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box; // 1\n}\n\nhtml {\n font-family: sans-serif; // 2\n line-height: 1.15; // 3\n -webkit-text-size-adjust: 100%; // 4\n -webkit-tap-highlight-color: rgba($black, 0); // 5\n}\n\n// Shim for \"new\" HTML5 structural elements to display correctly (IE10, older browsers)\n// TODO: remove in v5\n// stylelint-disable-next-line selector-list-comma-newline-after\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Set an explicit initial text-align value so that we can later use\n// the `inherit` value on things like `` elements.\n\nbody {\n margin: 0; // 1\n font-family: $font-family-base;\n @include font-size($font-size-base);\n font-weight: $font-weight-base;\n line-height: $line-height-base;\n color: $body-color;\n text-align: left; // 3\n background-color: $body-bg; // 2\n}\n\n// Suppress the focus outline on elements that cannot be accessed via keyboard.\n// This prevents an unwanted focus outline from appearing around elements that\n// might still respond to pointer events.\n//\n// Credit: https://github.com/suitcss/base\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\n\n// Content grouping\n//\n// 1. Add the correct box sizing in Firefox.\n// 2. Show the overflow in Edge and IE.\n\nhr {\n box-sizing: content-box; // 1\n height: 0; // 1\n overflow: visible; // 2\n}\n\n\n//\n// Typography\n//\n\n// Remove top margins from headings\n//\n// By default, `

`-`

` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n// stylelint-disable-next-line selector-list-comma-newline-after\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: $headings-margin-bottom;\n}\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `

`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n// Abbreviations\n//\n// 1. Duplicate behavior to the data-* attribute for our tooltip plugin\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Remove the bottom border in Firefox 39-.\n// 5. Prevent the text-decoration to be skipped.\n\nabbr[title],\nabbr[data-original-title] { // 1\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n border-bottom: 0; // 4\n text-decoration-skip-ink: none; // 5\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // Undo browser default\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: $font-weight-bolder; // Add the correct font weight in Chrome, Edge, and Safari\n}\n\nsmall {\n @include font-size(80%); // Add the correct font size in all browsers\n}\n\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n//\n\nsub,\nsup {\n position: relative;\n @include font-size(75%);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n//\n// Links\n//\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n background-color: transparent; // Remove the gray background on active links in IE 10.\n\n @include hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href)\n// which have not been made explicitly keyboard-focusable (without tabindex).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n\n @include hover-focus {\n color: inherit;\n text-decoration: none;\n }\n\n &:focus {\n outline: 0;\n }\n}\n\n\n//\n// Code\n//\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-monospace;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\npre {\n // Remove browser default top margin\n margin-top: 0;\n // Reset browser default of `1em` to use `rem`s\n margin-bottom: 1rem;\n // Don't allow content to break outside\n overflow: auto;\n}\n\n\n//\n// Figures\n//\n\nfigure {\n // Apply a consistent margin strategy (matches our type styles).\n margin: 0 0 1rem;\n}\n\n\n//\n// Images and content\n//\n\nimg {\n vertical-align: middle;\n border-style: none; // Remove the border on images inside links in IE 10-.\n}\n\nsvg {\n // Workaround for the SVG overflow bug in IE10/11 is still required.\n // See https://github.com/twbs/bootstrap/issues/26878\n overflow: hidden;\n vertical-align: middle;\n}\n\n\n//\n// Tables\n//\n\ntable {\n border-collapse: collapse; // Prevent double borders\n}\n\ncaption {\n padding-top: $table-cell-padding;\n padding-bottom: $table-cell-padding;\n color: $table-caption-color;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n // Matches default `` alignment by inheriting from the ``, or the\n // closest parent with a set `text-align`.\n text-align: inherit;\n}\n\n\n//\n// Forms\n//\n\nlabel {\n // Allow labels to use `margin` for spacing.\n display: inline-block;\n margin-bottom: $label-margin-bottom;\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24093\nbutton {\n // stylelint-disable-next-line property-blacklist\n border-radius: 0;\n}\n\n// Work around a Firefox/IE bug where the transparent `button` background\n// results in a loss of the default `button` focus styles.\n//\n// Credit: https://github.com/suitcss/base/\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // Remove the margin in Firefox and Safari\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible; // Show the overflow in Edge\n}\n\nbutton,\nselect {\n text-transform: none; // Remove the inheritance of text transform in Firefox\n}\n\n// Remove the inheritance of word-wrap in Safari.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24990\nselect {\n word-wrap: normal;\n}\n\n\n// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\n// controls in Android 4.\n// 2. Correct the inability to style clickable types in iOS and Safari.\nbutton,\n[type=\"button\"], // 1\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button; // 2\n}\n\n// Opinionated: add \"hand\" cursor to non-disabled button elements.\n@if $enable-pointer-cursor-for-buttons {\n button,\n [type=\"button\"],\n [type=\"reset\"],\n [type=\"submit\"] {\n &:not(:disabled) {\n cursor: pointer;\n }\n }\n}\n\n// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box; // 1. Add the correct box sizing in IE 10-\n padding: 0; // 2. Remove the padding in IE 10-\n}\n\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n // Remove the default appearance of temporal inputs to avoid a Mobile Safari\n // bug where setting a custom line-height prevents text from being vertically\n // centered within the input.\n // See https://bugs.webkit.org/show_bug.cgi?id=139848\n // and https://github.com/twbs/bootstrap/issues/11266\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto; // Remove the default vertical scrollbar in IE.\n // Textareas should really only resize vertically so they don't break their (horizontal) containers.\n resize: vertical;\n}\n\nfieldset {\n // Browsers set a default `min-width: min-content;` on fieldsets,\n // unlike e.g. `

`s, which have `min-width: 0;` by default.\n // So we reset that to ensure fieldsets behave more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359\n // and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements\n min-width: 0;\n // Reset the default outline behavior of fieldsets so they don't affect page layout.\n padding: 0;\n margin: 0;\n border: 0;\n}\n\n// 1. Correct the text wrapping in Edge and IE.\n// 2. Correct the color inheritance from `fieldset` elements in IE.\nlegend {\n display: block;\n width: 100%;\n max-width: 100%; // 1\n padding: 0;\n margin-bottom: .5rem;\n @include font-size(1.5rem);\n line-height: inherit;\n color: inherit; // 2\n white-space: normal; // 1\n}\n\nprogress {\n vertical-align: baseline; // Add the correct vertical alignment in Chrome, Firefox, and Opera.\n}\n\n// Correct the cursor style of increment and decrement buttons in Chrome.\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n // This overrides the extra rounded corners on search inputs in iOS so that our\n // `.form-control` class can properly style them. Note that this cannot simply\n // be added to `.form-control` as it's not specific enough. For details, see\n // https://github.com/twbs/bootstrap/issues/11586.\n outline-offset: -2px; // 2. Correct the outline style in Safari.\n -webkit-appearance: none;\n}\n\n//\n// Remove the inner padding in Chrome and Safari on macOS.\n//\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// 1. Correct the inability to style clickable types in iOS and Safari.\n// 2. Change font properties to `inherit` in Safari.\n//\n\n::-webkit-file-upload-button {\n font: inherit; // 2\n -webkit-appearance: button; // 1\n}\n\n//\n// Correct element displays\n//\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item; // Add the correct display in all browsers\n cursor: pointer;\n}\n\ntemplate {\n display: none; // Add the correct display in IE\n}\n\n// Always hide an element with the `hidden` HTML attribute (from PureCSS).\n// Needed for proper display in IE 10-.\n[hidden] {\n display: none !important;\n}\n","// Variables\n//\n// Variables should follow the `$component-state-property-size` formula for\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\n\n// Color system\n\n$white: #fff !default;\n$gray-100: #f8f9fa !default;\n$gray-200: #e9ecef !default;\n$gray-300: #dee2e6 !default;\n$gray-400: #ced4da !default;\n$gray-500: #adb5bd !default;\n$gray-600: #6c757d !default;\n$gray-700: #495057 !default;\n$gray-800: #343a40 !default;\n$gray-900: #212529 !default;\n$black: #000 !default;\n\n$grays: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$grays: map-merge(\n (\n \"100\": $gray-100,\n \"200\": $gray-200,\n \"300\": $gray-300,\n \"400\": $gray-400,\n \"500\": $gray-500,\n \"600\": $gray-600,\n \"700\": $gray-700,\n \"800\": $gray-800,\n \"900\": $gray-900\n ),\n $grays\n);\n\n$blue: #007bff !default;\n$indigo: #6610f2 !default;\n$purple: #6f42c1 !default;\n$pink: #e83e8c !default;\n$red: #dc3545 !default;\n$orange: #fd7e14 !default;\n$yellow: #ffc107 !default;\n$green: #28a745 !default;\n$teal: #20c997 !default;\n$cyan: #17a2b8 !default;\n\n$colors: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$colors: map-merge(\n (\n \"blue\": $blue,\n \"indigo\": $indigo,\n \"purple\": $purple,\n \"pink\": $pink,\n \"red\": $red,\n \"orange\": $orange,\n \"yellow\": $yellow,\n \"green\": $green,\n \"teal\": $teal,\n \"cyan\": $cyan,\n \"white\": $white,\n \"gray\": $gray-600,\n \"gray-dark\": $gray-800\n ),\n $colors\n);\n\n$primary: $blue !default;\n$secondary: $gray-600 !default;\n$success: $green !default;\n$info: $cyan !default;\n$warning: $yellow !default;\n$danger: $red !default;\n$light: $gray-100 !default;\n$dark: $gray-800 !default;\n\n$theme-colors: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$theme-colors: map-merge(\n (\n \"primary\": $primary,\n \"secondary\": $secondary,\n \"success\": $success,\n \"info\": $info,\n \"warning\": $warning,\n \"danger\": $danger,\n \"light\": $light,\n \"dark\": $dark\n ),\n $theme-colors\n);\n\n// Set a specific jump point for requesting color jumps\n$theme-color-interval: 8% !default;\n\n// The yiq lightness value that determines when the lightness of color changes from \"dark\" to \"light\". Acceptable values are between 0 and 255.\n$yiq-contrasted-threshold: 150 !default;\n\n// Customize the light and dark text colors for use in our YIQ color contrast function.\n$yiq-text-dark: $gray-900 !default;\n$yiq-text-light: $white !default;\n\n\n// Options\n//\n// Quickly modify global styling by enabling or disabling optional features.\n\n$enable-caret: true !default;\n$enable-rounded: true !default;\n$enable-shadows: false !default;\n$enable-gradients: false !default;\n$enable-transitions: true !default;\n$enable-prefers-reduced-motion-media-query: true !default;\n$enable-hover-media-query: false !default; // Deprecated, no longer affects any compiled CSS\n$enable-grid-classes: true !default;\n$enable-pointer-cursor-for-buttons: true !default;\n$enable-print-styles: true !default;\n$enable-responsive-font-sizes: false !default;\n$enable-validation-icons: true !default;\n$enable-deprecation-messages: true !default;\n\n\n// Spacing\n//\n// Control the default styling of most Bootstrap elements by modifying these\n// variables. Mostly focused on spacing.\n// You can add more entries to the $spacers map, should you need more variation.\n\n$spacer: 1rem !default;\n$spacers: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$spacers: map-merge(\n (\n 0: 0,\n 1: ($spacer * .25),\n 2: ($spacer * .5),\n 3: $spacer,\n 4: ($spacer * 1.5),\n 5: ($spacer * 3)\n ),\n $spacers\n);\n\n// This variable affects the `.h-*` and `.w-*` classes.\n$sizes: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$sizes: map-merge(\n (\n 25: 25%,\n 50: 50%,\n 75: 75%,\n 100: 100%,\n auto: auto\n ),\n $sizes\n);\n\n\n// Body\n//\n// Settings for the `` element.\n\n$body-bg: $white !default;\n$body-color: $gray-900 !default;\n\n\n// Links\n//\n// Style anchor elements.\n\n$link-color: theme-color(\"primary\") !default;\n$link-decoration: none !default;\n$link-hover-color: darken($link-color, 15%) !default;\n$link-hover-decoration: underline !default;\n// Darken percentage for links with `.text-*` class (e.g. `.text-success`)\n$emphasized-link-hover-darken-percentage: 15% !default;\n\n// Paragraphs\n//\n// Style p element.\n\n$paragraph-margin-bottom: 1rem !default;\n\n\n// Grid breakpoints\n//\n// Define the minimum dimensions at which your layout will change,\n// adapting to different screen sizes, for use in media queries.\n\n$grid-breakpoints: (\n xs: 0,\n sm: 576px,\n md: 768px,\n lg: 992px,\n xl: 1200px\n) !default;\n\n@include _assert-ascending($grid-breakpoints, \"$grid-breakpoints\");\n@include _assert-starts-at-zero($grid-breakpoints, \"$grid-breakpoints\");\n\n\n// Grid containers\n//\n// Define the maximum width of `.container` for different screen sizes.\n\n$container-max-widths: (\n sm: 540px,\n md: 720px,\n lg: 960px,\n xl: 1140px\n) !default;\n\n@include _assert-ascending($container-max-widths, \"$container-max-widths\");\n\n\n// Grid columns\n//\n// Set the number of columns and specify the width of the gutters.\n\n$grid-columns: 12 !default;\n$grid-gutter-width: 30px !default;\n\n\n// Components\n//\n// Define common padding and border radius sizes and more.\n\n$line-height-lg: 1.5 !default;\n$line-height-sm: 1.5 !default;\n\n$border-width: 1px !default;\n$border-color: $gray-300 !default;\n\n$border-radius: .25rem !default;\n$border-radius-lg: .3rem !default;\n$border-radius-sm: .2rem !default;\n\n$rounded-pill: 50rem !default;\n\n$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;\n$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;\n$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;\n\n$component-active-color: $white !default;\n$component-active-bg: theme-color(\"primary\") !default;\n\n$caret-width: .3em !default;\n$caret-vertical-align: $caret-width * .85 !default;\n$caret-spacing: $caret-width * .85 !default;\n\n$transition-base: all .2s ease-in-out !default;\n$transition-fade: opacity .15s linear !default;\n$transition-collapse: height .35s ease !default;\n\n$embed-responsive-aspect-ratios: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$embed-responsive-aspect-ratios: join(\n (\n (21 9),\n (16 9),\n (4 3),\n (1 1),\n ),\n $embed-responsive-aspect-ratios\n);\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// stylelint-disable value-keyword-case\n$font-family-sans-serif: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\" !default;\n$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !default;\n$font-family-base: $font-family-sans-serif !default;\n// stylelint-enable value-keyword-case\n\n$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`\n$font-size-lg: $font-size-base * 1.25 !default;\n$font-size-sm: $font-size-base * .875 !default;\n\n$font-weight-lighter: lighter !default;\n$font-weight-light: 300 !default;\n$font-weight-normal: 400 !default;\n$font-weight-bold: 700 !default;\n$font-weight-bolder: bolder !default;\n\n$font-weight-base: $font-weight-normal !default;\n$line-height-base: 1.5 !default;\n\n$h1-font-size: $font-size-base * 2.5 !default;\n$h2-font-size: $font-size-base * 2 !default;\n$h3-font-size: $font-size-base * 1.75 !default;\n$h4-font-size: $font-size-base * 1.5 !default;\n$h5-font-size: $font-size-base * 1.25 !default;\n$h6-font-size: $font-size-base !default;\n\n$headings-margin-bottom: $spacer / 2 !default;\n$headings-font-family: null !default;\n$headings-font-weight: 500 !default;\n$headings-line-height: 1.2 !default;\n$headings-color: null !default;\n\n$display1-size: 6rem !default;\n$display2-size: 5.5rem !default;\n$display3-size: 4.5rem !default;\n$display4-size: 3.5rem !default;\n\n$display1-weight: 300 !default;\n$display2-weight: 300 !default;\n$display3-weight: 300 !default;\n$display4-weight: 300 !default;\n$display-line-height: $headings-line-height !default;\n\n$lead-font-size: $font-size-base * 1.25 !default;\n$lead-font-weight: 300 !default;\n\n$small-font-size: 80% !default;\n\n$text-muted: $gray-600 !default;\n\n$blockquote-small-color: $gray-600 !default;\n$blockquote-small-font-size: $small-font-size !default;\n$blockquote-font-size: $font-size-base * 1.25 !default;\n\n$hr-border-color: rgba($black, .1) !default;\n$hr-border-width: $border-width !default;\n\n$mark-padding: .2em !default;\n\n$dt-font-weight: $font-weight-bold !default;\n\n$kbd-box-shadow: inset 0 -.1rem 0 rgba($black, .25) !default;\n$nested-kbd-font-weight: $font-weight-bold !default;\n\n$list-inline-padding: .5rem !default;\n\n$mark-bg: #fcf8e3 !default;\n\n$hr-margin-y: $spacer !default;\n\n\n// Tables\n//\n// Customizes the `.table` component with basic values, each used across all table variations.\n\n$table-cell-padding: .75rem !default;\n$table-cell-padding-sm: .3rem !default;\n\n$table-color: $body-color !default;\n$table-bg: null !default;\n$table-accent-bg: rgba($black, .05) !default;\n$table-hover-color: $table-color !default;\n$table-hover-bg: rgba($black, .075) !default;\n$table-active-bg: $table-hover-bg !default;\n\n$table-border-width: $border-width !default;\n$table-border-color: $border-color !default;\n\n$table-head-bg: $gray-200 !default;\n$table-head-color: $gray-700 !default;\n\n$table-dark-color: $white !default;\n$table-dark-bg: $gray-800 !default;\n$table-dark-accent-bg: rgba($white, .05) !default;\n$table-dark-hover-color: $table-dark-color !default;\n$table-dark-hover-bg: rgba($white, .075) !default;\n$table-dark-border-color: lighten($table-dark-bg, 7.5%) !default;\n$table-dark-color: $white !default;\n\n$table-striped-order: odd !default;\n\n$table-caption-color: $text-muted !default;\n\n$table-bg-level: -9 !default;\n$table-border-level: -6 !default;\n\n\n// Buttons + Forms\n//\n// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.\n\n$input-btn-padding-y: .375rem !default;\n$input-btn-padding-x: .75rem !default;\n$input-btn-font-family: null !default;\n$input-btn-font-size: $font-size-base !default;\n$input-btn-line-height: $line-height-base !default;\n\n$input-btn-focus-width: .2rem !default;\n$input-btn-focus-color: rgba($component-active-bg, .25) !default;\n$input-btn-focus-box-shadow: 0 0 0 $input-btn-focus-width $input-btn-focus-color !default;\n\n$input-btn-padding-y-sm: .25rem !default;\n$input-btn-padding-x-sm: .5rem !default;\n$input-btn-font-size-sm: $font-size-sm !default;\n$input-btn-line-height-sm: $line-height-sm !default;\n\n$input-btn-padding-y-lg: .5rem !default;\n$input-btn-padding-x-lg: 1rem !default;\n$input-btn-font-size-lg: $font-size-lg !default;\n$input-btn-line-height-lg: $line-height-lg !default;\n\n$input-btn-border-width: $border-width !default;\n\n\n// Buttons\n//\n// For each of Bootstrap's buttons, define text, background, and border color.\n\n$btn-padding-y: $input-btn-padding-y !default;\n$btn-padding-x: $input-btn-padding-x !default;\n$btn-font-family: $input-btn-font-family !default;\n$btn-font-size: $input-btn-font-size !default;\n$btn-line-height: $input-btn-line-height !default;\n\n$btn-padding-y-sm: $input-btn-padding-y-sm !default;\n$btn-padding-x-sm: $input-btn-padding-x-sm !default;\n$btn-font-size-sm: $input-btn-font-size-sm !default;\n$btn-line-height-sm: $input-btn-line-height-sm !default;\n\n$btn-padding-y-lg: $input-btn-padding-y-lg !default;\n$btn-padding-x-lg: $input-btn-padding-x-lg !default;\n$btn-font-size-lg: $input-btn-font-size-lg !default;\n$btn-line-height-lg: $input-btn-line-height-lg !default;\n\n$btn-border-width: $input-btn-border-width !default;\n\n$btn-font-weight: $font-weight-normal !default;\n$btn-box-shadow: inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default;\n$btn-focus-width: $input-btn-focus-width !default;\n$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$btn-disabled-opacity: .65 !default;\n$btn-active-box-shadow: inset 0 3px 5px rgba($black, .125) !default;\n\n$btn-link-disabled-color: $gray-600 !default;\n\n$btn-block-spacing-y: .5rem !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius: $border-radius !default;\n$btn-border-radius-lg: $border-radius-lg !default;\n$btn-border-radius-sm: $border-radius-sm !default;\n\n$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n\n// Forms\n\n$label-margin-bottom: .5rem !default;\n\n$input-padding-y: $input-btn-padding-y !default;\n$input-padding-x: $input-btn-padding-x !default;\n$input-font-family: $input-btn-font-family !default;\n$input-font-size: $input-btn-font-size !default;\n$input-font-weight: $font-weight-base !default;\n$input-line-height: $input-btn-line-height !default;\n\n$input-padding-y-sm: $input-btn-padding-y-sm !default;\n$input-padding-x-sm: $input-btn-padding-x-sm !default;\n$input-font-size-sm: $input-btn-font-size-sm !default;\n$input-line-height-sm: $input-btn-line-height-sm !default;\n\n$input-padding-y-lg: $input-btn-padding-y-lg !default;\n$input-padding-x-lg: $input-btn-padding-x-lg !default;\n$input-font-size-lg: $input-btn-font-size-lg !default;\n$input-line-height-lg: $input-btn-line-height-lg !default;\n\n$input-bg: $white !default;\n$input-disabled-bg: $gray-200 !default;\n\n$input-color: $gray-700 !default;\n$input-border-color: $gray-400 !default;\n$input-border-width: $input-btn-border-width !default;\n$input-box-shadow: inset 0 1px 1px rgba($black, .075) !default;\n\n$input-border-radius: $border-radius !default;\n$input-border-radius-lg: $border-radius-lg !default;\n$input-border-radius-sm: $border-radius-sm !default;\n\n$input-focus-bg: $input-bg !default;\n$input-focus-border-color: lighten($component-active-bg, 25%) !default;\n$input-focus-color: $input-color !default;\n$input-focus-width: $input-btn-focus-width !default;\n$input-focus-box-shadow: $input-btn-focus-box-shadow !default;\n\n$input-placeholder-color: $gray-600 !default;\n$input-plaintext-color: $body-color !default;\n\n$input-height-border: $input-border-width * 2 !default;\n\n$input-height-inner: calc(#{$input-line-height * 1em} + #{$input-padding-y * 2}) !default;\n$input-height-inner-half: calc(#{$input-line-height * .5em} + #{$input-padding-y}) !default;\n$input-height-inner-quarter: calc(#{$input-line-height * .25em} + #{$input-padding-y / 2}) !default;\n\n$input-height: calc(#{$input-line-height * 1em} + #{$input-padding-y * 2} + #{$input-height-border}) !default;\n$input-height-sm: calc(#{$input-line-height-sm * 1em} + #{$input-btn-padding-y-sm * 2} + #{$input-height-border}) !default;\n$input-height-lg: calc(#{$input-line-height-lg * 1em} + #{$input-btn-padding-y-lg * 2} + #{$input-height-border}) !default;\n\n$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$form-text-margin-top: .25rem !default;\n\n$form-check-input-gutter: 1.25rem !default;\n$form-check-input-margin-y: .3rem !default;\n$form-check-input-margin-x: .25rem !default;\n\n$form-check-inline-margin-x: .75rem !default;\n$form-check-inline-input-margin-x: .3125rem !default;\n\n$form-grid-gutter-width: 10px !default;\n$form-group-margin-bottom: 1rem !default;\n\n$input-group-addon-color: $input-color !default;\n$input-group-addon-bg: $gray-200 !default;\n$input-group-addon-border-color: $input-border-color !default;\n\n$custom-forms-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$custom-control-gutter: .5rem !default;\n$custom-control-spacer-x: 1rem !default;\n\n$custom-control-indicator-size: 1rem !default;\n$custom-control-indicator-bg: $input-bg !default;\n\n$custom-control-indicator-bg-size: 50% 50% !default;\n$custom-control-indicator-box-shadow: $input-box-shadow !default;\n$custom-control-indicator-border-color: $gray-500 !default;\n$custom-control-indicator-border-width: $input-border-width !default;\n\n$custom-control-indicator-disabled-bg: $input-disabled-bg !default;\n$custom-control-label-disabled-color: $gray-600 !default;\n\n$custom-control-indicator-checked-color: $component-active-color !default;\n$custom-control-indicator-checked-bg: $component-active-bg !default;\n$custom-control-indicator-checked-disabled-bg: rgba(theme-color(\"primary\"), .5) !default;\n$custom-control-indicator-checked-box-shadow: none !default;\n$custom-control-indicator-checked-border-color: $custom-control-indicator-checked-bg !default;\n\n$custom-control-indicator-focus-box-shadow: $input-focus-box-shadow !default;\n$custom-control-indicator-focus-border-color: $input-focus-border-color !default;\n\n$custom-control-indicator-active-color: $component-active-color !default;\n$custom-control-indicator-active-bg: lighten($component-active-bg, 35%) !default;\n$custom-control-indicator-active-box-shadow: none !default;\n$custom-control-indicator-active-border-color: $custom-control-indicator-active-bg !default;\n\n$custom-checkbox-indicator-border-radius: $border-radius !default;\n$custom-checkbox-indicator-icon-checked: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='#{$custom-control-indicator-checked-color}' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n\n$custom-checkbox-indicator-indeterminate-bg: $component-active-bg !default;\n$custom-checkbox-indicator-indeterminate-color: $custom-control-indicator-checked-color !default;\n$custom-checkbox-indicator-icon-indeterminate: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='#{$custom-checkbox-indicator-indeterminate-color}' d='M0 2h4'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$custom-checkbox-indicator-indeterminate-box-shadow: none !default;\n$custom-checkbox-indicator-indeterminate-border-color: $custom-checkbox-indicator-indeterminate-bg !default;\n\n$custom-radio-indicator-border-radius: 50% !default;\n$custom-radio-indicator-icon-checked: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='#{$custom-control-indicator-checked-color}'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n\n$custom-switch-width: $custom-control-indicator-size * 1.75 !default;\n$custom-switch-indicator-border-radius: $custom-control-indicator-size / 2 !default;\n$custom-switch-indicator-size: calc(#{$custom-control-indicator-size} - #{$custom-control-indicator-border-width * 4}) !default;\n\n$custom-select-padding-y: $input-padding-y !default;\n$custom-select-padding-x: $input-padding-x !default;\n$custom-select-font-family: $input-font-family !default;\n$custom-select-font-size: $input-font-size !default;\n$custom-select-height: $input-height !default;\n$custom-select-indicator-padding: 1rem !default; // Extra padding to account for the presence of the background-image based indicator\n$custom-select-font-weight: $input-font-weight !default;\n$custom-select-line-height: $input-line-height !default;\n$custom-select-color: $input-color !default;\n$custom-select-disabled-color: $gray-600 !default;\n$custom-select-bg: $input-bg !default;\n$custom-select-disabled-bg: $gray-200 !default;\n$custom-select-bg-size: 8px 10px !default; // In pixels because image dimensions\n$custom-select-indicator-color: $gray-800 !default;\n$custom-select-indicator: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='#{$custom-select-indicator-color}' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$custom-select-background: $custom-select-indicator no-repeat right $custom-select-padding-x center / $custom-select-bg-size !default; // Used so we can have multiple background elements (e.g., arrow and feedback icon)\n\n$custom-select-feedback-icon-padding-right: calc((1em + #{2 * $custom-select-padding-y}) * 3 / 4 + #{$custom-select-padding-x + $custom-select-indicator-padding}) !default;\n$custom-select-feedback-icon-position: center right ($custom-select-padding-x + $custom-select-indicator-padding) !default;\n$custom-select-feedback-icon-size: $input-height-inner-half $input-height-inner-half !default;\n\n$custom-select-border-width: $input-border-width !default;\n$custom-select-border-color: $input-border-color !default;\n$custom-select-border-radius: $border-radius !default;\n$custom-select-box-shadow: inset 0 1px 2px rgba($black, .075) !default;\n\n$custom-select-focus-border-color: $input-focus-border-color !default;\n$custom-select-focus-width: $input-focus-width !default;\n$custom-select-focus-box-shadow: 0 0 0 $custom-select-focus-width $input-btn-focus-color !default;\n\n$custom-select-padding-y-sm: $input-padding-y-sm !default;\n$custom-select-padding-x-sm: $input-padding-x-sm !default;\n$custom-select-font-size-sm: $input-font-size-sm !default;\n$custom-select-height-sm: $input-height-sm !default;\n\n$custom-select-padding-y-lg: $input-padding-y-lg !default;\n$custom-select-padding-x-lg: $input-padding-x-lg !default;\n$custom-select-font-size-lg: $input-font-size-lg !default;\n$custom-select-height-lg: $input-height-lg !default;\n\n$custom-range-track-width: 100% !default;\n$custom-range-track-height: .5rem !default;\n$custom-range-track-cursor: pointer !default;\n$custom-range-track-bg: $gray-300 !default;\n$custom-range-track-border-radius: 1rem !default;\n$custom-range-track-box-shadow: inset 0 .25rem .25rem rgba($black, .1) !default;\n\n$custom-range-thumb-width: 1rem !default;\n$custom-range-thumb-height: $custom-range-thumb-width !default;\n$custom-range-thumb-bg: $component-active-bg !default;\n$custom-range-thumb-border: 0 !default;\n$custom-range-thumb-border-radius: 1rem !default;\n$custom-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;\n$custom-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, $input-focus-box-shadow !default;\n$custom-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in IE/Edge\n$custom-range-thumb-active-bg: lighten($component-active-bg, 35%) !default;\n$custom-range-thumb-disabled-bg: $gray-500 !default;\n\n$custom-file-height: $input-height !default;\n$custom-file-height-inner: $input-height-inner !default;\n$custom-file-focus-border-color: $input-focus-border-color !default;\n$custom-file-focus-box-shadow: $input-focus-box-shadow !default;\n$custom-file-disabled-bg: $input-disabled-bg !default;\n\n$custom-file-padding-y: $input-padding-y !default;\n$custom-file-padding-x: $input-padding-x !default;\n$custom-file-line-height: $input-line-height !default;\n$custom-file-font-family: $input-font-family !default;\n$custom-file-font-weight: $input-font-weight !default;\n$custom-file-color: $input-color !default;\n$custom-file-bg: $input-bg !default;\n$custom-file-border-width: $input-border-width !default;\n$custom-file-border-color: $input-border-color !default;\n$custom-file-border-radius: $input-border-radius !default;\n$custom-file-box-shadow: $input-box-shadow !default;\n$custom-file-button-color: $custom-file-color !default;\n$custom-file-button-bg: $input-group-addon-bg !default;\n$custom-file-text: (\n en: \"Browse\"\n) !default;\n\n\n// Form validation\n\n$form-feedback-margin-top: $form-text-margin-top !default;\n$form-feedback-font-size: $small-font-size !default;\n$form-feedback-valid-color: theme-color(\"success\") !default;\n$form-feedback-invalid-color: theme-color(\"danger\") !default;\n\n$form-feedback-icon-valid-color: $form-feedback-valid-color !default;\n$form-feedback-icon-valid: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='#{$form-feedback-icon-valid-color}' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$form-feedback-icon-invalid-color: $form-feedback-invalid-color !default;\n$form-feedback-icon-invalid: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$form-feedback-icon-invalid-color}' viewBox='-2 -2 7 7'%3e%3cpath stroke='#{$form-feedback-icon-invalid-color}' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\"), \"#\", \"%23\") !default;\n\n$form-validation-states: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$form-validation-states: map-merge(\n (\n \"valid\": (\n \"color\": $form-feedback-valid-color,\n \"icon\": $form-feedback-icon-valid\n ),\n \"invalid\": (\n \"color\": $form-feedback-invalid-color,\n \"icon\": $form-feedback-icon-invalid\n ),\n ),\n $form-validation-states\n);\n\n// Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n\n$zindex-dropdown: 1000 !default;\n$zindex-sticky: 1020 !default;\n$zindex-fixed: 1030 !default;\n$zindex-modal-backdrop: 1040 !default;\n$zindex-modal: 1050 !default;\n$zindex-popover: 1060 !default;\n$zindex-tooltip: 1070 !default;\n\n\n// Navs\n\n$nav-link-padding-y: .5rem !default;\n$nav-link-padding-x: 1rem !default;\n$nav-link-disabled-color: $gray-600 !default;\n\n$nav-tabs-border-color: $gray-300 !default;\n$nav-tabs-border-width: $border-width !default;\n$nav-tabs-border-radius: $border-radius !default;\n$nav-tabs-link-hover-border-color: $gray-200 $gray-200 $nav-tabs-border-color !default;\n$nav-tabs-link-active-color: $gray-700 !default;\n$nav-tabs-link-active-bg: $body-bg !default;\n$nav-tabs-link-active-border-color: $gray-300 $gray-300 $nav-tabs-link-active-bg !default;\n\n$nav-pills-border-radius: $border-radius !default;\n$nav-pills-link-active-color: $component-active-color !default;\n$nav-pills-link-active-bg: $component-active-bg !default;\n\n$nav-divider-color: $gray-200 !default;\n$nav-divider-margin-y: $spacer / 2 !default;\n\n\n// Navbar\n\n$navbar-padding-y: $spacer / 2 !default;\n$navbar-padding-x: $spacer !default;\n\n$navbar-nav-link-padding-x: .5rem !default;\n\n$navbar-brand-font-size: $font-size-lg !default;\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\n$nav-link-height: $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default;\n$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default;\n$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) / 2 !default;\n\n$navbar-toggler-padding-y: .25rem !default;\n$navbar-toggler-padding-x: .75rem !default;\n$navbar-toggler-font-size: $font-size-lg !default;\n$navbar-toggler-border-radius: $btn-border-radius !default;\n\n$navbar-dark-color: rgba($white, .5) !default;\n$navbar-dark-hover-color: rgba($white, .75) !default;\n$navbar-dark-active-color: $white !default;\n$navbar-dark-disabled-color: rgba($white, .25) !default;\n$navbar-dark-toggler-icon-bg: str-replace(url(\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='#{$navbar-dark-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$navbar-dark-toggler-border-color: rgba($white, .1) !default;\n\n$navbar-light-color: rgba($black, .5) !default;\n$navbar-light-hover-color: rgba($black, .7) !default;\n$navbar-light-active-color: rgba($black, .9) !default;\n$navbar-light-disabled-color: rgba($black, .3) !default;\n$navbar-light-toggler-icon-bg: str-replace(url(\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='#{$navbar-light-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$navbar-light-toggler-border-color: rgba($black, .1) !default;\n\n$navbar-light-brand-color: $navbar-light-active-color !default;\n$navbar-light-brand-hover-color: $navbar-light-active-color !default;\n$navbar-dark-brand-color: $navbar-dark-active-color !default;\n$navbar-dark-brand-hover-color: $navbar-dark-active-color !default;\n\n\n// Dropdowns\n//\n// Dropdown menu container and contents.\n\n$dropdown-min-width: 10rem !default;\n$dropdown-padding-y: .5rem !default;\n$dropdown-spacer: .125rem !default;\n$dropdown-font-size: $font-size-base !default;\n$dropdown-color: $body-color !default;\n$dropdown-bg: $white !default;\n$dropdown-border-color: rgba($black, .15) !default;\n$dropdown-border-radius: $border-radius !default;\n$dropdown-border-width: $border-width !default;\n$dropdown-inner-border-radius: calc(#{$dropdown-border-radius} - #{$dropdown-border-width}) !default;\n$dropdown-divider-bg: $gray-200 !default;\n$dropdown-divider-margin-y: $nav-divider-margin-y !default;\n$dropdown-box-shadow: 0 .5rem 1rem rgba($black, .175) !default;\n\n$dropdown-link-color: $gray-900 !default;\n$dropdown-link-hover-color: darken($gray-900, 5%) !default;\n$dropdown-link-hover-bg: $gray-100 !default;\n\n$dropdown-link-active-color: $component-active-color !default;\n$dropdown-link-active-bg: $component-active-bg !default;\n\n$dropdown-link-disabled-color: $gray-600 !default;\n\n$dropdown-item-padding-y: .25rem !default;\n$dropdown-item-padding-x: 1.5rem !default;\n\n$dropdown-header-color: $gray-600 !default;\n\n\n// Pagination\n\n$pagination-padding-y: .5rem !default;\n$pagination-padding-x: .75rem !default;\n$pagination-padding-y-sm: .25rem !default;\n$pagination-padding-x-sm: .5rem !default;\n$pagination-padding-y-lg: .75rem !default;\n$pagination-padding-x-lg: 1.5rem !default;\n$pagination-line-height: 1.25 !default;\n\n$pagination-color: $link-color !default;\n$pagination-bg: $white !default;\n$pagination-border-width: $border-width !default;\n$pagination-border-color: $gray-300 !default;\n\n$pagination-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$pagination-focus-outline: 0 !default;\n\n$pagination-hover-color: $link-hover-color !default;\n$pagination-hover-bg: $gray-200 !default;\n$pagination-hover-border-color: $gray-300 !default;\n\n$pagination-active-color: $component-active-color !default;\n$pagination-active-bg: $component-active-bg !default;\n$pagination-active-border-color: $pagination-active-bg !default;\n\n$pagination-disabled-color: $gray-600 !default;\n$pagination-disabled-bg: $white !default;\n$pagination-disabled-border-color: $gray-300 !default;\n\n\n// Jumbotron\n\n$jumbotron-padding: 2rem !default;\n$jumbotron-color: null !default;\n$jumbotron-bg: $gray-200 !default;\n\n\n// Cards\n\n$card-spacer-y: .75rem !default;\n$card-spacer-x: 1.25rem !default;\n$card-border-width: $border-width !default;\n$card-border-radius: $border-radius !default;\n$card-border-color: rgba($black, .125) !default;\n$card-inner-border-radius: calc(#{$card-border-radius} - #{$card-border-width}) !default;\n$card-cap-bg: rgba($black, .03) !default;\n$card-cap-color: null !default;\n$card-color: null !default;\n$card-bg: $white !default;\n\n$card-img-overlay-padding: 1.25rem !default;\n\n$card-group-margin: $grid-gutter-width / 2 !default;\n$card-deck-margin: $card-group-margin !default;\n\n$card-columns-count: 3 !default;\n$card-columns-gap: 1.25rem !default;\n$card-columns-margin: $card-spacer-y !default;\n\n\n// Tooltips\n\n$tooltip-font-size: $font-size-sm !default;\n$tooltip-max-width: 200px !default;\n$tooltip-color: $white !default;\n$tooltip-bg: $black !default;\n$tooltip-border-radius: $border-radius !default;\n$tooltip-opacity: .9 !default;\n$tooltip-padding-y: .25rem !default;\n$tooltip-padding-x: .5rem !default;\n$tooltip-margin: 0 !default;\n\n$tooltip-arrow-width: .8rem !default;\n$tooltip-arrow-height: .4rem !default;\n$tooltip-arrow-color: $tooltip-bg !default;\n\n// Form tooltips must come after regular tooltips\n$form-feedback-tooltip-padding-y: $tooltip-padding-y !default;\n$form-feedback-tooltip-padding-x: $tooltip-padding-x !default;\n$form-feedback-tooltip-font-size: $tooltip-font-size !default;\n$form-feedback-tooltip-line-height: $line-height-base !default;\n$form-feedback-tooltip-opacity: $tooltip-opacity !default;\n$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;\n\n\n// Popovers\n\n$popover-font-size: $font-size-sm !default;\n$popover-bg: $white !default;\n$popover-max-width: 276px !default;\n$popover-border-width: $border-width !default;\n$popover-border-color: rgba($black, .2) !default;\n$popover-border-radius: $border-radius-lg !default;\n$popover-box-shadow: 0 .25rem .5rem rgba($black, .2) !default;\n\n$popover-header-bg: darken($popover-bg, 3%) !default;\n$popover-header-color: $headings-color !default;\n$popover-header-padding-y: .5rem !default;\n$popover-header-padding-x: .75rem !default;\n\n$popover-body-color: $body-color !default;\n$popover-body-padding-y: $popover-header-padding-y !default;\n$popover-body-padding-x: $popover-header-padding-x !default;\n\n$popover-arrow-width: 1rem !default;\n$popover-arrow-height: .5rem !default;\n$popover-arrow-color: $popover-bg !default;\n\n$popover-arrow-outer-color: fade-in($popover-border-color, .05) !default;\n\n\n// Toasts\n\n$toast-max-width: 350px !default;\n$toast-padding-x: .75rem !default;\n$toast-padding-y: .25rem !default;\n$toast-font-size: .875rem !default;\n$toast-color: null !default;\n$toast-background-color: rgba($white, .85) !default;\n$toast-border-width: 1px !default;\n$toast-border-color: rgba(0, 0, 0, .1) !default;\n$toast-border-radius: .25rem !default;\n$toast-box-shadow: 0 .25rem .75rem rgba($black, .1) !default;\n\n$toast-header-color: $gray-600 !default;\n$toast-header-background-color: rgba($white, .85) !default;\n$toast-header-border-color: rgba(0, 0, 0, .05) !default;\n\n\n// Badges\n\n$badge-font-size: 75% !default;\n$badge-font-weight: $font-weight-bold !default;\n$badge-padding-y: .25em !default;\n$badge-padding-x: .4em !default;\n$badge-border-radius: $border-radius !default;\n\n$badge-transition: $btn-transition !default;\n$badge-focus-width: $input-btn-focus-width !default;\n\n$badge-pill-padding-x: .6em !default;\n// Use a higher than normal value to ensure completely rounded edges when\n// customizing padding or font-size on labels.\n$badge-pill-border-radius: 10rem !default;\n\n\n// Modals\n\n// Padding applied to the modal body\n$modal-inner-padding: 1rem !default;\n\n$modal-dialog-margin: .5rem !default;\n$modal-dialog-margin-y-sm-up: 1.75rem !default;\n\n$modal-title-line-height: $line-height-base !default;\n\n$modal-content-color: null !default;\n$modal-content-bg: $white !default;\n$modal-content-border-color: rgba($black, .2) !default;\n$modal-content-border-width: $border-width !default;\n$modal-content-border-radius: $border-radius-lg !default;\n$modal-content-box-shadow-xs: 0 .25rem .5rem rgba($black, .5) !default;\n$modal-content-box-shadow-sm-up: 0 .5rem 1rem rgba($black, .5) !default;\n\n$modal-backdrop-bg: $black !default;\n$modal-backdrop-opacity: .5 !default;\n$modal-header-border-color: $border-color !default;\n$modal-footer-border-color: $modal-header-border-color !default;\n$modal-header-border-width: $modal-content-border-width !default;\n$modal-footer-border-width: $modal-header-border-width !default;\n$modal-header-padding-y: 1rem !default;\n$modal-header-padding-x: 1rem !default;\n$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility\n\n$modal-xl: 1140px !default;\n$modal-lg: 800px !default;\n$modal-md: 500px !default;\n$modal-sm: 300px !default;\n\n$modal-fade-transform: translate(0, -50px) !default;\n$modal-show-transform: none !default;\n$modal-transition: transform .3s ease-out !default;\n\n\n// Alerts\n//\n// Define alert colors, border radius, and padding.\n\n$alert-padding-y: .75rem !default;\n$alert-padding-x: 1.25rem !default;\n$alert-margin-bottom: 1rem !default;\n$alert-border-radius: $border-radius !default;\n$alert-link-font-weight: $font-weight-bold !default;\n$alert-border-width: $border-width !default;\n\n$alert-bg-level: -10 !default;\n$alert-border-level: -9 !default;\n$alert-color-level: 6 !default;\n\n\n// Progress bars\n\n$progress-height: 1rem !default;\n$progress-font-size: $font-size-base * .75 !default;\n$progress-bg: $gray-200 !default;\n$progress-border-radius: $border-radius !default;\n$progress-box-shadow: inset 0 .1rem .1rem rgba($black, .1) !default;\n$progress-bar-color: $white !default;\n$progress-bar-bg: theme-color(\"primary\") !default;\n$progress-bar-animation-timing: 1s linear infinite !default;\n$progress-bar-transition: width .6s ease !default;\n\n\n// List group\n\n$list-group-color: null !default;\n$list-group-bg: $white !default;\n$list-group-border-color: rgba($black, .125) !default;\n$list-group-border-width: $border-width !default;\n$list-group-border-radius: $border-radius !default;\n\n$list-group-item-padding-y: .75rem !default;\n$list-group-item-padding-x: 1.25rem !default;\n\n$list-group-hover-bg: $gray-100 !default;\n$list-group-active-color: $component-active-color !default;\n$list-group-active-bg: $component-active-bg !default;\n$list-group-active-border-color: $list-group-active-bg !default;\n\n$list-group-disabled-color: $gray-600 !default;\n$list-group-disabled-bg: $list-group-bg !default;\n\n$list-group-action-color: $gray-700 !default;\n$list-group-action-hover-color: $list-group-action-color !default;\n\n$list-group-action-active-color: $body-color !default;\n$list-group-action-active-bg: $gray-200 !default;\n\n\n// Image thumbnails\n\n$thumbnail-padding: .25rem !default;\n$thumbnail-bg: $body-bg !default;\n$thumbnail-border-width: $border-width !default;\n$thumbnail-border-color: $gray-300 !default;\n$thumbnail-border-radius: $border-radius !default;\n$thumbnail-box-shadow: 0 1px 2px rgba($black, .075) !default;\n\n\n// Figures\n\n$figure-caption-font-size: 90% !default;\n$figure-caption-color: $gray-600 !default;\n\n\n// Breadcrumbs\n\n$breadcrumb-padding-y: .75rem !default;\n$breadcrumb-padding-x: 1rem !default;\n$breadcrumb-item-padding: .5rem !default;\n\n$breadcrumb-margin-bottom: 1rem !default;\n\n$breadcrumb-bg: $gray-200 !default;\n$breadcrumb-divider-color: $gray-600 !default;\n$breadcrumb-active-color: $gray-600 !default;\n$breadcrumb-divider: quote(\"/\") !default;\n\n$breadcrumb-border-radius: $border-radius !default;\n\n\n// Carousel\n\n$carousel-control-color: $white !default;\n$carousel-control-width: 15% !default;\n$carousel-control-opacity: .5 !default;\n$carousel-control-hover-opacity: .9 !default;\n$carousel-control-transition: opacity .15s ease !default;\n\n$carousel-indicator-width: 30px !default;\n$carousel-indicator-height: 3px !default;\n$carousel-indicator-hit-area-height: 10px !default;\n$carousel-indicator-spacer: 3px !default;\n$carousel-indicator-active-bg: $white !default;\n$carousel-indicator-transition: opacity .6s ease !default;\n\n$carousel-caption-width: 70% !default;\n$carousel-caption-color: $white !default;\n\n$carousel-control-icon-width: 20px !default;\n\n$carousel-control-prev-icon-bg: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n$carousel-control-next-icon-bg: str-replace(url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e\"), \"#\", \"%23\") !default;\n\n$carousel-transition-duration: .6s !default;\n$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)\n\n\n// Spinners\n\n$spinner-width: 2rem !default;\n$spinner-height: $spinner-width !default;\n$spinner-border-width: .25em !default;\n\n$spinner-width-sm: 1rem !default;\n$spinner-height-sm: $spinner-width-sm !default;\n$spinner-border-width-sm: .2em !default;\n\n\n// Close\n\n$close-font-size: $font-size-base * 1.5 !default;\n$close-font-weight: $font-weight-bold !default;\n$close-color: $black !default;\n$close-text-shadow: 0 1px 0 $white !default;\n\n\n// Code\n\n$code-font-size: 87.5% !default;\n$code-color: $pink !default;\n\n$kbd-padding-y: .2rem !default;\n$kbd-padding-x: .4rem !default;\n$kbd-font-size: $code-font-size !default;\n$kbd-color: $white !default;\n$kbd-bg: $gray-900 !default;\n\n$pre-color: $gray-900 !default;\n$pre-scrollable-max-height: 340px !default;\n\n\n// Utilities\n\n$displays: none, inline, inline-block, block, table, table-row, table-cell, flex, inline-flex !default;\n$overflows: auto, hidden !default;\n$positions: static, relative, absolute, fixed, sticky !default;\n\n\n// Printing\n\n$print-page-size: a3 !default;\n$print-body-min-width: map-get($grid-breakpoints, \"lg\") !default;\n","// stylelint-disable property-blacklist, scss/dollar-variable-default\n\n// SCSS RFS mixin\n//\n// Automated font-resizing\n//\n// See https://github.com/twbs/rfs\n\n// Configuration\n\n// Base font size\n$rfs-base-font-size: 1.25rem !default;\n$rfs-font-size-unit: rem !default;\n\n// Breakpoint at where font-size starts decreasing if screen width is smaller\n$rfs-breakpoint: 1200px !default;\n$rfs-breakpoint-unit: px !default;\n\n// Resize font-size based on screen height and width\n$rfs-two-dimensional: false !default;\n\n// Factor of decrease\n$rfs-factor: 10 !default;\n\n@if type-of($rfs-factor) != \"number\" or $rfs-factor <= 1 {\n @error \"`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.\";\n}\n\n// Generate enable or disable classes. Possibilities: false, \"enable\" or \"disable\"\n$rfs-class: false !default;\n\n// 1 rem = $rfs-rem-value px\n$rfs-rem-value: 16 !default;\n\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\n$rfs-safari-iframe-resize-bug-fix: false !default;\n\n// Disable RFS by setting $enable-responsive-font-sizes to false\n$enable-responsive-font-sizes: true !default;\n\n// Cache $rfs-base-font-size unit\n$rfs-base-font-size-unit: unit($rfs-base-font-size);\n\n// Remove px-unit from $rfs-base-font-size for calculations\n@if $rfs-base-font-size-unit == \"px\" {\n $rfs-base-font-size: $rfs-base-font-size / ($rfs-base-font-size * 0 + 1);\n}\n@else if $rfs-base-font-size-unit == \"rem\" {\n $rfs-base-font-size: $rfs-base-font-size / ($rfs-base-font-size * 0 + 1 / $rfs-rem-value);\n}\n\n// Cache $rfs-breakpoint unit to prevent multiple calls\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\n\n// Remove unit from $rfs-breakpoint for calculations\n@if $rfs-breakpoint-unit-cache == \"px\" {\n $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1);\n}\n@else if $rfs-breakpoint-unit-cache == \"rem\" or $rfs-breakpoint-unit-cache == \"em\" {\n $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1 / $rfs-rem-value);\n}\n\n// Responsive font-size mixin\n@mixin rfs($fs, $important: false) {\n // Cache $fs unit\n $fs-unit: if(type-of($fs) == \"number\", unit($fs), false);\n\n // Add !important suffix if needed\n $rfs-suffix: if($important, \" !important\", \"\");\n\n // If $fs isn't a number (like inherit) or $fs has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n @if not $fs-unit or $fs-unit != \"\" and $fs-unit != \"px\" and $fs-unit != \"rem\" or $fs == 0 {\n font-size: #{$fs}#{$rfs-suffix};\n }\n @else {\n // Variables for storing static and fluid rescaling\n $rfs-static: null;\n $rfs-fluid: null;\n\n // Remove px-unit from $fs for calculations\n @if $fs-unit == \"px\" {\n $fs: $fs / ($fs * 0 + 1);\n }\n @else if $fs-unit == \"rem\" {\n $fs: $fs / ($fs * 0 + 1 / $rfs-rem-value);\n }\n\n // Set default font-size\n @if $rfs-font-size-unit == rem {\n $rfs-static: #{$fs / $rfs-rem-value}rem#{$rfs-suffix};\n }\n @else if $rfs-font-size-unit == px {\n $rfs-static: #{$fs}px#{$rfs-suffix};\n }\n @else {\n @error \"`#{$rfs-font-size-unit}` is not a valid unit for $rfs-font-size-unit. Use `px` or `rem`.\";\n }\n\n // Only add media query if font-size is bigger as the minimum font-size\n // If $rfs-factor == 1, no rescaling will take place\n @if $fs > $rfs-base-font-size and $enable-responsive-font-sizes {\n $min-width: null;\n $variable-unit: null;\n\n // Calculate minimum font-size for given font-size\n $fs-min: $rfs-base-font-size + ($fs - $rfs-base-font-size) / $rfs-factor;\n\n // Calculate difference between given font-size and minimum font-size for given font-size\n $fs-diff: $fs - $fs-min;\n\n // Base font-size formatting\n // No need to check if the unit is valid, because we did that before\n $min-width: if($rfs-font-size-unit == rem, #{$fs-min / $rfs-rem-value}rem, #{$fs-min}px);\n\n // If two-dimensional, use smallest of screen width and height\n $variable-unit: if($rfs-two-dimensional, vmin, vw);\n\n // Calculate the variable width between 0 and $rfs-breakpoint\n $variable-width: #{$fs-diff * 100 / $rfs-breakpoint}#{$variable-unit};\n\n // Set the calculated font-size.\n $rfs-fluid: calc(#{$min-width} + #{$variable-width}) #{$rfs-suffix};\n }\n\n // Rendering\n @if $rfs-fluid == null {\n // Only render static font-size if no fluid font-size is available\n font-size: $rfs-static;\n }\n @else {\n $mq-value: null;\n\n // RFS breakpoint formatting\n @if $rfs-breakpoint-unit == em or $rfs-breakpoint-unit == rem {\n $mq-value: #{$rfs-breakpoint / $rfs-rem-value}#{$rfs-breakpoint-unit};\n }\n @else if $rfs-breakpoint-unit == px {\n $mq-value: #{$rfs-breakpoint}px;\n }\n @else {\n @error \"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\";\n }\n\n @if $rfs-class == \"disable\" {\n // Adding an extra class increases specificity,\n // which prevents the media query to override the font size\n &,\n .disable-responsive-font-size &,\n &.disable-responsive-font-size {\n font-size: $rfs-static;\n }\n }\n @else {\n font-size: $rfs-static;\n }\n\n @if $rfs-two-dimensional {\n @media (max-width: #{$mq-value}), (max-height: #{$mq-value}) {\n @if $rfs-class == \"enable\" {\n .enable-responsive-font-size &,\n &.enable-responsive-font-size {\n font-size: $rfs-fluid;\n }\n }\n @else {\n font-size: $rfs-fluid;\n }\n\n @if $rfs-safari-iframe-resize-bug-fix {\n // stylelint-disable-next-line length-zero-no-unit\n min-width: 0vw;\n }\n }\n }\n @else {\n @media (max-width: #{$mq-value}) {\n @if $rfs-class == \"enable\" {\n .enable-responsive-font-size &,\n &.enable-responsive-font-size {\n font-size: $rfs-fluid;\n }\n }\n @else {\n font-size: $rfs-fluid;\n }\n\n @if $rfs-safari-iframe-resize-bug-fix {\n // stylelint-disable-next-line length-zero-no-unit\n min-width: 0vw;\n }\n }\n }\n }\n }\n}\n\n// The font-size & responsive-font-size mixin uses RFS to rescale font sizes\n@mixin font-size($fs, $important: false) {\n @include rfs($fs, $important);\n}\n\n@mixin responsive-font-size($fs, $important: false) {\n @include rfs($fs, $important);\n}\n","// Hover mixin and `$enable-hover-media-query` are deprecated.\n//\n// Originally added during our alphas and maintained during betas, this mixin was\n// designed to prevent `:hover` stickiness on iOS-an issue where hover styles\n// would persist after initial touch.\n//\n// For backward compatibility, we've kept these mixins and updated them to\n// always return their regular pseudo-classes instead of a shimmed media query.\n//\n// Issue: https://github.com/twbs/bootstrap/issues/25195\n\n@mixin hover {\n &:hover { @content; }\n}\n\n@mixin hover-focus {\n &:hover,\n &:focus {\n @content;\n }\n}\n\n@mixin plain-hover-focus {\n &,\n &:hover,\n &:focus {\n @content;\n }\n}\n\n@mixin hover-focus-active {\n &:hover,\n &:focus,\n &:active {\n @content;\n }\n}\n","// stylelint-disable declaration-no-important, selector-list-comma-newline-after\n\n//\n// Headings\n//\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n margin-bottom: $headings-margin-bottom;\n font-family: $headings-font-family;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: $headings-color;\n}\n\nh1, .h1 { @include font-size($h1-font-size); }\nh2, .h2 { @include font-size($h2-font-size); }\nh3, .h3 { @include font-size($h3-font-size); }\nh4, .h4 { @include font-size($h4-font-size); }\nh5, .h5 { @include font-size($h5-font-size); }\nh6, .h6 { @include font-size($h6-font-size); }\n\n.lead {\n @include font-size($lead-font-size);\n font-weight: $lead-font-weight;\n}\n\n// Type display classes\n.display-1 {\n @include font-size($display1-size);\n font-weight: $display1-weight;\n line-height: $display-line-height;\n}\n.display-2 {\n @include font-size($display2-size);\n font-weight: $display2-weight;\n line-height: $display-line-height;\n}\n.display-3 {\n @include font-size($display3-size);\n font-weight: $display3-weight;\n line-height: $display-line-height;\n}\n.display-4 {\n @include font-size($display4-size);\n font-weight: $display4-weight;\n line-height: $display-line-height;\n}\n\n\n//\n// Horizontal rules\n//\n\nhr {\n margin-top: $hr-margin-y;\n margin-bottom: $hr-margin-y;\n border: 0;\n border-top: $hr-border-width solid $hr-border-color;\n}\n\n\n//\n// Emphasis\n//\n\nsmall,\n.small {\n @include font-size($small-font-size);\n font-weight: $font-weight-normal;\n}\n\nmark,\n.mark {\n padding: $mark-padding;\n background-color: $mark-bg;\n}\n\n\n//\n// Lists\n//\n\n.list-unstyled {\n @include list-unstyled;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n @include list-unstyled;\n}\n.list-inline-item {\n display: inline-block;\n\n &:not(:last-child) {\n margin-right: $list-inline-padding;\n }\n}\n\n\n//\n// Misc\n//\n\n// Builds on `abbr`\n.initialism {\n @include font-size(90%);\n text-transform: uppercase;\n}\n\n// Blockquotes\n.blockquote {\n margin-bottom: $spacer;\n @include font-size($blockquote-font-size);\n}\n\n.blockquote-footer {\n display: block;\n @include font-size($blockquote-small-font-size);\n color: $blockquote-small-color;\n\n &::before {\n content: \"\\2014\\00A0\"; // em dash, nbsp\n }\n}\n","// Lists\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n@mixin list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n","// Responsive images (ensure images don't scale beyond their parents)\n//\n// This is purposefully opt-in via an explicit class rather than being the default for all ``s.\n// We previously tried the \"images are responsive by default\" approach in Bootstrap v2,\n// and abandoned it in Bootstrap v3 because it breaks lots of third-party widgets (including Google Maps)\n// which weren't expecting the images within themselves to be involuntarily resized.\n// See also https://github.com/twbs/bootstrap/issues/18178\n.img-fluid {\n @include img-fluid;\n}\n\n\n// Image thumbnails\n.img-thumbnail {\n padding: $thumbnail-padding;\n background-color: $thumbnail-bg;\n border: $thumbnail-border-width solid $thumbnail-border-color;\n @include border-radius($thumbnail-border-radius);\n @include box-shadow($thumbnail-box-shadow);\n\n // Keep them at most 100% wide\n @include img-fluid;\n}\n\n//\n// Figures\n//\n\n.figure {\n // Ensures the caption's text aligns with the image.\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: $spacer / 2;\n line-height: 1;\n}\n\n.figure-caption {\n @include font-size($figure-caption-font-size);\n color: $figure-caption-color;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n\n@mixin img-fluid {\n // Part 1: Set a maximum relative to the parent\n max-width: 100%;\n // Part 2: Override the height to auto, otherwise images will be stretched\n // when setting a width and height attribute on the img element.\n height: auto;\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size.\n\n@mixin img-retina($file-1x, $file-2x, $width-1x, $height-1x) {\n background-image: url($file-1x);\n\n // Autoprefixer takes care of adding -webkit-min-device-pixel-ratio and -o-min-device-pixel-ratio,\n // but doesn't convert dppx=>dpi.\n // There's no such thing as unprefixed min-device-pixel-ratio since it's nonstandard.\n // Compatibility info: https://caniuse.com/#feat=css-media-resolution\n @media only screen and (min-resolution: 192dpi), // IE9-11 don't support dppx\n only screen and (min-resolution: 2dppx) { // Standardized\n background-image: url($file-2x);\n background-size: $width-1x $height-1x;\n }\n @include deprecate(\"`img-retina()`\", \"v4.3.0\", \"v5\");\n}\n","// stylelint-disable property-blacklist\n// Single side border-radius\n\n@mixin border-radius($radius: $border-radius, $fallback-border-radius: false) {\n @if $enable-rounded {\n border-radius: $radius;\n }\n @else if $fallback-border-radius != false {\n border-radius: $fallback-border-radius;\n }\n}\n\n@mixin border-top-radius($radius) {\n @if $enable-rounded {\n border-top-left-radius: $radius;\n border-top-right-radius: $radius;\n }\n}\n\n@mixin border-right-radius($radius) {\n @if $enable-rounded {\n border-top-right-radius: $radius;\n border-bottom-right-radius: $radius;\n }\n}\n\n@mixin border-bottom-radius($radius) {\n @if $enable-rounded {\n border-bottom-right-radius: $radius;\n border-bottom-left-radius: $radius;\n }\n}\n\n@mixin border-left-radius($radius) {\n @if $enable-rounded {\n border-top-left-radius: $radius;\n border-bottom-left-radius: $radius;\n }\n}\n\n@mixin border-top-left-radius($radius) {\n @if $enable-rounded {\n border-top-left-radius: $radius;\n }\n}\n\n@mixin border-top-right-radius($radius) {\n @if $enable-rounded {\n border-top-right-radius: $radius;\n }\n}\n\n@mixin border-bottom-right-radius($radius) {\n @if $enable-rounded {\n border-bottom-right-radius: $radius;\n }\n}\n\n@mixin border-bottom-left-radius($radius) {\n @if $enable-rounded {\n border-bottom-left-radius: $radius;\n }\n}\n","// Inline code\ncode {\n @include font-size($code-font-size);\n color: $code-color;\n word-break: break-word;\n\n // Streamline the style when inside anchors to avoid broken underline and more\n a > & {\n color: inherit;\n }\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: $kbd-padding-y $kbd-padding-x;\n @include font-size($kbd-font-size);\n color: $kbd-color;\n background-color: $kbd-bg;\n @include border-radius($border-radius-sm);\n @include box-shadow($kbd-box-shadow);\n\n kbd {\n padding: 0;\n @include font-size(100%);\n font-weight: $nested-kbd-font-weight;\n @include box-shadow(none);\n }\n}\n\n// Blocks of code\npre {\n display: block;\n @include font-size($code-font-size);\n color: $pre-color;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n @include font-size(inherit);\n color: inherit;\n word-break: normal;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: $pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-grid-classes {\n .container {\n @include make-container();\n @include make-container-max-widths();\n }\n}\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but with 100% width for\n// fluid, full width layouts.\n\n@if $enable-grid-classes {\n .container-fluid {\n @include make-container();\n }\n}\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n@if $enable-grid-classes {\n .row {\n @include make-row();\n }\n\n // Remove the negative margin from default .row, then the horizontal padding\n // from all immediate children columns (to prevent runaway style inheritance).\n .no-gutters {\n margin-right: 0;\n margin-left: 0;\n\n > .col,\n > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n }\n }\n}\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n @include make-grid-columns();\n}\n","/// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-container($gutter: $grid-gutter-width) {\n width: 100%;\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n margin-right: auto;\n margin-left: auto;\n}\n\n\n// For each breakpoint, define the maximum width of the container in a media query\n@mixin make-container-max-widths($max-widths: $container-max-widths, $breakpoints: $grid-breakpoints) {\n @each $breakpoint, $container-max-width in $max-widths {\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n max-width: $container-max-width;\n }\n }\n}\n\n@mixin make-row($gutter: $grid-gutter-width) {\n display: flex;\n flex-wrap: wrap;\n margin-right: -$gutter / 2;\n margin-left: -$gutter / 2;\n}\n\n@mixin make-col-ready($gutter: $grid-gutter-width) {\n position: relative;\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we use `flex` values\n // later on to override this initial width.\n width: 100%;\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n}\n\n@mixin make-col($size, $columns: $grid-columns) {\n flex: 0 0 percentage($size / $columns);\n // Add a `max-width` to ensure content within each column does not blow out\n // the width of the column. Applies to IE10+ and Firefox. Chrome and Safari\n // do not appear to require this.\n max-width: percentage($size / $columns);\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: $size / $columns;\n margin-left: if($num == 0, 0, percentage($num));\n}\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @return if($n != null and $n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width. Null for the largest (last) breakpoint.\n// The maximum value is calculated as the minimum of the next one less 0.02px\n// to work around the limitations of `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $next: breakpoint-next($name, $breakpoints);\n @return if($next, breakpoint-min($next, $breakpoints) - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $max: breakpoint-max($name, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($name, $breakpoints) {\n @content;\n }\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n // Common properties for all breakpoints\n %grid-column {\n position: relative;\n width: 100%;\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n }\n\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n // Allow columns to stretch full width below their breakpoints\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @extend %grid-column;\n }\n }\n .col#{$infix},\n .col#{$infix}-auto {\n @extend %grid-column;\n }\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col#{$infix}-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%; // Reset earlier grid tiers\n }\n\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n .order#{$infix}-first { order: -1; }\n\n .order#{$infix}-last { order: $columns + 1; }\n\n @for $i from 0 through $columns {\n .order#{$infix}-#{$i} { order: $i; }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n }\n}\n","//\n// Basic Bootstrap table\n//\n\n.table {\n width: 100%;\n margin-bottom: $spacer;\n color: $table-color;\n background-color: $table-bg; // Reset for nesting within parents with `background-color`.\n\n th,\n td {\n padding: $table-cell-padding;\n vertical-align: top;\n border-top: $table-border-width solid $table-border-color;\n }\n\n thead th {\n vertical-align: bottom;\n border-bottom: (2 * $table-border-width) solid $table-border-color;\n }\n\n tbody + tbody {\n border-top: (2 * $table-border-width) solid $table-border-color;\n }\n}\n\n\n//\n// Condensed table w/ half padding\n//\n\n.table-sm {\n th,\n td {\n padding: $table-cell-padding-sm;\n }\n}\n\n\n// Border versions\n//\n// Add or remove borders all around the table and between all the columns.\n\n.table-bordered {\n border: $table-border-width solid $table-border-color;\n\n th,\n td {\n border: $table-border-width solid $table-border-color;\n }\n\n thead {\n th,\n td {\n border-bottom-width: 2 * $table-border-width;\n }\n }\n}\n\n.table-borderless {\n th,\n td,\n thead th,\n tbody + tbody {\n border: 0;\n }\n}\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n tbody tr:nth-of-type(#{$table-striped-order}) {\n background-color: $table-accent-bg;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n tbody tr {\n @include hover {\n color: $table-hover-color;\n background-color: $table-hover-bg;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n@each $color, $value in $theme-colors {\n @include table-row-variant($color, theme-color-level($color, $table-bg-level), theme-color-level($color, $table-border-level));\n}\n\n@include table-row-variant(active, $table-active-bg);\n\n\n// Dark styles\n//\n// Same table markup, but inverted color scheme: dark background and light text.\n\n// stylelint-disable-next-line no-duplicate-selectors\n.table {\n .thead-dark {\n th {\n color: $table-dark-color;\n background-color: $table-dark-bg;\n border-color: $table-dark-border-color;\n }\n }\n\n .thead-light {\n th {\n color: $table-head-color;\n background-color: $table-head-bg;\n border-color: $table-border-color;\n }\n }\n}\n\n.table-dark {\n color: $table-dark-color;\n background-color: $table-dark-bg;\n\n th,\n td,\n thead th {\n border-color: $table-dark-border-color;\n }\n\n &.table-bordered {\n border: 0;\n }\n\n &.table-striped {\n tbody tr:nth-of-type(odd) {\n background-color: $table-dark-accent-bg;\n }\n }\n\n &.table-hover {\n tbody tr {\n @include hover {\n color: $table-dark-hover-color;\n background-color: $table-dark-hover-bg;\n }\n }\n }\n}\n\n\n// Responsive tables\n//\n// Generate series of `.table-responsive-*` classes for configuring the screen\n// size of where your table will overflow.\n\n.table-responsive {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $next: breakpoint-next($breakpoint, $grid-breakpoints);\n $infix: breakpoint-infix($next, $grid-breakpoints);\n\n &#{$infix} {\n @include media-breakpoint-down($breakpoint) {\n display: block;\n width: 100%;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n\n // Prevent double border on horizontal scroll due to use of `display: block;`\n > .table-bordered {\n border: 0;\n }\n }\n }\n }\n}\n","// Tables\n\n@mixin table-row-variant($state, $background, $border: null) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table-#{$state} {\n &,\n > th,\n > td {\n background-color: $background;\n }\n\n @if $border != null {\n th,\n td,\n thead th,\n tbody + tbody {\n border-color: $border;\n }\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover {\n $hover-background: darken($background, 5%);\n\n .table-#{$state} {\n @include hover {\n background-color: $hover-background;\n\n > td,\n > th {\n background-color: $hover-background;\n }\n }\n }\n }\n}\n","// Bootstrap functions\n//\n// Utility mixins and functions for evaluating source code across our variables, maps, and mixins.\n\n// Ascending\n// Used to evaluate Sass maps like our grid breakpoints.\n@mixin _assert-ascending($map, $map-name) {\n $prev-key: null;\n $prev-num: null;\n @each $key, $num in $map {\n @if $prev-num == null or unit($num) == \"%\" {\n // Do nothing\n } @else if not comparable($prev-num, $num) {\n @warn \"Potentially invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} whose unit makes it incomparable to #{$prev-num}, the value of the previous key '#{$prev-key}' !\";\n } @else if $prev-num >= $num {\n @warn \"Invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} which isn't greater than #{$prev-num}, the value of the previous key '#{$prev-key}' !\";\n }\n $prev-key: $key;\n $prev-num: $num;\n }\n}\n\n// Starts at zero\n// Used to ensure the min-width of the lowest breakpoint starts at 0.\n@mixin _assert-starts-at-zero($map, $map-name: \"$grid-breakpoints\") {\n $values: map-values($map);\n $first-value: nth($values, 1);\n @if $first-value != 0 {\n @warn \"First breakpoint in #{$map-name} must start at 0, but starts at #{$first-value}.\";\n }\n}\n\n// Replace `$search` with `$replace` in `$string`\n// Used on our SVG icon backgrounds for custom forms.\n//\n// @author Hugo Giraudel\n// @param {String} $string - Initial string\n// @param {String} $search - Substring to replace\n// @param {String} $replace ('') - New value\n// @return {String} - Updated string\n@function str-replace($string, $search, $replace: \"\") {\n $index: str-index($string, $search);\n\n @if $index {\n @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace);\n }\n\n @return $string;\n}\n\n// Color contrast\n@function color-yiq($color, $dark: $yiq-text-dark, $light: $yiq-text-light) {\n $r: red($color);\n $g: green($color);\n $b: blue($color);\n\n $yiq: (($r * 299) + ($g * 587) + ($b * 114)) / 1000;\n\n @if ($yiq >= $yiq-contrasted-threshold) {\n @return $dark;\n } @else {\n @return $light;\n }\n}\n\n// Retrieve color Sass maps\n@function color($key: \"blue\") {\n @return map-get($colors, $key);\n}\n\n@function theme-color($key: \"primary\") {\n @return map-get($theme-colors, $key);\n}\n\n@function gray($key: \"100\") {\n @return map-get($grays, $key);\n}\n\n// Request a theme color level\n@function theme-color-level($color-name: \"primary\", $level: 0) {\n $color: theme-color($color-name);\n $color-base: if($level > 0, $black, $white);\n $level: abs($level);\n\n @return mix($color-base, $color, $level * $theme-color-interval);\n}\n","// stylelint-disable selector-no-qualifying-type\n\n//\n// Textual form controls\n//\n\n.form-control {\n display: block;\n width: 100%;\n height: $input-height;\n padding: $input-padding-y $input-padding-x;\n font-family: $input-font-family;\n @include font-size($input-font-size);\n font-weight: $input-font-weight;\n line-height: $input-line-height;\n color: $input-color;\n background-color: $input-bg;\n background-clip: padding-box;\n border: $input-border-width solid $input-border-color;\n\n // Note: This has no effect on `s in CSS.\n @include border-radius($input-border-radius, 0);\n\n @include box-shadow($input-box-shadow);\n @include transition($input-transition);\n\n // Unstyle the caret on ` receives focus\n // in IE and (under certain conditions) Edge, as it looks bad and cannot be made to\n // match the appearance of the native widget.\n // See https://github.com/twbs/bootstrap/issues/19398.\n color: $input-color;\n background-color: $input-bg;\n }\n}\n\n// Make file inputs better match text inputs by forcing them to new lines.\n.form-control-file,\n.form-control-range {\n display: block;\n width: 100%;\n}\n\n\n//\n// Labels\n//\n\n// For use with horizontal and inline forms, when you need the label (or legend)\n// text to align with the form controls.\n.col-form-label {\n padding-top: calc(#{$input-padding-y} + #{$input-border-width});\n padding-bottom: calc(#{$input-padding-y} + #{$input-border-width});\n margin-bottom: 0; // Override the `
',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",sanitize:!0,sanitizeFn:null,whiteList:Ee},je="show",He="out",Re={HIDE:"hide"+De,HIDDEN:"hidden"+De,SHOW:"show"+De,SHOWN:"shown"+De,INSERTED:"inserted"+De,CLICK:"click"+De,FOCUSIN:"focusin"+De,FOCUSOUT:"focusout"+De,MOUSEENTER:"mouseenter"+De,MOUSELEAVE:"mouseleave"+De},xe="fade",Fe="show",Ue=".tooltip-inner",We=".arrow",qe="hover",Me="focus",Ke="click",Qe="manual",Be=function(){function i(t,e){if("undefined"==typeof u)throw new TypeError("Bootstrap's tooltips require Popper.js (https://popper.js.org/)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var t=i.prototype;return t.enable=function(){this._isEnabled=!0},t.disable=function(){this._isEnabled=!1},t.toggleEnabled=function(){this._isEnabled=!this._isEnabled},t.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=g(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(g(this.getTipElement()).hasClass(Fe))return void this._leave(null,this);this._enter(null,this)}},t.dispose=function(){clearTimeout(this._timeout),g.removeData(this.element,this.constructor.DATA_KEY),g(this.element).off(this.constructor.EVENT_KEY),g(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&g(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,(this._activeTrigger=null)!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},t.show=function(){var e=this;if("none"===g(this.element).css("display"))throw new Error("Please use show on visible elements");var t=g.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){g(this.element).trigger(t);var n=_.findShadowRoot(this.element),i=g.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(t.isDefaultPrevented()||!i)return;var o=this.getTipElement(),r=_.getUID(this.constructor.NAME);o.setAttribute("id",r),this.element.setAttribute("aria-describedby",r),this.setContent(),this.config.animation&&g(o).addClass(xe);var s="function"==typeof this.config.placement?this.config.placement.call(this,o,this.element):this.config.placement,a=this._getAttachment(s);this.addAttachmentClass(a);var l=this._getContainer();g(o).data(this.constructor.DATA_KEY,this),g.contains(this.element.ownerDocument.documentElement,this.tip)||g(o).appendTo(l),g(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new u(this.element,o,{placement:a,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:We},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}}),g(o).addClass(Fe),"ontouchstart"in document.documentElement&&g(document.body).children().on("mouseover",null,g.noop);var c=function(){e.config.animation&&e._fixTransition();var t=e._hoverState;e._hoverState=null,g(e.element).trigger(e.constructor.Event.SHOWN),t===He&&e._leave(null,e)};if(g(this.tip).hasClass(xe)){var h=_.getTransitionDurationFromElement(this.tip);g(this.tip).one(_.TRANSITION_END,c).emulateTransitionEnd(h)}else c()}},t.hide=function(t){var e=this,n=this.getTipElement(),i=g.Event(this.constructor.Event.HIDE),o=function(){e._hoverState!==je&&n.parentNode&&n.parentNode.removeChild(n),e._cleanTipClass(),e.element.removeAttribute("aria-describedby"),g(e.element).trigger(e.constructor.Event.HIDDEN),null!==e._popper&&e._popper.destroy(),t&&t()};if(g(this.element).trigger(i),!i.isDefaultPrevented()){if(g(n).removeClass(Fe),"ontouchstart"in document.documentElement&&g(document.body).children().off("mouseover",null,g.noop),this._activeTrigger[Ke]=!1,this._activeTrigger[Me]=!1,this._activeTrigger[qe]=!1,g(this.tip).hasClass(xe)){var r=_.getTransitionDurationFromElement(n);g(n).one(_.TRANSITION_END,o).emulateTransitionEnd(r)}else o();this._hoverState=""}},t.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},t.isWithContent=function(){return Boolean(this.getTitle())},t.addAttachmentClass=function(t){g(this.getTipElement()).addClass(Ae+"-"+t)},t.getTipElement=function(){return this.tip=this.tip||g(this.config.template)[0],this.tip},t.setContent=function(){var t=this.getTipElement();this.setElementContent(g(t.querySelectorAll(Ue)),this.getTitle()),g(t).removeClass(xe+" "+Fe)},t.setElementContent=function(t,e){"object"!=typeof e||!e.nodeType&&!e.jquery?this.config.html?(this.config.sanitize&&(e=Se(e,this.config.whiteList,this.config.sanitizeFn)),t.html(e)):t.text(e):this.config.html?g(e).parent().is(t)||t.empty().append(e):t.text(g(e).text())},t.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},t._getOffset=function(){var e=this,t={};return"function"==typeof this.config.offset?t.fn=function(t){return t.offsets=l({},t.offsets,e.config.offset(t.offsets,e.element)||{}),t}:t.offset=this.config.offset,t},t._getContainer=function(){return!1===this.config.container?document.body:_.isElement(this.config.container)?g(this.config.container):g(document).find(this.config.container)},t._getAttachment=function(t){return Pe[t.toUpperCase()]},t._setListeners=function(){var i=this;this.config.trigger.split(" ").forEach(function(t){if("click"===t)g(i.element).on(i.constructor.Event.CLICK,i.config.selector,function(t){return i.toggle(t)});else if(t!==Qe){var e=t===qe?i.constructor.Event.MOUSEENTER:i.constructor.Event.FOCUSIN,n=t===qe?i.constructor.Event.MOUSELEAVE:i.constructor.Event.FOCUSOUT;g(i.element).on(e,i.config.selector,function(t){return i._enter(t)}).on(n,i.config.selector,function(t){return i._leave(t)})}}),g(this.element).closest(".modal").on("hide.bs.modal",function(){i.element&&i.hide()}),this.config.selector?this.config=l({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},t._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},t._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||g(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusin"===t.type?Me:qe]=!0),g(e.getTipElement()).hasClass(Fe)||e._hoverState===je?e._hoverState=je:(clearTimeout(e._timeout),e._hoverState=je,e.config.delay&&e.config.delay.show?e._timeout=setTimeout(function(){e._hoverState===je&&e.show()},e.config.delay.show):e.show())},t._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||g(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusout"===t.type?Me:qe]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=He,e.config.delay&&e.config.delay.hide?e._timeout=setTimeout(function(){e._hoverState===He&&e.hide()},e.config.delay.hide):e.hide())},t._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},t._getConfig=function(t){var e=g(this.element).data();return Object.keys(e).forEach(function(t){-1!==Oe.indexOf(t)&&delete e[t]}),"number"==typeof(t=l({},this.constructor.Default,e,"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),_.typeCheckConfig(be,t,this.constructor.DefaultType),t.sanitize&&(t.template=Se(t.template,t.whiteList,t.sanitizeFn)),t},t._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},t._cleanTipClass=function(){var t=g(this.getTipElement()),e=t.attr("class").match(Ne);null!==e&&e.length&&t.removeClass(e.join(""))},t._handlePopperPlacementChange=function(t){var e=t.instance;this.tip=e.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},t._fixTransition=function(){var t=this.getTipElement(),e=this.config.animation;null===t.getAttribute("x-placement")&&(g(t).removeClass(xe),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},i._jQueryInterface=function(n){return this.each(function(){var t=g(this).data(Ie),e="object"==typeof n&&n;if((t||!/dispose|hide/.test(n))&&(t||(t=new i(this,e),g(this).data(Ie,t)),"string"==typeof n)){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return Le}},{key:"NAME",get:function(){return be}},{key:"DATA_KEY",get:function(){return Ie}},{key:"Event",get:function(){return Re}},{key:"EVENT_KEY",get:function(){return De}},{key:"DefaultType",get:function(){return ke}}]),i}();g.fn[be]=Be._jQueryInterface,g.fn[be].Constructor=Be,g.fn[be].noConflict=function(){return g.fn[be]=we,Be._jQueryInterface};var Ve="popover",Ye="bs.popover",ze="."+Ye,Xe=g.fn[Ve],$e="bs-popover",Ge=new RegExp("(^|\\s)"+$e+"\\S+","g"),Je=l({},Be.Default,{placement:"right",trigger:"click",content:"",template:''}),Ze=l({},Be.DefaultType,{content:"(string|element|function)"}),tn="fade",en="show",nn=".popover-header",on=".popover-body",rn={HIDE:"hide"+ze,HIDDEN:"hidden"+ze,SHOW:"show"+ze,SHOWN:"shown"+ze,INSERTED:"inserted"+ze,CLICK:"click"+ze,FOCUSIN:"focusin"+ze,FOCUSOUT:"focusout"+ze,MOUSEENTER:"mouseenter"+ze,MOUSELEAVE:"mouseleave"+ze},sn=function(t){var e,n;function i(){return t.apply(this,arguments)||this}n=t,(e=i).prototype=Object.create(n.prototype),(e.prototype.constructor=e).__proto__=n;var o=i.prototype;return o.isWithContent=function(){return this.getTitle()||this._getContent()},o.addAttachmentClass=function(t){g(this.getTipElement()).addClass($e+"-"+t)},o.getTipElement=function(){return this.tip=this.tip||g(this.config.template)[0],this.tip},o.setContent=function(){var t=g(this.getTipElement());this.setElementContent(t.find(nn),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(on),e),t.removeClass(tn+" "+en)},o._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},o._cleanTipClass=function(){var t=g(this.getTipElement()),e=t.attr("class").match(Ge);null!==e&&0=this._offsets[o]&&("undefined"==typeof this._offsets[o+1]||t {\n called = true\n })\n\n setTimeout(() => {\n if (!called) {\n Util.triggerTransitionEnd(this)\n }\n }, duration)\n\n return this\n}\n\nfunction setTransitionEndSupport() {\n $.fn.emulateTransitionEnd = transitionEndEmulator\n $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent()\n}\n\n/**\n * --------------------------------------------------------------------------\n * Public Util Api\n * --------------------------------------------------------------------------\n */\n\nconst Util = {\n\n TRANSITION_END: 'bsTransitionEnd',\n\n getUID(prefix) {\n do {\n // eslint-disable-next-line no-bitwise\n prefix += ~~(Math.random() * MAX_UID) // \"~~\" acts like a faster Math.floor() here\n } while (document.getElementById(prefix))\n return prefix\n },\n\n getSelectorFromElement(element) {\n let selector = element.getAttribute('data-target')\n\n if (!selector || selector === '#') {\n const hrefAttr = element.getAttribute('href')\n selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : ''\n }\n\n try {\n return document.querySelector(selector) ? selector : null\n } catch (err) {\n return null\n }\n },\n\n getTransitionDurationFromElement(element) {\n if (!element) {\n return 0\n }\n\n // Get transition-duration of the element\n let transitionDuration = $(element).css('transition-duration')\n let transitionDelay = $(element).css('transition-delay')\n\n const floatTransitionDuration = parseFloat(transitionDuration)\n const floatTransitionDelay = parseFloat(transitionDelay)\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0]\n transitionDelay = transitionDelay.split(',')[0]\n\n return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\n },\n\n reflow(element) {\n return element.offsetHeight\n },\n\n triggerTransitionEnd(element) {\n $(element).trigger(TRANSITION_END)\n },\n\n // TODO: Remove in v5\n supportsTransitionEnd() {\n return Boolean(TRANSITION_END)\n },\n\n isElement(obj) {\n return (obj[0] || obj).nodeType\n },\n\n typeCheckConfig(componentName, config, configTypes) {\n for (const property in configTypes) {\n if (Object.prototype.hasOwnProperty.call(configTypes, property)) {\n const expectedTypes = configTypes[property]\n const value = config[property]\n const valueType = value && Util.isElement(value)\n ? 'element' : toType(value)\n\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new Error(\n `${componentName.toUpperCase()}: ` +\n `Option \"${property}\" provided type \"${valueType}\" ` +\n `but expected type \"${expectedTypes}\".`)\n }\n }\n }\n },\n\n findShadowRoot(element) {\n if (!document.documentElement.attachShadow) {\n return null\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode()\n return root instanceof ShadowRoot ? root : null\n }\n\n if (element instanceof ShadowRoot) {\n return element\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null\n }\n\n return Util.findShadowRoot(element.parentNode)\n }\n}\n\nsetTransitionEndSupport()\n\nexport default Util\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'alert'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.alert'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst Selector = {\n DISMISS : '[data-dismiss=\"alert\"]'\n}\n\nconst Event = {\n CLOSE : `close${EVENT_KEY}`,\n CLOSED : `closed${EVENT_KEY}`,\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n ALERT : 'alert',\n FADE : 'fade',\n SHOW : 'show'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Alert {\n constructor(element) {\n this._element = element\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n // Public\n\n close(element) {\n let rootElement = this._element\n if (element) {\n rootElement = this._getRootElement(element)\n }\n\n const customEvent = this._triggerCloseEvent(rootElement)\n\n if (customEvent.isDefaultPrevented()) {\n return\n }\n\n this._removeElement(rootElement)\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n this._element = null\n }\n\n // Private\n\n _getRootElement(element) {\n const selector = Util.getSelectorFromElement(element)\n let parent = false\n\n if (selector) {\n parent = document.querySelector(selector)\n }\n\n if (!parent) {\n parent = $(element).closest(`.${ClassName.ALERT}`)[0]\n }\n\n return parent\n }\n\n _triggerCloseEvent(element) {\n const closeEvent = $.Event(Event.CLOSE)\n\n $(element).trigger(closeEvent)\n return closeEvent\n }\n\n _removeElement(element) {\n $(element).removeClass(ClassName.SHOW)\n\n if (!$(element).hasClass(ClassName.FADE)) {\n this._destroyElement(element)\n return\n }\n\n const transitionDuration = Util.getTransitionDurationFromElement(element)\n\n $(element)\n .one(Util.TRANSITION_END, (event) => this._destroyElement(element, event))\n .emulateTransitionEnd(transitionDuration)\n }\n\n _destroyElement(element) {\n $(element)\n .detach()\n .trigger(Event.CLOSED)\n .remove()\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n const $element = $(this)\n let data = $element.data(DATA_KEY)\n\n if (!data) {\n data = new Alert(this)\n $element.data(DATA_KEY, data)\n }\n\n if (config === 'close') {\n data[config](this)\n }\n })\n }\n\n static _handleDismiss(alertInstance) {\n return function (event) {\n if (event) {\n event.preventDefault()\n }\n\n alertInstance.close(this)\n }\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document).on(\n Event.CLICK_DATA_API,\n Selector.DISMISS,\n Alert._handleDismiss(new Alert())\n)\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Alert._jQueryInterface\n$.fn[NAME].Constructor = Alert\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Alert._jQueryInterface\n}\n\nexport default Alert\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'button'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.button'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst ClassName = {\n ACTIVE : 'active',\n BUTTON : 'btn',\n FOCUS : 'focus'\n}\n\nconst Selector = {\n DATA_TOGGLE_CARROT : '[data-toggle^=\"button\"]',\n DATA_TOGGLE : '[data-toggle=\"buttons\"]',\n INPUT : 'input:not([type=\"hidden\"])',\n ACTIVE : '.active',\n BUTTON : '.btn'\n}\n\nconst Event = {\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`,\n FOCUS_BLUR_DATA_API : `focus${EVENT_KEY}${DATA_API_KEY} ` +\n `blur${EVENT_KEY}${DATA_API_KEY}`\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Button {\n constructor(element) {\n this._element = element\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n // Public\n\n toggle() {\n let triggerChangeEvent = true\n let addAriaPressed = true\n const rootElement = $(this._element).closest(\n Selector.DATA_TOGGLE\n )[0]\n\n if (rootElement) {\n const input = this._element.querySelector(Selector.INPUT)\n\n if (input) {\n if (input.type === 'radio') {\n if (input.checked &&\n this._element.classList.contains(ClassName.ACTIVE)) {\n triggerChangeEvent = false\n } else {\n const activeElement = rootElement.querySelector(Selector.ACTIVE)\n\n if (activeElement) {\n $(activeElement).removeClass(ClassName.ACTIVE)\n }\n }\n }\n\n if (triggerChangeEvent) {\n if (input.hasAttribute('disabled') ||\n rootElement.hasAttribute('disabled') ||\n input.classList.contains('disabled') ||\n rootElement.classList.contains('disabled')) {\n return\n }\n input.checked = !this._element.classList.contains(ClassName.ACTIVE)\n $(input).trigger('change')\n }\n\n input.focus()\n addAriaPressed = false\n }\n }\n\n if (addAriaPressed) {\n this._element.setAttribute('aria-pressed',\n !this._element.classList.contains(ClassName.ACTIVE))\n }\n\n if (triggerChangeEvent) {\n $(this._element).toggleClass(ClassName.ACTIVE)\n }\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n this._element = null\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n\n if (!data) {\n data = new Button(this)\n $(this).data(DATA_KEY, data)\n }\n\n if (config === 'toggle') {\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document)\n .on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, (event) => {\n event.preventDefault()\n\n let button = event.target\n\n if (!$(button).hasClass(ClassName.BUTTON)) {\n button = $(button).closest(Selector.BUTTON)\n }\n\n Button._jQueryInterface.call($(button), 'toggle')\n })\n .on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT, (event) => {\n const button = $(event.target).closest(Selector.BUTTON)[0]\n $(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type))\n })\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Button._jQueryInterface\n$.fn[NAME].Constructor = Button\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Button._jQueryInterface\n}\n\nexport default Button\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'carousel'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.carousel'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst ARROW_LEFT_KEYCODE = 37 // KeyboardEvent.which value for left arrow key\nconst ARROW_RIGHT_KEYCODE = 39 // KeyboardEvent.which value for right arrow key\nconst TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fire after touch\nconst SWIPE_THRESHOLD = 40\n\nconst Default = {\n interval : 5000,\n keyboard : true,\n slide : false,\n pause : 'hover',\n wrap : true,\n touch : true\n}\n\nconst DefaultType = {\n interval : '(number|boolean)',\n keyboard : 'boolean',\n slide : '(boolean|string)',\n pause : '(string|boolean)',\n wrap : 'boolean',\n touch : 'boolean'\n}\n\nconst Direction = {\n NEXT : 'next',\n PREV : 'prev',\n LEFT : 'left',\n RIGHT : 'right'\n}\n\nconst Event = {\n SLIDE : `slide${EVENT_KEY}`,\n SLID : `slid${EVENT_KEY}`,\n KEYDOWN : `keydown${EVENT_KEY}`,\n MOUSEENTER : `mouseenter${EVENT_KEY}`,\n MOUSELEAVE : `mouseleave${EVENT_KEY}`,\n TOUCHSTART : `touchstart${EVENT_KEY}`,\n TOUCHMOVE : `touchmove${EVENT_KEY}`,\n TOUCHEND : `touchend${EVENT_KEY}`,\n POINTERDOWN : `pointerdown${EVENT_KEY}`,\n POINTERUP : `pointerup${EVENT_KEY}`,\n DRAG_START : `dragstart${EVENT_KEY}`,\n LOAD_DATA_API : `load${EVENT_KEY}${DATA_API_KEY}`,\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n CAROUSEL : 'carousel',\n ACTIVE : 'active',\n SLIDE : 'slide',\n RIGHT : 'carousel-item-right',\n LEFT : 'carousel-item-left',\n NEXT : 'carousel-item-next',\n PREV : 'carousel-item-prev',\n ITEM : 'carousel-item',\n POINTER_EVENT : 'pointer-event'\n}\n\nconst Selector = {\n ACTIVE : '.active',\n ACTIVE_ITEM : '.active.carousel-item',\n ITEM : '.carousel-item',\n ITEM_IMG : '.carousel-item img',\n NEXT_PREV : '.carousel-item-next, .carousel-item-prev',\n INDICATORS : '.carousel-indicators',\n DATA_SLIDE : '[data-slide], [data-slide-to]',\n DATA_RIDE : '[data-ride=\"carousel\"]'\n}\n\nconst PointerType = {\n TOUCH : 'touch',\n PEN : 'pen'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\nclass Carousel {\n constructor(element, config) {\n this._items = null\n this._interval = null\n this._activeElement = null\n this._isPaused = false\n this._isSliding = false\n this.touchTimeout = null\n this.touchStartX = 0\n this.touchDeltaX = 0\n\n this._config = this._getConfig(config)\n this._element = element\n this._indicatorsElement = this._element.querySelector(Selector.INDICATORS)\n this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0\n this._pointerEvent = Boolean(window.PointerEvent || window.MSPointerEvent)\n\n this._addEventListeners()\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n next() {\n if (!this._isSliding) {\n this._slide(Direction.NEXT)\n }\n }\n\n nextWhenVisible() {\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden &&\n ($(this._element).is(':visible') && $(this._element).css('visibility') !== 'hidden')) {\n this.next()\n }\n }\n\n prev() {\n if (!this._isSliding) {\n this._slide(Direction.PREV)\n }\n }\n\n pause(event) {\n if (!event) {\n this._isPaused = true\n }\n\n if (this._element.querySelector(Selector.NEXT_PREV)) {\n Util.triggerTransitionEnd(this._element)\n this.cycle(true)\n }\n\n clearInterval(this._interval)\n this._interval = null\n }\n\n cycle(event) {\n if (!event) {\n this._isPaused = false\n }\n\n if (this._interval) {\n clearInterval(this._interval)\n this._interval = null\n }\n\n if (this._config.interval && !this._isPaused) {\n this._interval = setInterval(\n (document.visibilityState ? this.nextWhenVisible : this.next).bind(this),\n this._config.interval\n )\n }\n }\n\n to(index) {\n this._activeElement = this._element.querySelector(Selector.ACTIVE_ITEM)\n\n const activeIndex = this._getItemIndex(this._activeElement)\n\n if (index > this._items.length - 1 || index < 0) {\n return\n }\n\n if (this._isSliding) {\n $(this._element).one(Event.SLID, () => this.to(index))\n return\n }\n\n if (activeIndex === index) {\n this.pause()\n this.cycle()\n return\n }\n\n const direction = index > activeIndex\n ? Direction.NEXT\n : Direction.PREV\n\n this._slide(direction, this._items[index])\n }\n\n dispose() {\n $(this._element).off(EVENT_KEY)\n $.removeData(this._element, DATA_KEY)\n\n this._items = null\n this._config = null\n this._element = null\n this._interval = null\n this._isPaused = null\n this._isSliding = null\n this._activeElement = null\n this._indicatorsElement = null\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...config\n }\n Util.typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _handleSwipe() {\n const absDeltax = Math.abs(this.touchDeltaX)\n\n if (absDeltax <= SWIPE_THRESHOLD) {\n return\n }\n\n const direction = absDeltax / this.touchDeltaX\n\n // swipe left\n if (direction > 0) {\n this.prev()\n }\n\n // swipe right\n if (direction < 0) {\n this.next()\n }\n }\n\n _addEventListeners() {\n if (this._config.keyboard) {\n $(this._element)\n .on(Event.KEYDOWN, (event) => this._keydown(event))\n }\n\n if (this._config.pause === 'hover') {\n $(this._element)\n .on(Event.MOUSEENTER, (event) => this.pause(event))\n .on(Event.MOUSELEAVE, (event) => this.cycle(event))\n }\n\n if (this._config.touch) {\n this._addTouchEventListeners()\n }\n }\n\n _addTouchEventListeners() {\n if (!this._touchSupported) {\n return\n }\n\n const start = (event) => {\n if (this._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\n this.touchStartX = event.originalEvent.clientX\n } else if (!this._pointerEvent) {\n this.touchStartX = event.originalEvent.touches[0].clientX\n }\n }\n\n const move = (event) => {\n // ensure swiping with one touch and not pinching\n if (event.originalEvent.touches && event.originalEvent.touches.length > 1) {\n this.touchDeltaX = 0\n } else {\n this.touchDeltaX = event.originalEvent.touches[0].clientX - this.touchStartX\n }\n }\n\n const end = (event) => {\n if (this._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\n this.touchDeltaX = event.originalEvent.clientX - this.touchStartX\n }\n\n this._handleSwipe()\n if (this._config.pause === 'hover') {\n // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n\n this.pause()\n if (this.touchTimeout) {\n clearTimeout(this.touchTimeout)\n }\n this.touchTimeout = setTimeout((event) => this.cycle(event), TOUCHEVENT_COMPAT_WAIT + this._config.interval)\n }\n }\n\n $(this._element.querySelectorAll(Selector.ITEM_IMG)).on(Event.DRAG_START, (e) => e.preventDefault())\n if (this._pointerEvent) {\n $(this._element).on(Event.POINTERDOWN, (event) => start(event))\n $(this._element).on(Event.POINTERUP, (event) => end(event))\n\n this._element.classList.add(ClassName.POINTER_EVENT)\n } else {\n $(this._element).on(Event.TOUCHSTART, (event) => start(event))\n $(this._element).on(Event.TOUCHMOVE, (event) => move(event))\n $(this._element).on(Event.TOUCHEND, (event) => end(event))\n }\n }\n\n _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return\n }\n\n switch (event.which) {\n case ARROW_LEFT_KEYCODE:\n event.preventDefault()\n this.prev()\n break\n case ARROW_RIGHT_KEYCODE:\n event.preventDefault()\n this.next()\n break\n default:\n }\n }\n\n _getItemIndex(element) {\n this._items = element && element.parentNode\n ? [].slice.call(element.parentNode.querySelectorAll(Selector.ITEM))\n : []\n return this._items.indexOf(element)\n }\n\n _getItemByDirection(direction, activeElement) {\n const isNextDirection = direction === Direction.NEXT\n const isPrevDirection = direction === Direction.PREV\n const activeIndex = this._getItemIndex(activeElement)\n const lastItemIndex = this._items.length - 1\n const isGoingToWrap = isPrevDirection && activeIndex === 0 ||\n isNextDirection && activeIndex === lastItemIndex\n\n if (isGoingToWrap && !this._config.wrap) {\n return activeElement\n }\n\n const delta = direction === Direction.PREV ? -1 : 1\n const itemIndex = (activeIndex + delta) % this._items.length\n\n return itemIndex === -1\n ? this._items[this._items.length - 1] : this._items[itemIndex]\n }\n\n _triggerSlideEvent(relatedTarget, eventDirectionName) {\n const targetIndex = this._getItemIndex(relatedTarget)\n const fromIndex = this._getItemIndex(this._element.querySelector(Selector.ACTIVE_ITEM))\n const slideEvent = $.Event(Event.SLIDE, {\n relatedTarget,\n direction: eventDirectionName,\n from: fromIndex,\n to: targetIndex\n })\n\n $(this._element).trigger(slideEvent)\n\n return slideEvent\n }\n\n _setActiveIndicatorElement(element) {\n if (this._indicatorsElement) {\n const indicators = [].slice.call(this._indicatorsElement.querySelectorAll(Selector.ACTIVE))\n $(indicators)\n .removeClass(ClassName.ACTIVE)\n\n const nextIndicator = this._indicatorsElement.children[\n this._getItemIndex(element)\n ]\n\n if (nextIndicator) {\n $(nextIndicator).addClass(ClassName.ACTIVE)\n }\n }\n }\n\n _slide(direction, element) {\n const activeElement = this._element.querySelector(Selector.ACTIVE_ITEM)\n const activeElementIndex = this._getItemIndex(activeElement)\n const nextElement = element || activeElement &&\n this._getItemByDirection(direction, activeElement)\n const nextElementIndex = this._getItemIndex(nextElement)\n const isCycling = Boolean(this._interval)\n\n let directionalClassName\n let orderClassName\n let eventDirectionName\n\n if (direction === Direction.NEXT) {\n directionalClassName = ClassName.LEFT\n orderClassName = ClassName.NEXT\n eventDirectionName = Direction.LEFT\n } else {\n directionalClassName = ClassName.RIGHT\n orderClassName = ClassName.PREV\n eventDirectionName = Direction.RIGHT\n }\n\n if (nextElement && $(nextElement).hasClass(ClassName.ACTIVE)) {\n this._isSliding = false\n return\n }\n\n const slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName)\n if (slideEvent.isDefaultPrevented()) {\n return\n }\n\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n return\n }\n\n this._isSliding = true\n\n if (isCycling) {\n this.pause()\n }\n\n this._setActiveIndicatorElement(nextElement)\n\n const slidEvent = $.Event(Event.SLID, {\n relatedTarget: nextElement,\n direction: eventDirectionName,\n from: activeElementIndex,\n to: nextElementIndex\n })\n\n if ($(this._element).hasClass(ClassName.SLIDE)) {\n $(nextElement).addClass(orderClassName)\n\n Util.reflow(nextElement)\n\n $(activeElement).addClass(directionalClassName)\n $(nextElement).addClass(directionalClassName)\n\n const nextElementInterval = parseInt(nextElement.getAttribute('data-interval'), 10)\n if (nextElementInterval) {\n this._config.defaultInterval = this._config.defaultInterval || this._config.interval\n this._config.interval = nextElementInterval\n } else {\n this._config.interval = this._config.defaultInterval || this._config.interval\n }\n\n const transitionDuration = Util.getTransitionDurationFromElement(activeElement)\n\n $(activeElement)\n .one(Util.TRANSITION_END, () => {\n $(nextElement)\n .removeClass(`${directionalClassName} ${orderClassName}`)\n .addClass(ClassName.ACTIVE)\n\n $(activeElement).removeClass(`${ClassName.ACTIVE} ${orderClassName} ${directionalClassName}`)\n\n this._isSliding = false\n\n setTimeout(() => $(this._element).trigger(slidEvent), 0)\n })\n .emulateTransitionEnd(transitionDuration)\n } else {\n $(activeElement).removeClass(ClassName.ACTIVE)\n $(nextElement).addClass(ClassName.ACTIVE)\n\n this._isSliding = false\n $(this._element).trigger(slidEvent)\n }\n\n if (isCycling) {\n this.cycle()\n }\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n let _config = {\n ...Default,\n ...$(this).data()\n }\n\n if (typeof config === 'object') {\n _config = {\n ..._config,\n ...config\n }\n }\n\n const action = typeof config === 'string' ? config : _config.slide\n\n if (!data) {\n data = new Carousel(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'number') {\n data.to(config)\n } else if (typeof action === 'string') {\n if (typeof data[action] === 'undefined') {\n throw new TypeError(`No method named \"${action}\"`)\n }\n data[action]()\n } else if (_config.interval && _config.ride) {\n data.pause()\n data.cycle()\n }\n })\n }\n\n static _dataApiClickHandler(event) {\n const selector = Util.getSelectorFromElement(this)\n\n if (!selector) {\n return\n }\n\n const target = $(selector)[0]\n\n if (!target || !$(target).hasClass(ClassName.CAROUSEL)) {\n return\n }\n\n const config = {\n ...$(target).data(),\n ...$(this).data()\n }\n const slideIndex = this.getAttribute('data-slide-to')\n\n if (slideIndex) {\n config.interval = false\n }\n\n Carousel._jQueryInterface.call($(target), config)\n\n if (slideIndex) {\n $(target).data(DATA_KEY).to(slideIndex)\n }\n\n event.preventDefault()\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document)\n .on(Event.CLICK_DATA_API, Selector.DATA_SLIDE, Carousel._dataApiClickHandler)\n\n$(window).on(Event.LOAD_DATA_API, () => {\n const carousels = [].slice.call(document.querySelectorAll(Selector.DATA_RIDE))\n for (let i = 0, len = carousels.length; i < len; i++) {\n const $carousel = $(carousels[i])\n Carousel._jQueryInterface.call($carousel, $carousel.data())\n }\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Carousel._jQueryInterface\n$.fn[NAME].Constructor = Carousel\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Carousel._jQueryInterface\n}\n\nexport default Carousel\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'collapse'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.collapse'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst Default = {\n toggle : true,\n parent : ''\n}\n\nconst DefaultType = {\n toggle : 'boolean',\n parent : '(string|element)'\n}\n\nconst Event = {\n SHOW : `show${EVENT_KEY}`,\n SHOWN : `shown${EVENT_KEY}`,\n HIDE : `hide${EVENT_KEY}`,\n HIDDEN : `hidden${EVENT_KEY}`,\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n SHOW : 'show',\n COLLAPSE : 'collapse',\n COLLAPSING : 'collapsing',\n COLLAPSED : 'collapsed'\n}\n\nconst Dimension = {\n WIDTH : 'width',\n HEIGHT : 'height'\n}\n\nconst Selector = {\n ACTIVES : '.show, .collapsing',\n DATA_TOGGLE : '[data-toggle=\"collapse\"]'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Collapse {\n constructor(element, config) {\n this._isTransitioning = false\n this._element = element\n this._config = this._getConfig(config)\n this._triggerArray = [].slice.call(document.querySelectorAll(\n `[data-toggle=\"collapse\"][href=\"#${element.id}\"],` +\n `[data-toggle=\"collapse\"][data-target=\"#${element.id}\"]`\n ))\n\n const toggleList = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE))\n for (let i = 0, len = toggleList.length; i < len; i++) {\n const elem = toggleList[i]\n const selector = Util.getSelectorFromElement(elem)\n const filterElement = [].slice.call(document.querySelectorAll(selector))\n .filter((foundElem) => foundElem === element)\n\n if (selector !== null && filterElement.length > 0) {\n this._selector = selector\n this._triggerArray.push(elem)\n }\n }\n\n this._parent = this._config.parent ? this._getParent() : null\n\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._element, this._triggerArray)\n }\n\n if (this._config.toggle) {\n this.toggle()\n }\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n toggle() {\n if ($(this._element).hasClass(ClassName.SHOW)) {\n this.hide()\n } else {\n this.show()\n }\n }\n\n show() {\n if (this._isTransitioning ||\n $(this._element).hasClass(ClassName.SHOW)) {\n return\n }\n\n let actives\n let activesData\n\n if (this._parent) {\n actives = [].slice.call(this._parent.querySelectorAll(Selector.ACTIVES))\n .filter((elem) => {\n if (typeof this._config.parent === 'string') {\n return elem.getAttribute('data-parent') === this._config.parent\n }\n\n return elem.classList.contains(ClassName.COLLAPSE)\n })\n\n if (actives.length === 0) {\n actives = null\n }\n }\n\n if (actives) {\n activesData = $(actives).not(this._selector).data(DATA_KEY)\n if (activesData && activesData._isTransitioning) {\n return\n }\n }\n\n const startEvent = $.Event(Event.SHOW)\n $(this._element).trigger(startEvent)\n if (startEvent.isDefaultPrevented()) {\n return\n }\n\n if (actives) {\n Collapse._jQueryInterface.call($(actives).not(this._selector), 'hide')\n if (!activesData) {\n $(actives).data(DATA_KEY, null)\n }\n }\n\n const dimension = this._getDimension()\n\n $(this._element)\n .removeClass(ClassName.COLLAPSE)\n .addClass(ClassName.COLLAPSING)\n\n this._element.style[dimension] = 0\n\n if (this._triggerArray.length) {\n $(this._triggerArray)\n .removeClass(ClassName.COLLAPSED)\n .attr('aria-expanded', true)\n }\n\n this.setTransitioning(true)\n\n const complete = () => {\n $(this._element)\n .removeClass(ClassName.COLLAPSING)\n .addClass(ClassName.COLLAPSE)\n .addClass(ClassName.SHOW)\n\n this._element.style[dimension] = ''\n\n this.setTransitioning(false)\n\n $(this._element).trigger(Event.SHOWN)\n }\n\n const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)\n const scrollSize = `scroll${capitalizedDimension}`\n const transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n $(this._element)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n\n this._element.style[dimension] = `${this._element[scrollSize]}px`\n }\n\n hide() {\n if (this._isTransitioning ||\n !$(this._element).hasClass(ClassName.SHOW)) {\n return\n }\n\n const startEvent = $.Event(Event.HIDE)\n $(this._element).trigger(startEvent)\n if (startEvent.isDefaultPrevented()) {\n return\n }\n\n const dimension = this._getDimension()\n\n this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`\n\n Util.reflow(this._element)\n\n $(this._element)\n .addClass(ClassName.COLLAPSING)\n .removeClass(ClassName.COLLAPSE)\n .removeClass(ClassName.SHOW)\n\n const triggerArrayLength = this._triggerArray.length\n if (triggerArrayLength > 0) {\n for (let i = 0; i < triggerArrayLength; i++) {\n const trigger = this._triggerArray[i]\n const selector = Util.getSelectorFromElement(trigger)\n\n if (selector !== null) {\n const $elem = $([].slice.call(document.querySelectorAll(selector)))\n if (!$elem.hasClass(ClassName.SHOW)) {\n $(trigger).addClass(ClassName.COLLAPSED)\n .attr('aria-expanded', false)\n }\n }\n }\n }\n\n this.setTransitioning(true)\n\n const complete = () => {\n this.setTransitioning(false)\n $(this._element)\n .removeClass(ClassName.COLLAPSING)\n .addClass(ClassName.COLLAPSE)\n .trigger(Event.HIDDEN)\n }\n\n this._element.style[dimension] = ''\n const transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n $(this._element)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n }\n\n setTransitioning(isTransitioning) {\n this._isTransitioning = isTransitioning\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n\n this._config = null\n this._parent = null\n this._element = null\n this._triggerArray = null\n this._isTransitioning = null\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...config\n }\n config.toggle = Boolean(config.toggle) // Coerce string values\n Util.typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _getDimension() {\n const hasWidth = $(this._element).hasClass(Dimension.WIDTH)\n return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT\n }\n\n _getParent() {\n let parent\n\n if (Util.isElement(this._config.parent)) {\n parent = this._config.parent\n\n // It's a jQuery object\n if (typeof this._config.parent.jquery !== 'undefined') {\n parent = this._config.parent[0]\n }\n } else {\n parent = document.querySelector(this._config.parent)\n }\n\n const selector =\n `[data-toggle=\"collapse\"][data-parent=\"${this._config.parent}\"]`\n\n const children = [].slice.call(parent.querySelectorAll(selector))\n $(children).each((i, element) => {\n this._addAriaAndCollapsedClass(\n Collapse._getTargetFromElement(element),\n [element]\n )\n })\n\n return parent\n }\n\n _addAriaAndCollapsedClass(element, triggerArray) {\n const isOpen = $(element).hasClass(ClassName.SHOW)\n\n if (triggerArray.length) {\n $(triggerArray)\n .toggleClass(ClassName.COLLAPSED, !isOpen)\n .attr('aria-expanded', isOpen)\n }\n }\n\n // Static\n\n static _getTargetFromElement(element) {\n const selector = Util.getSelectorFromElement(element)\n return selector ? document.querySelector(selector) : null\n }\n\n static _jQueryInterface(config) {\n return this.each(function () {\n const $this = $(this)\n let data = $this.data(DATA_KEY)\n const _config = {\n ...Default,\n ...$this.data(),\n ...typeof config === 'object' && config ? config : {}\n }\n\n if (!data && _config.toggle && /show|hide/.test(config)) {\n _config.toggle = false\n }\n\n if (!data) {\n data = new Collapse(this, _config)\n $this.data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n // preventDefault only for elements (which change the URL) not inside the collapsible element\n if (event.currentTarget.tagName === 'A') {\n event.preventDefault()\n }\n\n const $trigger = $(this)\n const selector = Util.getSelectorFromElement(this)\n const selectors = [].slice.call(document.querySelectorAll(selector))\n\n $(selectors).each(function () {\n const $target = $(this)\n const data = $target.data(DATA_KEY)\n const config = data ? 'toggle' : $trigger.data()\n Collapse._jQueryInterface.call($target, config)\n })\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Collapse._jQueryInterface\n$.fn[NAME].Constructor = Collapse\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Collapse._jQueryInterface\n}\n\nexport default Collapse\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Popper from 'popper.js'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'dropdown'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.dropdown'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst ESCAPE_KEYCODE = 27 // KeyboardEvent.which value for Escape (Esc) key\nconst SPACE_KEYCODE = 32 // KeyboardEvent.which value for space key\nconst TAB_KEYCODE = 9 // KeyboardEvent.which value for tab key\nconst ARROW_UP_KEYCODE = 38 // KeyboardEvent.which value for up arrow key\nconst ARROW_DOWN_KEYCODE = 40 // KeyboardEvent.which value for down arrow key\nconst RIGHT_MOUSE_BUTTON_WHICH = 3 // MouseEvent.which value for the right button (assuming a right-handed mouse)\nconst REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEYCODE}|${ARROW_DOWN_KEYCODE}|${ESCAPE_KEYCODE}`)\n\nconst Event = {\n HIDE : `hide${EVENT_KEY}`,\n HIDDEN : `hidden${EVENT_KEY}`,\n SHOW : `show${EVENT_KEY}`,\n SHOWN : `shown${EVENT_KEY}`,\n CLICK : `click${EVENT_KEY}`,\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`,\n KEYDOWN_DATA_API : `keydown${EVENT_KEY}${DATA_API_KEY}`,\n KEYUP_DATA_API : `keyup${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n DISABLED : 'disabled',\n SHOW : 'show',\n DROPUP : 'dropup',\n DROPRIGHT : 'dropright',\n DROPLEFT : 'dropleft',\n MENURIGHT : 'dropdown-menu-right',\n MENULEFT : 'dropdown-menu-left',\n POSITION_STATIC : 'position-static'\n}\n\nconst Selector = {\n DATA_TOGGLE : '[data-toggle=\"dropdown\"]',\n FORM_CHILD : '.dropdown form',\n MENU : '.dropdown-menu',\n NAVBAR_NAV : '.navbar-nav',\n VISIBLE_ITEMS : '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n}\n\nconst AttachmentMap = {\n TOP : 'top-start',\n TOPEND : 'top-end',\n BOTTOM : 'bottom-start',\n BOTTOMEND : 'bottom-end',\n RIGHT : 'right-start',\n RIGHTEND : 'right-end',\n LEFT : 'left-start',\n LEFTEND : 'left-end'\n}\n\nconst Default = {\n offset : 0,\n flip : true,\n boundary : 'scrollParent',\n reference : 'toggle',\n display : 'dynamic'\n}\n\nconst DefaultType = {\n offset : '(number|string|function)',\n flip : 'boolean',\n boundary : '(string|element)',\n reference : '(string|element)',\n display : 'string'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Dropdown {\n constructor(element, config) {\n this._element = element\n this._popper = null\n this._config = this._getConfig(config)\n this._menu = this._getMenuElement()\n this._inNavbar = this._detectNavbar()\n\n this._addEventListeners()\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n // Public\n\n toggle() {\n if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED)) {\n return\n }\n\n const parent = Dropdown._getParentFromElement(this._element)\n const isActive = $(this._menu).hasClass(ClassName.SHOW)\n\n Dropdown._clearMenus()\n\n if (isActive) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n const showEvent = $.Event(Event.SHOW, relatedTarget)\n\n $(parent).trigger(showEvent)\n\n if (showEvent.isDefaultPrevented()) {\n return\n }\n\n // Disable totally Popper.js for Dropdown in Navbar\n if (!this._inNavbar) {\n /**\n * Check for Popper dependency\n * Popper - https://popper.js.org\n */\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s dropdowns require Popper.js (https://popper.js.org/)')\n }\n\n let referenceElement = this._element\n\n if (this._config.reference === 'parent') {\n referenceElement = parent\n } else if (Util.isElement(this._config.reference)) {\n referenceElement = this._config.reference\n\n // Check if it's jQuery element\n if (typeof this._config.reference.jquery !== 'undefined') {\n referenceElement = this._config.reference[0]\n }\n }\n\n // If boundary is not `scrollParent`, then set position to `static`\n // to allow the menu to \"escape\" the scroll parent's boundaries\n // https://github.com/twbs/bootstrap/issues/24251\n if (this._config.boundary !== 'scrollParent') {\n $(parent).addClass(ClassName.POSITION_STATIC)\n }\n this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig())\n }\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement &&\n $(parent).closest(Selector.NAVBAR_NAV).length === 0) {\n $(document.body).children().on('mouseover', null, $.noop)\n }\n\n this._element.focus()\n this._element.setAttribute('aria-expanded', true)\n\n $(this._menu).toggleClass(ClassName.SHOW)\n $(parent)\n .toggleClass(ClassName.SHOW)\n .trigger($.Event(Event.SHOWN, relatedTarget))\n }\n\n show() {\n if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED) || $(this._menu).hasClass(ClassName.SHOW)) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n const showEvent = $.Event(Event.SHOW, relatedTarget)\n const parent = Dropdown._getParentFromElement(this._element)\n\n $(parent).trigger(showEvent)\n\n if (showEvent.isDefaultPrevented()) {\n return\n }\n\n $(this._menu).toggleClass(ClassName.SHOW)\n $(parent)\n .toggleClass(ClassName.SHOW)\n .trigger($.Event(Event.SHOWN, relatedTarget))\n }\n\n hide() {\n if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED) || !$(this._menu).hasClass(ClassName.SHOW)) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n const hideEvent = $.Event(Event.HIDE, relatedTarget)\n const parent = Dropdown._getParentFromElement(this._element)\n\n $(parent).trigger(hideEvent)\n\n if (hideEvent.isDefaultPrevented()) {\n return\n }\n\n $(this._menu).toggleClass(ClassName.SHOW)\n $(parent)\n .toggleClass(ClassName.SHOW)\n .trigger($.Event(Event.HIDDEN, relatedTarget))\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n $(this._element).off(EVENT_KEY)\n this._element = null\n this._menu = null\n if (this._popper !== null) {\n this._popper.destroy()\n this._popper = null\n }\n }\n\n update() {\n this._inNavbar = this._detectNavbar()\n if (this._popper !== null) {\n this._popper.scheduleUpdate()\n }\n }\n\n // Private\n\n _addEventListeners() {\n $(this._element).on(Event.CLICK, (event) => {\n event.preventDefault()\n event.stopPropagation()\n this.toggle()\n })\n }\n\n _getConfig(config) {\n config = {\n ...this.constructor.Default,\n ...$(this._element).data(),\n ...config\n }\n\n Util.typeCheckConfig(\n NAME,\n config,\n this.constructor.DefaultType\n )\n\n return config\n }\n\n _getMenuElement() {\n if (!this._menu) {\n const parent = Dropdown._getParentFromElement(this._element)\n\n if (parent) {\n this._menu = parent.querySelector(Selector.MENU)\n }\n }\n return this._menu\n }\n\n _getPlacement() {\n const $parentDropdown = $(this._element.parentNode)\n let placement = AttachmentMap.BOTTOM\n\n // Handle dropup\n if ($parentDropdown.hasClass(ClassName.DROPUP)) {\n placement = AttachmentMap.TOP\n if ($(this._menu).hasClass(ClassName.MENURIGHT)) {\n placement = AttachmentMap.TOPEND\n }\n } else if ($parentDropdown.hasClass(ClassName.DROPRIGHT)) {\n placement = AttachmentMap.RIGHT\n } else if ($parentDropdown.hasClass(ClassName.DROPLEFT)) {\n placement = AttachmentMap.LEFT\n } else if ($(this._menu).hasClass(ClassName.MENURIGHT)) {\n placement = AttachmentMap.BOTTOMEND\n }\n return placement\n }\n\n _detectNavbar() {\n return $(this._element).closest('.navbar').length > 0\n }\n\n _getOffset() {\n const offset = {}\n\n if (typeof this._config.offset === 'function') {\n offset.fn = (data) => {\n data.offsets = {\n ...data.offsets,\n ...this._config.offset(data.offsets, this._element) || {}\n }\n\n return data\n }\n } else {\n offset.offset = this._config.offset\n }\n\n return offset\n }\n\n _getPopperConfig() {\n const popperConfig = {\n placement: this._getPlacement(),\n modifiers: {\n offset: this._getOffset(),\n flip: {\n enabled: this._config.flip\n },\n preventOverflow: {\n boundariesElement: this._config.boundary\n }\n }\n }\n\n // Disable Popper.js if we have a static display\n if (this._config.display === 'static') {\n popperConfig.modifiers.applyStyle = {\n enabled: false\n }\n }\n\n return popperConfig\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = typeof config === 'object' ? config : null\n\n if (!data) {\n data = new Dropdown(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config]()\n }\n })\n }\n\n static _clearMenus(event) {\n if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH ||\n event.type === 'keyup' && event.which !== TAB_KEYCODE)) {\n return\n }\n\n const toggles = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE))\n\n for (let i = 0, len = toggles.length; i < len; i++) {\n const parent = Dropdown._getParentFromElement(toggles[i])\n const context = $(toggles[i]).data(DATA_KEY)\n const relatedTarget = {\n relatedTarget: toggles[i]\n }\n\n if (event && event.type === 'click') {\n relatedTarget.clickEvent = event\n }\n\n if (!context) {\n continue\n }\n\n const dropdownMenu = context._menu\n if (!$(parent).hasClass(ClassName.SHOW)) {\n continue\n }\n\n if (event && (event.type === 'click' &&\n /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) &&\n $.contains(parent, event.target)) {\n continue\n }\n\n const hideEvent = $.Event(Event.HIDE, relatedTarget)\n $(parent).trigger(hideEvent)\n if (hideEvent.isDefaultPrevented()) {\n continue\n }\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n $(document.body).children().off('mouseover', null, $.noop)\n }\n\n toggles[i].setAttribute('aria-expanded', 'false')\n\n $(dropdownMenu).removeClass(ClassName.SHOW)\n $(parent)\n .removeClass(ClassName.SHOW)\n .trigger($.Event(Event.HIDDEN, relatedTarget))\n }\n }\n\n static _getParentFromElement(element) {\n let parent\n const selector = Util.getSelectorFromElement(element)\n\n if (selector) {\n parent = document.querySelector(selector)\n }\n\n return parent || element.parentNode\n }\n\n // eslint-disable-next-line complexity\n static _dataApiKeydownHandler(event) {\n // If not input/textarea:\n // - And not a key in REGEXP_KEYDOWN => not a dropdown command\n // If input/textarea:\n // - If space key => not a dropdown command\n // - If key is other than escape\n // - If key is not up or down => not a dropdown command\n // - If trigger inside the menu => not a dropdown command\n if (/input|textarea/i.test(event.target.tagName)\n ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE &&\n (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE ||\n $(event.target).closest(Selector.MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n\n if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {\n return\n }\n\n const parent = Dropdown._getParentFromElement(this)\n const isActive = $(parent).hasClass(ClassName.SHOW)\n\n if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {\n if (event.which === ESCAPE_KEYCODE) {\n const toggle = parent.querySelector(Selector.DATA_TOGGLE)\n $(toggle).trigger('focus')\n }\n\n $(this).trigger('click')\n return\n }\n\n const items = [].slice.call(parent.querySelectorAll(Selector.VISIBLE_ITEMS))\n\n if (items.length === 0) {\n return\n }\n\n let index = items.indexOf(event.target)\n\n if (event.which === ARROW_UP_KEYCODE && index > 0) { // Up\n index--\n }\n\n if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) { // Down\n index++\n }\n\n if (index < 0) {\n index = 0\n }\n\n items[index].focus()\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document)\n .on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler)\n .on(Event.KEYDOWN_DATA_API, Selector.MENU, Dropdown._dataApiKeydownHandler)\n .on(`${Event.CLICK_DATA_API} ${Event.KEYUP_DATA_API}`, Dropdown._clearMenus)\n .on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n event.preventDefault()\n event.stopPropagation()\n Dropdown._jQueryInterface.call($(this), 'toggle')\n })\n .on(Event.CLICK_DATA_API, Selector.FORM_CHILD, (e) => {\n e.stopPropagation()\n })\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Dropdown._jQueryInterface\n$.fn[NAME].Constructor = Dropdown\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Dropdown._jQueryInterface\n}\n\n\nexport default Dropdown\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'modal'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.modal'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst ESCAPE_KEYCODE = 27 // KeyboardEvent.which value for Escape (Esc) key\n\nconst Default = {\n backdrop : true,\n keyboard : true,\n focus : true,\n show : true\n}\n\nconst DefaultType = {\n backdrop : '(boolean|string)',\n keyboard : 'boolean',\n focus : 'boolean',\n show : 'boolean'\n}\n\nconst Event = {\n HIDE : `hide${EVENT_KEY}`,\n HIDDEN : `hidden${EVENT_KEY}`,\n SHOW : `show${EVENT_KEY}`,\n SHOWN : `shown${EVENT_KEY}`,\n FOCUSIN : `focusin${EVENT_KEY}`,\n RESIZE : `resize${EVENT_KEY}`,\n CLICK_DISMISS : `click.dismiss${EVENT_KEY}`,\n KEYDOWN_DISMISS : `keydown.dismiss${EVENT_KEY}`,\n MOUSEUP_DISMISS : `mouseup.dismiss${EVENT_KEY}`,\n MOUSEDOWN_DISMISS : `mousedown.dismiss${EVENT_KEY}`,\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n SCROLLABLE : 'modal-dialog-scrollable',\n SCROLLBAR_MEASURER : 'modal-scrollbar-measure',\n BACKDROP : 'modal-backdrop',\n OPEN : 'modal-open',\n FADE : 'fade',\n SHOW : 'show'\n}\n\nconst Selector = {\n DIALOG : '.modal-dialog',\n MODAL_BODY : '.modal-body',\n DATA_TOGGLE : '[data-toggle=\"modal\"]',\n DATA_DISMISS : '[data-dismiss=\"modal\"]',\n FIXED_CONTENT : '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top',\n STICKY_CONTENT : '.sticky-top'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Modal {\n constructor(element, config) {\n this._config = this._getConfig(config)\n this._element = element\n this._dialog = element.querySelector(Selector.DIALOG)\n this._backdrop = null\n this._isShown = false\n this._isBodyOverflowing = false\n this._ignoreBackdropClick = false\n this._isTransitioning = false\n this._scrollbarWidth = 0\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return\n }\n\n if ($(this._element).hasClass(ClassName.FADE)) {\n this._isTransitioning = true\n }\n\n const showEvent = $.Event(Event.SHOW, {\n relatedTarget\n })\n\n $(this._element).trigger(showEvent)\n\n if (this._isShown || showEvent.isDefaultPrevented()) {\n return\n }\n\n this._isShown = true\n\n this._checkScrollbar()\n this._setScrollbar()\n\n this._adjustDialog()\n\n this._setEscapeEvent()\n this._setResizeEvent()\n\n $(this._element).on(\n Event.CLICK_DISMISS,\n Selector.DATA_DISMISS,\n (event) => this.hide(event)\n )\n\n $(this._dialog).on(Event.MOUSEDOWN_DISMISS, () => {\n $(this._element).one(Event.MOUSEUP_DISMISS, (event) => {\n if ($(event.target).is(this._element)) {\n this._ignoreBackdropClick = true\n }\n })\n })\n\n this._showBackdrop(() => this._showElement(relatedTarget))\n }\n\n hide(event) {\n if (event) {\n event.preventDefault()\n }\n\n if (!this._isShown || this._isTransitioning) {\n return\n }\n\n const hideEvent = $.Event(Event.HIDE)\n\n $(this._element).trigger(hideEvent)\n\n if (!this._isShown || hideEvent.isDefaultPrevented()) {\n return\n }\n\n this._isShown = false\n const transition = $(this._element).hasClass(ClassName.FADE)\n\n if (transition) {\n this._isTransitioning = true\n }\n\n this._setEscapeEvent()\n this._setResizeEvent()\n\n $(document).off(Event.FOCUSIN)\n\n $(this._element).removeClass(ClassName.SHOW)\n\n $(this._element).off(Event.CLICK_DISMISS)\n $(this._dialog).off(Event.MOUSEDOWN_DISMISS)\n\n\n if (transition) {\n const transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n $(this._element)\n .one(Util.TRANSITION_END, (event) => this._hideModal(event))\n .emulateTransitionEnd(transitionDuration)\n } else {\n this._hideModal()\n }\n }\n\n dispose() {\n [window, this._element, this._dialog]\n .forEach((htmlElement) => $(htmlElement).off(EVENT_KEY))\n\n /**\n * `document` has 2 events `Event.FOCUSIN` and `Event.CLICK_DATA_API`\n * Do not move `document` in `htmlElements` array\n * It will remove `Event.CLICK_DATA_API` event that should remain\n */\n $(document).off(Event.FOCUSIN)\n\n $.removeData(this._element, DATA_KEY)\n\n this._config = null\n this._element = null\n this._dialog = null\n this._backdrop = null\n this._isShown = null\n this._isBodyOverflowing = null\n this._ignoreBackdropClick = null\n this._isTransitioning = null\n this._scrollbarWidth = null\n }\n\n handleUpdate() {\n this._adjustDialog()\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...config\n }\n Util.typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _showElement(relatedTarget) {\n const transition = $(this._element).hasClass(ClassName.FADE)\n\n if (!this._element.parentNode ||\n this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {\n // Don't move modal's DOM position\n document.body.appendChild(this._element)\n }\n\n this._element.style.display = 'block'\n this._element.removeAttribute('aria-hidden')\n this._element.setAttribute('aria-modal', true)\n\n if ($(this._dialog).hasClass(ClassName.SCROLLABLE)) {\n this._dialog.querySelector(Selector.MODAL_BODY).scrollTop = 0\n } else {\n this._element.scrollTop = 0\n }\n\n if (transition) {\n Util.reflow(this._element)\n }\n\n $(this._element).addClass(ClassName.SHOW)\n\n if (this._config.focus) {\n this._enforceFocus()\n }\n\n const shownEvent = $.Event(Event.SHOWN, {\n relatedTarget\n })\n\n const transitionComplete = () => {\n if (this._config.focus) {\n this._element.focus()\n }\n this._isTransitioning = false\n $(this._element).trigger(shownEvent)\n }\n\n if (transition) {\n const transitionDuration = Util.getTransitionDurationFromElement(this._dialog)\n\n $(this._dialog)\n .one(Util.TRANSITION_END, transitionComplete)\n .emulateTransitionEnd(transitionDuration)\n } else {\n transitionComplete()\n }\n }\n\n _enforceFocus() {\n $(document)\n .off(Event.FOCUSIN) // Guard against infinite focus loop\n .on(Event.FOCUSIN, (event) => {\n if (document !== event.target &&\n this._element !== event.target &&\n $(this._element).has(event.target).length === 0) {\n this._element.focus()\n }\n })\n }\n\n _setEscapeEvent() {\n if (this._isShown && this._config.keyboard) {\n $(this._element).on(Event.KEYDOWN_DISMISS, (event) => {\n if (event.which === ESCAPE_KEYCODE) {\n event.preventDefault()\n this.hide()\n }\n })\n } else if (!this._isShown) {\n $(this._element).off(Event.KEYDOWN_DISMISS)\n }\n }\n\n _setResizeEvent() {\n if (this._isShown) {\n $(window).on(Event.RESIZE, (event) => this.handleUpdate(event))\n } else {\n $(window).off(Event.RESIZE)\n }\n }\n\n _hideModal() {\n this._element.style.display = 'none'\n this._element.setAttribute('aria-hidden', true)\n this._element.removeAttribute('aria-modal')\n this._isTransitioning = false\n this._showBackdrop(() => {\n $(document.body).removeClass(ClassName.OPEN)\n this._resetAdjustments()\n this._resetScrollbar()\n $(this._element).trigger(Event.HIDDEN)\n })\n }\n\n _removeBackdrop() {\n if (this._backdrop) {\n $(this._backdrop).remove()\n this._backdrop = null\n }\n }\n\n _showBackdrop(callback) {\n const animate = $(this._element).hasClass(ClassName.FADE)\n ? ClassName.FADE : ''\n\n if (this._isShown && this._config.backdrop) {\n this._backdrop = document.createElement('div')\n this._backdrop.className = ClassName.BACKDROP\n\n if (animate) {\n this._backdrop.classList.add(animate)\n }\n\n $(this._backdrop).appendTo(document.body)\n\n $(this._element).on(Event.CLICK_DISMISS, (event) => {\n if (this._ignoreBackdropClick) {\n this._ignoreBackdropClick = false\n return\n }\n if (event.target !== event.currentTarget) {\n return\n }\n if (this._config.backdrop === 'static') {\n this._element.focus()\n } else {\n this.hide()\n }\n })\n\n if (animate) {\n Util.reflow(this._backdrop)\n }\n\n $(this._backdrop).addClass(ClassName.SHOW)\n\n if (!callback) {\n return\n }\n\n if (!animate) {\n callback()\n return\n }\n\n const backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop)\n\n $(this._backdrop)\n .one(Util.TRANSITION_END, callback)\n .emulateTransitionEnd(backdropTransitionDuration)\n } else if (!this._isShown && this._backdrop) {\n $(this._backdrop).removeClass(ClassName.SHOW)\n\n const callbackRemove = () => {\n this._removeBackdrop()\n if (callback) {\n callback()\n }\n }\n\n if ($(this._element).hasClass(ClassName.FADE)) {\n const backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop)\n\n $(this._backdrop)\n .one(Util.TRANSITION_END, callbackRemove)\n .emulateTransitionEnd(backdropTransitionDuration)\n } else {\n callbackRemove()\n }\n } else if (callback) {\n callback()\n }\n }\n\n // ----------------------------------------------------------------------\n // the following methods are used to handle overflowing modals\n // todo (fat): these should probably be refactored out of modal.js\n // ----------------------------------------------------------------------\n\n _adjustDialog() {\n const isModalOverflowing =\n this._element.scrollHeight > document.documentElement.clientHeight\n\n if (!this._isBodyOverflowing && isModalOverflowing) {\n this._element.style.paddingLeft = `${this._scrollbarWidth}px`\n }\n\n if (this._isBodyOverflowing && !isModalOverflowing) {\n this._element.style.paddingRight = `${this._scrollbarWidth}px`\n }\n }\n\n _resetAdjustments() {\n this._element.style.paddingLeft = ''\n this._element.style.paddingRight = ''\n }\n\n _checkScrollbar() {\n const rect = document.body.getBoundingClientRect()\n this._isBodyOverflowing = rect.left + rect.right < window.innerWidth\n this._scrollbarWidth = this._getScrollbarWidth()\n }\n\n _setScrollbar() {\n if (this._isBodyOverflowing) {\n // Note: DOMNode.style.paddingRight returns the actual value or '' if not set\n // while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set\n const fixedContent = [].slice.call(document.querySelectorAll(Selector.FIXED_CONTENT))\n const stickyContent = [].slice.call(document.querySelectorAll(Selector.STICKY_CONTENT))\n\n // Adjust fixed content padding\n $(fixedContent).each((index, element) => {\n const actualPadding = element.style.paddingRight\n const calculatedPadding = $(element).css('padding-right')\n $(element)\n .data('padding-right', actualPadding)\n .css('padding-right', `${parseFloat(calculatedPadding) + this._scrollbarWidth}px`)\n })\n\n // Adjust sticky content margin\n $(stickyContent).each((index, element) => {\n const actualMargin = element.style.marginRight\n const calculatedMargin = $(element).css('margin-right')\n $(element)\n .data('margin-right', actualMargin)\n .css('margin-right', `${parseFloat(calculatedMargin) - this._scrollbarWidth}px`)\n })\n\n // Adjust body padding\n const actualPadding = document.body.style.paddingRight\n const calculatedPadding = $(document.body).css('padding-right')\n $(document.body)\n .data('padding-right', actualPadding)\n .css('padding-right', `${parseFloat(calculatedPadding) + this._scrollbarWidth}px`)\n }\n\n $(document.body).addClass(ClassName.OPEN)\n }\n\n _resetScrollbar() {\n // Restore fixed content padding\n const fixedContent = [].slice.call(document.querySelectorAll(Selector.FIXED_CONTENT))\n $(fixedContent).each((index, element) => {\n const padding = $(element).data('padding-right')\n $(element).removeData('padding-right')\n element.style.paddingRight = padding ? padding : ''\n })\n\n // Restore sticky content\n const elements = [].slice.call(document.querySelectorAll(`${Selector.STICKY_CONTENT}`))\n $(elements).each((index, element) => {\n const margin = $(element).data('margin-right')\n if (typeof margin !== 'undefined') {\n $(element).css('margin-right', margin).removeData('margin-right')\n }\n })\n\n // Restore body padding\n const padding = $(document.body).data('padding-right')\n $(document.body).removeData('padding-right')\n document.body.style.paddingRight = padding ? padding : ''\n }\n\n _getScrollbarWidth() { // thx d.walsh\n const scrollDiv = document.createElement('div')\n scrollDiv.className = ClassName.SCROLLBAR_MEASURER\n document.body.appendChild(scrollDiv)\n const scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth\n document.body.removeChild(scrollDiv)\n return scrollbarWidth\n }\n\n // Static\n\n static _jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = {\n ...Default,\n ...$(this).data(),\n ...typeof config === 'object' && config ? config : {}\n }\n\n if (!data) {\n data = new Modal(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config](relatedTarget)\n } else if (_config.show) {\n data.show(relatedTarget)\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n let target\n const selector = Util.getSelectorFromElement(this)\n\n if (selector) {\n target = document.querySelector(selector)\n }\n\n const config = $(target).data(DATA_KEY)\n ? 'toggle' : {\n ...$(target).data(),\n ...$(this).data()\n }\n\n if (this.tagName === 'A' || this.tagName === 'AREA') {\n event.preventDefault()\n }\n\n const $target = $(target).one(Event.SHOW, (showEvent) => {\n if (showEvent.isDefaultPrevented()) {\n // Only register focus restorer if modal will actually get shown\n return\n }\n\n $target.one(Event.HIDDEN, () => {\n if ($(this).is(':visible')) {\n this.focus()\n }\n })\n })\n\n Modal._jQueryInterface.call($(target), config, this)\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Modal._jQueryInterface\n$.fn[NAME].Constructor = Modal\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Modal._jQueryInterface\n}\n\nexport default Modal\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): tools/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst uriAttrs = [\n 'background',\n 'cite',\n 'href',\n 'itemtype',\n 'longdesc',\n 'poster',\n 'src',\n 'xlink:href'\n]\n\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i\n\nexport const DefaultWhitelist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n div: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n}\n\n/**\n * A pattern that recognizes a commonly useful subset of URLs that are safe.\n *\n * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n */\nconst SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi\n\n/**\n * A pattern that matches safe data URLs. Only matches image, video and audio types.\n *\n * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n */\nconst DATA_URL_PATTERN = /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i\n\nfunction allowedAttribute(attr, allowedAttributeList) {\n const attrName = attr.nodeName.toLowerCase()\n\n if (allowedAttributeList.indexOf(attrName) !== -1) {\n if (uriAttrs.indexOf(attrName) !== -1) {\n return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN))\n }\n\n return true\n }\n\n const regExp = allowedAttributeList.filter((attrRegex) => attrRegex instanceof RegExp)\n\n // Check if a regular expression validates the attribute.\n for (let i = 0, l = regExp.length; i < l; i++) {\n if (attrName.match(regExp[i])) {\n return true\n }\n }\n\n return false\n}\n\nexport function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {\n if (unsafeHtml.length === 0) {\n return unsafeHtml\n }\n\n if (sanitizeFn && typeof sanitizeFn === 'function') {\n return sanitizeFn(unsafeHtml)\n }\n\n const domParser = new window.DOMParser()\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html')\n const whitelistKeys = Object.keys(whiteList)\n const elements = [].slice.call(createdDocument.body.querySelectorAll('*'))\n\n for (let i = 0, len = elements.length; i < len; i++) {\n const el = elements[i]\n const elName = el.nodeName.toLowerCase()\n\n if (whitelistKeys.indexOf(el.nodeName.toLowerCase()) === -1) {\n el.parentNode.removeChild(el)\n\n continue\n }\n\n const attributeList = [].slice.call(el.attributes)\n const whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || [])\n\n attributeList.forEach((attr) => {\n if (!allowedAttribute(attr, whitelistedAttributes)) {\n el.removeAttribute(attr.nodeName)\n }\n })\n }\n\n return createdDocument.body.innerHTML\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n DefaultWhitelist,\n sanitizeHtml\n} from './tools/sanitizer'\nimport $ from 'jquery'\nimport Popper from 'popper.js'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'tooltip'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.tooltip'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst CLASS_PREFIX = 'bs-tooltip'\nconst BSCLS_PREFIX_REGEX = new RegExp(`(^|\\\\s)${CLASS_PREFIX}\\\\S+`, 'g')\nconst DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn']\n\nconst DefaultType = {\n animation : 'boolean',\n template : 'string',\n title : '(string|element|function)',\n trigger : 'string',\n delay : '(number|object)',\n html : 'boolean',\n selector : '(string|boolean)',\n placement : '(string|function)',\n offset : '(number|string|function)',\n container : '(string|element|boolean)',\n fallbackPlacement : '(string|array)',\n boundary : '(string|element)',\n sanitize : 'boolean',\n sanitizeFn : '(null|function)',\n whiteList : 'object'\n}\n\nconst AttachmentMap = {\n AUTO : 'auto',\n TOP : 'top',\n RIGHT : 'right',\n BOTTOM : 'bottom',\n LEFT : 'left'\n}\n\nconst Default = {\n animation : true,\n template : '
' +\n '
' +\n '
',\n trigger : 'hover focus',\n title : '',\n delay : 0,\n html : false,\n selector : false,\n placement : 'top',\n offset : 0,\n container : false,\n fallbackPlacement : 'flip',\n boundary : 'scrollParent',\n sanitize : true,\n sanitizeFn : null,\n whiteList : DefaultWhitelist\n}\n\nconst HoverState = {\n SHOW : 'show',\n OUT : 'out'\n}\n\nconst Event = {\n HIDE : `hide${EVENT_KEY}`,\n HIDDEN : `hidden${EVENT_KEY}`,\n SHOW : `show${EVENT_KEY}`,\n SHOWN : `shown${EVENT_KEY}`,\n INSERTED : `inserted${EVENT_KEY}`,\n CLICK : `click${EVENT_KEY}`,\n FOCUSIN : `focusin${EVENT_KEY}`,\n FOCUSOUT : `focusout${EVENT_KEY}`,\n MOUSEENTER : `mouseenter${EVENT_KEY}`,\n MOUSELEAVE : `mouseleave${EVENT_KEY}`\n}\n\nconst ClassName = {\n FADE : 'fade',\n SHOW : 'show'\n}\n\nconst Selector = {\n TOOLTIP : '.tooltip',\n TOOLTIP_INNER : '.tooltip-inner',\n ARROW : '.arrow'\n}\n\nconst Trigger = {\n HOVER : 'hover',\n FOCUS : 'focus',\n CLICK : 'click',\n MANUAL : 'manual'\n}\n\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Tooltip {\n constructor(element, config) {\n /**\n * Check for Popper dependency\n * Popper - https://popper.js.org\n */\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s tooltips require Popper.js (https://popper.js.org/)')\n }\n\n // private\n this._isEnabled = true\n this._timeout = 0\n this._hoverState = ''\n this._activeTrigger = {}\n this._popper = null\n\n // Protected\n this.element = element\n this.config = this._getConfig(config)\n this.tip = null\n\n this._setListeners()\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n static get DATA_KEY() {\n return DATA_KEY\n }\n\n static get Event() {\n return Event\n }\n\n static get EVENT_KEY() {\n return EVENT_KEY\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n // Public\n\n enable() {\n this._isEnabled = true\n }\n\n disable() {\n this._isEnabled = false\n }\n\n toggleEnabled() {\n this._isEnabled = !this._isEnabled\n }\n\n toggle(event) {\n if (!this._isEnabled) {\n return\n }\n\n if (event) {\n const dataKey = this.constructor.DATA_KEY\n let context = $(event.currentTarget).data(dataKey)\n\n if (!context) {\n context = new this.constructor(\n event.currentTarget,\n this._getDelegateConfig()\n )\n $(event.currentTarget).data(dataKey, context)\n }\n\n context._activeTrigger.click = !context._activeTrigger.click\n\n if (context._isWithActiveTrigger()) {\n context._enter(null, context)\n } else {\n context._leave(null, context)\n }\n } else {\n if ($(this.getTipElement()).hasClass(ClassName.SHOW)) {\n this._leave(null, this)\n return\n }\n\n this._enter(null, this)\n }\n }\n\n dispose() {\n clearTimeout(this._timeout)\n\n $.removeData(this.element, this.constructor.DATA_KEY)\n\n $(this.element).off(this.constructor.EVENT_KEY)\n $(this.element).closest('.modal').off('hide.bs.modal')\n\n if (this.tip) {\n $(this.tip).remove()\n }\n\n this._isEnabled = null\n this._timeout = null\n this._hoverState = null\n this._activeTrigger = null\n if (this._popper !== null) {\n this._popper.destroy()\n }\n\n this._popper = null\n this.element = null\n this.config = null\n this.tip = null\n }\n\n show() {\n if ($(this.element).css('display') === 'none') {\n throw new Error('Please use show on visible elements')\n }\n\n const showEvent = $.Event(this.constructor.Event.SHOW)\n if (this.isWithContent() && this._isEnabled) {\n $(this.element).trigger(showEvent)\n\n const shadowRoot = Util.findShadowRoot(this.element)\n const isInTheDom = $.contains(\n shadowRoot !== null ? shadowRoot : this.element.ownerDocument.documentElement,\n this.element\n )\n\n if (showEvent.isDefaultPrevented() || !isInTheDom) {\n return\n }\n\n const tip = this.getTipElement()\n const tipId = Util.getUID(this.constructor.NAME)\n\n tip.setAttribute('id', tipId)\n this.element.setAttribute('aria-describedby', tipId)\n\n this.setContent()\n\n if (this.config.animation) {\n $(tip).addClass(ClassName.FADE)\n }\n\n const placement = typeof this.config.placement === 'function'\n ? this.config.placement.call(this, tip, this.element)\n : this.config.placement\n\n const attachment = this._getAttachment(placement)\n this.addAttachmentClass(attachment)\n\n const container = this._getContainer()\n $(tip).data(this.constructor.DATA_KEY, this)\n\n if (!$.contains(this.element.ownerDocument.documentElement, this.tip)) {\n $(tip).appendTo(container)\n }\n\n $(this.element).trigger(this.constructor.Event.INSERTED)\n\n this._popper = new Popper(this.element, tip, {\n placement: attachment,\n modifiers: {\n offset: this._getOffset(),\n flip: {\n behavior: this.config.fallbackPlacement\n },\n arrow: {\n element: Selector.ARROW\n },\n preventOverflow: {\n boundariesElement: this.config.boundary\n }\n },\n onCreate: (data) => {\n if (data.originalPlacement !== data.placement) {\n this._handlePopperPlacementChange(data)\n }\n },\n onUpdate: (data) => this._handlePopperPlacementChange(data)\n })\n\n $(tip).addClass(ClassName.SHOW)\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement) {\n $(document.body).children().on('mouseover', null, $.noop)\n }\n\n const complete = () => {\n if (this.config.animation) {\n this._fixTransition()\n }\n const prevHoverState = this._hoverState\n this._hoverState = null\n\n $(this.element).trigger(this.constructor.Event.SHOWN)\n\n if (prevHoverState === HoverState.OUT) {\n this._leave(null, this)\n }\n }\n\n if ($(this.tip).hasClass(ClassName.FADE)) {\n const transitionDuration = Util.getTransitionDurationFromElement(this.tip)\n\n $(this.tip)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n } else {\n complete()\n }\n }\n }\n\n hide(callback) {\n const tip = this.getTipElement()\n const hideEvent = $.Event(this.constructor.Event.HIDE)\n const complete = () => {\n if (this._hoverState !== HoverState.SHOW && tip.parentNode) {\n tip.parentNode.removeChild(tip)\n }\n\n this._cleanTipClass()\n this.element.removeAttribute('aria-describedby')\n $(this.element).trigger(this.constructor.Event.HIDDEN)\n if (this._popper !== null) {\n this._popper.destroy()\n }\n\n if (callback) {\n callback()\n }\n }\n\n $(this.element).trigger(hideEvent)\n\n if (hideEvent.isDefaultPrevented()) {\n return\n }\n\n $(tip).removeClass(ClassName.SHOW)\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n $(document.body).children().off('mouseover', null, $.noop)\n }\n\n this._activeTrigger[Trigger.CLICK] = false\n this._activeTrigger[Trigger.FOCUS] = false\n this._activeTrigger[Trigger.HOVER] = false\n\n if ($(this.tip).hasClass(ClassName.FADE)) {\n const transitionDuration = Util.getTransitionDurationFromElement(tip)\n\n $(tip)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n } else {\n complete()\n }\n\n this._hoverState = ''\n }\n\n update() {\n if (this._popper !== null) {\n this._popper.scheduleUpdate()\n }\n }\n\n // Protected\n\n isWithContent() {\n return Boolean(this.getTitle())\n }\n\n addAttachmentClass(attachment) {\n $(this.getTipElement()).addClass(`${CLASS_PREFIX}-${attachment}`)\n }\n\n getTipElement() {\n this.tip = this.tip || $(this.config.template)[0]\n return this.tip\n }\n\n setContent() {\n const tip = this.getTipElement()\n this.setElementContent($(tip.querySelectorAll(Selector.TOOLTIP_INNER)), this.getTitle())\n $(tip).removeClass(`${ClassName.FADE} ${ClassName.SHOW}`)\n }\n\n setElementContent($element, content) {\n if (typeof content === 'object' && (content.nodeType || content.jquery)) {\n // Content is a DOM node or a jQuery\n if (this.config.html) {\n if (!$(content).parent().is($element)) {\n $element.empty().append(content)\n }\n } else {\n $element.text($(content).text())\n }\n\n return\n }\n\n if (this.config.html) {\n if (this.config.sanitize) {\n content = sanitizeHtml(content, this.config.whiteList, this.config.sanitizeFn)\n }\n\n $element.html(content)\n } else {\n $element.text(content)\n }\n }\n\n getTitle() {\n let title = this.element.getAttribute('data-original-title')\n\n if (!title) {\n title = typeof this.config.title === 'function'\n ? this.config.title.call(this.element)\n : this.config.title\n }\n\n return title\n }\n\n // Private\n\n _getOffset() {\n const offset = {}\n\n if (typeof this.config.offset === 'function') {\n offset.fn = (data) => {\n data.offsets = {\n ...data.offsets,\n ...this.config.offset(data.offsets, this.element) || {}\n }\n\n return data\n }\n } else {\n offset.offset = this.config.offset\n }\n\n return offset\n }\n\n _getContainer() {\n if (this.config.container === false) {\n return document.body\n }\n\n if (Util.isElement(this.config.container)) {\n return $(this.config.container)\n }\n\n return $(document).find(this.config.container)\n }\n\n _getAttachment(placement) {\n return AttachmentMap[placement.toUpperCase()]\n }\n\n _setListeners() {\n const triggers = this.config.trigger.split(' ')\n\n triggers.forEach((trigger) => {\n if (trigger === 'click') {\n $(this.element).on(\n this.constructor.Event.CLICK,\n this.config.selector,\n (event) => this.toggle(event)\n )\n } else if (trigger !== Trigger.MANUAL) {\n const eventIn = trigger === Trigger.HOVER\n ? this.constructor.Event.MOUSEENTER\n : this.constructor.Event.FOCUSIN\n const eventOut = trigger === Trigger.HOVER\n ? this.constructor.Event.MOUSELEAVE\n : this.constructor.Event.FOCUSOUT\n\n $(this.element)\n .on(\n eventIn,\n this.config.selector,\n (event) => this._enter(event)\n )\n .on(\n eventOut,\n this.config.selector,\n (event) => this._leave(event)\n )\n }\n })\n\n $(this.element).closest('.modal').on(\n 'hide.bs.modal',\n () => {\n if (this.element) {\n this.hide()\n }\n }\n )\n\n if (this.config.selector) {\n this.config = {\n ...this.config,\n trigger: 'manual',\n selector: ''\n }\n } else {\n this._fixTitle()\n }\n }\n\n _fixTitle() {\n const titleType = typeof this.element.getAttribute('data-original-title')\n\n if (this.element.getAttribute('title') || titleType !== 'string') {\n this.element.setAttribute(\n 'data-original-title',\n this.element.getAttribute('title') || ''\n )\n\n this.element.setAttribute('title', '')\n }\n }\n\n _enter(event, context) {\n const dataKey = this.constructor.DATA_KEY\n context = context || $(event.currentTarget).data(dataKey)\n\n if (!context) {\n context = new this.constructor(\n event.currentTarget,\n this._getDelegateConfig()\n )\n $(event.currentTarget).data(dataKey, context)\n }\n\n if (event) {\n context._activeTrigger[\n event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER\n ] = true\n }\n\n if ($(context.getTipElement()).hasClass(ClassName.SHOW) || context._hoverState === HoverState.SHOW) {\n context._hoverState = HoverState.SHOW\n return\n }\n\n clearTimeout(context._timeout)\n\n context._hoverState = HoverState.SHOW\n\n if (!context.config.delay || !context.config.delay.show) {\n context.show()\n return\n }\n\n context._timeout = setTimeout(() => {\n if (context._hoverState === HoverState.SHOW) {\n context.show()\n }\n }, context.config.delay.show)\n }\n\n _leave(event, context) {\n const dataKey = this.constructor.DATA_KEY\n context = context || $(event.currentTarget).data(dataKey)\n\n if (!context) {\n context = new this.constructor(\n event.currentTarget,\n this._getDelegateConfig()\n )\n $(event.currentTarget).data(dataKey, context)\n }\n\n if (event) {\n context._activeTrigger[\n event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER\n ] = false\n }\n\n if (context._isWithActiveTrigger()) {\n return\n }\n\n clearTimeout(context._timeout)\n\n context._hoverState = HoverState.OUT\n\n if (!context.config.delay || !context.config.delay.hide) {\n context.hide()\n return\n }\n\n context._timeout = setTimeout(() => {\n if (context._hoverState === HoverState.OUT) {\n context.hide()\n }\n }, context.config.delay.hide)\n }\n\n _isWithActiveTrigger() {\n for (const trigger in this._activeTrigger) {\n if (this._activeTrigger[trigger]) {\n return true\n }\n }\n\n return false\n }\n\n _getConfig(config) {\n const dataAttributes = $(this.element).data()\n\n Object.keys(dataAttributes)\n .forEach((dataAttr) => {\n if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) {\n delete dataAttributes[dataAttr]\n }\n })\n\n config = {\n ...this.constructor.Default,\n ...dataAttributes,\n ...typeof config === 'object' && config ? config : {}\n }\n\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n }\n }\n\n if (typeof config.title === 'number') {\n config.title = config.title.toString()\n }\n\n if (typeof config.content === 'number') {\n config.content = config.content.toString()\n }\n\n Util.typeCheckConfig(\n NAME,\n config,\n this.constructor.DefaultType\n )\n\n if (config.sanitize) {\n config.template = sanitizeHtml(config.template, config.whiteList, config.sanitizeFn)\n }\n\n return config\n }\n\n _getDelegateConfig() {\n const config = {}\n\n if (this.config) {\n for (const key in this.config) {\n if (this.constructor.Default[key] !== this.config[key]) {\n config[key] = this.config[key]\n }\n }\n }\n\n return config\n }\n\n _cleanTipClass() {\n const $tip = $(this.getTipElement())\n const tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX)\n if (tabClass !== null && tabClass.length) {\n $tip.removeClass(tabClass.join(''))\n }\n }\n\n _handlePopperPlacementChange(popperData) {\n const popperInstance = popperData.instance\n this.tip = popperInstance.popper\n this._cleanTipClass()\n this.addAttachmentClass(this._getAttachment(popperData.placement))\n }\n\n _fixTransition() {\n const tip = this.getTipElement()\n const initConfigAnimation = this.config.animation\n\n if (tip.getAttribute('x-placement') !== null) {\n return\n }\n\n $(tip).removeClass(ClassName.FADE)\n this.config.animation = false\n this.hide()\n this.show()\n this.config.animation = initConfigAnimation\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = typeof config === 'object' && config\n\n if (!data && /dispose|hide/.test(config)) {\n return\n }\n\n if (!data) {\n data = new Tooltip(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Tooltip._jQueryInterface\n$.fn[NAME].Constructor = Tooltip\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Tooltip._jQueryInterface\n}\n\nexport default Tooltip\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Tooltip from './tooltip'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'popover'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.popover'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst CLASS_PREFIX = 'bs-popover'\nconst BSCLS_PREFIX_REGEX = new RegExp(`(^|\\\\s)${CLASS_PREFIX}\\\\S+`, 'g')\n\nconst Default = {\n ...Tooltip.Default,\n placement : 'right',\n trigger : 'click',\n content : '',\n template : '
' +\n '
' +\n '

' +\n '
'\n}\n\nconst DefaultType = {\n ...Tooltip.DefaultType,\n content : '(string|element|function)'\n}\n\nconst ClassName = {\n FADE : 'fade',\n SHOW : 'show'\n}\n\nconst Selector = {\n TITLE : '.popover-header',\n CONTENT : '.popover-body'\n}\n\nconst Event = {\n HIDE : `hide${EVENT_KEY}`,\n HIDDEN : `hidden${EVENT_KEY}`,\n SHOW : `show${EVENT_KEY}`,\n SHOWN : `shown${EVENT_KEY}`,\n INSERTED : `inserted${EVENT_KEY}`,\n CLICK : `click${EVENT_KEY}`,\n FOCUSIN : `focusin${EVENT_KEY}`,\n FOCUSOUT : `focusout${EVENT_KEY}`,\n MOUSEENTER : `mouseenter${EVENT_KEY}`,\n MOUSELEAVE : `mouseleave${EVENT_KEY}`\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Popover extends Tooltip {\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n static get DATA_KEY() {\n return DATA_KEY\n }\n\n static get Event() {\n return Event\n }\n\n static get EVENT_KEY() {\n return EVENT_KEY\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n // Overrides\n\n isWithContent() {\n return this.getTitle() || this._getContent()\n }\n\n addAttachmentClass(attachment) {\n $(this.getTipElement()).addClass(`${CLASS_PREFIX}-${attachment}`)\n }\n\n getTipElement() {\n this.tip = this.tip || $(this.config.template)[0]\n return this.tip\n }\n\n setContent() {\n const $tip = $(this.getTipElement())\n\n // We use append for html objects to maintain js events\n this.setElementContent($tip.find(Selector.TITLE), this.getTitle())\n let content = this._getContent()\n if (typeof content === 'function') {\n content = content.call(this.element)\n }\n this.setElementContent($tip.find(Selector.CONTENT), content)\n\n $tip.removeClass(`${ClassName.FADE} ${ClassName.SHOW}`)\n }\n\n // Private\n\n _getContent() {\n return this.element.getAttribute('data-content') ||\n this.config.content\n }\n\n _cleanTipClass() {\n const $tip = $(this.getTipElement())\n const tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX)\n if (tabClass !== null && tabClass.length > 0) {\n $tip.removeClass(tabClass.join(''))\n }\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = typeof config === 'object' ? config : null\n\n if (!data && /dispose|hide/.test(config)) {\n return\n }\n\n if (!data) {\n data = new Popover(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Popover._jQueryInterface\n$.fn[NAME].Constructor = Popover\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Popover._jQueryInterface\n}\n\nexport default Popover\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'scrollspy'\nconst VERSION = '4.3.1'\nconst DATA_KEY = 'bs.scrollspy'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst Default = {\n offset : 10,\n method : 'auto',\n target : ''\n}\n\nconst DefaultType = {\n offset : 'number',\n method : 'string',\n target : '(string|element)'\n}\n\nconst Event = {\n ACTIVATE : `activate${EVENT_KEY}`,\n SCROLL : `scroll${EVENT_KEY}`,\n LOAD_DATA_API : `load${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n DROPDOWN_ITEM : 'dropdown-item',\n DROPDOWN_MENU : 'dropdown-menu',\n ACTIVE : 'active'\n}\n\nconst Selector = {\n DATA_SPY : '[data-spy=\"scroll\"]',\n ACTIVE : '.active',\n NAV_LIST_GROUP : '.nav, .list-group',\n NAV_LINKS : '.nav-link',\n NAV_ITEMS : '.nav-item',\n LIST_ITEMS : '.list-group-item',\n DROPDOWN : '.dropdown',\n DROPDOWN_ITEMS : '.dropdown-item',\n DROPDOWN_TOGGLE : '.dropdown-toggle'\n}\n\nconst OffsetMethod = {\n OFFSET : 'offset',\n POSITION : 'position'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass ScrollSpy {\n constructor(element, config) {\n this._element = element\n this._scrollElement = element.tagName === 'BODY' ? window : element\n this._config = this._getConfig(config)\n this._selector = `${this._config.target} ${Selector.NAV_LINKS},` +\n `${this._config.target} ${Selector.LIST_ITEMS},` +\n `${this._config.target} ${Selector.DROPDOWN_ITEMS}`\n this._offsets = []\n this._targets = []\n this._activeTarget = null\n this._scrollHeight = 0\n\n $(this._scrollElement).on(Event.SCROLL, (event) => this._process(event))\n\n this.refresh()\n this._process()\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n refresh() {\n const autoMethod = this._scrollElement === this._scrollElement.window\n ? OffsetMethod.OFFSET : OffsetMethod.POSITION\n\n const offsetMethod = this._config.method === 'auto'\n ? autoMethod : this._config.method\n\n const offsetBase = offsetMethod === OffsetMethod.POSITION\n ? this._getScrollTop() : 0\n\n this._offsets = []\n this._targets = []\n\n this._scrollHeight = this._getScrollHeight()\n\n const targets = [].slice.call(document.querySelectorAll(this._selector))\n\n targets\n .map((element) => {\n let target\n const targetSelector = Util.getSelectorFromElement(element)\n\n if (targetSelector) {\n target = document.querySelector(targetSelector)\n }\n\n if (target) {\n const targetBCR = target.getBoundingClientRect()\n if (targetBCR.width || targetBCR.height) {\n // TODO (fat): remove sketch reliance on jQuery position/offset\n return [\n $(target)[offsetMethod]().top + offsetBase,\n targetSelector\n ]\n }\n }\n return null\n })\n .filter((item) => item)\n .sort((a, b) => a[0] - b[0])\n .forEach((item) => {\n this._offsets.push(item[0])\n this._targets.push(item[1])\n })\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n $(this._scrollElement).off(EVENT_KEY)\n\n this._element = null\n this._scrollElement = null\n this._config = null\n this._selector = null\n this._offsets = null\n this._targets = null\n this._activeTarget = null\n this._scrollHeight = null\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...typeof config === 'object' && config ? config : {}\n }\n\n if (typeof config.target !== 'string') {\n let id = $(config.target).attr('id')\n if (!id) {\n id = Util.getUID(NAME)\n $(config.target).attr('id', id)\n }\n config.target = `#${id}`\n }\n\n Util.typeCheckConfig(NAME, config, DefaultType)\n\n return config\n }\n\n _getScrollTop() {\n return this._scrollElement === window\n ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop\n }\n\n _getScrollHeight() {\n return this._scrollElement.scrollHeight || Math.max(\n document.body.scrollHeight,\n document.documentElement.scrollHeight\n )\n }\n\n _getOffsetHeight() {\n return this._scrollElement === window\n ? window.innerHeight : this._scrollElement.getBoundingClientRect().height\n }\n\n _process() {\n const scrollTop = this._getScrollTop() + this._config.offset\n const scrollHeight = this._getScrollHeight()\n const maxScroll = this._config.offset +\n scrollHeight -\n this._getOffsetHeight()\n\n if (this._scrollHeight !== scrollHeight) {\n this.refresh()\n }\n\n if (scrollTop >= maxScroll) {\n const target = this._targets[this._targets.length - 1]\n\n if (this._activeTarget !== target) {\n this._activate(target)\n }\n return\n }\n\n if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\n this._activeTarget = null\n this._clear()\n return\n }\n\n const offsetLength = this._offsets.length\n for (let i = offsetLength; i--;) {\n const isActiveTarget = this._activeTarget !== this._targets[i] &&\n scrollTop >= this._offsets[i] &&\n (typeof this._offsets[i + 1] === 'undefined' ||\n scrollTop < this._offsets[i + 1])\n\n if (isActiveTarget) {\n this._activate(this._targets[i])\n }\n }\n }\n\n _activate(target) {\n this._activeTarget = target\n\n this._clear()\n\n const queries = this._selector\n .split(',')\n .map((selector) => `${selector}[data-target=\"${target}\"],${selector}[href=\"${target}\"]`)\n\n const $link = $([].slice.call(document.querySelectorAll(queries.join(','))))\n\n if ($link.hasClass(ClassName.DROPDOWN_ITEM)) {\n $link.closest(Selector.DROPDOWN).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE)\n $link.addClass(ClassName.ACTIVE)\n } else {\n // Set triggered link as active\n $link.addClass(ClassName.ACTIVE)\n // Set triggered links parents as active\n // With both
',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",sanitize:!0,sanitizeFn:null,whiteList:Qt,popperConfig:null},Zt={HIDE:"hide.bs.tooltip",HIDDEN:"hidden.bs.tooltip",SHOW:"show.bs.tooltip",SHOWN:"shown.bs.tooltip",INSERTED:"inserted.bs.tooltip",CLICK:"click.bs.tooltip",FOCUSIN:"focusin.bs.tooltip",FOCUSOUT:"focusout.bs.tooltip",MOUSEENTER:"mouseenter.bs.tooltip",MOUSELEAVE:"mouseleave.bs.tooltip"},te=function(){function t(t,e){if("undefined"==typeof It)throw new TypeError("Bootstrap's tooltips require Popper.js (https://popper.js.org/)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var e=t.prototype;return e.enable=function(){this._isEnabled=!0},e.disable=function(){this._isEnabled=!1},e.toggleEnabled=function(){this._isEnabled=!this._isEnabled},e.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=i.default(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),i.default(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(i.default(this.getTipElement()).hasClass("show"))return void this._leave(null,this);this._enter(null,this)}},e.dispose=function(){clearTimeout(this._timeout),i.default.removeData(this.element,this.constructor.DATA_KEY),i.default(this.element).off(this.constructor.EVENT_KEY),i.default(this.element).closest(".modal").off("hide.bs.modal",this._hideModalHandler),this.tip&&i.default(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},e.show=function(){var t=this;if("none"===i.default(this.element).css("display"))throw new Error("Please use show on visible elements");var e=i.default.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){i.default(this.element).trigger(e);var n=l.findShadowRoot(this.element),o=i.default.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(e.isDefaultPrevented()||!o)return;var r=this.getTipElement(),a=l.getUID(this.constructor.NAME);r.setAttribute("id",a),this.element.setAttribute("aria-describedby",a),this.setContent(),this.config.animation&&i.default(r).addClass("fade");var s="function"==typeof this.config.placement?this.config.placement.call(this,r,this.element):this.config.placement,u=this._getAttachment(s);this.addAttachmentClass(u);var f=this._getContainer();i.default(r).data(this.constructor.DATA_KEY,this),i.default.contains(this.element.ownerDocument.documentElement,this.tip)||i.default(r).appendTo(f),i.default(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new It(this.element,r,this._getPopperConfig(u)),i.default(r).addClass("show"),"ontouchstart"in document.documentElement&&i.default(document.body).children().on("mouseover",null,i.default.noop);var d=function(){t.config.animation&&t._fixTransition();var e=t._hoverState;t._hoverState=null,i.default(t.element).trigger(t.constructor.Event.SHOWN),"out"===e&&t._leave(null,t)};if(i.default(this.tip).hasClass("fade")){var c=l.getTransitionDurationFromElement(this.tip);i.default(this.tip).one(l.TRANSITION_END,d).emulateTransitionEnd(c)}else d()}},e.hide=function(t){var e=this,n=this.getTipElement(),o=i.default.Event(this.constructor.Event.HIDE),r=function(){"show"!==e._hoverState&&n.parentNode&&n.parentNode.removeChild(n),e._cleanTipClass(),e.element.removeAttribute("aria-describedby"),i.default(e.element).trigger(e.constructor.Event.HIDDEN),null!==e._popper&&e._popper.destroy(),t&&t()};if(i.default(this.element).trigger(o),!o.isDefaultPrevented()){if(i.default(n).removeClass("show"),"ontouchstart"in document.documentElement&&i.default(document.body).children().off("mouseover",null,i.default.noop),this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1,i.default(this.tip).hasClass("fade")){var a=l.getTransitionDurationFromElement(n);i.default(n).one(l.TRANSITION_END,r).emulateTransitionEnd(a)}else r();this._hoverState=""}},e.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},e.isWithContent=function(){return Boolean(this.getTitle())},e.addAttachmentClass=function(t){i.default(this.getTipElement()).addClass("bs-tooltip-"+t)},e.getTipElement=function(){return this.tip=this.tip||i.default(this.config.template)[0],this.tip},e.setContent=function(){var t=this.getTipElement();this.setElementContent(i.default(t.querySelectorAll(".tooltip-inner")),this.getTitle()),i.default(t).removeClass("fade show")},e.setElementContent=function(t,e){"object"!=typeof e||!e.nodeType&&!e.jquery?this.config.html?(this.config.sanitize&&(e=Vt(e,this.config.whiteList,this.config.sanitizeFn)),t.html(e)):t.text(e):this.config.html?i.default(e).parent().is(t)||t.empty().append(e):t.text(i.default(e).text())},e.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},e._getPopperConfig=function(t){var e=this;return a({},{placement:t,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:".arrow"},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}},this.config.popperConfig)},e._getOffset=function(){var t=this,e={};return"function"==typeof this.config.offset?e.fn=function(e){return e.offsets=a({},e.offsets,t.config.offset(e.offsets,t.element)||{}),e}:e.offset=this.config.offset,e},e._getContainer=function(){return!1===this.config.container?document.body:l.isElement(this.config.container)?i.default(this.config.container):i.default(document).find(this.config.container)},e._getAttachment=function(t){return $t[t.toUpperCase()]},e._setListeners=function(){var t=this;this.config.trigger.split(" ").forEach((function(e){if("click"===e)i.default(t.element).on(t.constructor.Event.CLICK,t.config.selector,(function(e){return t.toggle(e)}));else if("manual"!==e){var n="hover"===e?t.constructor.Event.MOUSEENTER:t.constructor.Event.FOCUSIN,o="hover"===e?t.constructor.Event.MOUSELEAVE:t.constructor.Event.FOCUSOUT;i.default(t.element).on(n,t.config.selector,(function(e){return t._enter(e)})).on(o,t.config.selector,(function(e){return t._leave(e)}))}})),this._hideModalHandler=function(){t.element&&t.hide()},i.default(this.element).closest(".modal").on("hide.bs.modal",this._hideModalHandler),this.config.selector?this.config=a({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},e._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},e._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||i.default(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),i.default(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusin"===t.type?"focus":"hover"]=!0),i.default(e.getTipElement()).hasClass("show")||"show"===e._hoverState?e._hoverState="show":(clearTimeout(e._timeout),e._hoverState="show",e.config.delay&&e.config.delay.show?e._timeout=setTimeout((function(){"show"===e._hoverState&&e.show()}),e.config.delay.show):e.show())},e._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||i.default(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),i.default(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusout"===t.type?"focus":"hover"]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState="out",e.config.delay&&e.config.delay.hide?e._timeout=setTimeout((function(){"out"===e._hoverState&&e.hide()}),e.config.delay.hide):e.hide())},e._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},e._getConfig=function(t){var e=i.default(this.element).data();return Object.keys(e).forEach((function(t){-1!==Kt.indexOf(t)&&delete e[t]})),"number"==typeof(t=a({},this.constructor.Default,e,"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),l.typeCheckConfig(Yt,t,this.constructor.DefaultType),t.sanitize&&(t.template=Vt(t.template,t.whiteList,t.sanitizeFn)),t},e._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},e._cleanTipClass=function(){var t=i.default(this.getTipElement()),e=t.attr("class").match(Xt);null!==e&&e.length&&t.removeClass(e.join(""))},e._handlePopperPlacementChange=function(t){this.tip=t.instance.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},e._fixTransition=function(){var t=this.getTipElement(),e=this.config.animation;null===t.getAttribute("x-placement")&&(i.default(t).removeClass("fade"),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},t._jQueryInterface=function(e){return this.each((function(){var n=i.default(this),o=n.data("bs.tooltip"),r="object"==typeof e&&e;if((o||!/dispose|hide/.test(e))&&(o||(o=new t(this,r),n.data("bs.tooltip",o)),"string"==typeof e)){if("undefined"==typeof o[e])throw new TypeError('No method named "'+e+'"');o[e]()}}))},r(t,null,[{key:"VERSION",get:function(){return"4.5.3"}},{key:"Default",get:function(){return Jt}},{key:"NAME",get:function(){return Yt}},{key:"DATA_KEY",get:function(){return"bs.tooltip"}},{key:"Event",get:function(){return Zt}},{key:"EVENT_KEY",get:function(){return".bs.tooltip"}},{key:"DefaultType",get:function(){return Gt}}]),t}();i.default.fn[Yt]=te._jQueryInterface,i.default.fn[Yt].Constructor=te,i.default.fn[Yt].noConflict=function(){return i.default.fn[Yt]=zt,te._jQueryInterface};var ee="popover",ne=i.default.fn[ee],ie=new RegExp("(^|\\s)bs-popover\\S+","g"),oe=a({},te.Default,{placement:"right",trigger:"click",content:"",template:''}),re=a({},te.DefaultType,{content:"(string|element|function)"}),ae={HIDE:"hide.bs.popover",HIDDEN:"hidden.bs.popover",SHOW:"show.bs.popover",SHOWN:"shown.bs.popover",INSERTED:"inserted.bs.popover",CLICK:"click.bs.popover",FOCUSIN:"focusin.bs.popover",FOCUSOUT:"focusout.bs.popover",MOUSEENTER:"mouseenter.bs.popover",MOUSELEAVE:"mouseleave.bs.popover"},se=function(t){var e,n;function o(){return t.apply(this,arguments)||this}n=t,(e=o).prototype=Object.create(n.prototype),e.prototype.constructor=e,e.__proto__=n;var a=o.prototype;return a.isWithContent=function(){return this.getTitle()||this._getContent()},a.addAttachmentClass=function(t){i.default(this.getTipElement()).addClass("bs-popover-"+t)},a.getTipElement=function(){return this.tip=this.tip||i.default(this.config.template)[0],this.tip},a.setContent=function(){var t=i.default(this.getTipElement());this.setElementContent(t.find(".popover-header"),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(".popover-body"),e),t.removeClass("fade show")},a._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},a._cleanTipClass=function(){var t=i.default(this.getTipElement()),e=t.attr("class").match(ie);null!==e&&e.length>0&&t.removeClass(e.join(""))},o._jQueryInterface=function(t){return this.each((function(){var e=i.default(this).data("bs.popover"),n="object"==typeof t?t:null;if((e||!/dispose|hide/.test(t))&&(e||(e=new o(this,n),i.default(this).data("bs.popover",e)),"string"==typeof t)){if("undefined"==typeof e[t])throw new TypeError('No method named "'+t+'"');e[t]()}}))},r(o,null,[{key:"VERSION",get:function(){return"4.5.3"}},{key:"Default",get:function(){return oe}},{key:"NAME",get:function(){return ee}},{key:"DATA_KEY",get:function(){return"bs.popover"}},{key:"Event",get:function(){return ae}},{key:"EVENT_KEY",get:function(){return".bs.popover"}},{key:"DefaultType",get:function(){return re}}]),o}(te);i.default.fn[ee]=se._jQueryInterface,i.default.fn[ee].Constructor=se,i.default.fn[ee].noConflict=function(){return i.default.fn[ee]=ne,se._jQueryInterface};var le="scrollspy",ue=i.default.fn[le],fe={offset:10,method:"auto",target:""},de={offset:"number",method:"string",target:"(string|element)"},ce=function(){function t(t,e){var n=this;this._element=t,this._scrollElement="BODY"===t.tagName?window:t,this._config=this._getConfig(e),this._selector=this._config.target+" .nav-link,"+this._config.target+" .list-group-item,"+this._config.target+" .dropdown-item",this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,i.default(this._scrollElement).on("scroll.bs.scrollspy",(function(t){return n._process(t)})),this.refresh(),this._process()}var e=t.prototype;return e.refresh=function(){var t=this,e=this._scrollElement===this._scrollElement.window?"offset":"position",n="auto"===this._config.method?e:this._config.method,o="position"===n?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),[].slice.call(document.querySelectorAll(this._selector)).map((function(t){var e,r=l.getSelectorFromElement(t);if(r&&(e=document.querySelector(r)),e){var a=e.getBoundingClientRect();if(a.width||a.height)return[i.default(e)[n]().top+o,r]}return null})).filter((function(t){return t})).sort((function(t,e){return t[0]-e[0]})).forEach((function(e){t._offsets.push(e[0]),t._targets.push(e[1])}))},e.dispose=function(){i.default.removeData(this._element,"bs.scrollspy"),i.default(this._scrollElement).off(".bs.scrollspy"),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},e._getConfig=function(t){if("string"!=typeof(t=a({},fe,"object"==typeof t&&t?t:{})).target&&l.isElement(t.target)){var e=i.default(t.target).attr("id");e||(e=l.getUID(le),i.default(t.target).attr("id",e)),t.target="#"+e}return l.typeCheckConfig(le,t,de),t},e._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},e._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},e._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},e._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=n){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t0)return this._activeTarget=null,void this._clear();for(var o=this._offsets.length;o--;){this._activeTarget!==this._targets[o]&&t>=this._offsets[o]&&("undefined"==typeof this._offsets[o+1]||t li > .active":".active";n=(n=i.default.makeArray(i.default(o).find(a)))[n.length-1]}var s=i.default.Event("hide.bs.tab",{relatedTarget:this._element}),u=i.default.Event("show.bs.tab",{relatedTarget:n});if(n&&i.default(n).trigger(s),i.default(this._element).trigger(u),!u.isDefaultPrevented()&&!s.isDefaultPrevented()){r&&(e=document.querySelector(r)),this._activate(this._element,o);var f=function(){var e=i.default.Event("hidden.bs.tab",{relatedTarget:t._element}),o=i.default.Event("shown.bs.tab",{relatedTarget:n});i.default(n).trigger(e),i.default(t._element).trigger(o)};e?this._activate(e,e.parentNode,f):f()}}},e.dispose=function(){i.default.removeData(this._element,"bs.tab"),this._element=null},e._activate=function(t,e,n){var o=this,r=(!e||"UL"!==e.nodeName&&"OL"!==e.nodeName?i.default(e).children(".active"):i.default(e).find("> li > .active"))[0],a=n&&r&&i.default(r).hasClass("fade"),s=function(){return o._transitionComplete(t,r,n)};if(r&&a){var u=l.getTransitionDurationFromElement(r);i.default(r).removeClass("show").one(l.TRANSITION_END,s).emulateTransitionEnd(u)}else s()},e._transitionComplete=function(t,e,n){if(e){i.default(e).removeClass("active");var o=i.default(e.parentNode).find("> .dropdown-menu .active")[0];o&&i.default(o).removeClass("active"),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!1)}if(i.default(t).addClass("active"),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),l.reflow(t),t.classList.contains("fade")&&t.classList.add("show"),t.parentNode&&i.default(t.parentNode).hasClass("dropdown-menu")){var r=i.default(t).closest(".dropdown")[0];if(r){var a=[].slice.call(r.querySelectorAll(".dropdown-toggle"));i.default(a).addClass("active")}t.setAttribute("aria-expanded",!0)}n&&n()},t._jQueryInterface=function(e){return this.each((function(){var n=i.default(this),o=n.data("bs.tab");if(o||(o=new t(this),n.data("bs.tab",o)),"string"==typeof e){if("undefined"==typeof o[e])throw new TypeError('No method named "'+e+'"');o[e]()}}))},r(t,null,[{key:"VERSION",get:function(){return"4.5.3"}}]),t}();i.default(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',(function(t){t.preventDefault(),pe._jQueryInterface.call(i.default(this),"show")})),i.default.fn.tab=pe._jQueryInterface,i.default.fn.tab.Constructor=pe,i.default.fn.tab.noConflict=function(){return i.default.fn.tab=he,pe._jQueryInterface};var me=i.default.fn.toast,ge={animation:"boolean",autohide:"boolean",delay:"number"},ve={animation:!0,autohide:!0,delay:500},_e=function(){function t(t,e){this._element=t,this._config=this._getConfig(e),this._timeout=null,this._setListeners()}var e=t.prototype;return e.show=function(){var t=this,e=i.default.Event("show.bs.toast");if(i.default(this._element).trigger(e),!e.isDefaultPrevented()){this._clearTimeout(),this._config.animation&&this._element.classList.add("fade");var n=function(){t._element.classList.remove("showing"),t._element.classList.add("show"),i.default(t._element).trigger("shown.bs.toast"),t._config.autohide&&(t._timeout=setTimeout((function(){t.hide()}),t._config.delay))};if(this._element.classList.remove("hide"),l.reflow(this._element),this._element.classList.add("showing"),this._config.animation){var o=l.getTransitionDurationFromElement(this._element);i.default(this._element).one(l.TRANSITION_END,n).emulateTransitionEnd(o)}else n()}},e.hide=function(){if(this._element.classList.contains("show")){var t=i.default.Event("hide.bs.toast");i.default(this._element).trigger(t),t.isDefaultPrevented()||this._close()}},e.dispose=function(){this._clearTimeout(),this._element.classList.contains("show")&&this._element.classList.remove("show"),i.default(this._element).off("click.dismiss.bs.toast"),i.default.removeData(this._element,"bs.toast"),this._element=null,this._config=null},e._getConfig=function(t){return t=a({},ve,i.default(this._element).data(),"object"==typeof t&&t?t:{}),l.typeCheckConfig("toast",t,this.constructor.DefaultType),t},e._setListeners=function(){var t=this;i.default(this._element).on("click.dismiss.bs.toast",'[data-dismiss="toast"]',(function(){return t.hide()}))},e._close=function(){var t=this,e=function(){t._element.classList.add("hide"),i.default(t._element).trigger("hidden.bs.toast")};if(this._element.classList.remove("show"),this._config.animation){var n=l.getTransitionDurationFromElement(this._element);i.default(this._element).one(l.TRANSITION_END,e).emulateTransitionEnd(n)}else e()},e._clearTimeout=function(){clearTimeout(this._timeout),this._timeout=null},t._jQueryInterface=function(e){return this.each((function(){var n=i.default(this),o=n.data("bs.toast");if(o||(o=new t(this,"object"==typeof e&&e),n.data("bs.toast",o)),"string"==typeof e){if("undefined"==typeof o[e])throw new TypeError('No method named "'+e+'"');o[e](this)}}))},r(t,null,[{key:"VERSION",get:function(){return"4.5.3"}},{key:"DefaultType",get:function(){return ge}},{key:"Default",get:function(){return ve}}]),t}();i.default.fn.toast=_e._jQueryInterface,i.default.fn.toast.Constructor=_e,i.default.fn.toast.noConflict=function(){return i.default.fn.toast=me,_e._jQueryInterface},t.Alert=d,t.Button=h,t.Carousel=y,t.Collapse=S,t.Dropdown=Ft,t.Modal=Bt,t.Popover=se,t.Scrollspy=ce,t.Tab=pe,t.Toast=_e,t.Tooltip=te,t.Util=l,Object.defineProperty(t,"__esModule",{value:!0})})); -//# sourceMappingURL=bootstrap.bundle.min.js.map \ No newline at end of file diff --git a/_Resources/node_modules/web-dev-utils/personal-utilities/js/bootstrap.js b/_Resources/node_modules/web-dev-utils/personal-utilities/js/bootstrap.js deleted file mode 100644 index 8b95e65..0000000 --- a/_Resources/node_modules/web-dev-utils/personal-utilities/js/bootstrap.js +++ /dev/null @@ -1,4418 +0,0 @@ -/*! - * Bootstrap v4.5.3 (https://getbootstrap.com/) - * Copyright 2011-2020 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */ -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('jquery'), require('popper.js')) : - typeof define === 'function' && define.amd ? define(['exports', 'jquery', 'popper.js'], factory) : - (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.bootstrap = {}, global.jQuery, global.Popper)); -}(this, (function (exports, $, Popper) { 'use strict'; - - function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } - - var $__default = /*#__PURE__*/_interopDefaultLegacy($); - var Popper__default = /*#__PURE__*/_interopDefaultLegacy(Popper); - - function _defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } - } - - function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) _defineProperties(Constructor.prototype, protoProps); - if (staticProps) _defineProperties(Constructor, staticProps); - return Constructor; - } - - function _extends() { - _extends = Object.assign || function (target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - - for (var key in source) { - if (Object.prototype.hasOwnProperty.call(source, key)) { - target[key] = source[key]; - } - } - } - - return target; - }; - - return _extends.apply(this, arguments); - } - - function _inheritsLoose(subClass, superClass) { - subClass.prototype = Object.create(superClass.prototype); - subClass.prototype.constructor = subClass; - subClass.__proto__ = superClass; - } - - /** - * -------------------------------------------------------------------------- - * Bootstrap (v4.5.3): util.js - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - * -------------------------------------------------------------------------- - */ - /** - * ------------------------------------------------------------------------ - * Private TransitionEnd Helpers - * ------------------------------------------------------------------------ - */ - - var TRANSITION_END = 'transitionend'; - var MAX_UID = 1000000; - var MILLISECONDS_MULTIPLIER = 1000; // Shoutout AngusCroll (https://goo.gl/pxwQGp) - - function toType(obj) { - if (obj === null || typeof obj === 'undefined') { - return "" + obj; - } - - return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase(); - } - - function getSpecialTransitionEndEvent() { - return { - bindType: TRANSITION_END, - delegateType: TRANSITION_END, - handle: function handle(event) { - if ($__default['default'](event.target).is(this)) { - return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params - } - - return undefined; - } - }; - } - - function transitionEndEmulator(duration) { - var _this = this; - - var called = false; - $__default['default'](this).one(Util.TRANSITION_END, function () { - called = true; - }); - setTimeout(function () { - if (!called) { - Util.triggerTransitionEnd(_this); - } - }, duration); - return this; - } - - function setTransitionEndSupport() { - $__default['default'].fn.emulateTransitionEnd = transitionEndEmulator; - $__default['default'].event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent(); - } - /** - * -------------------------------------------------------------------------- - * Public Util Api - * -------------------------------------------------------------------------- - */ - - - var Util = { - TRANSITION_END: 'bsTransitionEnd', - getUID: function getUID(prefix) { - do { - prefix += ~~(Math.random() * MAX_UID); // "~~" acts like a faster Math.floor() here - } while (document.getElementById(prefix)); - - return prefix; - }, - getSelectorFromElement: function getSelectorFromElement(element) { - var selector = element.getAttribute('data-target'); - - if (!selector || selector === '#') { - var hrefAttr = element.getAttribute('href'); - selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : ''; - } - - try { - return document.querySelector(selector) ? selector : null; - } catch (_) { - return null; - } - }, - getTransitionDurationFromElement: function getTransitionDurationFromElement(element) { - if (!element) { - return 0; - } // Get transition-duration of the element - - - var transitionDuration = $__default['default'](element).css('transition-duration'); - var transitionDelay = $__default['default'](element).css('transition-delay'); - var floatTransitionDuration = parseFloat(transitionDuration); - var floatTransitionDelay = parseFloat(transitionDelay); // Return 0 if element or transition duration is not found - - if (!floatTransitionDuration && !floatTransitionDelay) { - return 0; - } // If multiple durations are defined, take the first - - - transitionDuration = transitionDuration.split(',')[0]; - transitionDelay = transitionDelay.split(',')[0]; - return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER; - }, - reflow: function reflow(element) { - return element.offsetHeight; - }, - triggerTransitionEnd: function triggerTransitionEnd(element) { - $__default['default'](element).trigger(TRANSITION_END); - }, - supportsTransitionEnd: function supportsTransitionEnd() { - return Boolean(TRANSITION_END); - }, - isElement: function isElement(obj) { - return (obj[0] || obj).nodeType; - }, - typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) { - for (var property in configTypes) { - if (Object.prototype.hasOwnProperty.call(configTypes, property)) { - var expectedTypes = configTypes[property]; - var value = config[property]; - var valueType = value && Util.isElement(value) ? 'element' : toType(value); - - if (!new RegExp(expectedTypes).test(valueType)) { - throw new Error(componentName.toUpperCase() + ": " + ("Option \"" + property + "\" provided type \"" + valueType + "\" ") + ("but expected type \"" + expectedTypes + "\".")); - } - } - } - }, - findShadowRoot: function findShadowRoot(element) { - if (!document.documentElement.attachShadow) { - return null; - } // Can find the shadow root otherwise it'll return the document - - - if (typeof element.getRootNode === 'function') { - var root = element.getRootNode(); - return root instanceof ShadowRoot ? root : null; - } - - if (element instanceof ShadowRoot) { - return element; - } // when we don't find a shadow root - - - if (!element.parentNode) { - return null; - } - - return Util.findShadowRoot(element.parentNode); - }, - jQueryDetection: function jQueryDetection() { - if (typeof $__default['default'] === 'undefined') { - throw new TypeError('Bootstrap\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\'s JavaScript.'); - } - - var version = $__default['default'].fn.jquery.split(' ')[0].split('.'); - var minMajor = 1; - var ltMajor = 2; - var minMinor = 9; - var minPatch = 1; - var maxMajor = 4; - - if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) { - throw new Error('Bootstrap\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0'); - } - } - }; - Util.jQueryDetection(); - setTransitionEndSupport(); - - /** - * ------------------------------------------------------------------------ - * Constants - * ------------------------------------------------------------------------ - */ - - var NAME = 'alert'; - var VERSION = '4.5.3'; - var DATA_KEY = 'bs.alert'; - var EVENT_KEY = "." + DATA_KEY; - var DATA_API_KEY = '.data-api'; - var JQUERY_NO_CONFLICT = $__default['default'].fn[NAME]; - var SELECTOR_DISMISS = '[data-dismiss="alert"]'; - var EVENT_CLOSE = "close" + EVENT_KEY; - var EVENT_CLOSED = "closed" + EVENT_KEY; - var EVENT_CLICK_DATA_API = "click" + EVENT_KEY + DATA_API_KEY; - var CLASS_NAME_ALERT = 'alert'; - var CLASS_NAME_FADE = 'fade'; - var CLASS_NAME_SHOW = 'show'; - /** - * ------------------------------------------------------------------------ - * Class Definition - * ------------------------------------------------------------------------ - */ - - var Alert = /*#__PURE__*/function () { - function Alert(element) { - this._element = element; - } // Getters - - - var _proto = Alert.prototype; - - // Public - _proto.close = function close(element) { - var rootElement = this._element; - - if (element) { - rootElement = this._getRootElement(element); - } - - var customEvent = this._triggerCloseEvent(rootElement); - - if (customEvent.isDefaultPrevented()) { - return; - } - - this._removeElement(rootElement); - }; - - _proto.dispose = function dispose() { - $__default['default'].removeData(this._element, DATA_KEY); - this._element = null; - } // Private - ; - - _proto._getRootElement = function _getRootElement(element) { - var selector = Util.getSelectorFromElement(element); - var parent = false; - - if (selector) { - parent = document.querySelector(selector); - } - - if (!parent) { - parent = $__default['default'](element).closest("." + CLASS_NAME_ALERT)[0]; - } - - return parent; - }; - - _proto._triggerCloseEvent = function _triggerCloseEvent(element) { - var closeEvent = $__default['default'].Event(EVENT_CLOSE); - $__default['default'](element).trigger(closeEvent); - return closeEvent; - }; - - _proto._removeElement = function _removeElement(element) { - var _this = this; - - $__default['default'](element).removeClass(CLASS_NAME_SHOW); - - if (!$__default['default'](element).hasClass(CLASS_NAME_FADE)) { - this._destroyElement(element); - - return; - } - - var transitionDuration = Util.getTransitionDurationFromElement(element); - $__default['default'](element).one(Util.TRANSITION_END, function (event) { - return _this._destroyElement(element, event); - }).emulateTransitionEnd(transitionDuration); - }; - - _proto._destroyElement = function _destroyElement(element) { - $__default['default'](element).detach().trigger(EVENT_CLOSED).remove(); - } // Static - ; - - Alert._jQueryInterface = function _jQueryInterface(config) { - return this.each(function () { - var $element = $__default['default'](this); - var data = $element.data(DATA_KEY); - - if (!data) { - data = new Alert(this); - $element.data(DATA_KEY, data); - } - - if (config === 'close') { - data[config](this); - } - }); - }; - - Alert._handleDismiss = function _handleDismiss(alertInstance) { - return function (event) { - if (event) { - event.preventDefault(); - } - - alertInstance.close(this); - }; - }; - - _createClass(Alert, null, [{ - key: "VERSION", - get: function get() { - return VERSION; - } - }]); - - return Alert; - }(); - /** - * ------------------------------------------------------------------------ - * Data Api implementation - * ------------------------------------------------------------------------ - */ - - - $__default['default'](document).on(EVENT_CLICK_DATA_API, SELECTOR_DISMISS, Alert._handleDismiss(new Alert())); - /** - * ------------------------------------------------------------------------ - * jQuery - * ------------------------------------------------------------------------ - */ - - $__default['default'].fn[NAME] = Alert._jQueryInterface; - $__default['default'].fn[NAME].Constructor = Alert; - - $__default['default'].fn[NAME].noConflict = function () { - $__default['default'].fn[NAME] = JQUERY_NO_CONFLICT; - return Alert._jQueryInterface; - }; - - /** - * ------------------------------------------------------------------------ - * Constants - * ------------------------------------------------------------------------ - */ - - var NAME$1 = 'button'; - var VERSION$1 = '4.5.3'; - var DATA_KEY$1 = 'bs.button'; - var EVENT_KEY$1 = "." + DATA_KEY$1; - var DATA_API_KEY$1 = '.data-api'; - var JQUERY_NO_CONFLICT$1 = $__default['default'].fn[NAME$1]; - var CLASS_NAME_ACTIVE = 'active'; - var CLASS_NAME_BUTTON = 'btn'; - var CLASS_NAME_FOCUS = 'focus'; - var SELECTOR_DATA_TOGGLE_CARROT = '[data-toggle^="button"]'; - var SELECTOR_DATA_TOGGLES = '[data-toggle="buttons"]'; - var SELECTOR_DATA_TOGGLE = '[data-toggle="button"]'; - var SELECTOR_DATA_TOGGLES_BUTTONS = '[data-toggle="buttons"] .btn'; - var SELECTOR_INPUT = 'input:not([type="hidden"])'; - var SELECTOR_ACTIVE = '.active'; - var SELECTOR_BUTTON = '.btn'; - var EVENT_CLICK_DATA_API$1 = "click" + EVENT_KEY$1 + DATA_API_KEY$1; - var EVENT_FOCUS_BLUR_DATA_API = "focus" + EVENT_KEY$1 + DATA_API_KEY$1 + " " + ("blur" + EVENT_KEY$1 + DATA_API_KEY$1); - var EVENT_LOAD_DATA_API = "load" + EVENT_KEY$1 + DATA_API_KEY$1; - /** - * ------------------------------------------------------------------------ - * Class Definition - * ------------------------------------------------------------------------ - */ - - var Button = /*#__PURE__*/function () { - function Button(element) { - this._element = element; - this.shouldAvoidTriggerChange = false; - } // Getters - - - var _proto = Button.prototype; - - // Public - _proto.toggle = function toggle() { - var triggerChangeEvent = true; - var addAriaPressed = true; - var rootElement = $__default['default'](this._element).closest(SELECTOR_DATA_TOGGLES)[0]; - - if (rootElement) { - var input = this._element.querySelector(SELECTOR_INPUT); - - if (input) { - if (input.type === 'radio') { - if (input.checked && this._element.classList.contains(CLASS_NAME_ACTIVE)) { - triggerChangeEvent = false; - } else { - var activeElement = rootElement.querySelector(SELECTOR_ACTIVE); - - if (activeElement) { - $__default['default'](activeElement).removeClass(CLASS_NAME_ACTIVE); - } - } - } - - if (triggerChangeEvent) { - // if it's not a radio button or checkbox don't add a pointless/invalid checked property to the input - if (input.type === 'checkbox' || input.type === 'radio') { - input.checked = !this._element.classList.contains(CLASS_NAME_ACTIVE); - } - - if (!this.shouldAvoidTriggerChange) { - $__default['default'](input).trigger('change'); - } - } - - input.focus(); - addAriaPressed = false; - } - } - - if (!(this._element.hasAttribute('disabled') || this._element.classList.contains('disabled'))) { - if (addAriaPressed) { - this._element.setAttribute('aria-pressed', !this._element.classList.contains(CLASS_NAME_ACTIVE)); - } - - if (triggerChangeEvent) { - $__default['default'](this._element).toggleClass(CLASS_NAME_ACTIVE); - } - } - }; - - _proto.dispose = function dispose() { - $__default['default'].removeData(this._element, DATA_KEY$1); - this._element = null; - } // Static - ; - - Button._jQueryInterface = function _jQueryInterface(config, avoidTriggerChange) { - return this.each(function () { - var $element = $__default['default'](this); - var data = $element.data(DATA_KEY$1); - - if (!data) { - data = new Button(this); - $element.data(DATA_KEY$1, data); - } - - data.shouldAvoidTriggerChange = avoidTriggerChange; - - if (config === 'toggle') { - data[config](); - } - }); - }; - - _createClass(Button, null, [{ - key: "VERSION", - get: function get() { - return VERSION$1; - } - }]); - - return Button; - }(); - /** - * ------------------------------------------------------------------------ - * Data Api implementation - * ------------------------------------------------------------------------ - */ - - - $__default['default'](document).on(EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE_CARROT, function (event) { - var button = event.target; - var initialButton = button; - - if (!$__default['default'](button).hasClass(CLASS_NAME_BUTTON)) { - button = $__default['default'](button).closest(SELECTOR_BUTTON)[0]; - } - - if (!button || button.hasAttribute('disabled') || button.classList.contains('disabled')) { - event.preventDefault(); // work around Firefox bug #1540995 - } else { - var inputBtn = button.querySelector(SELECTOR_INPUT); - - if (inputBtn && (inputBtn.hasAttribute('disabled') || inputBtn.classList.contains('disabled'))) { - event.preventDefault(); // work around Firefox bug #1540995 - - return; - } - - if (initialButton.tagName === 'INPUT' || button.tagName !== 'LABEL') { - Button._jQueryInterface.call($__default['default'](button), 'toggle', initialButton.tagName === 'INPUT'); - } - } - }).on(EVENT_FOCUS_BLUR_DATA_API, SELECTOR_DATA_TOGGLE_CARROT, function (event) { - var button = $__default['default'](event.target).closest(SELECTOR_BUTTON)[0]; - $__default['default'](button).toggleClass(CLASS_NAME_FOCUS, /^focus(in)?$/.test(event.type)); - }); - $__default['default'](window).on(EVENT_LOAD_DATA_API, function () { - // ensure correct active class is set to match the controls' actual values/states - // find all checkboxes/readio buttons inside data-toggle groups - var buttons = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLES_BUTTONS)); - - for (var i = 0, len = buttons.length; i < len; i++) { - var button = buttons[i]; - var input = button.querySelector(SELECTOR_INPUT); - - if (input.checked || input.hasAttribute('checked')) { - button.classList.add(CLASS_NAME_ACTIVE); - } else { - button.classList.remove(CLASS_NAME_ACTIVE); - } - } // find all button toggles - - - buttons = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE)); - - for (var _i = 0, _len = buttons.length; _i < _len; _i++) { - var _button = buttons[_i]; - - if (_button.getAttribute('aria-pressed') === 'true') { - _button.classList.add(CLASS_NAME_ACTIVE); - } else { - _button.classList.remove(CLASS_NAME_ACTIVE); - } - } - }); - /** - * ------------------------------------------------------------------------ - * jQuery - * ------------------------------------------------------------------------ - */ - - $__default['default'].fn[NAME$1] = Button._jQueryInterface; - $__default['default'].fn[NAME$1].Constructor = Button; - - $__default['default'].fn[NAME$1].noConflict = function () { - $__default['default'].fn[NAME$1] = JQUERY_NO_CONFLICT$1; - return Button._jQueryInterface; - }; - - /** - * ------------------------------------------------------------------------ - * Constants - * ------------------------------------------------------------------------ - */ - - var NAME$2 = 'carousel'; - var VERSION$2 = '4.5.3'; - var DATA_KEY$2 = 'bs.carousel'; - var EVENT_KEY$2 = "." + DATA_KEY$2; - var DATA_API_KEY$2 = '.data-api'; - var JQUERY_NO_CONFLICT$2 = $__default['default'].fn[NAME$2]; - var ARROW_LEFT_KEYCODE = 37; // KeyboardEvent.which value for left arrow key - - var ARROW_RIGHT_KEYCODE = 39; // KeyboardEvent.which value for right arrow key - - var TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch - - var SWIPE_THRESHOLD = 40; - var Default = { - interval: 5000, - keyboard: true, - slide: false, - pause: 'hover', - wrap: true, - touch: true - }; - var DefaultType = { - interval: '(number|boolean)', - keyboard: 'boolean', - slide: '(boolean|string)', - pause: '(string|boolean)', - wrap: 'boolean', - touch: 'boolean' - }; - var DIRECTION_NEXT = 'next'; - var DIRECTION_PREV = 'prev'; - var DIRECTION_LEFT = 'left'; - var DIRECTION_RIGHT = 'right'; - var EVENT_SLIDE = "slide" + EVENT_KEY$2; - var EVENT_SLID = "slid" + EVENT_KEY$2; - var EVENT_KEYDOWN = "keydown" + EVENT_KEY$2; - var EVENT_MOUSEENTER = "mouseenter" + EVENT_KEY$2; - var EVENT_MOUSELEAVE = "mouseleave" + EVENT_KEY$2; - var EVENT_TOUCHSTART = "touchstart" + EVENT_KEY$2; - var EVENT_TOUCHMOVE = "touchmove" + EVENT_KEY$2; - var EVENT_TOUCHEND = "touchend" + EVENT_KEY$2; - var EVENT_POINTERDOWN = "pointerdown" + EVENT_KEY$2; - var EVENT_POINTERUP = "pointerup" + EVENT_KEY$2; - var EVENT_DRAG_START = "dragstart" + EVENT_KEY$2; - var EVENT_LOAD_DATA_API$1 = "load" + EVENT_KEY$2 + DATA_API_KEY$2; - var EVENT_CLICK_DATA_API$2 = "click" + EVENT_KEY$2 + DATA_API_KEY$2; - var CLASS_NAME_CAROUSEL = 'carousel'; - var CLASS_NAME_ACTIVE$1 = 'active'; - var CLASS_NAME_SLIDE = 'slide'; - var CLASS_NAME_RIGHT = 'carousel-item-right'; - var CLASS_NAME_LEFT = 'carousel-item-left'; - var CLASS_NAME_NEXT = 'carousel-item-next'; - var CLASS_NAME_PREV = 'carousel-item-prev'; - var CLASS_NAME_POINTER_EVENT = 'pointer-event'; - var SELECTOR_ACTIVE$1 = '.active'; - var SELECTOR_ACTIVE_ITEM = '.active.carousel-item'; - var SELECTOR_ITEM = '.carousel-item'; - var SELECTOR_ITEM_IMG = '.carousel-item img'; - var SELECTOR_NEXT_PREV = '.carousel-item-next, .carousel-item-prev'; - var SELECTOR_INDICATORS = '.carousel-indicators'; - var SELECTOR_DATA_SLIDE = '[data-slide], [data-slide-to]'; - var SELECTOR_DATA_RIDE = '[data-ride="carousel"]'; - var PointerType = { - TOUCH: 'touch', - PEN: 'pen' - }; - /** - * ------------------------------------------------------------------------ - * Class Definition - * ------------------------------------------------------------------------ - */ - - var Carousel = /*#__PURE__*/function () { - function Carousel(element, config) { - this._items = null; - this._interval = null; - this._activeElement = null; - this._isPaused = false; - this._isSliding = false; - this.touchTimeout = null; - this.touchStartX = 0; - this.touchDeltaX = 0; - this._config = this._getConfig(config); - this._element = element; - this._indicatorsElement = this._element.querySelector(SELECTOR_INDICATORS); - this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0; - this._pointerEvent = Boolean(window.PointerEvent || window.MSPointerEvent); - - this._addEventListeners(); - } // Getters - - - var _proto = Carousel.prototype; - - // Public - _proto.next = function next() { - if (!this._isSliding) { - this._slide(DIRECTION_NEXT); - } - }; - - _proto.nextWhenVisible = function nextWhenVisible() { - var $element = $__default['default'](this._element); // Don't call next when the page isn't visible - // or the carousel or its parent isn't visible - - if (!document.hidden && $element.is(':visible') && $element.css('visibility') !== 'hidden') { - this.next(); - } - }; - - _proto.prev = function prev() { - if (!this._isSliding) { - this._slide(DIRECTION_PREV); - } - }; - - _proto.pause = function pause(event) { - if (!event) { - this._isPaused = true; - } - - if (this._element.querySelector(SELECTOR_NEXT_PREV)) { - Util.triggerTransitionEnd(this._element); - this.cycle(true); - } - - clearInterval(this._interval); - this._interval = null; - }; - - _proto.cycle = function cycle(event) { - if (!event) { - this._isPaused = false; - } - - if (this._interval) { - clearInterval(this._interval); - this._interval = null; - } - - if (this._config.interval && !this._isPaused) { - this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval); - } - }; - - _proto.to = function to(index) { - var _this = this; - - this._activeElement = this._element.querySelector(SELECTOR_ACTIVE_ITEM); - - var activeIndex = this._getItemIndex(this._activeElement); - - if (index > this._items.length - 1 || index < 0) { - return; - } - - if (this._isSliding) { - $__default['default'](this._element).one(EVENT_SLID, function () { - return _this.to(index); - }); - return; - } - - if (activeIndex === index) { - this.pause(); - this.cycle(); - return; - } - - var direction = index > activeIndex ? DIRECTION_NEXT : DIRECTION_PREV; - - this._slide(direction, this._items[index]); - }; - - _proto.dispose = function dispose() { - $__default['default'](this._element).off(EVENT_KEY$2); - $__default['default'].removeData(this._element, DATA_KEY$2); - this._items = null; - this._config = null; - this._element = null; - this._interval = null; - this._isPaused = null; - this._isSliding = null; - this._activeElement = null; - this._indicatorsElement = null; - } // Private - ; - - _proto._getConfig = function _getConfig(config) { - config = _extends({}, Default, config); - Util.typeCheckConfig(NAME$2, config, DefaultType); - return config; - }; - - _proto._handleSwipe = function _handleSwipe() { - var absDeltax = Math.abs(this.touchDeltaX); - - if (absDeltax <= SWIPE_THRESHOLD) { - return; - } - - var direction = absDeltax / this.touchDeltaX; - this.touchDeltaX = 0; // swipe left - - if (direction > 0) { - this.prev(); - } // swipe right - - - if (direction < 0) { - this.next(); - } - }; - - _proto._addEventListeners = function _addEventListeners() { - var _this2 = this; - - if (this._config.keyboard) { - $__default['default'](this._element).on(EVENT_KEYDOWN, function (event) { - return _this2._keydown(event); - }); - } - - if (this._config.pause === 'hover') { - $__default['default'](this._element).on(EVENT_MOUSEENTER, function (event) { - return _this2.pause(event); - }).on(EVENT_MOUSELEAVE, function (event) { - return _this2.cycle(event); - }); - } - - if (this._config.touch) { - this._addTouchEventListeners(); - } - }; - - _proto._addTouchEventListeners = function _addTouchEventListeners() { - var _this3 = this; - - if (!this._touchSupported) { - return; - } - - var start = function start(event) { - if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) { - _this3.touchStartX = event.originalEvent.clientX; - } else if (!_this3._pointerEvent) { - _this3.touchStartX = event.originalEvent.touches[0].clientX; - } - }; - - var move = function move(event) { - // ensure swiping with one touch and not pinching - if (event.originalEvent.touches && event.originalEvent.touches.length > 1) { - _this3.touchDeltaX = 0; - } else { - _this3.touchDeltaX = event.originalEvent.touches[0].clientX - _this3.touchStartX; - } - }; - - var end = function end(event) { - if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) { - _this3.touchDeltaX = event.originalEvent.clientX - _this3.touchStartX; - } - - _this3._handleSwipe(); - - if (_this3._config.pause === 'hover') { - // If it's a touch-enabled device, mouseenter/leave are fired as - // part of the mouse compatibility events on first tap - the carousel - // would stop cycling until user tapped out of it; - // here, we listen for touchend, explicitly pause the carousel - // (as if it's the second time we tap on it, mouseenter compat event - // is NOT fired) and after a timeout (to allow for mouse compatibility - // events to fire) we explicitly restart cycling - _this3.pause(); - - if (_this3.touchTimeout) { - clearTimeout(_this3.touchTimeout); - } - - _this3.touchTimeout = setTimeout(function (event) { - return _this3.cycle(event); - }, TOUCHEVENT_COMPAT_WAIT + _this3._config.interval); - } - }; - - $__default['default'](this._element.querySelectorAll(SELECTOR_ITEM_IMG)).on(EVENT_DRAG_START, function (e) { - return e.preventDefault(); - }); - - if (this._pointerEvent) { - $__default['default'](this._element).on(EVENT_POINTERDOWN, function (event) { - return start(event); - }); - $__default['default'](this._element).on(EVENT_POINTERUP, function (event) { - return end(event); - }); - - this._element.classList.add(CLASS_NAME_POINTER_EVENT); - } else { - $__default['default'](this._element).on(EVENT_TOUCHSTART, function (event) { - return start(event); - }); - $__default['default'](this._element).on(EVENT_TOUCHMOVE, function (event) { - return move(event); - }); - $__default['default'](this._element).on(EVENT_TOUCHEND, function (event) { - return end(event); - }); - } - }; - - _proto._keydown = function _keydown(event) { - if (/input|textarea/i.test(event.target.tagName)) { - return; - } - - switch (event.which) { - case ARROW_LEFT_KEYCODE: - event.preventDefault(); - this.prev(); - break; - - case ARROW_RIGHT_KEYCODE: - event.preventDefault(); - this.next(); - break; - } - }; - - _proto._getItemIndex = function _getItemIndex(element) { - this._items = element && element.parentNode ? [].slice.call(element.parentNode.querySelectorAll(SELECTOR_ITEM)) : []; - return this._items.indexOf(element); - }; - - _proto._getItemByDirection = function _getItemByDirection(direction, activeElement) { - var isNextDirection = direction === DIRECTION_NEXT; - var isPrevDirection = direction === DIRECTION_PREV; - - var activeIndex = this._getItemIndex(activeElement); - - var lastItemIndex = this._items.length - 1; - var isGoingToWrap = isPrevDirection && activeIndex === 0 || isNextDirection && activeIndex === lastItemIndex; - - if (isGoingToWrap && !this._config.wrap) { - return activeElement; - } - - var delta = direction === DIRECTION_PREV ? -1 : 1; - var itemIndex = (activeIndex + delta) % this._items.length; - return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex]; - }; - - _proto._triggerSlideEvent = function _triggerSlideEvent(relatedTarget, eventDirectionName) { - var targetIndex = this._getItemIndex(relatedTarget); - - var fromIndex = this._getItemIndex(this._element.querySelector(SELECTOR_ACTIVE_ITEM)); - - var slideEvent = $__default['default'].Event(EVENT_SLIDE, { - relatedTarget: relatedTarget, - direction: eventDirectionName, - from: fromIndex, - to: targetIndex - }); - $__default['default'](this._element).trigger(slideEvent); - return slideEvent; - }; - - _proto._setActiveIndicatorElement = function _setActiveIndicatorElement(element) { - if (this._indicatorsElement) { - var indicators = [].slice.call(this._indicatorsElement.querySelectorAll(SELECTOR_ACTIVE$1)); - $__default['default'](indicators).removeClass(CLASS_NAME_ACTIVE$1); - - var nextIndicator = this._indicatorsElement.children[this._getItemIndex(element)]; - - if (nextIndicator) { - $__default['default'](nextIndicator).addClass(CLASS_NAME_ACTIVE$1); - } - } - }; - - _proto._slide = function _slide(direction, element) { - var _this4 = this; - - var activeElement = this._element.querySelector(SELECTOR_ACTIVE_ITEM); - - var activeElementIndex = this._getItemIndex(activeElement); - - var nextElement = element || activeElement && this._getItemByDirection(direction, activeElement); - - var nextElementIndex = this._getItemIndex(nextElement); - - var isCycling = Boolean(this._interval); - var directionalClassName; - var orderClassName; - var eventDirectionName; - - if (direction === DIRECTION_NEXT) { - directionalClassName = CLASS_NAME_LEFT; - orderClassName = CLASS_NAME_NEXT; - eventDirectionName = DIRECTION_LEFT; - } else { - directionalClassName = CLASS_NAME_RIGHT; - orderClassName = CLASS_NAME_PREV; - eventDirectionName = DIRECTION_RIGHT; - } - - if (nextElement && $__default['default'](nextElement).hasClass(CLASS_NAME_ACTIVE$1)) { - this._isSliding = false; - return; - } - - var slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName); - - if (slideEvent.isDefaultPrevented()) { - return; - } - - if (!activeElement || !nextElement) { - // Some weirdness is happening, so we bail - return; - } - - this._isSliding = true; - - if (isCycling) { - this.pause(); - } - - this._setActiveIndicatorElement(nextElement); - - var slidEvent = $__default['default'].Event(EVENT_SLID, { - relatedTarget: nextElement, - direction: eventDirectionName, - from: activeElementIndex, - to: nextElementIndex - }); - - if ($__default['default'](this._element).hasClass(CLASS_NAME_SLIDE)) { - $__default['default'](nextElement).addClass(orderClassName); - Util.reflow(nextElement); - $__default['default'](activeElement).addClass(directionalClassName); - $__default['default'](nextElement).addClass(directionalClassName); - var nextElementInterval = parseInt(nextElement.getAttribute('data-interval'), 10); - - if (nextElementInterval) { - this._config.defaultInterval = this._config.defaultInterval || this._config.interval; - this._config.interval = nextElementInterval; - } else { - this._config.interval = this._config.defaultInterval || this._config.interval; - } - - var transitionDuration = Util.getTransitionDurationFromElement(activeElement); - $__default['default'](activeElement).one(Util.TRANSITION_END, function () { - $__default['default'](nextElement).removeClass(directionalClassName + " " + orderClassName).addClass(CLASS_NAME_ACTIVE$1); - $__default['default'](activeElement).removeClass(CLASS_NAME_ACTIVE$1 + " " + orderClassName + " " + directionalClassName); - _this4._isSliding = false; - setTimeout(function () { - return $__default['default'](_this4._element).trigger(slidEvent); - }, 0); - }).emulateTransitionEnd(transitionDuration); - } else { - $__default['default'](activeElement).removeClass(CLASS_NAME_ACTIVE$1); - $__default['default'](nextElement).addClass(CLASS_NAME_ACTIVE$1); - this._isSliding = false; - $__default['default'](this._element).trigger(slidEvent); - } - - if (isCycling) { - this.cycle(); - } - } // Static - ; - - Carousel._jQueryInterface = function _jQueryInterface(config) { - return this.each(function () { - var data = $__default['default'](this).data(DATA_KEY$2); - - var _config = _extends({}, Default, $__default['default'](this).data()); - - if (typeof config === 'object') { - _config = _extends({}, _config, config); - } - - var action = typeof config === 'string' ? config : _config.slide; - - if (!data) { - data = new Carousel(this, _config); - $__default['default'](this).data(DATA_KEY$2, data); - } - - if (typeof config === 'number') { - data.to(config); - } else if (typeof action === 'string') { - if (typeof data[action] === 'undefined') { - throw new TypeError("No method named \"" + action + "\""); - } - - data[action](); - } else if (_config.interval && _config.ride) { - data.pause(); - data.cycle(); - } - }); - }; - - Carousel._dataApiClickHandler = function _dataApiClickHandler(event) { - var selector = Util.getSelectorFromElement(this); - - if (!selector) { - return; - } - - var target = $__default['default'](selector)[0]; - - if (!target || !$__default['default'](target).hasClass(CLASS_NAME_CAROUSEL)) { - return; - } - - var config = _extends({}, $__default['default'](target).data(), $__default['default'](this).data()); - - var slideIndex = this.getAttribute('data-slide-to'); - - if (slideIndex) { - config.interval = false; - } - - Carousel._jQueryInterface.call($__default['default'](target), config); - - if (slideIndex) { - $__default['default'](target).data(DATA_KEY$2).to(slideIndex); - } - - event.preventDefault(); - }; - - _createClass(Carousel, null, [{ - key: "VERSION", - get: function get() { - return VERSION$2; - } - }, { - key: "Default", - get: function get() { - return Default; - } - }]); - - return Carousel; - }(); - /** - * ------------------------------------------------------------------------ - * Data Api implementation - * ------------------------------------------------------------------------ - */ - - - $__default['default'](document).on(EVENT_CLICK_DATA_API$2, SELECTOR_DATA_SLIDE, Carousel._dataApiClickHandler); - $__default['default'](window).on(EVENT_LOAD_DATA_API$1, function () { - var carousels = [].slice.call(document.querySelectorAll(SELECTOR_DATA_RIDE)); - - for (var i = 0, len = carousels.length; i < len; i++) { - var $carousel = $__default['default'](carousels[i]); - - Carousel._jQueryInterface.call($carousel, $carousel.data()); - } - }); - /** - * ------------------------------------------------------------------------ - * jQuery - * ------------------------------------------------------------------------ - */ - - $__default['default'].fn[NAME$2] = Carousel._jQueryInterface; - $__default['default'].fn[NAME$2].Constructor = Carousel; - - $__default['default'].fn[NAME$2].noConflict = function () { - $__default['default'].fn[NAME$2] = JQUERY_NO_CONFLICT$2; - return Carousel._jQueryInterface; - }; - - /** - * ------------------------------------------------------------------------ - * Constants - * ------------------------------------------------------------------------ - */ - - var NAME$3 = 'collapse'; - var VERSION$3 = '4.5.3'; - var DATA_KEY$3 = 'bs.collapse'; - var EVENT_KEY$3 = "." + DATA_KEY$3; - var DATA_API_KEY$3 = '.data-api'; - var JQUERY_NO_CONFLICT$3 = $__default['default'].fn[NAME$3]; - var Default$1 = { - toggle: true, - parent: '' - }; - var DefaultType$1 = { - toggle: 'boolean', - parent: '(string|element)' - }; - var EVENT_SHOW = "show" + EVENT_KEY$3; - var EVENT_SHOWN = "shown" + EVENT_KEY$3; - var EVENT_HIDE = "hide" + EVENT_KEY$3; - var EVENT_HIDDEN = "hidden" + EVENT_KEY$3; - var EVENT_CLICK_DATA_API$3 = "click" + EVENT_KEY$3 + DATA_API_KEY$3; - var CLASS_NAME_SHOW$1 = 'show'; - var CLASS_NAME_COLLAPSE = 'collapse'; - var CLASS_NAME_COLLAPSING = 'collapsing'; - var CLASS_NAME_COLLAPSED = 'collapsed'; - var DIMENSION_WIDTH = 'width'; - var DIMENSION_HEIGHT = 'height'; - var SELECTOR_ACTIVES = '.show, .collapsing'; - var SELECTOR_DATA_TOGGLE$1 = '[data-toggle="collapse"]'; - /** - * ------------------------------------------------------------------------ - * Class Definition - * ------------------------------------------------------------------------ - */ - - var Collapse = /*#__PURE__*/function () { - function Collapse(element, config) { - this._isTransitioning = false; - this._element = element; - this._config = this._getConfig(config); - this._triggerArray = [].slice.call(document.querySelectorAll("[data-toggle=\"collapse\"][href=\"#" + element.id + "\"]," + ("[data-toggle=\"collapse\"][data-target=\"#" + element.id + "\"]"))); - var toggleList = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE$1)); - - for (var i = 0, len = toggleList.length; i < len; i++) { - var elem = toggleList[i]; - var selector = Util.getSelectorFromElement(elem); - var filterElement = [].slice.call(document.querySelectorAll(selector)).filter(function (foundElem) { - return foundElem === element; - }); - - if (selector !== null && filterElement.length > 0) { - this._selector = selector; - - this._triggerArray.push(elem); - } - } - - this._parent = this._config.parent ? this._getParent() : null; - - if (!this._config.parent) { - this._addAriaAndCollapsedClass(this._element, this._triggerArray); - } - - if (this._config.toggle) { - this.toggle(); - } - } // Getters - - - var _proto = Collapse.prototype; - - // Public - _proto.toggle = function toggle() { - if ($__default['default'](this._element).hasClass(CLASS_NAME_SHOW$1)) { - this.hide(); - } else { - this.show(); - } - }; - - _proto.show = function show() { - var _this = this; - - if (this._isTransitioning || $__default['default'](this._element).hasClass(CLASS_NAME_SHOW$1)) { - return; - } - - var actives; - var activesData; - - if (this._parent) { - actives = [].slice.call(this._parent.querySelectorAll(SELECTOR_ACTIVES)).filter(function (elem) { - if (typeof _this._config.parent === 'string') { - return elem.getAttribute('data-parent') === _this._config.parent; - } - - return elem.classList.contains(CLASS_NAME_COLLAPSE); - }); - - if (actives.length === 0) { - actives = null; - } - } - - if (actives) { - activesData = $__default['default'](actives).not(this._selector).data(DATA_KEY$3); - - if (activesData && activesData._isTransitioning) { - return; - } - } - - var startEvent = $__default['default'].Event(EVENT_SHOW); - $__default['default'](this._element).trigger(startEvent); - - if (startEvent.isDefaultPrevented()) { - return; - } - - if (actives) { - Collapse._jQueryInterface.call($__default['default'](actives).not(this._selector), 'hide'); - - if (!activesData) { - $__default['default'](actives).data(DATA_KEY$3, null); - } - } - - var dimension = this._getDimension(); - - $__default['default'](this._element).removeClass(CLASS_NAME_COLLAPSE).addClass(CLASS_NAME_COLLAPSING); - this._element.style[dimension] = 0; - - if (this._triggerArray.length) { - $__default['default'](this._triggerArray).removeClass(CLASS_NAME_COLLAPSED).attr('aria-expanded', true); - } - - this.setTransitioning(true); - - var complete = function complete() { - $__default['default'](_this._element).removeClass(CLASS_NAME_COLLAPSING).addClass(CLASS_NAME_COLLAPSE + " " + CLASS_NAME_SHOW$1); - _this._element.style[dimension] = ''; - - _this.setTransitioning(false); - - $__default['default'](_this._element).trigger(EVENT_SHOWN); - }; - - var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1); - var scrollSize = "scroll" + capitalizedDimension; - var transitionDuration = Util.getTransitionDurationFromElement(this._element); - $__default['default'](this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration); - this._element.style[dimension] = this._element[scrollSize] + "px"; - }; - - _proto.hide = function hide() { - var _this2 = this; - - if (this._isTransitioning || !$__default['default'](this._element).hasClass(CLASS_NAME_SHOW$1)) { - return; - } - - var startEvent = $__default['default'].Event(EVENT_HIDE); - $__default['default'](this._element).trigger(startEvent); - - if (startEvent.isDefaultPrevented()) { - return; - } - - var dimension = this._getDimension(); - - this._element.style[dimension] = this._element.getBoundingClientRect()[dimension] + "px"; - Util.reflow(this._element); - $__default['default'](this._element).addClass(CLASS_NAME_COLLAPSING).removeClass(CLASS_NAME_COLLAPSE + " " + CLASS_NAME_SHOW$1); - var triggerArrayLength = this._triggerArray.length; - - if (triggerArrayLength > 0) { - for (var i = 0; i < triggerArrayLength; i++) { - var trigger = this._triggerArray[i]; - var selector = Util.getSelectorFromElement(trigger); - - if (selector !== null) { - var $elem = $__default['default']([].slice.call(document.querySelectorAll(selector))); - - if (!$elem.hasClass(CLASS_NAME_SHOW$1)) { - $__default['default'](trigger).addClass(CLASS_NAME_COLLAPSED).attr('aria-expanded', false); - } - } - } - } - - this.setTransitioning(true); - - var complete = function complete() { - _this2.setTransitioning(false); - - $__default['default'](_this2._element).removeClass(CLASS_NAME_COLLAPSING).addClass(CLASS_NAME_COLLAPSE).trigger(EVENT_HIDDEN); - }; - - this._element.style[dimension] = ''; - var transitionDuration = Util.getTransitionDurationFromElement(this._element); - $__default['default'](this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration); - }; - - _proto.setTransitioning = function setTransitioning(isTransitioning) { - this._isTransitioning = isTransitioning; - }; - - _proto.dispose = function dispose() { - $__default['default'].removeData(this._element, DATA_KEY$3); - this._config = null; - this._parent = null; - this._element = null; - this._triggerArray = null; - this._isTransitioning = null; - } // Private - ; - - _proto._getConfig = function _getConfig(config) { - config = _extends({}, Default$1, config); - config.toggle = Boolean(config.toggle); // Coerce string values - - Util.typeCheckConfig(NAME$3, config, DefaultType$1); - return config; - }; - - _proto._getDimension = function _getDimension() { - var hasWidth = $__default['default'](this._element).hasClass(DIMENSION_WIDTH); - return hasWidth ? DIMENSION_WIDTH : DIMENSION_HEIGHT; - }; - - _proto._getParent = function _getParent() { - var _this3 = this; - - var parent; - - if (Util.isElement(this._config.parent)) { - parent = this._config.parent; // It's a jQuery object - - if (typeof this._config.parent.jquery !== 'undefined') { - parent = this._config.parent[0]; - } - } else { - parent = document.querySelector(this._config.parent); - } - - var selector = "[data-toggle=\"collapse\"][data-parent=\"" + this._config.parent + "\"]"; - var children = [].slice.call(parent.querySelectorAll(selector)); - $__default['default'](children).each(function (i, element) { - _this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]); - }); - return parent; - }; - - _proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) { - var isOpen = $__default['default'](element).hasClass(CLASS_NAME_SHOW$1); - - if (triggerArray.length) { - $__default['default'](triggerArray).toggleClass(CLASS_NAME_COLLAPSED, !isOpen).attr('aria-expanded', isOpen); - } - } // Static - ; - - Collapse._getTargetFromElement = function _getTargetFromElement(element) { - var selector = Util.getSelectorFromElement(element); - return selector ? document.querySelector(selector) : null; - }; - - Collapse._jQueryInterface = function _jQueryInterface(config) { - return this.each(function () { - var $element = $__default['default'](this); - var data = $element.data(DATA_KEY$3); - - var _config = _extends({}, Default$1, $element.data(), typeof config === 'object' && config ? config : {}); - - if (!data && _config.toggle && typeof config === 'string' && /show|hide/.test(config)) { - _config.toggle = false; - } - - if (!data) { - data = new Collapse(this, _config); - $element.data(DATA_KEY$3, data); - } - - if (typeof config === 'string') { - if (typeof data[config] === 'undefined') { - throw new TypeError("No method named \"" + config + "\""); - } - - data[config](); - } - }); - }; - - _createClass(Collapse, null, [{ - key: "VERSION", - get: function get() { - return VERSION$3; - } - }, { - key: "Default", - get: function get() { - return Default$1; - } - }]); - - return Collapse; - }(); - /** - * ------------------------------------------------------------------------ - * Data Api implementation - * ------------------------------------------------------------------------ - */ - - - $__default['default'](document).on(EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$1, function (event) { - // preventDefault only for elements (which change the URL) not inside the collapsible element - if (event.currentTarget.tagName === 'A') { - event.preventDefault(); - } - - var $trigger = $__default['default'](this); - var selector = Util.getSelectorFromElement(this); - var selectors = [].slice.call(document.querySelectorAll(selector)); - $__default['default'](selectors).each(function () { - var $target = $__default['default'](this); - var data = $target.data(DATA_KEY$3); - var config = data ? 'toggle' : $trigger.data(); - - Collapse._jQueryInterface.call($target, config); - }); - }); - /** - * ------------------------------------------------------------------------ - * jQuery - * ------------------------------------------------------------------------ - */ - - $__default['default'].fn[NAME$3] = Collapse._jQueryInterface; - $__default['default'].fn[NAME$3].Constructor = Collapse; - - $__default['default'].fn[NAME$3].noConflict = function () { - $__default['default'].fn[NAME$3] = JQUERY_NO_CONFLICT$3; - return Collapse._jQueryInterface; - }; - - /** - * ------------------------------------------------------------------------ - * Constants - * ------------------------------------------------------------------------ - */ - - var NAME$4 = 'dropdown'; - var VERSION$4 = '4.5.3'; - var DATA_KEY$4 = 'bs.dropdown'; - var EVENT_KEY$4 = "." + DATA_KEY$4; - var DATA_API_KEY$4 = '.data-api'; - var JQUERY_NO_CONFLICT$4 = $__default['default'].fn[NAME$4]; - var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key - - var SPACE_KEYCODE = 32; // KeyboardEvent.which value for space key - - var TAB_KEYCODE = 9; // KeyboardEvent.which value for tab key - - var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key - - var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key - - var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse) - - var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEYCODE + "|" + ARROW_DOWN_KEYCODE + "|" + ESCAPE_KEYCODE); - var EVENT_HIDE$1 = "hide" + EVENT_KEY$4; - var EVENT_HIDDEN$1 = "hidden" + EVENT_KEY$4; - var EVENT_SHOW$1 = "show" + EVENT_KEY$4; - var EVENT_SHOWN$1 = "shown" + EVENT_KEY$4; - var EVENT_CLICK = "click" + EVENT_KEY$4; - var EVENT_CLICK_DATA_API$4 = "click" + EVENT_KEY$4 + DATA_API_KEY$4; - var EVENT_KEYDOWN_DATA_API = "keydown" + EVENT_KEY$4 + DATA_API_KEY$4; - var EVENT_KEYUP_DATA_API = "keyup" + EVENT_KEY$4 + DATA_API_KEY$4; - var CLASS_NAME_DISABLED = 'disabled'; - var CLASS_NAME_SHOW$2 = 'show'; - var CLASS_NAME_DROPUP = 'dropup'; - var CLASS_NAME_DROPRIGHT = 'dropright'; - var CLASS_NAME_DROPLEFT = 'dropleft'; - var CLASS_NAME_MENURIGHT = 'dropdown-menu-right'; - var CLASS_NAME_POSITION_STATIC = 'position-static'; - var SELECTOR_DATA_TOGGLE$2 = '[data-toggle="dropdown"]'; - var SELECTOR_FORM_CHILD = '.dropdown form'; - var SELECTOR_MENU = '.dropdown-menu'; - var SELECTOR_NAVBAR_NAV = '.navbar-nav'; - var SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'; - var PLACEMENT_TOP = 'top-start'; - var PLACEMENT_TOPEND = 'top-end'; - var PLACEMENT_BOTTOM = 'bottom-start'; - var PLACEMENT_BOTTOMEND = 'bottom-end'; - var PLACEMENT_RIGHT = 'right-start'; - var PLACEMENT_LEFT = 'left-start'; - var Default$2 = { - offset: 0, - flip: true, - boundary: 'scrollParent', - reference: 'toggle', - display: 'dynamic', - popperConfig: null - }; - var DefaultType$2 = { - offset: '(number|string|function)', - flip: 'boolean', - boundary: '(string|element)', - reference: '(string|element)', - display: 'string', - popperConfig: '(null|object)' - }; - /** - * ------------------------------------------------------------------------ - * Class Definition - * ------------------------------------------------------------------------ - */ - - var Dropdown = /*#__PURE__*/function () { - function Dropdown(element, config) { - this._element = element; - this._popper = null; - this._config = this._getConfig(config); - this._menu = this._getMenuElement(); - this._inNavbar = this._detectNavbar(); - - this._addEventListeners(); - } // Getters - - - var _proto = Dropdown.prototype; - - // Public - _proto.toggle = function toggle() { - if (this._element.disabled || $__default['default'](this._element).hasClass(CLASS_NAME_DISABLED)) { - return; - } - - var isActive = $__default['default'](this._menu).hasClass(CLASS_NAME_SHOW$2); - - Dropdown._clearMenus(); - - if (isActive) { - return; - } - - this.show(true); - }; - - _proto.show = function show(usePopper) { - if (usePopper === void 0) { - usePopper = false; - } - - if (this._element.disabled || $__default['default'](this._element).hasClass(CLASS_NAME_DISABLED) || $__default['default'](this._menu).hasClass(CLASS_NAME_SHOW$2)) { - return; - } - - var relatedTarget = { - relatedTarget: this._element - }; - var showEvent = $__default['default'].Event(EVENT_SHOW$1, relatedTarget); - - var parent = Dropdown._getParentFromElement(this._element); - - $__default['default'](parent).trigger(showEvent); - - if (showEvent.isDefaultPrevented()) { - return; - } // Disable totally Popper.js for Dropdown in Navbar - - - if (!this._inNavbar && usePopper) { - /** - * Check for Popper dependency - * Popper - https://popper.js.org - */ - if (typeof Popper__default['default'] === 'undefined') { - throw new TypeError('Bootstrap\'s dropdowns require Popper.js (https://popper.js.org/)'); - } - - var referenceElement = this._element; - - if (this._config.reference === 'parent') { - referenceElement = parent; - } else if (Util.isElement(this._config.reference)) { - referenceElement = this._config.reference; // Check if it's jQuery element - - if (typeof this._config.reference.jquery !== 'undefined') { - referenceElement = this._config.reference[0]; - } - } // If boundary is not `scrollParent`, then set position to `static` - // to allow the menu to "escape" the scroll parent's boundaries - // https://github.com/twbs/bootstrap/issues/24251 - - - if (this._config.boundary !== 'scrollParent') { - $__default['default'](parent).addClass(CLASS_NAME_POSITION_STATIC); - } - - this._popper = new Popper__default['default'](referenceElement, this._menu, this._getPopperConfig()); - } // If this is a touch-enabled device we add extra - // empty mouseover listeners to the body's immediate children; - // only needed because of broken event delegation on iOS - // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html - - - if ('ontouchstart' in document.documentElement && $__default['default'](parent).closest(SELECTOR_NAVBAR_NAV).length === 0) { - $__default['default'](document.body).children().on('mouseover', null, $__default['default'].noop); - } - - this._element.focus(); - - this._element.setAttribute('aria-expanded', true); - - $__default['default'](this._menu).toggleClass(CLASS_NAME_SHOW$2); - $__default['default'](parent).toggleClass(CLASS_NAME_SHOW$2).trigger($__default['default'].Event(EVENT_SHOWN$1, relatedTarget)); - }; - - _proto.hide = function hide() { - if (this._element.disabled || $__default['default'](this._element).hasClass(CLASS_NAME_DISABLED) || !$__default['default'](this._menu).hasClass(CLASS_NAME_SHOW$2)) { - return; - } - - var relatedTarget = { - relatedTarget: this._element - }; - var hideEvent = $__default['default'].Event(EVENT_HIDE$1, relatedTarget); - - var parent = Dropdown._getParentFromElement(this._element); - - $__default['default'](parent).trigger(hideEvent); - - if (hideEvent.isDefaultPrevented()) { - return; - } - - if (this._popper) { - this._popper.destroy(); - } - - $__default['default'](this._menu).toggleClass(CLASS_NAME_SHOW$2); - $__default['default'](parent).toggleClass(CLASS_NAME_SHOW$2).trigger($__default['default'].Event(EVENT_HIDDEN$1, relatedTarget)); - }; - - _proto.dispose = function dispose() { - $__default['default'].removeData(this._element, DATA_KEY$4); - $__default['default'](this._element).off(EVENT_KEY$4); - this._element = null; - this._menu = null; - - if (this._popper !== null) { - this._popper.destroy(); - - this._popper = null; - } - }; - - _proto.update = function update() { - this._inNavbar = this._detectNavbar(); - - if (this._popper !== null) { - this._popper.scheduleUpdate(); - } - } // Private - ; - - _proto._addEventListeners = function _addEventListeners() { - var _this = this; - - $__default['default'](this._element).on(EVENT_CLICK, function (event) { - event.preventDefault(); - event.stopPropagation(); - - _this.toggle(); - }); - }; - - _proto._getConfig = function _getConfig(config) { - config = _extends({}, this.constructor.Default, $__default['default'](this._element).data(), config); - Util.typeCheckConfig(NAME$4, config, this.constructor.DefaultType); - return config; - }; - - _proto._getMenuElement = function _getMenuElement() { - if (!this._menu) { - var parent = Dropdown._getParentFromElement(this._element); - - if (parent) { - this._menu = parent.querySelector(SELECTOR_MENU); - } - } - - return this._menu; - }; - - _proto._getPlacement = function _getPlacement() { - var $parentDropdown = $__default['default'](this._element.parentNode); - var placement = PLACEMENT_BOTTOM; // Handle dropup - - if ($parentDropdown.hasClass(CLASS_NAME_DROPUP)) { - placement = $__default['default'](this._menu).hasClass(CLASS_NAME_MENURIGHT) ? PLACEMENT_TOPEND : PLACEMENT_TOP; - } else if ($parentDropdown.hasClass(CLASS_NAME_DROPRIGHT)) { - placement = PLACEMENT_RIGHT; - } else if ($parentDropdown.hasClass(CLASS_NAME_DROPLEFT)) { - placement = PLACEMENT_LEFT; - } else if ($__default['default'](this._menu).hasClass(CLASS_NAME_MENURIGHT)) { - placement = PLACEMENT_BOTTOMEND; - } - - return placement; - }; - - _proto._detectNavbar = function _detectNavbar() { - return $__default['default'](this._element).closest('.navbar').length > 0; - }; - - _proto._getOffset = function _getOffset() { - var _this2 = this; - - var offset = {}; - - if (typeof this._config.offset === 'function') { - offset.fn = function (data) { - data.offsets = _extends({}, data.offsets, _this2._config.offset(data.offsets, _this2._element) || {}); - return data; - }; - } else { - offset.offset = this._config.offset; - } - - return offset; - }; - - _proto._getPopperConfig = function _getPopperConfig() { - var popperConfig = { - placement: this._getPlacement(), - modifiers: { - offset: this._getOffset(), - flip: { - enabled: this._config.flip - }, - preventOverflow: { - boundariesElement: this._config.boundary - } - } - }; // Disable Popper.js if we have a static display - - if (this._config.display === 'static') { - popperConfig.modifiers.applyStyle = { - enabled: false - }; - } - - return _extends({}, popperConfig, this._config.popperConfig); - } // Static - ; - - Dropdown._jQueryInterface = function _jQueryInterface(config) { - return this.each(function () { - var data = $__default['default'](this).data(DATA_KEY$4); - - var _config = typeof config === 'object' ? config : null; - - if (!data) { - data = new Dropdown(this, _config); - $__default['default'](this).data(DATA_KEY$4, data); - } - - if (typeof config === 'string') { - if (typeof data[config] === 'undefined') { - throw new TypeError("No method named \"" + config + "\""); - } - - data[config](); - } - }); - }; - - Dropdown._clearMenus = function _clearMenus(event) { - if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH || event.type === 'keyup' && event.which !== TAB_KEYCODE)) { - return; - } - - var toggles = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE$2)); - - for (var i = 0, len = toggles.length; i < len; i++) { - var parent = Dropdown._getParentFromElement(toggles[i]); - - var context = $__default['default'](toggles[i]).data(DATA_KEY$4); - var relatedTarget = { - relatedTarget: toggles[i] - }; - - if (event && event.type === 'click') { - relatedTarget.clickEvent = event; - } - - if (!context) { - continue; - } - - var dropdownMenu = context._menu; - - if (!$__default['default'](parent).hasClass(CLASS_NAME_SHOW$2)) { - continue; - } - - if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) && $__default['default'].contains(parent, event.target)) { - continue; - } - - var hideEvent = $__default['default'].Event(EVENT_HIDE$1, relatedTarget); - $__default['default'](parent).trigger(hideEvent); - - if (hideEvent.isDefaultPrevented()) { - continue; - } // If this is a touch-enabled device we remove the extra - // empty mouseover listeners we added for iOS support - - - if ('ontouchstart' in document.documentElement) { - $__default['default'](document.body).children().off('mouseover', null, $__default['default'].noop); - } - - toggles[i].setAttribute('aria-expanded', 'false'); - - if (context._popper) { - context._popper.destroy(); - } - - $__default['default'](dropdownMenu).removeClass(CLASS_NAME_SHOW$2); - $__default['default'](parent).removeClass(CLASS_NAME_SHOW$2).trigger($__default['default'].Event(EVENT_HIDDEN$1, relatedTarget)); - } - }; - - Dropdown._getParentFromElement = function _getParentFromElement(element) { - var parent; - var selector = Util.getSelectorFromElement(element); - - if (selector) { - parent = document.querySelector(selector); - } - - return parent || element.parentNode; - } // eslint-disable-next-line complexity - ; - - Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) { - // If not input/textarea: - // - And not a key in REGEXP_KEYDOWN => not a dropdown command - // If input/textarea: - // - If space key => not a dropdown command - // - If key is other than escape - // - If key is not up or down => not a dropdown command - // - If trigger inside the menu => not a dropdown command - if (/input|textarea/i.test(event.target.tagName) ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE && (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE || $__default['default'](event.target).closest(SELECTOR_MENU).length) : !REGEXP_KEYDOWN.test(event.which)) { - return; - } - - if (this.disabled || $__default['default'](this).hasClass(CLASS_NAME_DISABLED)) { - return; - } - - var parent = Dropdown._getParentFromElement(this); - - var isActive = $__default['default'](parent).hasClass(CLASS_NAME_SHOW$2); - - if (!isActive && event.which === ESCAPE_KEYCODE) { - return; - } - - event.preventDefault(); - event.stopPropagation(); - - if (!isActive || event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE) { - if (event.which === ESCAPE_KEYCODE) { - $__default['default'](parent.querySelector(SELECTOR_DATA_TOGGLE$2)).trigger('focus'); - } - - $__default['default'](this).trigger('click'); - return; - } - - var items = [].slice.call(parent.querySelectorAll(SELECTOR_VISIBLE_ITEMS)).filter(function (item) { - return $__default['default'](item).is(':visible'); - }); - - if (items.length === 0) { - return; - } - - var index = items.indexOf(event.target); - - if (event.which === ARROW_UP_KEYCODE && index > 0) { - // Up - index--; - } - - if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) { - // Down - index++; - } - - if (index < 0) { - index = 0; - } - - items[index].focus(); - }; - - _createClass(Dropdown, null, [{ - key: "VERSION", - get: function get() { - return VERSION$4; - } - }, { - key: "Default", - get: function get() { - return Default$2; - } - }, { - key: "DefaultType", - get: function get() { - return DefaultType$2; - } - }]); - - return Dropdown; - }(); - /** - * ------------------------------------------------------------------------ - * Data Api implementation - * ------------------------------------------------------------------------ - */ - - - $__default['default'](document).on(EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE$2, Dropdown._dataApiKeydownHandler).on(EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown._dataApiKeydownHandler).on(EVENT_CLICK_DATA_API$4 + " " + EVENT_KEYUP_DATA_API, Dropdown._clearMenus).on(EVENT_CLICK_DATA_API$4, SELECTOR_DATA_TOGGLE$2, function (event) { - event.preventDefault(); - event.stopPropagation(); - - Dropdown._jQueryInterface.call($__default['default'](this), 'toggle'); - }).on(EVENT_CLICK_DATA_API$4, SELECTOR_FORM_CHILD, function (e) { - e.stopPropagation(); - }); - /** - * ------------------------------------------------------------------------ - * jQuery - * ------------------------------------------------------------------------ - */ - - $__default['default'].fn[NAME$4] = Dropdown._jQueryInterface; - $__default['default'].fn[NAME$4].Constructor = Dropdown; - - $__default['default'].fn[NAME$4].noConflict = function () { - $__default['default'].fn[NAME$4] = JQUERY_NO_CONFLICT$4; - return Dropdown._jQueryInterface; - }; - - /** - * ------------------------------------------------------------------------ - * Constants - * ------------------------------------------------------------------------ - */ - - var NAME$5 = 'modal'; - var VERSION$5 = '4.5.3'; - var DATA_KEY$5 = 'bs.modal'; - var EVENT_KEY$5 = "." + DATA_KEY$5; - var DATA_API_KEY$5 = '.data-api'; - var JQUERY_NO_CONFLICT$5 = $__default['default'].fn[NAME$5]; - var ESCAPE_KEYCODE$1 = 27; // KeyboardEvent.which value for Escape (Esc) key - - var Default$3 = { - backdrop: true, - keyboard: true, - focus: true, - show: true - }; - var DefaultType$3 = { - backdrop: '(boolean|string)', - keyboard: 'boolean', - focus: 'boolean', - show: 'boolean' - }; - var EVENT_HIDE$2 = "hide" + EVENT_KEY$5; - var EVENT_HIDE_PREVENTED = "hidePrevented" + EVENT_KEY$5; - var EVENT_HIDDEN$2 = "hidden" + EVENT_KEY$5; - var EVENT_SHOW$2 = "show" + EVENT_KEY$5; - var EVENT_SHOWN$2 = "shown" + EVENT_KEY$5; - var EVENT_FOCUSIN = "focusin" + EVENT_KEY$5; - var EVENT_RESIZE = "resize" + EVENT_KEY$5; - var EVENT_CLICK_DISMISS = "click.dismiss" + EVENT_KEY$5; - var EVENT_KEYDOWN_DISMISS = "keydown.dismiss" + EVENT_KEY$5; - var EVENT_MOUSEUP_DISMISS = "mouseup.dismiss" + EVENT_KEY$5; - var EVENT_MOUSEDOWN_DISMISS = "mousedown.dismiss" + EVENT_KEY$5; - var EVENT_CLICK_DATA_API$5 = "click" + EVENT_KEY$5 + DATA_API_KEY$5; - var CLASS_NAME_SCROLLABLE = 'modal-dialog-scrollable'; - var CLASS_NAME_SCROLLBAR_MEASURER = 'modal-scrollbar-measure'; - var CLASS_NAME_BACKDROP = 'modal-backdrop'; - var CLASS_NAME_OPEN = 'modal-open'; - var CLASS_NAME_FADE$1 = 'fade'; - var CLASS_NAME_SHOW$3 = 'show'; - var CLASS_NAME_STATIC = 'modal-static'; - var SELECTOR_DIALOG = '.modal-dialog'; - var SELECTOR_MODAL_BODY = '.modal-body'; - var SELECTOR_DATA_TOGGLE$3 = '[data-toggle="modal"]'; - var SELECTOR_DATA_DISMISS = '[data-dismiss="modal"]'; - var SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'; - var SELECTOR_STICKY_CONTENT = '.sticky-top'; - /** - * ------------------------------------------------------------------------ - * Class Definition - * ------------------------------------------------------------------------ - */ - - var Modal = /*#__PURE__*/function () { - function Modal(element, config) { - this._config = this._getConfig(config); - this._element = element; - this._dialog = element.querySelector(SELECTOR_DIALOG); - this._backdrop = null; - this._isShown = false; - this._isBodyOverflowing = false; - this._ignoreBackdropClick = false; - this._isTransitioning = false; - this._scrollbarWidth = 0; - } // Getters - - - var _proto = Modal.prototype; - - // Public - _proto.toggle = function toggle(relatedTarget) { - return this._isShown ? this.hide() : this.show(relatedTarget); - }; - - _proto.show = function show(relatedTarget) { - var _this = this; - - if (this._isShown || this._isTransitioning) { - return; - } - - if ($__default['default'](this._element).hasClass(CLASS_NAME_FADE$1)) { - this._isTransitioning = true; - } - - var showEvent = $__default['default'].Event(EVENT_SHOW$2, { - relatedTarget: relatedTarget - }); - $__default['default'](this._element).trigger(showEvent); - - if (this._isShown || showEvent.isDefaultPrevented()) { - return; - } - - this._isShown = true; - - this._checkScrollbar(); - - this._setScrollbar(); - - this._adjustDialog(); - - this._setEscapeEvent(); - - this._setResizeEvent(); - - $__default['default'](this._element).on(EVENT_CLICK_DISMISS, SELECTOR_DATA_DISMISS, function (event) { - return _this.hide(event); - }); - $__default['default'](this._dialog).on(EVENT_MOUSEDOWN_DISMISS, function () { - $__default['default'](_this._element).one(EVENT_MOUSEUP_DISMISS, function (event) { - if ($__default['default'](event.target).is(_this._element)) { - _this._ignoreBackdropClick = true; - } - }); - }); - - this._showBackdrop(function () { - return _this._showElement(relatedTarget); - }); - }; - - _proto.hide = function hide(event) { - var _this2 = this; - - if (event) { - event.preventDefault(); - } - - if (!this._isShown || this._isTransitioning) { - return; - } - - var hideEvent = $__default['default'].Event(EVENT_HIDE$2); - $__default['default'](this._element).trigger(hideEvent); - - if (!this._isShown || hideEvent.isDefaultPrevented()) { - return; - } - - this._isShown = false; - var transition = $__default['default'](this._element).hasClass(CLASS_NAME_FADE$1); - - if (transition) { - this._isTransitioning = true; - } - - this._setEscapeEvent(); - - this._setResizeEvent(); - - $__default['default'](document).off(EVENT_FOCUSIN); - $__default['default'](this._element).removeClass(CLASS_NAME_SHOW$3); - $__default['default'](this._element).off(EVENT_CLICK_DISMISS); - $__default['default'](this._dialog).off(EVENT_MOUSEDOWN_DISMISS); - - if (transition) { - var transitionDuration = Util.getTransitionDurationFromElement(this._element); - $__default['default'](this._element).one(Util.TRANSITION_END, function (event) { - return _this2._hideModal(event); - }).emulateTransitionEnd(transitionDuration); - } else { - this._hideModal(); - } - }; - - _proto.dispose = function dispose() { - [window, this._element, this._dialog].forEach(function (htmlElement) { - return $__default['default'](htmlElement).off(EVENT_KEY$5); - }); - /** - * `document` has 2 events `EVENT_FOCUSIN` and `EVENT_CLICK_DATA_API` - * Do not move `document` in `htmlElements` array - * It will remove `EVENT_CLICK_DATA_API` event that should remain - */ - - $__default['default'](document).off(EVENT_FOCUSIN); - $__default['default'].removeData(this._element, DATA_KEY$5); - this._config = null; - this._element = null; - this._dialog = null; - this._backdrop = null; - this._isShown = null; - this._isBodyOverflowing = null; - this._ignoreBackdropClick = null; - this._isTransitioning = null; - this._scrollbarWidth = null; - }; - - _proto.handleUpdate = function handleUpdate() { - this._adjustDialog(); - } // Private - ; - - _proto._getConfig = function _getConfig(config) { - config = _extends({}, Default$3, config); - Util.typeCheckConfig(NAME$5, config, DefaultType$3); - return config; - }; - - _proto._triggerBackdropTransition = function _triggerBackdropTransition() { - var _this3 = this; - - if (this._config.backdrop === 'static') { - var hideEventPrevented = $__default['default'].Event(EVENT_HIDE_PREVENTED); - $__default['default'](this._element).trigger(hideEventPrevented); - - if (hideEventPrevented.isDefaultPrevented()) { - return; - } - - var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight; - - if (!isModalOverflowing) { - this._element.style.overflowY = 'hidden'; - } - - this._element.classList.add(CLASS_NAME_STATIC); - - var modalTransitionDuration = Util.getTransitionDurationFromElement(this._dialog); - $__default['default'](this._element).off(Util.TRANSITION_END); - $__default['default'](this._element).one(Util.TRANSITION_END, function () { - _this3._element.classList.remove(CLASS_NAME_STATIC); - - if (!isModalOverflowing) { - $__default['default'](_this3._element).one(Util.TRANSITION_END, function () { - _this3._element.style.overflowY = ''; - }).emulateTransitionEnd(_this3._element, modalTransitionDuration); - } - }).emulateTransitionEnd(modalTransitionDuration); - - this._element.focus(); - } else { - this.hide(); - } - }; - - _proto._showElement = function _showElement(relatedTarget) { - var _this4 = this; - - var transition = $__default['default'](this._element).hasClass(CLASS_NAME_FADE$1); - var modalBody = this._dialog ? this._dialog.querySelector(SELECTOR_MODAL_BODY) : null; - - if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) { - // Don't move modal's DOM position - document.body.appendChild(this._element); - } - - this._element.style.display = 'block'; - - this._element.removeAttribute('aria-hidden'); - - this._element.setAttribute('aria-modal', true); - - this._element.setAttribute('role', 'dialog'); - - if ($__default['default'](this._dialog).hasClass(CLASS_NAME_SCROLLABLE) && modalBody) { - modalBody.scrollTop = 0; - } else { - this._element.scrollTop = 0; - } - - if (transition) { - Util.reflow(this._element); - } - - $__default['default'](this._element).addClass(CLASS_NAME_SHOW$3); - - if (this._config.focus) { - this._enforceFocus(); - } - - var shownEvent = $__default['default'].Event(EVENT_SHOWN$2, { - relatedTarget: relatedTarget - }); - - var transitionComplete = function transitionComplete() { - if (_this4._config.focus) { - _this4._element.focus(); - } - - _this4._isTransitioning = false; - $__default['default'](_this4._element).trigger(shownEvent); - }; - - if (transition) { - var transitionDuration = Util.getTransitionDurationFromElement(this._dialog); - $__default['default'](this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(transitionDuration); - } else { - transitionComplete(); - } - }; - - _proto._enforceFocus = function _enforceFocus() { - var _this5 = this; - - $__default['default'](document).off(EVENT_FOCUSIN) // Guard against infinite focus loop - .on(EVENT_FOCUSIN, function (event) { - if (document !== event.target && _this5._element !== event.target && $__default['default'](_this5._element).has(event.target).length === 0) { - _this5._element.focus(); - } - }); - }; - - _proto._setEscapeEvent = function _setEscapeEvent() { - var _this6 = this; - - if (this._isShown) { - $__default['default'](this._element).on(EVENT_KEYDOWN_DISMISS, function (event) { - if (_this6._config.keyboard && event.which === ESCAPE_KEYCODE$1) { - event.preventDefault(); - - _this6.hide(); - } else if (!_this6._config.keyboard && event.which === ESCAPE_KEYCODE$1) { - _this6._triggerBackdropTransition(); - } - }); - } else if (!this._isShown) { - $__default['default'](this._element).off(EVENT_KEYDOWN_DISMISS); - } - }; - - _proto._setResizeEvent = function _setResizeEvent() { - var _this7 = this; - - if (this._isShown) { - $__default['default'](window).on(EVENT_RESIZE, function (event) { - return _this7.handleUpdate(event); - }); - } else { - $__default['default'](window).off(EVENT_RESIZE); - } - }; - - _proto._hideModal = function _hideModal() { - var _this8 = this; - - this._element.style.display = 'none'; - - this._element.setAttribute('aria-hidden', true); - - this._element.removeAttribute('aria-modal'); - - this._element.removeAttribute('role'); - - this._isTransitioning = false; - - this._showBackdrop(function () { - $__default['default'](document.body).removeClass(CLASS_NAME_OPEN); - - _this8._resetAdjustments(); - - _this8._resetScrollbar(); - - $__default['default'](_this8._element).trigger(EVENT_HIDDEN$2); - }); - }; - - _proto._removeBackdrop = function _removeBackdrop() { - if (this._backdrop) { - $__default['default'](this._backdrop).remove(); - this._backdrop = null; - } - }; - - _proto._showBackdrop = function _showBackdrop(callback) { - var _this9 = this; - - var animate = $__default['default'](this._element).hasClass(CLASS_NAME_FADE$1) ? CLASS_NAME_FADE$1 : ''; - - if (this._isShown && this._config.backdrop) { - this._backdrop = document.createElement('div'); - this._backdrop.className = CLASS_NAME_BACKDROP; - - if (animate) { - this._backdrop.classList.add(animate); - } - - $__default['default'](this._backdrop).appendTo(document.body); - $__default['default'](this._element).on(EVENT_CLICK_DISMISS, function (event) { - if (_this9._ignoreBackdropClick) { - _this9._ignoreBackdropClick = false; - return; - } - - if (event.target !== event.currentTarget) { - return; - } - - _this9._triggerBackdropTransition(); - }); - - if (animate) { - Util.reflow(this._backdrop); - } - - $__default['default'](this._backdrop).addClass(CLASS_NAME_SHOW$3); - - if (!callback) { - return; - } - - if (!animate) { - callback(); - return; - } - - var backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop); - $__default['default'](this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(backdropTransitionDuration); - } else if (!this._isShown && this._backdrop) { - $__default['default'](this._backdrop).removeClass(CLASS_NAME_SHOW$3); - - var callbackRemove = function callbackRemove() { - _this9._removeBackdrop(); - - if (callback) { - callback(); - } - }; - - if ($__default['default'](this._element).hasClass(CLASS_NAME_FADE$1)) { - var _backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop); - - $__default['default'](this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(_backdropTransitionDuration); - } else { - callbackRemove(); - } - } else if (callback) { - callback(); - } - } // ---------------------------------------------------------------------- - // the following methods are used to handle overflowing modals - // todo (fat): these should probably be refactored out of modal.js - // ---------------------------------------------------------------------- - ; - - _proto._adjustDialog = function _adjustDialog() { - var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight; - - if (!this._isBodyOverflowing && isModalOverflowing) { - this._element.style.paddingLeft = this._scrollbarWidth + "px"; - } - - if (this._isBodyOverflowing && !isModalOverflowing) { - this._element.style.paddingRight = this._scrollbarWidth + "px"; - } - }; - - _proto._resetAdjustments = function _resetAdjustments() { - this._element.style.paddingLeft = ''; - this._element.style.paddingRight = ''; - }; - - _proto._checkScrollbar = function _checkScrollbar() { - var rect = document.body.getBoundingClientRect(); - this._isBodyOverflowing = Math.round(rect.left + rect.right) < window.innerWidth; - this._scrollbarWidth = this._getScrollbarWidth(); - }; - - _proto._setScrollbar = function _setScrollbar() { - var _this10 = this; - - if (this._isBodyOverflowing) { - // Note: DOMNode.style.paddingRight returns the actual value or '' if not set - // while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set - var fixedContent = [].slice.call(document.querySelectorAll(SELECTOR_FIXED_CONTENT)); - var stickyContent = [].slice.call(document.querySelectorAll(SELECTOR_STICKY_CONTENT)); // Adjust fixed content padding - - $__default['default'](fixedContent).each(function (index, element) { - var actualPadding = element.style.paddingRight; - var calculatedPadding = $__default['default'](element).css('padding-right'); - $__default['default'](element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this10._scrollbarWidth + "px"); - }); // Adjust sticky content margin - - $__default['default'](stickyContent).each(function (index, element) { - var actualMargin = element.style.marginRight; - var calculatedMargin = $__default['default'](element).css('margin-right'); - $__default['default'](element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) - _this10._scrollbarWidth + "px"); - }); // Adjust body padding - - var actualPadding = document.body.style.paddingRight; - var calculatedPadding = $__default['default'](document.body).css('padding-right'); - $__default['default'](document.body).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + this._scrollbarWidth + "px"); - } - - $__default['default'](document.body).addClass(CLASS_NAME_OPEN); - }; - - _proto._resetScrollbar = function _resetScrollbar() { - // Restore fixed content padding - var fixedContent = [].slice.call(document.querySelectorAll(SELECTOR_FIXED_CONTENT)); - $__default['default'](fixedContent).each(function (index, element) { - var padding = $__default['default'](element).data('padding-right'); - $__default['default'](element).removeData('padding-right'); - element.style.paddingRight = padding ? padding : ''; - }); // Restore sticky content - - var elements = [].slice.call(document.querySelectorAll("" + SELECTOR_STICKY_CONTENT)); - $__default['default'](elements).each(function (index, element) { - var margin = $__default['default'](element).data('margin-right'); - - if (typeof margin !== 'undefined') { - $__default['default'](element).css('margin-right', margin).removeData('margin-right'); - } - }); // Restore body padding - - var padding = $__default['default'](document.body).data('padding-right'); - $__default['default'](document.body).removeData('padding-right'); - document.body.style.paddingRight = padding ? padding : ''; - }; - - _proto._getScrollbarWidth = function _getScrollbarWidth() { - // thx d.walsh - var scrollDiv = document.createElement('div'); - scrollDiv.className = CLASS_NAME_SCROLLBAR_MEASURER; - document.body.appendChild(scrollDiv); - var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth; - document.body.removeChild(scrollDiv); - return scrollbarWidth; - } // Static - ; - - Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) { - return this.each(function () { - var data = $__default['default'](this).data(DATA_KEY$5); - - var _config = _extends({}, Default$3, $__default['default'](this).data(), typeof config === 'object' && config ? config : {}); - - if (!data) { - data = new Modal(this, _config); - $__default['default'](this).data(DATA_KEY$5, data); - } - - if (typeof config === 'string') { - if (typeof data[config] === 'undefined') { - throw new TypeError("No method named \"" + config + "\""); - } - - data[config](relatedTarget); - } else if (_config.show) { - data.show(relatedTarget); - } - }); - }; - - _createClass(Modal, null, [{ - key: "VERSION", - get: function get() { - return VERSION$5; - } - }, { - key: "Default", - get: function get() { - return Default$3; - } - }]); - - return Modal; - }(); - /** - * ------------------------------------------------------------------------ - * Data Api implementation - * ------------------------------------------------------------------------ - */ - - - $__default['default'](document).on(EVENT_CLICK_DATA_API$5, SELECTOR_DATA_TOGGLE$3, function (event) { - var _this11 = this; - - var target; - var selector = Util.getSelectorFromElement(this); - - if (selector) { - target = document.querySelector(selector); - } - - var config = $__default['default'](target).data(DATA_KEY$5) ? 'toggle' : _extends({}, $__default['default'](target).data(), $__default['default'](this).data()); - - if (this.tagName === 'A' || this.tagName === 'AREA') { - event.preventDefault(); - } - - var $target = $__default['default'](target).one(EVENT_SHOW$2, function (showEvent) { - if (showEvent.isDefaultPrevented()) { - // Only register focus restorer if modal will actually get shown - return; - } - - $target.one(EVENT_HIDDEN$2, function () { - if ($__default['default'](_this11).is(':visible')) { - _this11.focus(); - } - }); - }); - - Modal._jQueryInterface.call($__default['default'](target), config, this); - }); - /** - * ------------------------------------------------------------------------ - * jQuery - * ------------------------------------------------------------------------ - */ - - $__default['default'].fn[NAME$5] = Modal._jQueryInterface; - $__default['default'].fn[NAME$5].Constructor = Modal; - - $__default['default'].fn[NAME$5].noConflict = function () { - $__default['default'].fn[NAME$5] = JQUERY_NO_CONFLICT$5; - return Modal._jQueryInterface; - }; - - /** - * -------------------------------------------------------------------------- - * Bootstrap (v4.5.3): tools/sanitizer.js - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - * -------------------------------------------------------------------------- - */ - var uriAttrs = ['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']; - var ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i; - var DefaultWhitelist = { - // Global attributes allowed on any supplied element below. - '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN], - a: ['target', 'href', 'title', 'rel'], - area: [], - b: [], - br: [], - col: [], - code: [], - div: [], - em: [], - hr: [], - h1: [], - h2: [], - h3: [], - h4: [], - h5: [], - h6: [], - i: [], - img: ['src', 'srcset', 'alt', 'title', 'width', 'height'], - li: [], - ol: [], - p: [], - pre: [], - s: [], - small: [], - span: [], - sub: [], - sup: [], - strong: [], - u: [], - ul: [] - }; - /** - * A pattern that recognizes a commonly useful subset of URLs that are safe. - * - * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts - */ - - var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^#&/:?]*(?:[#/?]|$))/gi; - /** - * A pattern that matches safe data URLs. Only matches image, video and audio types. - * - * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts - */ - - var DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i; - - function allowedAttribute(attr, allowedAttributeList) { - var attrName = attr.nodeName.toLowerCase(); - - if (allowedAttributeList.indexOf(attrName) !== -1) { - if (uriAttrs.indexOf(attrName) !== -1) { - return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN)); - } - - return true; - } - - var regExp = allowedAttributeList.filter(function (attrRegex) { - return attrRegex instanceof RegExp; - }); // Check if a regular expression validates the attribute. - - for (var i = 0, len = regExp.length; i < len; i++) { - if (attrName.match(regExp[i])) { - return true; - } - } - - return false; - } - - function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) { - if (unsafeHtml.length === 0) { - return unsafeHtml; - } - - if (sanitizeFn && typeof sanitizeFn === 'function') { - return sanitizeFn(unsafeHtml); - } - - var domParser = new window.DOMParser(); - var createdDocument = domParser.parseFromString(unsafeHtml, 'text/html'); - var whitelistKeys = Object.keys(whiteList); - var elements = [].slice.call(createdDocument.body.querySelectorAll('*')); - - var _loop = function _loop(i, len) { - var el = elements[i]; - var elName = el.nodeName.toLowerCase(); - - if (whitelistKeys.indexOf(el.nodeName.toLowerCase()) === -1) { - el.parentNode.removeChild(el); - return "continue"; - } - - var attributeList = [].slice.call(el.attributes); - var whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || []); - attributeList.forEach(function (attr) { - if (!allowedAttribute(attr, whitelistedAttributes)) { - el.removeAttribute(attr.nodeName); - } - }); - }; - - for (var i = 0, len = elements.length; i < len; i++) { - var _ret = _loop(i); - - if (_ret === "continue") continue; - } - - return createdDocument.body.innerHTML; - } - - /** - * ------------------------------------------------------------------------ - * Constants - * ------------------------------------------------------------------------ - */ - - var NAME$6 = 'tooltip'; - var VERSION$6 = '4.5.3'; - var DATA_KEY$6 = 'bs.tooltip'; - var EVENT_KEY$6 = "." + DATA_KEY$6; - var JQUERY_NO_CONFLICT$6 = $__default['default'].fn[NAME$6]; - var CLASS_PREFIX = 'bs-tooltip'; - var BSCLS_PREFIX_REGEX = new RegExp("(^|\\s)" + CLASS_PREFIX + "\\S+", 'g'); - var DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn']; - var DefaultType$4 = { - animation: 'boolean', - template: 'string', - title: '(string|element|function)', - trigger: 'string', - delay: '(number|object)', - html: 'boolean', - selector: '(string|boolean)', - placement: '(string|function)', - offset: '(number|string|function)', - container: '(string|element|boolean)', - fallbackPlacement: '(string|array)', - boundary: '(string|element)', - sanitize: 'boolean', - sanitizeFn: '(null|function)', - whiteList: 'object', - popperConfig: '(null|object)' - }; - var AttachmentMap = { - AUTO: 'auto', - TOP: 'top', - RIGHT: 'right', - BOTTOM: 'bottom', - LEFT: 'left' - }; - var Default$4 = { - animation: true, - template: '', - trigger: 'hover focus', - title: '', - delay: 0, - html: false, - selector: false, - placement: 'top', - offset: 0, - container: false, - fallbackPlacement: 'flip', - boundary: 'scrollParent', - sanitize: true, - sanitizeFn: null, - whiteList: DefaultWhitelist, - popperConfig: null - }; - var HOVER_STATE_SHOW = 'show'; - var HOVER_STATE_OUT = 'out'; - var Event = { - HIDE: "hide" + EVENT_KEY$6, - HIDDEN: "hidden" + EVENT_KEY$6, - SHOW: "show" + EVENT_KEY$6, - SHOWN: "shown" + EVENT_KEY$6, - INSERTED: "inserted" + EVENT_KEY$6, - CLICK: "click" + EVENT_KEY$6, - FOCUSIN: "focusin" + EVENT_KEY$6, - FOCUSOUT: "focusout" + EVENT_KEY$6, - MOUSEENTER: "mouseenter" + EVENT_KEY$6, - MOUSELEAVE: "mouseleave" + EVENT_KEY$6 - }; - var CLASS_NAME_FADE$2 = 'fade'; - var CLASS_NAME_SHOW$4 = 'show'; - var SELECTOR_TOOLTIP_INNER = '.tooltip-inner'; - var SELECTOR_ARROW = '.arrow'; - var TRIGGER_HOVER = 'hover'; - var TRIGGER_FOCUS = 'focus'; - var TRIGGER_CLICK = 'click'; - var TRIGGER_MANUAL = 'manual'; - /** - * ------------------------------------------------------------------------ - * Class Definition - * ------------------------------------------------------------------------ - */ - - var Tooltip = /*#__PURE__*/function () { - function Tooltip(element, config) { - if (typeof Popper__default['default'] === 'undefined') { - throw new TypeError('Bootstrap\'s tooltips require Popper.js (https://popper.js.org/)'); - } // private - - - this._isEnabled = true; - this._timeout = 0; - this._hoverState = ''; - this._activeTrigger = {}; - this._popper = null; // Protected - - this.element = element; - this.config = this._getConfig(config); - this.tip = null; - - this._setListeners(); - } // Getters - - - var _proto = Tooltip.prototype; - - // Public - _proto.enable = function enable() { - this._isEnabled = true; - }; - - _proto.disable = function disable() { - this._isEnabled = false; - }; - - _proto.toggleEnabled = function toggleEnabled() { - this._isEnabled = !this._isEnabled; - }; - - _proto.toggle = function toggle(event) { - if (!this._isEnabled) { - return; - } - - if (event) { - var dataKey = this.constructor.DATA_KEY; - var context = $__default['default'](event.currentTarget).data(dataKey); - - if (!context) { - context = new this.constructor(event.currentTarget, this._getDelegateConfig()); - $__default['default'](event.currentTarget).data(dataKey, context); - } - - context._activeTrigger.click = !context._activeTrigger.click; - - if (context._isWithActiveTrigger()) { - context._enter(null, context); - } else { - context._leave(null, context); - } - } else { - if ($__default['default'](this.getTipElement()).hasClass(CLASS_NAME_SHOW$4)) { - this._leave(null, this); - - return; - } - - this._enter(null, this); - } - }; - - _proto.dispose = function dispose() { - clearTimeout(this._timeout); - $__default['default'].removeData(this.element, this.constructor.DATA_KEY); - $__default['default'](this.element).off(this.constructor.EVENT_KEY); - $__default['default'](this.element).closest('.modal').off('hide.bs.modal', this._hideModalHandler); - - if (this.tip) { - $__default['default'](this.tip).remove(); - } - - this._isEnabled = null; - this._timeout = null; - this._hoverState = null; - this._activeTrigger = null; - - if (this._popper) { - this._popper.destroy(); - } - - this._popper = null; - this.element = null; - this.config = null; - this.tip = null; - }; - - _proto.show = function show() { - var _this = this; - - if ($__default['default'](this.element).css('display') === 'none') { - throw new Error('Please use show on visible elements'); - } - - var showEvent = $__default['default'].Event(this.constructor.Event.SHOW); - - if (this.isWithContent() && this._isEnabled) { - $__default['default'](this.element).trigger(showEvent); - var shadowRoot = Util.findShadowRoot(this.element); - var isInTheDom = $__default['default'].contains(shadowRoot !== null ? shadowRoot : this.element.ownerDocument.documentElement, this.element); - - if (showEvent.isDefaultPrevented() || !isInTheDom) { - return; - } - - var tip = this.getTipElement(); - var tipId = Util.getUID(this.constructor.NAME); - tip.setAttribute('id', tipId); - this.element.setAttribute('aria-describedby', tipId); - this.setContent(); - - if (this.config.animation) { - $__default['default'](tip).addClass(CLASS_NAME_FADE$2); - } - - var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement; - - var attachment = this._getAttachment(placement); - - this.addAttachmentClass(attachment); - - var container = this._getContainer(); - - $__default['default'](tip).data(this.constructor.DATA_KEY, this); - - if (!$__default['default'].contains(this.element.ownerDocument.documentElement, this.tip)) { - $__default['default'](tip).appendTo(container); - } - - $__default['default'](this.element).trigger(this.constructor.Event.INSERTED); - this._popper = new Popper__default['default'](this.element, tip, this._getPopperConfig(attachment)); - $__default['default'](tip).addClass(CLASS_NAME_SHOW$4); // If this is a touch-enabled device we add extra - // empty mouseover listeners to the body's immediate children; - // only needed because of broken event delegation on iOS - // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html - - if ('ontouchstart' in document.documentElement) { - $__default['default'](document.body).children().on('mouseover', null, $__default['default'].noop); - } - - var complete = function complete() { - if (_this.config.animation) { - _this._fixTransition(); - } - - var prevHoverState = _this._hoverState; - _this._hoverState = null; - $__default['default'](_this.element).trigger(_this.constructor.Event.SHOWN); - - if (prevHoverState === HOVER_STATE_OUT) { - _this._leave(null, _this); - } - }; - - if ($__default['default'](this.tip).hasClass(CLASS_NAME_FADE$2)) { - var transitionDuration = Util.getTransitionDurationFromElement(this.tip); - $__default['default'](this.tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration); - } else { - complete(); - } - } - }; - - _proto.hide = function hide(callback) { - var _this2 = this; - - var tip = this.getTipElement(); - var hideEvent = $__default['default'].Event(this.constructor.Event.HIDE); - - var complete = function complete() { - if (_this2._hoverState !== HOVER_STATE_SHOW && tip.parentNode) { - tip.parentNode.removeChild(tip); - } - - _this2._cleanTipClass(); - - _this2.element.removeAttribute('aria-describedby'); - - $__default['default'](_this2.element).trigger(_this2.constructor.Event.HIDDEN); - - if (_this2._popper !== null) { - _this2._popper.destroy(); - } - - if (callback) { - callback(); - } - }; - - $__default['default'](this.element).trigger(hideEvent); - - if (hideEvent.isDefaultPrevented()) { - return; - } - - $__default['default'](tip).removeClass(CLASS_NAME_SHOW$4); // If this is a touch-enabled device we remove the extra - // empty mouseover listeners we added for iOS support - - if ('ontouchstart' in document.documentElement) { - $__default['default'](document.body).children().off('mouseover', null, $__default['default'].noop); - } - - this._activeTrigger[TRIGGER_CLICK] = false; - this._activeTrigger[TRIGGER_FOCUS] = false; - this._activeTrigger[TRIGGER_HOVER] = false; - - if ($__default['default'](this.tip).hasClass(CLASS_NAME_FADE$2)) { - var transitionDuration = Util.getTransitionDurationFromElement(tip); - $__default['default'](tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration); - } else { - complete(); - } - - this._hoverState = ''; - }; - - _proto.update = function update() { - if (this._popper !== null) { - this._popper.scheduleUpdate(); - } - } // Protected - ; - - _proto.isWithContent = function isWithContent() { - return Boolean(this.getTitle()); - }; - - _proto.addAttachmentClass = function addAttachmentClass(attachment) { - $__default['default'](this.getTipElement()).addClass(CLASS_PREFIX + "-" + attachment); - }; - - _proto.getTipElement = function getTipElement() { - this.tip = this.tip || $__default['default'](this.config.template)[0]; - return this.tip; - }; - - _proto.setContent = function setContent() { - var tip = this.getTipElement(); - this.setElementContent($__default['default'](tip.querySelectorAll(SELECTOR_TOOLTIP_INNER)), this.getTitle()); - $__default['default'](tip).removeClass(CLASS_NAME_FADE$2 + " " + CLASS_NAME_SHOW$4); - }; - - _proto.setElementContent = function setElementContent($element, content) { - if (typeof content === 'object' && (content.nodeType || content.jquery)) { - // Content is a DOM node or a jQuery - if (this.config.html) { - if (!$__default['default'](content).parent().is($element)) { - $element.empty().append(content); - } - } else { - $element.text($__default['default'](content).text()); - } - - return; - } - - if (this.config.html) { - if (this.config.sanitize) { - content = sanitizeHtml(content, this.config.whiteList, this.config.sanitizeFn); - } - - $element.html(content); - } else { - $element.text(content); - } - }; - - _proto.getTitle = function getTitle() { - var title = this.element.getAttribute('data-original-title'); - - if (!title) { - title = typeof this.config.title === 'function' ? this.config.title.call(this.element) : this.config.title; - } - - return title; - } // Private - ; - - _proto._getPopperConfig = function _getPopperConfig(attachment) { - var _this3 = this; - - var defaultBsConfig = { - placement: attachment, - modifiers: { - offset: this._getOffset(), - flip: { - behavior: this.config.fallbackPlacement - }, - arrow: { - element: SELECTOR_ARROW - }, - preventOverflow: { - boundariesElement: this.config.boundary - } - }, - onCreate: function onCreate(data) { - if (data.originalPlacement !== data.placement) { - _this3._handlePopperPlacementChange(data); - } - }, - onUpdate: function onUpdate(data) { - return _this3._handlePopperPlacementChange(data); - } - }; - return _extends({}, defaultBsConfig, this.config.popperConfig); - }; - - _proto._getOffset = function _getOffset() { - var _this4 = this; - - var offset = {}; - - if (typeof this.config.offset === 'function') { - offset.fn = function (data) { - data.offsets = _extends({}, data.offsets, _this4.config.offset(data.offsets, _this4.element) || {}); - return data; - }; - } else { - offset.offset = this.config.offset; - } - - return offset; - }; - - _proto._getContainer = function _getContainer() { - if (this.config.container === false) { - return document.body; - } - - if (Util.isElement(this.config.container)) { - return $__default['default'](this.config.container); - } - - return $__default['default'](document).find(this.config.container); - }; - - _proto._getAttachment = function _getAttachment(placement) { - return AttachmentMap[placement.toUpperCase()]; - }; - - _proto._setListeners = function _setListeners() { - var _this5 = this; - - var triggers = this.config.trigger.split(' '); - triggers.forEach(function (trigger) { - if (trigger === 'click') { - $__default['default'](_this5.element).on(_this5.constructor.Event.CLICK, _this5.config.selector, function (event) { - return _this5.toggle(event); - }); - } else if (trigger !== TRIGGER_MANUAL) { - var eventIn = trigger === TRIGGER_HOVER ? _this5.constructor.Event.MOUSEENTER : _this5.constructor.Event.FOCUSIN; - var eventOut = trigger === TRIGGER_HOVER ? _this5.constructor.Event.MOUSELEAVE : _this5.constructor.Event.FOCUSOUT; - $__default['default'](_this5.element).on(eventIn, _this5.config.selector, function (event) { - return _this5._enter(event); - }).on(eventOut, _this5.config.selector, function (event) { - return _this5._leave(event); - }); - } - }); - - this._hideModalHandler = function () { - if (_this5.element) { - _this5.hide(); - } - }; - - $__default['default'](this.element).closest('.modal').on('hide.bs.modal', this._hideModalHandler); - - if (this.config.selector) { - this.config = _extends({}, this.config, { - trigger: 'manual', - selector: '' - }); - } else { - this._fixTitle(); - } - }; - - _proto._fixTitle = function _fixTitle() { - var titleType = typeof this.element.getAttribute('data-original-title'); - - if (this.element.getAttribute('title') || titleType !== 'string') { - this.element.setAttribute('data-original-title', this.element.getAttribute('title') || ''); - this.element.setAttribute('title', ''); - } - }; - - _proto._enter = function _enter(event, context) { - var dataKey = this.constructor.DATA_KEY; - context = context || $__default['default'](event.currentTarget).data(dataKey); - - if (!context) { - context = new this.constructor(event.currentTarget, this._getDelegateConfig()); - $__default['default'](event.currentTarget).data(dataKey, context); - } - - if (event) { - context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true; - } - - if ($__default['default'](context.getTipElement()).hasClass(CLASS_NAME_SHOW$4) || context._hoverState === HOVER_STATE_SHOW) { - context._hoverState = HOVER_STATE_SHOW; - return; - } - - clearTimeout(context._timeout); - context._hoverState = HOVER_STATE_SHOW; - - if (!context.config.delay || !context.config.delay.show) { - context.show(); - return; - } - - context._timeout = setTimeout(function () { - if (context._hoverState === HOVER_STATE_SHOW) { - context.show(); - } - }, context.config.delay.show); - }; - - _proto._leave = function _leave(event, context) { - var dataKey = this.constructor.DATA_KEY; - context = context || $__default['default'](event.currentTarget).data(dataKey); - - if (!context) { - context = new this.constructor(event.currentTarget, this._getDelegateConfig()); - $__default['default'](event.currentTarget).data(dataKey, context); - } - - if (event) { - context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = false; - } - - if (context._isWithActiveTrigger()) { - return; - } - - clearTimeout(context._timeout); - context._hoverState = HOVER_STATE_OUT; - - if (!context.config.delay || !context.config.delay.hide) { - context.hide(); - return; - } - - context._timeout = setTimeout(function () { - if (context._hoverState === HOVER_STATE_OUT) { - context.hide(); - } - }, context.config.delay.hide); - }; - - _proto._isWithActiveTrigger = function _isWithActiveTrigger() { - for (var trigger in this._activeTrigger) { - if (this._activeTrigger[trigger]) { - return true; - } - } - - return false; - }; - - _proto._getConfig = function _getConfig(config) { - var dataAttributes = $__default['default'](this.element).data(); - Object.keys(dataAttributes).forEach(function (dataAttr) { - if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) { - delete dataAttributes[dataAttr]; - } - }); - config = _extends({}, this.constructor.Default, dataAttributes, typeof config === 'object' && config ? config : {}); - - if (typeof config.delay === 'number') { - config.delay = { - show: config.delay, - hide: config.delay - }; - } - - if (typeof config.title === 'number') { - config.title = config.title.toString(); - } - - if (typeof config.content === 'number') { - config.content = config.content.toString(); - } - - Util.typeCheckConfig(NAME$6, config, this.constructor.DefaultType); - - if (config.sanitize) { - config.template = sanitizeHtml(config.template, config.whiteList, config.sanitizeFn); - } - - return config; - }; - - _proto._getDelegateConfig = function _getDelegateConfig() { - var config = {}; - - if (this.config) { - for (var key in this.config) { - if (this.constructor.Default[key] !== this.config[key]) { - config[key] = this.config[key]; - } - } - } - - return config; - }; - - _proto._cleanTipClass = function _cleanTipClass() { - var $tip = $__default['default'](this.getTipElement()); - var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX); - - if (tabClass !== null && tabClass.length) { - $tip.removeClass(tabClass.join('')); - } - }; - - _proto._handlePopperPlacementChange = function _handlePopperPlacementChange(popperData) { - this.tip = popperData.instance.popper; - - this._cleanTipClass(); - - this.addAttachmentClass(this._getAttachment(popperData.placement)); - }; - - _proto._fixTransition = function _fixTransition() { - var tip = this.getTipElement(); - var initConfigAnimation = this.config.animation; - - if (tip.getAttribute('x-placement') !== null) { - return; - } - - $__default['default'](tip).removeClass(CLASS_NAME_FADE$2); - this.config.animation = false; - this.hide(); - this.show(); - this.config.animation = initConfigAnimation; - } // Static - ; - - Tooltip._jQueryInterface = function _jQueryInterface(config) { - return this.each(function () { - var $element = $__default['default'](this); - var data = $element.data(DATA_KEY$6); - - var _config = typeof config === 'object' && config; - - if (!data && /dispose|hide/.test(config)) { - return; - } - - if (!data) { - data = new Tooltip(this, _config); - $element.data(DATA_KEY$6, data); - } - - if (typeof config === 'string') { - if (typeof data[config] === 'undefined') { - throw new TypeError("No method named \"" + config + "\""); - } - - data[config](); - } - }); - }; - - _createClass(Tooltip, null, [{ - key: "VERSION", - get: function get() { - return VERSION$6; - } - }, { - key: "Default", - get: function get() { - return Default$4; - } - }, { - key: "NAME", - get: function get() { - return NAME$6; - } - }, { - key: "DATA_KEY", - get: function get() { - return DATA_KEY$6; - } - }, { - key: "Event", - get: function get() { - return Event; - } - }, { - key: "EVENT_KEY", - get: function get() { - return EVENT_KEY$6; - } - }, { - key: "DefaultType", - get: function get() { - return DefaultType$4; - } - }]); - - return Tooltip; - }(); - /** - * ------------------------------------------------------------------------ - * jQuery - * ------------------------------------------------------------------------ - */ - - - $__default['default'].fn[NAME$6] = Tooltip._jQueryInterface; - $__default['default'].fn[NAME$6].Constructor = Tooltip; - - $__default['default'].fn[NAME$6].noConflict = function () { - $__default['default'].fn[NAME$6] = JQUERY_NO_CONFLICT$6; - return Tooltip._jQueryInterface; - }; - - /** - * ------------------------------------------------------------------------ - * Constants - * ------------------------------------------------------------------------ - */ - - var NAME$7 = 'popover'; - var VERSION$7 = '4.5.3'; - var DATA_KEY$7 = 'bs.popover'; - var EVENT_KEY$7 = "." + DATA_KEY$7; - var JQUERY_NO_CONFLICT$7 = $__default['default'].fn[NAME$7]; - var CLASS_PREFIX$1 = 'bs-popover'; - var BSCLS_PREFIX_REGEX$1 = new RegExp("(^|\\s)" + CLASS_PREFIX$1 + "\\S+", 'g'); - - var Default$5 = _extends({}, Tooltip.Default, { - placement: 'right', - trigger: 'click', - content: '', - template: '' - }); - - var DefaultType$5 = _extends({}, Tooltip.DefaultType, { - content: '(string|element|function)' - }); - - var CLASS_NAME_FADE$3 = 'fade'; - var CLASS_NAME_SHOW$5 = 'show'; - var SELECTOR_TITLE = '.popover-header'; - var SELECTOR_CONTENT = '.popover-body'; - var Event$1 = { - HIDE: "hide" + EVENT_KEY$7, - HIDDEN: "hidden" + EVENT_KEY$7, - SHOW: "show" + EVENT_KEY$7, - SHOWN: "shown" + EVENT_KEY$7, - INSERTED: "inserted" + EVENT_KEY$7, - CLICK: "click" + EVENT_KEY$7, - FOCUSIN: "focusin" + EVENT_KEY$7, - FOCUSOUT: "focusout" + EVENT_KEY$7, - MOUSEENTER: "mouseenter" + EVENT_KEY$7, - MOUSELEAVE: "mouseleave" + EVENT_KEY$7 - }; - /** - * ------------------------------------------------------------------------ - * Class Definition - * ------------------------------------------------------------------------ - */ - - var Popover = /*#__PURE__*/function (_Tooltip) { - _inheritsLoose(Popover, _Tooltip); - - function Popover() { - return _Tooltip.apply(this, arguments) || this; - } - - var _proto = Popover.prototype; - - // Overrides - _proto.isWithContent = function isWithContent() { - return this.getTitle() || this._getContent(); - }; - - _proto.addAttachmentClass = function addAttachmentClass(attachment) { - $__default['default'](this.getTipElement()).addClass(CLASS_PREFIX$1 + "-" + attachment); - }; - - _proto.getTipElement = function getTipElement() { - this.tip = this.tip || $__default['default'](this.config.template)[0]; - return this.tip; - }; - - _proto.setContent = function setContent() { - var $tip = $__default['default'](this.getTipElement()); // We use append for html objects to maintain js events - - this.setElementContent($tip.find(SELECTOR_TITLE), this.getTitle()); - - var content = this._getContent(); - - if (typeof content === 'function') { - content = content.call(this.element); - } - - this.setElementContent($tip.find(SELECTOR_CONTENT), content); - $tip.removeClass(CLASS_NAME_FADE$3 + " " + CLASS_NAME_SHOW$5); - } // Private - ; - - _proto._getContent = function _getContent() { - return this.element.getAttribute('data-content') || this.config.content; - }; - - _proto._cleanTipClass = function _cleanTipClass() { - var $tip = $__default['default'](this.getTipElement()); - var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX$1); - - if (tabClass !== null && tabClass.length > 0) { - $tip.removeClass(tabClass.join('')); - } - } // Static - ; - - Popover._jQueryInterface = function _jQueryInterface(config) { - return this.each(function () { - var data = $__default['default'](this).data(DATA_KEY$7); - - var _config = typeof config === 'object' ? config : null; - - if (!data && /dispose|hide/.test(config)) { - return; - } - - if (!data) { - data = new Popover(this, _config); - $__default['default'](this).data(DATA_KEY$7, data); - } - - if (typeof config === 'string') { - if (typeof data[config] === 'undefined') { - throw new TypeError("No method named \"" + config + "\""); - } - - data[config](); - } - }); - }; - - _createClass(Popover, null, [{ - key: "VERSION", - // Getters - get: function get() { - return VERSION$7; - } - }, { - key: "Default", - get: function get() { - return Default$5; - } - }, { - key: "NAME", - get: function get() { - return NAME$7; - } - }, { - key: "DATA_KEY", - get: function get() { - return DATA_KEY$7; - } - }, { - key: "Event", - get: function get() { - return Event$1; - } - }, { - key: "EVENT_KEY", - get: function get() { - return EVENT_KEY$7; - } - }, { - key: "DefaultType", - get: function get() { - return DefaultType$5; - } - }]); - - return Popover; - }(Tooltip); - /** - * ------------------------------------------------------------------------ - * jQuery - * ------------------------------------------------------------------------ - */ - - - $__default['default'].fn[NAME$7] = Popover._jQueryInterface; - $__default['default'].fn[NAME$7].Constructor = Popover; - - $__default['default'].fn[NAME$7].noConflict = function () { - $__default['default'].fn[NAME$7] = JQUERY_NO_CONFLICT$7; - return Popover._jQueryInterface; - }; - - /** - * ------------------------------------------------------------------------ - * Constants - * ------------------------------------------------------------------------ - */ - - var NAME$8 = 'scrollspy'; - var VERSION$8 = '4.5.3'; - var DATA_KEY$8 = 'bs.scrollspy'; - var EVENT_KEY$8 = "." + DATA_KEY$8; - var DATA_API_KEY$6 = '.data-api'; - var JQUERY_NO_CONFLICT$8 = $__default['default'].fn[NAME$8]; - var Default$6 = { - offset: 10, - method: 'auto', - target: '' - }; - var DefaultType$6 = { - offset: 'number', - method: 'string', - target: '(string|element)' - }; - var EVENT_ACTIVATE = "activate" + EVENT_KEY$8; - var EVENT_SCROLL = "scroll" + EVENT_KEY$8; - var EVENT_LOAD_DATA_API$2 = "load" + EVENT_KEY$8 + DATA_API_KEY$6; - var CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'; - var CLASS_NAME_ACTIVE$2 = 'active'; - var SELECTOR_DATA_SPY = '[data-spy="scroll"]'; - var SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'; - var SELECTOR_NAV_LINKS = '.nav-link'; - var SELECTOR_NAV_ITEMS = '.nav-item'; - var SELECTOR_LIST_ITEMS = '.list-group-item'; - var SELECTOR_DROPDOWN = '.dropdown'; - var SELECTOR_DROPDOWN_ITEMS = '.dropdown-item'; - var SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'; - var METHOD_OFFSET = 'offset'; - var METHOD_POSITION = 'position'; - /** - * ------------------------------------------------------------------------ - * Class Definition - * ------------------------------------------------------------------------ - */ - - var ScrollSpy = /*#__PURE__*/function () { - function ScrollSpy(element, config) { - var _this = this; - - this._element = element; - this._scrollElement = element.tagName === 'BODY' ? window : element; - this._config = this._getConfig(config); - this._selector = this._config.target + " " + SELECTOR_NAV_LINKS + "," + (this._config.target + " " + SELECTOR_LIST_ITEMS + ",") + (this._config.target + " " + SELECTOR_DROPDOWN_ITEMS); - this._offsets = []; - this._targets = []; - this._activeTarget = null; - this._scrollHeight = 0; - $__default['default'](this._scrollElement).on(EVENT_SCROLL, function (event) { - return _this._process(event); - }); - this.refresh(); - - this._process(); - } // Getters - - - var _proto = ScrollSpy.prototype; - - // Public - _proto.refresh = function refresh() { - var _this2 = this; - - var autoMethod = this._scrollElement === this._scrollElement.window ? METHOD_OFFSET : METHOD_POSITION; - var offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method; - var offsetBase = offsetMethod === METHOD_POSITION ? this._getScrollTop() : 0; - this._offsets = []; - this._targets = []; - this._scrollHeight = this._getScrollHeight(); - var targets = [].slice.call(document.querySelectorAll(this._selector)); - targets.map(function (element) { - var target; - var targetSelector = Util.getSelectorFromElement(element); - - if (targetSelector) { - target = document.querySelector(targetSelector); - } - - if (target) { - var targetBCR = target.getBoundingClientRect(); - - if (targetBCR.width || targetBCR.height) { - // TODO (fat): remove sketch reliance on jQuery position/offset - return [$__default['default'](target)[offsetMethod]().top + offsetBase, targetSelector]; - } - } - - return null; - }).filter(function (item) { - return item; - }).sort(function (a, b) { - return a[0] - b[0]; - }).forEach(function (item) { - _this2._offsets.push(item[0]); - - _this2._targets.push(item[1]); - }); - }; - - _proto.dispose = function dispose() { - $__default['default'].removeData(this._element, DATA_KEY$8); - $__default['default'](this._scrollElement).off(EVENT_KEY$8); - this._element = null; - this._scrollElement = null; - this._config = null; - this._selector = null; - this._offsets = null; - this._targets = null; - this._activeTarget = null; - this._scrollHeight = null; - } // Private - ; - - _proto._getConfig = function _getConfig(config) { - config = _extends({}, Default$6, typeof config === 'object' && config ? config : {}); - - if (typeof config.target !== 'string' && Util.isElement(config.target)) { - var id = $__default['default'](config.target).attr('id'); - - if (!id) { - id = Util.getUID(NAME$8); - $__default['default'](config.target).attr('id', id); - } - - config.target = "#" + id; - } - - Util.typeCheckConfig(NAME$8, config, DefaultType$6); - return config; - }; - - _proto._getScrollTop = function _getScrollTop() { - return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop; - }; - - _proto._getScrollHeight = function _getScrollHeight() { - return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight); - }; - - _proto._getOffsetHeight = function _getOffsetHeight() { - return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height; - }; - - _proto._process = function _process() { - var scrollTop = this._getScrollTop() + this._config.offset; - - var scrollHeight = this._getScrollHeight(); - - var maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight(); - - if (this._scrollHeight !== scrollHeight) { - this.refresh(); - } - - if (scrollTop >= maxScroll) { - var target = this._targets[this._targets.length - 1]; - - if (this._activeTarget !== target) { - this._activate(target); - } - - return; - } - - if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) { - this._activeTarget = null; - - this._clear(); - - return; - } - - for (var i = this._offsets.length; i--;) { - var isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]); - - if (isActiveTarget) { - this._activate(this._targets[i]); - } - } - }; - - _proto._activate = function _activate(target) { - this._activeTarget = target; - - this._clear(); - - var queries = this._selector.split(',').map(function (selector) { - return selector + "[data-target=\"" + target + "\"]," + selector + "[href=\"" + target + "\"]"; - }); - - var $link = $__default['default']([].slice.call(document.querySelectorAll(queries.join(',')))); - - if ($link.hasClass(CLASS_NAME_DROPDOWN_ITEM)) { - $link.closest(SELECTOR_DROPDOWN).find(SELECTOR_DROPDOWN_TOGGLE).addClass(CLASS_NAME_ACTIVE$2); - $link.addClass(CLASS_NAME_ACTIVE$2); - } else { - // Set triggered link as active - $link.addClass(CLASS_NAME_ACTIVE$2); // Set triggered links parents as active - // With both
    and
',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",sanitize:!0,sanitizeFn:null,whiteList:Q,popperConfig:null},$={HIDE:"hide.bs.tooltip",HIDDEN:"hidden.bs.tooltip",SHOW:"show.bs.tooltip",SHOWN:"shown.bs.tooltip",INSERTED:"inserted.bs.tooltip",CLICK:"click.bs.tooltip",FOCUSIN:"focusin.bs.tooltip",FOCUSOUT:"focusout.bs.tooltip",MOUSEENTER:"mouseenter.bs.tooltip",MOUSELEAVE:"mouseleave.bs.tooltip"},J=function(){function t(t,e){if("undefined"==typeof a.default)throw new TypeError("Bootstrap's tooltips require Popper.js (https://popper.js.org/)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var e=t.prototype;return e.enable=function(){this._isEnabled=!0},e.disable=function(){this._isEnabled=!1},e.toggleEnabled=function(){this._isEnabled=!this._isEnabled},e.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=o.default(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),o.default(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(o.default(this.getTipElement()).hasClass("show"))return void this._leave(null,this);this._enter(null,this)}},e.dispose=function(){clearTimeout(this._timeout),o.default.removeData(this.element,this.constructor.DATA_KEY),o.default(this.element).off(this.constructor.EVENT_KEY),o.default(this.element).closest(".modal").off("hide.bs.modal",this._hideModalHandler),this.tip&&o.default(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},e.show=function(){var t=this;if("none"===o.default(this.element).css("display"))throw new Error("Please use show on visible elements");var e=o.default.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){o.default(this.element).trigger(e);var n=d.findShadowRoot(this.element),i=o.default.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(e.isDefaultPrevented()||!i)return;var s=this.getTipElement(),l=d.getUID(this.constructor.NAME);s.setAttribute("id",l),this.element.setAttribute("aria-describedby",l),this.setContent(),this.config.animation&&o.default(s).addClass("fade");var r="function"==typeof this.config.placement?this.config.placement.call(this,s,this.element):this.config.placement,u=this._getAttachment(r);this.addAttachmentClass(u);var f=this._getContainer();o.default(s).data(this.constructor.DATA_KEY,this),o.default.contains(this.element.ownerDocument.documentElement,this.tip)||o.default(s).appendTo(f),o.default(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new a.default(this.element,s,this._getPopperConfig(u)),o.default(s).addClass("show"),"ontouchstart"in document.documentElement&&o.default(document.body).children().on("mouseover",null,o.default.noop);var c=function(){t.config.animation&&t._fixTransition();var e=t._hoverState;t._hoverState=null,o.default(t.element).trigger(t.constructor.Event.SHOWN),"out"===e&&t._leave(null,t)};if(o.default(this.tip).hasClass("fade")){var h=d.getTransitionDurationFromElement(this.tip);o.default(this.tip).one(d.TRANSITION_END,c).emulateTransitionEnd(h)}else c()}},e.hide=function(t){var e=this,n=this.getTipElement(),i=o.default.Event(this.constructor.Event.HIDE),a=function(){"show"!==e._hoverState&&n.parentNode&&n.parentNode.removeChild(n),e._cleanTipClass(),e.element.removeAttribute("aria-describedby"),o.default(e.element).trigger(e.constructor.Event.HIDDEN),null!==e._popper&&e._popper.destroy(),t&&t()};if(o.default(this.element).trigger(i),!i.isDefaultPrevented()){if(o.default(n).removeClass("show"),"ontouchstart"in document.documentElement&&o.default(document.body).children().off("mouseover",null,o.default.noop),this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1,o.default(this.tip).hasClass("fade")){var s=d.getTransitionDurationFromElement(n);o.default(n).one(d.TRANSITION_END,a).emulateTransitionEnd(s)}else a();this._hoverState=""}},e.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},e.isWithContent=function(){return Boolean(this.getTitle())},e.addAttachmentClass=function(t){o.default(this.getTipElement()).addClass("bs-tooltip-"+t)},e.getTipElement=function(){return this.tip=this.tip||o.default(this.config.template)[0],this.tip},e.setContent=function(){var t=this.getTipElement();this.setElementContent(o.default(t.querySelectorAll(".tooltip-inner")),this.getTitle()),o.default(t).removeClass("fade show")},e.setElementContent=function(t,e){"object"!=typeof e||!e.nodeType&&!e.jquery?this.config.html?(this.config.sanitize&&(e=U(e,this.config.whiteList,this.config.sanitizeFn)),t.html(e)):t.text(e):this.config.html?o.default(e).parent().is(t)||t.empty().append(e):t.text(o.default(e).text())},e.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},e._getPopperConfig=function(t){var e=this;return r({},{placement:t,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:".arrow"},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}},this.config.popperConfig)},e._getOffset=function(){var t=this,e={};return"function"==typeof this.config.offset?e.fn=function(e){return e.offsets=r({},e.offsets,t.config.offset(e.offsets,t.element)||{}),e}:e.offset=this.config.offset,e},e._getContainer=function(){return!1===this.config.container?document.body:d.isElement(this.config.container)?o.default(this.config.container):o.default(document).find(this.config.container)},e._getAttachment=function(t){return X[t.toUpperCase()]},e._setListeners=function(){var t=this;this.config.trigger.split(" ").forEach((function(e){if("click"===e)o.default(t.element).on(t.constructor.Event.CLICK,t.config.selector,(function(e){return t.toggle(e)}));else if("manual"!==e){var n="hover"===e?t.constructor.Event.MOUSEENTER:t.constructor.Event.FOCUSIN,i="hover"===e?t.constructor.Event.MOUSELEAVE:t.constructor.Event.FOCUSOUT;o.default(t.element).on(n,t.config.selector,(function(e){return t._enter(e)})).on(i,t.config.selector,(function(e){return t._leave(e)}))}})),this._hideModalHandler=function(){t.element&&t.hide()},o.default(this.element).closest(".modal").on("hide.bs.modal",this._hideModalHandler),this.config.selector?this.config=r({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},e._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},e._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||o.default(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),o.default(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusin"===t.type?"focus":"hover"]=!0),o.default(e.getTipElement()).hasClass("show")||"show"===e._hoverState?e._hoverState="show":(clearTimeout(e._timeout),e._hoverState="show",e.config.delay&&e.config.delay.show?e._timeout=setTimeout((function(){"show"===e._hoverState&&e.show()}),e.config.delay.show):e.show())},e._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||o.default(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),o.default(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusout"===t.type?"focus":"hover"]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState="out",e.config.delay&&e.config.delay.hide?e._timeout=setTimeout((function(){"out"===e._hoverState&&e.hide()}),e.config.delay.hide):e.hide())},e._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},e._getConfig=function(t){var e=o.default(this.element).data();return Object.keys(e).forEach((function(t){-1!==z.indexOf(t)&&delete e[t]})),"number"==typeof(t=r({},this.constructor.Default,e,"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),d.typeCheckConfig(M,t,this.constructor.DefaultType),t.sanitize&&(t.template=U(t.template,t.whiteList,t.sanitizeFn)),t},e._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},e._cleanTipClass=function(){var t=o.default(this.getTipElement()),e=t.attr("class").match(V);null!==e&&e.length&&t.removeClass(e.join(""))},e._handlePopperPlacementChange=function(t){this.tip=t.instance.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},e._fixTransition=function(){var t=this.getTipElement(),e=this.config.animation;null===t.getAttribute("x-placement")&&(o.default(t).removeClass("fade"),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},t._jQueryInterface=function(e){return this.each((function(){var n=o.default(this),i=n.data("bs.tooltip"),a="object"==typeof e&&e;if((i||!/dispose|hide/.test(e))&&(i||(i=new t(this,a),n.data("bs.tooltip",i)),"string"==typeof e)){if("undefined"==typeof i[e])throw new TypeError('No method named "'+e+'"');i[e]()}}))},l(t,null,[{key:"VERSION",get:function(){return"4.5.3"}},{key:"Default",get:function(){return Y}},{key:"NAME",get:function(){return M}},{key:"DATA_KEY",get:function(){return"bs.tooltip"}},{key:"Event",get:function(){return $}},{key:"EVENT_KEY",get:function(){return".bs.tooltip"}},{key:"DefaultType",get:function(){return K}}]),t}();o.default.fn[M]=J._jQueryInterface,o.default.fn[M].Constructor=J,o.default.fn[M].noConflict=function(){return o.default.fn[M]=W,J._jQueryInterface};var G="popover",Z=o.default.fn[G],tt=new RegExp("(^|\\s)bs-popover\\S+","g"),et=r({},J.Default,{placement:"right",trigger:"click",content:"",template:''}),nt=r({},J.DefaultType,{content:"(string|element|function)"}),it={HIDE:"hide.bs.popover",HIDDEN:"hidden.bs.popover",SHOW:"show.bs.popover",SHOWN:"shown.bs.popover",INSERTED:"inserted.bs.popover",CLICK:"click.bs.popover",FOCUSIN:"focusin.bs.popover",FOCUSOUT:"focusout.bs.popover",MOUSEENTER:"mouseenter.bs.popover",MOUSELEAVE:"mouseleave.bs.popover"},ot=function(t){var e,n;function i(){return t.apply(this,arguments)||this}n=t,(e=i).prototype=Object.create(n.prototype),e.prototype.constructor=e,e.__proto__=n;var a=i.prototype;return a.isWithContent=function(){return this.getTitle()||this._getContent()},a.addAttachmentClass=function(t){o.default(this.getTipElement()).addClass("bs-popover-"+t)},a.getTipElement=function(){return this.tip=this.tip||o.default(this.config.template)[0],this.tip},a.setContent=function(){var t=o.default(this.getTipElement());this.setElementContent(t.find(".popover-header"),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(".popover-body"),e),t.removeClass("fade show")},a._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},a._cleanTipClass=function(){var t=o.default(this.getTipElement()),e=t.attr("class").match(tt);null!==e&&e.length>0&&t.removeClass(e.join(""))},i._jQueryInterface=function(t){return this.each((function(){var e=o.default(this).data("bs.popover"),n="object"==typeof t?t:null;if((e||!/dispose|hide/.test(t))&&(e||(e=new i(this,n),o.default(this).data("bs.popover",e)),"string"==typeof t)){if("undefined"==typeof e[t])throw new TypeError('No method named "'+t+'"');e[t]()}}))},l(i,null,[{key:"VERSION",get:function(){return"4.5.3"}},{key:"Default",get:function(){return et}},{key:"NAME",get:function(){return G}},{key:"DATA_KEY",get:function(){return"bs.popover"}},{key:"Event",get:function(){return it}},{key:"EVENT_KEY",get:function(){return".bs.popover"}},{key:"DefaultType",get:function(){return nt}}]),i}(J);o.default.fn[G]=ot._jQueryInterface,o.default.fn[G].Constructor=ot,o.default.fn[G].noConflict=function(){return o.default.fn[G]=Z,ot._jQueryInterface};var at="scrollspy",st=o.default.fn[at],lt={offset:10,method:"auto",target:""},rt={offset:"number",method:"string",target:"(string|element)"},ut=function(){function t(t,e){var n=this;this._element=t,this._scrollElement="BODY"===t.tagName?window:t,this._config=this._getConfig(e),this._selector=this._config.target+" .nav-link,"+this._config.target+" .list-group-item,"+this._config.target+" .dropdown-item",this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,o.default(this._scrollElement).on("scroll.bs.scrollspy",(function(t){return n._process(t)})),this.refresh(),this._process()}var e=t.prototype;return e.refresh=function(){var t=this,e=this._scrollElement===this._scrollElement.window?"offset":"position",n="auto"===this._config.method?e:this._config.method,i="position"===n?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),[].slice.call(document.querySelectorAll(this._selector)).map((function(t){var e,a=d.getSelectorFromElement(t);if(a&&(e=document.querySelector(a)),e){var s=e.getBoundingClientRect();if(s.width||s.height)return[o.default(e)[n]().top+i,a]}return null})).filter((function(t){return t})).sort((function(t,e){return t[0]-e[0]})).forEach((function(e){t._offsets.push(e[0]),t._targets.push(e[1])}))},e.dispose=function(){o.default.removeData(this._element,"bs.scrollspy"),o.default(this._scrollElement).off(".bs.scrollspy"),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},e._getConfig=function(t){if("string"!=typeof(t=r({},lt,"object"==typeof t&&t?t:{})).target&&d.isElement(t.target)){var e=o.default(t.target).attr("id");e||(e=d.getUID(at),o.default(t.target).attr("id",e)),t.target="#"+e}return d.typeCheckConfig(at,t,rt),t},e._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},e._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},e._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},e._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=n){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t0)return this._activeTarget=null,void this._clear();for(var o=this._offsets.length;o--;){this._activeTarget!==this._targets[o]&&t>=this._offsets[o]&&("undefined"==typeof this._offsets[o+1]||t li > .active":".active";n=(n=o.default.makeArray(o.default(i).find(s)))[n.length-1]}var l=o.default.Event("hide.bs.tab",{relatedTarget:this._element}),r=o.default.Event("show.bs.tab",{relatedTarget:n});if(n&&o.default(n).trigger(l),o.default(this._element).trigger(r),!r.isDefaultPrevented()&&!l.isDefaultPrevented()){a&&(e=document.querySelector(a)),this._activate(this._element,i);var u=function(){var e=o.default.Event("hidden.bs.tab",{relatedTarget:t._element}),i=o.default.Event("shown.bs.tab",{relatedTarget:n});o.default(n).trigger(e),o.default(t._element).trigger(i)};e?this._activate(e,e.parentNode,u):u()}}},e.dispose=function(){o.default.removeData(this._element,"bs.tab"),this._element=null},e._activate=function(t,e,n){var i=this,a=(!e||"UL"!==e.nodeName&&"OL"!==e.nodeName?o.default(e).children(".active"):o.default(e).find("> li > .active"))[0],s=n&&a&&o.default(a).hasClass("fade"),l=function(){return i._transitionComplete(t,a,n)};if(a&&s){var r=d.getTransitionDurationFromElement(a);o.default(a).removeClass("show").one(d.TRANSITION_END,l).emulateTransitionEnd(r)}else l()},e._transitionComplete=function(t,e,n){if(e){o.default(e).removeClass("active");var i=o.default(e.parentNode).find("> .dropdown-menu .active")[0];i&&o.default(i).removeClass("active"),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!1)}if(o.default(t).addClass("active"),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),d.reflow(t),t.classList.contains("fade")&&t.classList.add("show"),t.parentNode&&o.default(t.parentNode).hasClass("dropdown-menu")){var a=o.default(t).closest(".dropdown")[0];if(a){var s=[].slice.call(a.querySelectorAll(".dropdown-toggle"));o.default(s).addClass("active")}t.setAttribute("aria-expanded",!0)}n&&n()},t._jQueryInterface=function(e){return this.each((function(){var n=o.default(this),i=n.data("bs.tab");if(i||(i=new t(this),n.data("bs.tab",i)),"string"==typeof e){if("undefined"==typeof i[e])throw new TypeError('No method named "'+e+'"');i[e]()}}))},l(t,null,[{key:"VERSION",get:function(){return"4.5.3"}}]),t}();o.default(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',(function(t){t.preventDefault(),ft._jQueryInterface.call(o.default(this),"show")})),o.default.fn.tab=ft._jQueryInterface,o.default.fn.tab.Constructor=ft,o.default.fn.tab.noConflict=function(){return o.default.fn.tab=dt,ft._jQueryInterface};var ct=o.default.fn.toast,ht={animation:"boolean",autohide:"boolean",delay:"number"},gt={animation:!0,autohide:!0,delay:500},mt=function(){function t(t,e){this._element=t,this._config=this._getConfig(e),this._timeout=null,this._setListeners()}var e=t.prototype;return e.show=function(){var t=this,e=o.default.Event("show.bs.toast");if(o.default(this._element).trigger(e),!e.isDefaultPrevented()){this._clearTimeout(),this._config.animation&&this._element.classList.add("fade");var n=function(){t._element.classList.remove("showing"),t._element.classList.add("show"),o.default(t._element).trigger("shown.bs.toast"),t._config.autohide&&(t._timeout=setTimeout((function(){t.hide()}),t._config.delay))};if(this._element.classList.remove("hide"),d.reflow(this._element),this._element.classList.add("showing"),this._config.animation){var i=d.getTransitionDurationFromElement(this._element);o.default(this._element).one(d.TRANSITION_END,n).emulateTransitionEnd(i)}else n()}},e.hide=function(){if(this._element.classList.contains("show")){var t=o.default.Event("hide.bs.toast");o.default(this._element).trigger(t),t.isDefaultPrevented()||this._close()}},e.dispose=function(){this._clearTimeout(),this._element.classList.contains("show")&&this._element.classList.remove("show"),o.default(this._element).off("click.dismiss.bs.toast"),o.default.removeData(this._element,"bs.toast"),this._element=null,this._config=null},e._getConfig=function(t){return t=r({},gt,o.default(this._element).data(),"object"==typeof t&&t?t:{}),d.typeCheckConfig("toast",t,this.constructor.DefaultType),t},e._setListeners=function(){var t=this;o.default(this._element).on("click.dismiss.bs.toast",'[data-dismiss="toast"]',(function(){return t.hide()}))},e._close=function(){var t=this,e=function(){t._element.classList.add("hide"),o.default(t._element).trigger("hidden.bs.toast")};if(this._element.classList.remove("show"),this._config.animation){var n=d.getTransitionDurationFromElement(this._element);o.default(this._element).one(d.TRANSITION_END,e).emulateTransitionEnd(n)}else e()},e._clearTimeout=function(){clearTimeout(this._timeout),this._timeout=null},t._jQueryInterface=function(e){return this.each((function(){var n=o.default(this),i=n.data("bs.toast");if(i||(i=new t(this,"object"==typeof e&&e),n.data("bs.toast",i)),"string"==typeof e){if("undefined"==typeof i[e])throw new TypeError('No method named "'+e+'"');i[e](this)}}))},l(t,null,[{key:"VERSION",get:function(){return"4.5.3"}},{key:"DefaultType",get:function(){return ht}},{key:"Default",get:function(){return gt}}]),t}();o.default.fn.toast=mt._jQueryInterface,o.default.fn.toast.Constructor=mt,o.default.fn.toast.noConflict=function(){return o.default.fn.toast=ct,mt._jQueryInterface},t.Alert=h,t.Button=m,t.Carousel=w,t.Collapse=D,t.Dropdown=x,t.Modal=q,t.Popover=ot,t.Scrollspy=ut,t.Tab=ft,t.Toast=mt,t.Tooltip=J,t.Util=d,Object.defineProperty(t,"__esModule",{value:!0})})); -//# sourceMappingURL=bootstrap.min.js.map \ No newline at end of file diff --git a/_Resources/node_modules/web-dev-utils/personal-utilities/js/jquery.js b/_Resources/node_modules/web-dev-utils/personal-utilities/js/jquery.js deleted file mode 100644 index b51262a..0000000 --- a/_Resources/node_modules/web-dev-utils/personal-utilities/js/jquery.js +++ /dev/null @@ -1,10979 +0,0 @@ -/*! - * jQuery JavaScript Library v3.5.1 - * https://jquery.com/ - * - * Includes Sizzle.js - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://jquery.org/license - * - * Date: 2020-05-04T22:49Z - */ -( function ( global, factory ) { - - "use strict"; - - if ( typeof module === "object" && typeof module.exports === "object" ) { - - // For CommonJS and CommonJS-like environments where a proper `window` - // is present, execute the factory and get jQuery. - // For environments that do not have a `window` with a `document` - // (such as Node.js), expose a factory as module.exports. - // This accentuates the need for the creation of a real `window`. - // e.g. var jQuery = require("jquery")(window); - // See ticket #14549 for more info. - module.exports = global.document ? - factory( global, true ) : - function ( w ) { - if ( !w.document ) { - throw new Error( "jQuery requires a window with a document" ); - } - return factory( w ); - }; - } else { - factory( global ); - } - - // Pass this if window is not defined yet -} )( typeof window !== "undefined" ? window : this, function ( window, noGlobal ) { - - // Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 - // throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode - // arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common - // enough that all such attempts are guarded in a try block. - "use strict"; - - var arr = []; - - var getProto = Object.getPrototypeOf; - - var slice = arr.slice; - - var flat = arr.flat ? function ( array ) { - return arr.flat.call( array ); - } : function ( array ) { - return arr.concat.apply( [], array ); - }; - - - var push = arr.push; - - var indexOf = arr.indexOf; - - var class2type = {}; - - var toString = class2type.toString; - - var hasOwn = class2type.hasOwnProperty; - - var fnToString = hasOwn.toString; - - var ObjectFunctionString = fnToString.call( Object ); - - var support = {}; - - var isFunction = function isFunction( obj ) { - - // Support: Chrome <=57, Firefox <=52 - // In some browsers, typeof returns "function" for HTML elements - // (i.e., `typeof document.createElement( "object" ) === "function"`). - // We don't want to classify *any* DOM node as a function. - return typeof obj === "function" && typeof obj.nodeType !== "number"; - }; - - - var isWindow = function isWindow( obj ) { - return obj != null && obj === obj.window; - }; - - - var document = window.document; - - - - var preservedScriptAttributes = { - type: true, - src: true, - nonce: true, - noModule: true - }; - - function DOMEval( code, node, doc ) { - doc = doc || document; - - var i, val, - script = doc.createElement( "script" ); - - script.text = code; - if ( node ) { - for ( i in preservedScriptAttributes ) { - - // Support: Firefox 64+, Edge 18+ - // Some browsers don't support the "nonce" property on scripts. - // On the other hand, just using `getAttribute` is not enough as - // the `nonce` attribute is reset to an empty string whenever it - // becomes browsing-context connected. - // See https://github.com/whatwg/html/issues/2369 - // See https://html.spec.whatwg.org/#nonce-attributes - // The `node.getAttribute` check was added for the sake of - // `jQuery.globalEval` so that it can fake a nonce-containing node - // via an object. - val = node[ i ] || node.getAttribute && node.getAttribute( i ); - if ( val ) { - script.setAttribute( i, val ); - } - } - } - doc.head.appendChild( script ).parentNode.removeChild( script ); - } - - - function toType( obj ) { - if ( obj == null ) { - return obj + ""; - } - - // Support: Android <=2.3 only (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call( obj ) ] || "object" : - typeof obj; - } - /* global Symbol */ - // Defining this global in .eslintrc.json would create a danger of using the global - // unguarded in another place, it seems safer to define global only for this module - - - - var - version = "3.5.1", - - // Define a local copy of jQuery - jQuery = function ( selector, context ) { - - // The jQuery object is actually just the init constructor 'enhanced' - // Need init if jQuery is called (just allow error to be thrown if not included) - return new jQuery.fn.init( selector, context ); - }; - - jQuery.fn = jQuery.prototype = { - - // The current version of jQuery being used - jquery: version, - - constructor: jQuery, - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function () { - return slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function ( num ) { - - // Return all the elements in a clean array - if ( num == null ) { - return slice.call( this ); - } - - // Return just the one element from the set - return num < 0 ? this[ num + this.length ] : this[ num ]; - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function ( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - each: function ( callback ) { - return jQuery.each( this, callback ); - }, - - map: function ( callback ) { - return this.pushStack( jQuery.map( this, function ( elem, i ) { - return callback.call( elem, i, elem ); - } ) ); - }, - - slice: function () { - return this.pushStack( slice.apply( this, arguments ) ); - }, - - first: function () { - return this.eq( 0 ); - }, - - last: function () { - return this.eq( -1 ); - }, - - even: function () { - return this.pushStack( jQuery.grep( this, function ( _elem, i ) { - return ( i + 1 ) % 2; - } ) ); - }, - - odd: function () { - return this.pushStack( jQuery.grep( this, function ( _elem, i ) { - return i % 2; - } ) ); - }, - - eq: function ( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); - }, - - end: function () { - return this.prevObject || this.constructor(); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: arr.sort, - splice: arr.splice - }; - - jQuery.extend = jQuery.fn.extend = function () { - var options, name, src, copy, copyIsArray, clone, - target = arguments[ 0 ] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - - // Skip the boolean and the target - target = arguments[ i ] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !isFunction( target ) ) { - target = {}; - } - - // Extend jQuery itself if only one argument is passed - if ( i === length ) { - target = this; - i--; - } - - for ( ; i < length; i++ ) { - - // Only deal with non-null/undefined values - if ( ( options = arguments[ i ] ) != null ) { - - // Extend the base object - for ( name in options ) { - copy = options[ name ]; - - // Prevent Object.prototype pollution - // Prevent never-ending loop - if ( name === "__proto__" || target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject( copy ) || - ( copyIsArray = Array.isArray( copy ) ) ) ) { - src = target[ name ]; - - // Ensure proper type for the source value - if ( copyIsArray && !Array.isArray( src ) ) { - clone = []; - } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { - clone = {}; - } else { - clone = src; - } - copyIsArray = false; - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; - }; - - jQuery.extend( { - - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), - - // Assume jQuery is ready without the ready module - isReady: true, - - error: function ( msg ) { - throw new Error( msg ); - }, - - noop: function () {}, - - isPlainObject: function ( obj ) { - var proto, Ctor; - - // Detect obvious negatives - // Use toString instead of jQuery.type to catch host objects - if ( !obj || toString.call( obj ) !== "[object Object]" ) { - return false; - } - - proto = getProto( obj ); - - // Objects with no prototype (e.g., `Object.create( null )`) are plain - if ( !proto ) { - return true; - } - - // Objects with prototype are plain iff they were constructed by a global Object function - Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; - return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; - }, - - isEmptyObject: function ( obj ) { - var name; - - for ( name in obj ) { - return false; - } - return true; - }, - - // Evaluates a script in a provided context; falls back to the global one - // if not specified. - globalEval: function ( code, options, doc ) { - DOMEval( code, { - nonce: options && options.nonce - }, doc ); - }, - - each: function ( obj, callback ) { - var length, i = 0; - - if ( isArrayLike( obj ) ) { - length = obj.length; - for ( ; i < length; i++ ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } else { - for ( i in obj ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } - - return obj; - }, - - // results is for internal usage only - makeArray: function ( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArrayLike( Object( arr ) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? [ arr ] : arr - ); - } else { - push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function ( elem, arr, i ) { - return arr == null ? -1 : indexOf.call( arr, elem, i ); - }, - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - merge: function ( first, second ) { - var len = +second.length, - j = 0, - i = first.length; - - for ( ; j < len; j++ ) { - first[ i++ ] = second[ j ]; - } - - first.length = i; - - return first; - }, - - grep: function ( elems, callback, invert ) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - callbackInverse = !callback( elems[ i ], i ); - if ( callbackInverse !== callbackExpect ) { - matches.push( elems[ i ] ); - } - } - - return matches; - }, - - // arg is for internal usage only - map: function ( elems, callback, arg ) { - var length, value, - i = 0, - ret = []; - - // Go through the array, translating each of the items to their new values - if ( isArrayLike( elems ) ) { - length = elems.length; - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - } - - // Flatten any nested arrays - return flat( ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support - } ); - - if ( typeof Symbol === "function" ) { - jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; - } - - // Populate the class2type map - jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), - function ( _i, name ) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); - } ); - - function isArrayLike( obj ) { - - // Support: real iOS 8.2 only (not reproducible in simulator) - // `in` check used to prevent JIT error (gh-2145) - // hasOwn isn't used here due to false negatives - // regarding Nodelist length in IE - var length = !!obj && "length" in obj && obj.length, - type = toType( obj ); - - if ( isFunction( obj ) || isWindow( obj ) ) { - return false; - } - - return type === "array" || length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj; - } - var Sizzle = - /*! - * Sizzle CSS Selector Engine v2.3.5 - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://js.foundation/ - * - * Date: 2020-03-14 - */ - ( function ( window ) { - var i, - support, - Expr, - getText, - isXML, - tokenize, - compile, - select, - outermostContext, - sortInput, - hasDuplicate, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + 1 * new Date(), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - nonnativeSelectorCache = createCache(), - sortOrder = function ( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - // Instance methods - hasOwn = ( {} ).hasOwnProperty, - arr = [], - pop = arr.pop, - pushNative = arr.push, - push = arr.push, - slice = arr.slice, - - // Use a stripped-down indexOf as it's faster than native - // https://jsperf.com/thor-indexof-vs-for/5 - indexOf = function ( list, elem ) { - var i = 0, - len = list.length; - for ( ; i < len; i++ ) { - if ( list[ i ] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + - "ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - - // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram - identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + - "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", - - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + - - // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + - - // "Attribute values must be CSS identifiers [capture 5] - // or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + - whitespace + "*\\]", - - pseudos = ":(" + identifier + ")(?:\\((" + - - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + - - // 2. simple (capture 6) - "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + - - // 3. anything else (capture 2) - ".*" + - ")\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rwhitespace = new RegExp( whitespace + "+", "g" ), - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + - whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + - "*" ), - rdescend = new RegExp( whitespace + "|>" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + identifier + ")" ), - "CLASS": new RegExp( "^\\.(" + identifier + ")" ), - "TAG": new RegExp( "^(" + identifier + "|[*])" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + - whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + - whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + - "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + - "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rhtml = /HTML$/i, - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - - // CSS escapes - // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), - funescape = function ( escape, nonHex ) { - var high = "0x" + escape.slice( 1 ) - 0x10000; - - return nonHex ? - - // Strip the backslash prefix from a non-hex escape sequence - nonHex : - - // Replace a hexadecimal escape sequence with the encoded Unicode code point - // Support: IE <=11+ - // For values outside the Basic Multilingual Plane (BMP), manually construct a - // surrogate pair - high < 0 ? - String.fromCharCode( high + 0x10000 ) : - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // CSS string/identifier serialization - // https://drafts.csswg.org/cssom/#common-serializing-idioms - rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, - fcssescape = function ( ch, asCodePoint ) { - if ( asCodePoint ) { - - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if ( ch === "\0" ) { - return "\uFFFD"; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice( 0, -1 ) + "\\" + - ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; - } - - // Other potentially-special ASCII characters get backslash-escaped - return "\\" + ch; - }, - - // Used for iframes - // See setDocument() - // Removing the function wrapper causes a "Permission Denied" - // error in IE - unloadHandler = function () { - setDocument(); - }, - - inDisabledFieldset = addCombinator( - function ( elem ) { - return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; - }, { - dir: "parentNode", - next: "legend" - } - ); - - // Optimize for push.apply( _, NodeList ) - try { - push.apply( - ( arr = slice.call( preferredDoc.childNodes ) ), - preferredDoc.childNodes - ); - - // Support: Android<4.0 - // Detect silently failing push.apply - // eslint-disable-next-line no-unused-expressions - arr[ preferredDoc.childNodes.length ].nodeType; - } catch ( e ) { - push = { - apply: arr.length ? - - // Leverage slice if possible - function ( target, els ) { - pushNative.apply( target, slice.call( els ) ); - } : - - // Support: IE<9 - // Otherwise append directly - function ( target, els ) { - var j = target.length, - i = 0; - - // Can't trust NodeList.length - while ( ( target[ j++ ] = els[ i++ ] ) ) {} - target.length = j - 1; - } - }; - } - - function Sizzle( selector, context, results, seed ) { - var m, i, elem, nid, match, groups, newSelector, - newContext = context && context.ownerDocument, - - // nodeType defaults to 9, since context defaults to document - nodeType = context ? context.nodeType : 9; - - results = results || []; - - // Return early from calls with invalid selector or context - if ( typeof selector !== "string" || !selector || - nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { - - return results; - } - - // Try to shortcut find operations (as opposed to filters) in HTML documents - if ( !seed ) { - setDocument( context ); - context = context || document; - - if ( documentIsHTML ) { - - // If the selector is sufficiently simple, try using a "get*By*" DOM method - // (excepting DocumentFragment context, where the methods don't exist) - if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { - - // ID selector - if ( ( m = match[ 1 ] ) ) { - - // Document context - if ( nodeType === 9 ) { - if ( ( elem = context.getElementById( m ) ) ) { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - - // Element context - } else { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( newContext && ( elem = newContext.getElementById( m ) ) && - contains( context, elem ) && - elem.id === m ) { - - results.push( elem ); - return results; - } - } - - // Type selector - } else if ( match[ 2 ] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Class selector - } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && - context.getElementsByClassName ) { - - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // Take advantage of querySelectorAll - if ( support.qsa && - !nonnativeSelectorCache[ selector + " " ] && - ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && - - // Support: IE 8 only - // Exclude object elements - ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { - - newSelector = selector; - newContext = context; - - // qSA considers elements outside a scoping root when evaluating child or - // descendant combinators, which is not what we want. - // In such cases, we work around the behavior by prefixing every selector in the - // list with an ID selector referencing the scope context. - // The technique has to be used as well when a leading combinator is used - // as such selectors are not recognized by querySelectorAll. - // Thanks to Andrew Dupont for this technique. - if ( nodeType === 1 && - ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { - - // Expand context for sibling selectors - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || - context; - - // We can use :scope instead of the ID hack if the browser - // supports it & if we're not changing the context. - if ( newContext !== context || !support.scope ) { - - // Capture the context ID, setting it first if necessary - if ( ( nid = context.getAttribute( "id" ) ) ) { - nid = nid.replace( rcssescape, fcssescape ); - } else { - context.setAttribute( "id", ( nid = expando ) ); - } - } - - // Prefix every selector in the list - groups = tokenize( selector ); - i = groups.length; - while ( i-- ) { - groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + - toSelector( groups[ i ] ); - } - newSelector = groups.join( "," ); - } - - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch ( qsaError ) { - nonnativeSelectorCache( selector, true ); - } finally { - if ( nid === expando ) { - context.removeAttribute( "id" ); - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); - } - - /** - * Create key-value caches of limited size - * @returns {function(string, object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ - function createCache() { - var keys = []; - - function cache( key, value ) { - - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key + " " ) > Expr.cacheLength ) { - - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return ( cache[ key + " " ] = value ); - } - return cache; - } - - /** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ - function markFunction( fn ) { - fn[ expando ] = true; - return fn; - } - - /** - * Support testing using an element - * @param {Function} fn Passed the created element and returns a boolean result - */ - function assert( fn ) { - var el = document.createElement( "fieldset" ); - - try { - return !!fn( el ); - } catch ( e ) { - return false; - } finally { - - // Remove from its parent by default - if ( el.parentNode ) { - el.parentNode.removeChild( el ); - } - - // release memory in IE - el = null; - } - } - - /** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ - function addHandle( attrs, handler ) { - var arr = attrs.split( "|" ), - i = arr.length; - - while ( i-- ) { - Expr.attrHandle[ arr[ i ] ] = handler; - } - } - - /** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ - function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - a.sourceIndex - b.sourceIndex; - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( ( cur = cur.nextSibling ) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; - } - - /** - * Returns a function to use in pseudos for input types - * @param {String} type - */ - function createInputPseudo( type ) { - return function ( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; - } - - /** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ - function createButtonPseudo( type ) { - return function ( elem ) { - var name = elem.nodeName.toLowerCase(); - return ( name === "input" || name === "button" ) && elem.type === type; - }; - } - - /** - * Returns a function to use in pseudos for :enabled/:disabled - * @param {Boolean} disabled true for :disabled; false for :enabled - */ - function createDisabledPseudo( disabled ) { - - // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable - return function ( elem ) { - - // Only certain elements can match :enabled or :disabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled - if ( "form" in elem ) { - - // Check for inherited disabledness on relevant non-disabled elements: - // * listed form-associated elements in a disabled fieldset - // https://html.spec.whatwg.org/multipage/forms.html#category-listed - // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled - // * option elements in a disabled optgroup - // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled - // All such elements have a "form" property. - if ( elem.parentNode && elem.disabled === false ) { - - // Option elements defer to a parent optgroup if present - if ( "label" in elem ) { - if ( "label" in elem.parentNode ) { - return elem.parentNode.disabled === disabled; - } else { - return elem.disabled === disabled; - } - } - - // Support: IE 6 - 11 - // Use the isDisabled shortcut property to check for disabled fieldset ancestors - return elem.isDisabled === disabled || - - // Where there is no isDisabled, check manually - /* jshint -W018 */ - elem.isDisabled !== !disabled && - inDisabledFieldset( elem ) === disabled; - } - - return elem.disabled === disabled; - - // Try to winnow out elements that can't be disabled before trusting the disabled property. - // Some victims get caught in our net (label, legend, menu, track), but it shouldn't - // even exist on them, let alone have a boolean value. - } else if ( "label" in elem ) { - return elem.disabled === disabled; - } - - // Remaining elements are neither :enabled nor :disabled - return false; - }; - } - - /** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ - function createPositionalPseudo( fn ) { - return markFunction( function ( argument ) { - argument = +argument; - return markFunction( function ( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ ( j = matchIndexes[ i ] ) ] ) { - seed[ j ] = !( matches[ j ] = seed[ j ] ); - } - } - } ); - } ); - } - - /** - * Checks a node for validity as a Sizzle context - * @param {Element|Object=} context - * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value - */ - function testContext( context ) { - return context && typeof context.getElementsByTagName !== "undefined" && context; - } - - // Expose support vars for convenience - support = Sizzle.support = {}; - - /** - * Detects XML nodes - * @param {Element|Object} elem An element or a document - * @returns {Boolean} True iff elem is a non-HTML XML node - */ - isXML = Sizzle.isXML = function ( elem ) { - var namespace = elem.namespaceURI, - docElem = ( elem.ownerDocument || elem ).documentElement; - - // Support: IE <=8 - // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes - // https://bugs.jquery.com/ticket/4833 - return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); - }; - - /** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ - setDocument = Sizzle.setDocument = function ( node ) { - var hasCompare, subWindow, - doc = node ? node.ownerDocument || node : preferredDoc; - - // Return early if doc is invalid or already selected - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Update global variables - document = doc; - docElem = document.documentElement; - documentIsHTML = !isXML( document ); - - // Support: IE 9 - 11+, Edge 12 - 18+ - // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( preferredDoc != document && - ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { - - // Support: IE 11, Edge - if ( subWindow.addEventListener ) { - subWindow.addEventListener( "unload", unloadHandler, false ); - - // Support: IE 9 - 10 only - } else if ( subWindow.attachEvent ) { - subWindow.attachEvent( "onunload", unloadHandler ); - } - } - - // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, - // Safari 4 - 5 only, Opera <=11.6 - 12.x only - // IE/Edge & older browsers don't support the :scope pseudo-class. - // Support: Safari 6.0 only - // Safari 6.0 supports :scope but it's an alias of :root there. - support.scope = assert( function ( el ) { - docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); - return typeof el.querySelectorAll !== "undefined" && - !el.querySelectorAll( ":scope fieldset div" ).length; - } ); - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties - // (excepting IE8 booleans) - support.attributes = assert( function ( el ) { - el.className = "i"; - return !el.getAttribute( "className" ); - } ); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert( function ( el ) { - el.appendChild( document.createComment( "" ) ); - return !el.getElementsByTagName( "*" ).length; - } ); - - // Support: IE<9 - support.getElementsByClassName = rnative.test( document.getElementsByClassName ); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programmatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert( function ( el ) { - docElem.appendChild( el ).id = expando; - return !document.getElementsByName || !document.getElementsByName( expando ).length; - } ); - - // ID filter and find - if ( support.getById ) { - Expr.filter[ "ID" ] = function ( id ) { - var attrId = id.replace( runescape, funescape ); - return function ( elem ) { - return elem.getAttribute( "id" ) === attrId; - }; - }; - Expr.find[ "ID" ] = function ( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var elem = context.getElementById( id ); - return elem ? [ elem ] : []; - } - }; - } else { - Expr.filter[ "ID" ] = function ( id ) { - var attrId = id.replace( runescape, funescape ); - return function ( elem ) { - var node = typeof elem.getAttributeNode !== "undefined" && - elem.getAttributeNode( "id" ); - return node && node.value === attrId; - }; - }; - - // Support: IE 6 - 7 only - // getElementById is not reliable as a find shortcut - Expr.find[ "ID" ] = function ( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var node, i, elems, - elem = context.getElementById( id ); - - if ( elem ) { - - // Verify the id attribute - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - - // Fall back on getElementsByName - elems = context.getElementsByName( id ); - i = 0; - while ( ( elem = elems[ i++ ] ) ) { - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - } - } - - return []; - } - }; - } - - // Tag - Expr.find[ "TAG" ] = support.getElementsByTagName ? - function ( tag, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( tag ); - - // DocumentFragment nodes don't have gEBTN - } else if ( support.qsa ) { - return context.querySelectorAll( tag ); - } - } : - - function ( tag, context ) { - var elem, - tmp = [], - i = 0, - - // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find[ "CLASS" ] = support.getElementsByClassName && function ( className, context ) { - if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See https://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { - - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert( function ( el ) { - - var input; - - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // https://bugs.jquery.com/ticket/12359 - docElem.appendChild( el ).innerHTML = "" + - ""; - - // Support: IE8, Opera 11-12.16 - // Nothing should be selected when empty strings follow ^= or $= or *= - // The test attribute must be unknown in Opera but "safe" for WinRT - // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !el.querySelectorAll( "[selected]" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ - if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { - rbuggyQSA.push( "~=" ); - } - - // Support: IE 11+, Edge 15 - 18+ - // IE 11/Edge don't find elements on a `[name='']` query in some cases. - // Adding a temporary attribute to the document before the selection works - // around the issue. - // Interestingly, IE 10 & older don't seem to have the issue. - input = document.createElement( "input" ); - input.setAttribute( "name", "" ); - el.appendChild( input ); - if ( !el.querySelectorAll( "[name='']" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + - whitespace + "*(?:''|\"\")" ); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !el.querySelectorAll( ":checked" ).length ) { - rbuggyQSA.push( ":checked" ); - } - - // Support: Safari 8+, iOS 8+ - // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibling-combinator selector` fails - if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { - rbuggyQSA.push( ".#.+[+~]" ); - } - - // Support: Firefox <=3.6 - 5 only - // Old Firefox doesn't throw on a badly-escaped identifier. - el.querySelectorAll( "\\\f" ); - rbuggyQSA.push( "[\\r\\n\\f]" ); - } ); - - assert( function ( el ) { - el.innerHTML = "" + - ""; - - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - var input = document.createElement( "input" ); - input.setAttribute( "type", "hidden" ); - el.appendChild( input ).setAttribute( "name", "D" ); - - // Support: IE8 - // Enforce case-sensitivity of name attribute - if ( el.querySelectorAll( "[name=d]" ).length ) { - rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: IE9-11+ - // IE's :disabled selector does not pick up the children of disabled fieldsets - docElem.appendChild( el ).disabled = true; - if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: Opera 10 - 11 only - // Opera 10-11 does not throw on post-comma invalid pseudos - el.querySelectorAll( "*,:x" ); - rbuggyQSA.push( ",.*:" ); - } ); - } - - if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || - docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector ) ) ) ) { - - assert( function ( el ) { - - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( el, "*" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( el, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - } ); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); - - /* Contains - ---------------------------------------------------------------------- */ - hasCompare = rnative.test( docElem.compareDocumentPosition ); - - // Element contains another - // Purposefully self-exclusive - // As in, an element does not contain itself - contains = hasCompare || rnative.test( docElem.contains ) ? - function ( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - ) ); - } : - function ( a, b ) { - if ( b ) { - while ( ( b = b.parentNode ) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = hasCompare ? - function ( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - // Sort on method existence if only one input has compareDocumentPosition - var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if ( compare ) { - return compare; - } - - // Calculate position if both inputs belong to the same document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? - a.compareDocumentPosition( b ) : - - // Otherwise we know they are disconnected - 1; - - // Disconnected nodes - if ( compare & 1 || - ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { - - // Choose the first element that is related to our preferred document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( a == document || a.ownerDocument == preferredDoc && - contains( preferredDoc, a ) ) { - return -1; - } - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( b == document || b.ownerDocument == preferredDoc && - contains( preferredDoc, b ) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } : - function ( a, b ) { - - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Parentless nodes are either documents or disconnected - if ( !aup || !bup ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - return a == document ? -1 : - b == document ? 1 : - /* eslint-enable eqeqeq */ - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( ( cur = cur.parentNode ) ) { - ap.unshift( cur ); - } - cur = b; - while ( ( cur = cur.parentNode ) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[ i ] === bp[ i ] ) { - i++; - } - - return i ? - - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[ i ], bp[ i ] ) : - - // Otherwise nodes in our document sort first - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - ap[ i ] == preferredDoc ? -1 : - bp[ i ] == preferredDoc ? 1 : - /* eslint-enable eqeqeq */ - 0; - }; - - return document; - }; - - Sizzle.matches = function ( expr, elements ) { - return Sizzle( expr, null, null, elements ); - }; - - Sizzle.matchesSelector = function ( elem, expr ) { - setDocument( elem ); - - if ( support.matchesSelector && documentIsHTML && - !nonnativeSelectorCache[ expr + " " ] && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch ( e ) { - nonnativeSelectorCache( expr, true ); - } - } - - return Sizzle( expr, document, null, [ elem ] ).length > 0; - }; - - Sizzle.contains = function ( context, elem ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( context.ownerDocument || context ) != document ) { - setDocument( context ); - } - return contains( context, elem ); - }; - - Sizzle.attr = function ( elem, name ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( elem.ownerDocument || elem ) != document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val !== undefined ? - val : - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; - }; - - Sizzle.escape = function ( sel ) { - return ( sel + "" ).replace( rcssescape, fcssescape ); - }; - - Sizzle.error = function ( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); - }; - - /** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ - Sizzle.uniqueSort = function ( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; - }; - - /** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ - getText = Sizzle.getText = function ( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - - // If no nodeType, this is expected to be an array - while ( ( node = elem[ i++ ] ) ) { - - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - - // Use textContent for elements - // innerText usage removed for consistency of new lines (jQuery #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - - // Do not include comment or processing instruction nodes - - return ret; - }; - - Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { - dir: "parentNode", - first: true - }, - " ": { - dir: "parentNode" - }, - "+": { - dir: "previousSibling", - first: true - }, - "~": { - dir: "previousSibling" - } - }, - - preFilter: { - "ATTR": function ( match ) { - match[ 1 ] = match[ 1 ].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[ 3 ] = ( match[ 3 ] || match[ 4 ] || - match[ 5 ] || "" ).replace( runescape, funescape ); - - if ( match[ 2 ] === "~=" ) { - match[ 3 ] = " " + match[ 3 ] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function ( match ) { - - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[ 1 ] = match[ 1 ].toLowerCase(); - - if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { - - // nth-* requires argument - if ( !match[ 3 ] ) { - Sizzle.error( match[ 0 ] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[ 4 ] = +( match[ 4 ] ? - match[ 5 ] + ( match[ 6 ] || 1 ) : - 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); - match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); - - // other types prohibit arguments - } else if ( match[ 3 ] ) { - Sizzle.error( match[ 0 ] ); - } - - return match; - }, - - "PSEUDO": function ( match ) { - var excess, - unquoted = !match[ 6 ] && match[ 2 ]; - - if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[ 3 ] ) { - match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - - // Get excess from tokenize (recursively) - ( excess = tokenize( unquoted, true ) ) && - - // advance to the next closing parenthesis - ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { - - // excess is a negative index - match[ 0 ] = match[ 0 ].slice( 0, excess ); - match[ 2 ] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - "TAG": function ( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function () { - return true; - } : - function ( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function ( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - ( pattern = new RegExp( "(^|" + whitespace + - ")" + className + "(" + whitespace + "|$)" ) ) && classCache( - className, - function ( elem ) { - return pattern.test( - typeof elem.className === "string" && elem.className || - typeof elem.getAttribute !== "undefined" && - elem.getAttribute( "class" ) || - "" - ); - } ); - }, - - "ATTR": function ( name, operator, check ) { - return function ( elem ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - /* eslint-disable max-len */ - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - /* eslint-enable max-len */ - - }; - }, - - "CHILD": function ( type, what, _argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function ( elem ) { - return !!elem.parentNode; - } : - - function ( elem, _context, xml ) { - var cache, uniqueCache, outerCache, node, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType, - diff = false; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( ( node = node[ dir ] ) ) { - if ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) { - - return false; - } - } - - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - - // Seek `elem` from a previously-cached index - - // ...in a gzip-friendly way - node = parent; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex && cache[ 2 ]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( ( node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - } else { - - // Use previously-cached element index if available - if ( useCache ) { - - // ...in a gzip-friendly way - node = elem; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex; - } - - // xml :nth-child(...) - // or :nth-last-child(...) or :nth(-last)?-of-type(...) - if ( diff === false ) { - - // Use the same loop as above to seek `elem` from the start - while ( ( node = ++nodeIndex && node && node[ dir ] || - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - if ( ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) && - ++diff ) { - - // Cache the index of each encountered element - if ( useCache ) { - outerCache = node[ expando ] || - ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - uniqueCache[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - "PSEUDO": function ( pseudo, argument ) { - - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction( function ( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf( seed, matched[ i ] ); - seed[ idx ] = !( matches[ idx ] = matched[ i ] ); - } - } ) : - function ( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - - // Potentially complex pseudos - "not": markFunction( function ( selector ) { - - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); - - return matcher[ expando ] ? - markFunction( function ( seed, matches, _context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( ( elem = unmatched[ i ] ) ) { - seed[ i ] = !( matches[ i ] = elem ); - } - } - } ) : - function ( elem, _context, xml ) { - input[ 0 ] = elem; - matcher( input, null, xml, results ); - - // Don't keep the element (issue #299) - input[ 0 ] = null; - return !results.pop(); - }; - } ), - - "has": markFunction( function ( selector ) { - return function ( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - } ), - - "contains": markFunction( function ( text ) { - text = text.replace( runescape, funescape ); - return function ( elem ) { - return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; - }; - } ), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function ( lang ) { - - // lang value must be a valid identifier - if ( !ridentifier.test( lang || "" ) ) { - Sizzle.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function ( elem ) { - var elemLang; - do { - if ( ( elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); - return false; - }; - } ), - - // Miscellaneous - "target": function ( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - "root": function ( elem ) { - return elem === docElem; - }, - - "focus": function ( elem ) { - return elem === document.activeElement && - ( !document.hasFocus || document.hasFocus() ) && - !!( elem.type || elem.href || ~elem.tabIndex ); - }, - - // Boolean properties - "enabled": createDisabledPseudo( false ), - "disabled": createDisabledPseudo( true ), - - "checked": function ( elem ) { - - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return ( nodeName === "input" && !!elem.checked ) || - ( nodeName === "option" && !!elem.selected ); - }, - - "selected": function ( elem ) { - - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - // eslint-disable-next-line no-unused-expressions - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function ( elem ) { - - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), - // but not by others (comment: 8; processing instruction: 7; etc.) - // nodeType < 6 works because attributes (2) do not appear as children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeType < 6 ) { - return false; - } - } - return true; - }, - - "parent": function ( elem ) { - return !Expr.pseudos[ "empty" ]( elem ); - }, - - // Element/input types - "header": function ( elem ) { - return rheader.test( elem.nodeName ); - }, - - "input": function ( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "button": function ( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function ( elem ) { - var attr; - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - - // Support: IE<8 - // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" - ( ( attr = elem.getAttribute( "type" ) ) == null || - attr.toLowerCase() === "text" ); - }, - - // Position-in-collection - "first": createPositionalPseudo( function () { - return [ 0 ]; - } ), - - "last": createPositionalPseudo( function ( _matchIndexes, length ) { - return [ length - 1 ]; - } ), - - "eq": createPositionalPseudo( function ( _matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - } ), - - "even": createPositionalPseudo( function ( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "odd": createPositionalPseudo( function ( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "lt": createPositionalPseudo( function ( matchIndexes, length, argument ) { - var i = argument < 0 ? - argument + length : - argument > length ? - length : - argument; - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "gt": createPositionalPseudo( function ( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ) - } - }; - - Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; - - // Add button/input type pseudos - for ( i in { - radio: true, - checkbox: true, - file: true, - password: true, - image: true - } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); - } - for ( i in { - submit: true, - reset: true - } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); - } - - // Easy API for creating new setFilters - function setFilters() {} - setFilters.prototype = Expr.filters = Expr.pseudos; - Expr.setFilters = new setFilters(); - - tokenize = Sizzle.tokenize = function ( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || ( match = rcomma.exec( soFar ) ) ) { - if ( match ) { - - // Don't consume trailing commas as valid - soFar = soFar.slice( match[ 0 ].length ) || soFar; - } - groups.push( ( tokens = [] ) ); - } - - matched = false; - - // Combinators - if ( ( match = rcombinators.exec( soFar ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - - // Cast descendant combinators to space - type: match[ 0 ].replace( rtrim, " " ) - } ); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || - ( match = preFilters[ type ]( match ) ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - type: type, - matches: match - } ); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); - }; - - function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[ i ].value; - } - return selector; - } - - function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - skip = combinator.next, - key = skip || dir, - checkNonElements = base && key === "parentNode", - doneName = done++; - - return combinator.first ? - - // Check against closest ancestor/preceding element - function ( elem, context, xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - return false; - } : - - // Check against all ancestor/preceding elements - function ( elem, context, xml ) { - var oldCache, uniqueCache, outerCache, - newCache = [ dirruns, doneName ]; - - // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching - if ( xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || ( elem[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ elem.uniqueID ] || - ( outerCache[ elem.uniqueID ] = {} ); - - if ( skip && skip === elem.nodeName.toLowerCase() ) { - elem = elem[ dir ] || elem; - } else if ( ( oldCache = uniqueCache[ key ] ) && - oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { - - // Assign to newCache so results back-propagate to previous elements - return ( newCache[ 2 ] = oldCache[ 2 ] ); - } else { - - // Reuse newcache so results back-propagate to previous elements - uniqueCache[ key ] = newCache; - - // A match means we're done; a fail means we have to keep checking - if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { - return true; - } - } - } - } - } - return false; - }; - } - - function elementMatcher( matchers ) { - return matchers.length > 1 ? - function ( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[ i ]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[ 0 ]; - } - - function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[ i ], results ); - } - return results; - } - - function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( ( elem = unmatched[ i ] ) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; - } - - function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction( function ( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( - selector || "*", - context.nodeType ? [ context ] : context, - [] - ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( ( elem = temp[ i ] ) ) { - matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) ) { - - // Restore matcherIn since elem is not yet a final match - temp.push( ( matcherIn[ i ] = elem ) ); - } - } - postFinder( null, ( matcherOut = [] ), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) && - ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { - - seed[ temp ] = !( results[ temp ] = elem ); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - } ); - } - - function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[ 0 ].type ], - implicitRelative = leadingRelative || Expr.relative[ " " ], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function ( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function ( elem ) { - return indexOf( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function ( elem, context, xml ) { - var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - ( checkContext = context ).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - - // Avoid hanging onto element (issue #299) - checkContext = null; - return ret; - } ]; - - for ( ; i < len; i++ ) { - if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { - matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; - } else { - matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[ j ].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens - .slice( 0, i - 1 ) - .concat( { - value: tokens[ i - 2 ].type === " " ? "*" : "" - } ) - ).replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); - } - - function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - var bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function ( seed, context, xml, results, outermost ) { - var elem, j, matcher, - matchedCount = 0, - i = "0", - unmatched = seed && [], - setMatched = [], - contextBackup = outermostContext, - - // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), - - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), - len = elems.length; - - if ( outermost ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - outermostContext = context == document || context || outermost; - } - - // Add elements passing elementMatchers directly to results - // Support: IE<9, Safari - // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id - for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( !context && elem.ownerDocument != document ) { - setDocument( elem ); - xml = !documentIsHTML; - } - while ( ( matcher = elementMatchers[ j++ ] ) ) { - if ( matcher( elem, context || document, xml ) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - - // They will have gone through all possible matchers - if ( ( elem = !matcher && elem ) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // `i` is now the count of elements visited above, and adding it to `matchedCount` - // makes the latter nonnegative. - matchedCount += i; - - // Apply set filters to unmatched elements - // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` - // equals `i`), unless we didn't visit _any_ elements in the above loop because we have - // no element matchers and no seed. - // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that - // case, which will result in a "00" `matchedCount` that differs from `i` but is also - // numerically zero. - if ( bySet && i !== matchedCount ) { - j = 0; - while ( ( matcher = setMatchers[ j++ ] ) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !( unmatched[ i ] || setMatched[ i ] ) ) { - setMatched[ i ] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; - } - - compile = Sizzle.compile = function ( selector, match /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - - // Generate a function of recursive functions that can be used to check each element - if ( !match ) { - match = tokenize( selector ); - } - i = match.length; - while ( i-- ) { - cached = matcherFromTokens( match[ i ] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( - selector, - matcherFromGroupMatchers( elementMatchers, setMatchers ) - ); - - // Save selector and tokenization - cached.selector = selector; - } - return cached; - }; - - /** - * A low-level selection function that works with Sizzle's compiled - * selector functions - * @param {String|Function} selector A selector or a pre-compiled - * selector function built with Sizzle.compile - * @param {Element} context - * @param {Array} [results] - * @param {Array} [seed] A set of elements to match against - */ - select = Sizzle.select = function ( selector, context, results, seed ) { - var i, tokens, token, type, find, - compiled = typeof selector === "function" && selector, - match = !seed && tokenize( ( selector = compiled.selector || selector ) ); - - results = results || []; - - // Try to minimize operations if there is only one selector in the list and no seed - // (the latter of which guarantees us context) - if ( match.length === 1 ) { - - // Reduce context if the leading compound selector is an ID - tokens = match[ 0 ] = match[ 0 ].slice( 0 ); - if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && - context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { - - context = ( Expr.find[ "ID" ]( token.matches[ 0 ] - .replace( runescape, funescape ), context ) || [] )[ 0 ]; - if ( !context ) { - return results; - - // Precompiled matchers will still verify ancestry, so step up a level - } else if ( compiled ) { - context = context.parentNode; - } - - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[ i ]; - - // Abort if we hit a combinator - if ( Expr.relative[ ( type = token.type ) ] ) { - break; - } - if ( ( find = Expr.find[ type ] ) ) { - - // Search, expanding context for leading sibling combinators - if ( ( seed = find( - token.matches[ 0 ].replace( runescape, funescape ), - rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || - context - ) ) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - - // Compile and execute a filtering function if one is not provided - // Provide `match` to avoid retokenization if we modified the selector above - ( compiled || compile( selector, match ) )( - seed, - context, - !documentIsHTML, - results, - !context || rsibling.test( selector ) && testContext( context.parentNode ) || context - ); - return results; - }; - - // One-time assignments - - // Sort stability - support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; - - // Support: Chrome 14-35+ - // Always assume duplicates if they aren't passed to the comparison function - support.detectDuplicates = !!hasDuplicate; - - // Initialize against the default document - setDocument(); - - // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) - // Detached nodes confoundingly follow *each other* - support.sortDetached = assert( function ( el ) { - - // Should return 1, but returns 4 (following) - return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; - } ); - - // Support: IE<8 - // Prevent attribute/property "interpolation" - // https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx - if ( !assert( function ( el ) { - el.innerHTML = ""; - return el.firstChild.getAttribute( "href" ) === "#"; - } ) ) { - addHandle( "type|href|height|width", function ( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - } ); - } - - // Support: IE<9 - // Use defaultValue in place of getAttribute("value") - if ( !support.attributes || !assert( function ( el ) { - el.innerHTML = ""; - el.firstChild.setAttribute( "value", "" ); - return el.firstChild.getAttribute( "value" ) === ""; - } ) ) { - addHandle( "value", function ( elem, _name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - } ); - } - - // Support: IE<9 - // Use getAttributeNode to fetch booleans when getAttribute lies - if ( !assert( function ( el ) { - return el.getAttribute( "disabled" ) == null; - } ) ) { - addHandle( booleans, function ( elem, name, isXML ) { - var val; - if ( !isXML ) { - return elem[ name ] === true ? name.toLowerCase() : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; - } - } ); - } - - return Sizzle; - - } )( window ); - - - - jQuery.find = Sizzle; - jQuery.expr = Sizzle.selectors; - - // Deprecated - jQuery.expr[ ":" ] = jQuery.expr.pseudos; - jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; - jQuery.text = Sizzle.getText; - jQuery.isXMLDoc = Sizzle.isXML; - jQuery.contains = Sizzle.contains; - jQuery.escapeSelector = Sizzle.escape; - - - - - var dir = function ( elem, dir, until ) { - var matched = [], - truncate = until !== undefined; - - while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { - if ( elem.nodeType === 1 ) { - if ( truncate && jQuery( elem ).is( until ) ) { - break; - } - matched.push( elem ); - } - } - return matched; - }; - - - var siblings = function ( n, elem ) { - var matched = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - matched.push( n ); - } - } - - return matched; - }; - - - var rneedsContext = jQuery.expr.match.needsContext; - - - - function nodeName( elem, name ) { - - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - - }; - var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); - - - - // Implement the identical functionality for filter and not - function winnow( elements, qualifier, not ) { - if ( isFunction( qualifier ) ) { - return jQuery.grep( elements, function ( elem, i ) { - return !!qualifier.call( elem, i, elem ) !== not; - } ); - } - - // Single element - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function ( elem ) { - return ( elem === qualifier ) !== not; - } ); - } - - // Arraylike of elements (jQuery, arguments, Array) - if ( typeof qualifier !== "string" ) { - return jQuery.grep( elements, function ( elem ) { - return ( indexOf.call( qualifier, elem ) > -1 ) !== not; - } ); - } - - // Filtered directly for both simple and complex selectors - return jQuery.filter( qualifier, elements, not ); - } - - jQuery.filter = function ( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - if ( elems.length === 1 && elem.nodeType === 1 ) { - return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; - } - - return jQuery.find.matches( expr, jQuery.grep( elems, function ( elem ) { - return elem.nodeType === 1; - } ) ); - }; - - jQuery.fn.extend( { - find: function ( selector ) { - var i, ret, - len = this.length, - self = this; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter( function () { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - } ) ); - } - - ret = this.pushStack( [] ); - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - return len > 1 ? jQuery.uniqueSort( ret ) : ret; - }, - filter: function ( selector ) { - return this.pushStack( winnow( this, selector || [], false ) ); - }, - not: function ( selector ) { - return this.pushStack( winnow( this, selector || [], true ) ); - }, - is: function ( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - } - } ); - - - // Initialize a jQuery object - - - // A central reference to the root jQuery(document) - var rootjQuery, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - // Shortcut simple #id case for speed - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, - - init = jQuery.fn.init = function ( selector, context, root ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Method init() accepts an alternate rootjQuery - // so migrate can support jQuery.sub (gh-2101) - root = root || rootjQuery; - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector[ 0 ] === "<" && - selector[ selector.length - 1 ] === ">" && - selector.length >= 3 ) { - - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && ( match[ 1 ] || !context ) ) { - - // HANDLE: $(html) -> $(array) - if ( match[ 1 ] ) { - context = context instanceof jQuery ? context[ 0 ] : context; - - // Option to run scripts is true for back-compat - // Intentionally let the error be thrown if parseHTML is not present - jQuery.merge( this, jQuery.parseHTML( - match[ 1 ], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - - // Properties of context are called as methods if possible - if ( isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[ 2 ] ); - - if ( elem ) { - - // Inject the element directly into the jQuery object - this[ 0 ] = elem; - this.length = 1; - } - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || root ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this[ 0 ] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( isFunction( selector ) ) { - return root.ready !== undefined ? - root.ready( selector ) : - - // Execute immediately if ready is not present - selector( jQuery ); - } - - return jQuery.makeArray( selector, this ); - }; - - // Give the init function the jQuery prototype for later instantiation - init.prototype = jQuery.fn; - - // Initialize central reference - rootjQuery = jQuery( document ); - - - var rparentsprev = /^(?:parents|prev(?:Until|All))/, - - // Methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - - jQuery.fn.extend( { - has: function ( target ) { - var targets = jQuery( target, this ), - l = targets.length; - - return this.filter( function () { - var i = 0; - for ( ; i < l; i++ ) { - if ( jQuery.contains( this, targets[ i ] ) ) { - return true; - } - } - } ); - }, - - closest: function ( selectors, context ) { - var cur, - i = 0, - l = this.length, - matched = [], - targets = typeof selectors !== "string" && jQuery( selectors ); - - // Positional selectors never match, since there's no _selection_ context - if ( !rneedsContext.test( selectors ) ) { - for ( ; i < l; i++ ) { - for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { - - // Always skip document fragments - if ( cur.nodeType < 11 && ( targets ? - targets.index( cur ) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector( cur, selectors ) ) ) { - - matched.push( cur ); - break; - } - } - } - } - - return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); - }, - - // Determine the position of an element within the set - index: function ( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; - } - - // Index in selector - if ( typeof elem === "string" ) { - return indexOf.call( jQuery( elem ), this[ 0 ] ); - } - - // Locate the position of the desired element - return indexOf.call( this, - - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[ 0 ] : elem - ); - }, - - add: function ( selector, context ) { - return this.pushStack( - jQuery.uniqueSort( - jQuery.merge( this.get(), jQuery( selector, context ) ) - ) - ); - }, - - addBack: function ( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter( selector ) - ); - } - } ); - - function sibling( cur, dir ) { - while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} - return cur; - } - - jQuery.each( { - parent: function ( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function ( elem ) { - return dir( elem, "parentNode" ); - }, - parentsUntil: function ( elem, _i, until ) { - return dir( elem, "parentNode", until ); - }, - next: function ( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function ( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function ( elem ) { - return dir( elem, "nextSibling" ); - }, - prevAll: function ( elem ) { - return dir( elem, "previousSibling" ); - }, - nextUntil: function ( elem, _i, until ) { - return dir( elem, "nextSibling", until ); - }, - prevUntil: function ( elem, _i, until ) { - return dir( elem, "previousSibling", until ); - }, - siblings: function ( elem ) { - return siblings( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function ( elem ) { - return siblings( elem.firstChild ); - }, - contents: function ( elem ) { - if ( elem.contentDocument != null && - - // Support: IE 11+ - // elements with no `data` attribute has an object - // `contentDocument` with a `null` prototype. - getProto( elem.contentDocument ) ) { - - return elem.contentDocument; - } - - // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only - // Treat the template element as a regular one in browsers that - // don't support it. - if ( nodeName( elem, "template" ) ) { - elem = elem.content || elem; - } - - return jQuery.merge( [], elem.childNodes ); - } - }, function ( name, fn ) { - jQuery.fn[ name ] = function ( until, selector ) { - var matched = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - matched = jQuery.filter( selector, matched ); - } - - if ( this.length > 1 ) { - - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - jQuery.uniqueSort( matched ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - matched.reverse(); - } - } - - return this.pushStack( matched ); - }; - } ); - var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); - - - - // Convert String-formatted options into Object-formatted ones - function createOptions( options ) { - var object = {}; - jQuery.each( options.match( rnothtmlwhite ) || [], function ( _, flag ) { - object[ flag ] = true; - } ); - return object; - } - - /* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ - jQuery.Callbacks = function ( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - createOptions( options ) : - jQuery.extend( {}, options ); - - var // Flag to know if list is currently firing - firing, - - // Last fire value for non-forgettable lists - memory, - - // Flag to know if list was already fired - fired, - - // Flag to prevent firing - locked, - - // Actual callback list - list = [], - - // Queue of execution data for repeatable lists - queue = [], - - // Index of currently firing callback (modified by add/remove as needed) - firingIndex = -1, - - // Fire callbacks - fire = function () { - - // Enforce single-firing - locked = locked || options.once; - - // Execute callbacks for all pending executions, - // respecting firingIndex overrides and runtime changes - fired = firing = true; - for ( ; queue.length; firingIndex = -1 ) { - memory = queue.shift(); - while ( ++firingIndex < list.length ) { - - // Run callback and check for early termination - if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && - options.stopOnFalse ) { - - // Jump to end and forget the data so .add doesn't re-fire - firingIndex = list.length; - memory = false; - } - } - } - - // Forget the data if we're done with it - if ( !options.memory ) { - memory = false; - } - - firing = false; - - // Clean up if we're done firing for good - if ( locked ) { - - // Keep an empty list if we have data for future add calls - if ( memory ) { - list = []; - - // Otherwise, this object is spent - } else { - list = ""; - } - } - }, - - // Actual Callbacks object - self = { - - // Add a callback or a collection of callbacks to the list - add: function () { - if ( list ) { - - // If we have memory from a past run, we should fire after adding - if ( memory && !firing ) { - firingIndex = list.length - 1; - queue.push( memory ); - } - - ( function add( args ) { - jQuery.each( args, function ( _, arg ) { - if ( isFunction( arg ) ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && toType( arg ) !== "string" ) { - - // Inspect recursively - add( arg ); - } - } ); - } )( arguments ); - - if ( memory && !firing ) { - fire(); - } - } - return this; - }, - - // Remove a callback from the list - remove: function () { - jQuery.each( arguments, function ( _, arg ) { - var index; - while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - - // Handle firing indexes - if ( index <= firingIndex ) { - firingIndex--; - } - } - } ); - return this; - }, - - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function ( fn ) { - return fn ? - jQuery.inArray( fn, list ) > -1 : - list.length > 0; - }, - - // Remove all callbacks from the list - empty: function () { - if ( list ) { - list = []; - } - return this; - }, - - // Disable .fire and .add - // Abort any current/pending executions - // Clear all callbacks and values - disable: function () { - locked = queue = []; - list = memory = ""; - return this; - }, - disabled: function () { - return !list; - }, - - // Disable .fire - // Also disable .add unless we have memory (since it would have no effect) - // Abort any pending executions - lock: function () { - locked = queue = []; - if ( !memory && !firing ) { - list = memory = ""; - } - return this; - }, - locked: function () { - return !!locked; - }, - - // Call all callbacks with the given context and arguments - fireWith: function ( context, args ) { - if ( !locked ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - queue.push( args ); - if ( !firing ) { - fire(); - } - } - return this; - }, - - // Call all the callbacks with the given arguments - fire: function () { - self.fireWith( this, arguments ); - return this; - }, - - // To know if the callbacks have already been called at least once - fired: function () { - return !!fired; - } - }; - - return self; - }; - - - function Identity( v ) { - return v; - } - - function Thrower( ex ) { - throw ex; - } - - function adoptValue( value, resolve, reject, noValue ) { - var method; - - try { - - // Check for promise aspect first to privilege synchronous behavior - if ( value && isFunction( ( method = value.promise ) ) ) { - method.call( value ).done( resolve ).fail( reject ); - - // Other thenables - } else if ( value && isFunction( ( method = value.then ) ) ) { - method.call( value, resolve, reject ); - - // Other non-thenables - } else { - - // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: - // * false: [ value ].slice( 0 ) => resolve( value ) - // * true: [ value ].slice( 1 ) => resolve() - resolve.apply( undefined, [ value ].slice( noValue ) ); - } - - // For Promises/A+, convert exceptions into rejections - // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in - // Deferred#then to conditionally suppress rejection. - } catch ( value ) { - - // Support: Android 4.0 only - // Strict mode functions invoked without .call/.apply get global-object context - reject.apply( undefined, [ value ] ); - } - } - - jQuery.extend( { - - Deferred: function ( func ) { - var tuples = [ - - // action, add listener, callbacks, - // ... .then handlers, argument index, [final state] - [ "notify", "progress", jQuery.Callbacks( "memory" ), - jQuery.Callbacks( "memory" ), 2 - ], - [ "resolve", "done", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 0, "resolved" - ], - [ "reject", "fail", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 1, "rejected" - ] - ], - state = "pending", - promise = { - state: function () { - return state; - }, - always: function () { - deferred.done( arguments ).fail( arguments ); - return this; - }, - "catch": function ( fn ) { - return promise.then( null, fn ); - }, - - // Keep pipe for back-compat - pipe: function ( /* fnDone, fnFail, fnProgress */) { - var fns = arguments; - - return jQuery.Deferred( function ( newDefer ) { - jQuery.each( tuples, function ( _i, tuple ) { - - // Map tuples (progress, done, fail) to arguments (done, fail, progress) - var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; - - // deferred.progress(function() { bind to newDefer or newDefer.notify }) - // deferred.done(function() { bind to newDefer or newDefer.resolve }) - // deferred.fail(function() { bind to newDefer or newDefer.reject }) - deferred[ tuple[ 1 ] ]( function () { - var returned = fn && fn.apply( this, arguments ); - if ( returned && isFunction( returned.promise ) ) { - returned.promise() - .progress( newDefer.notify ) - .done( newDefer.resolve ) - .fail( newDefer.reject ); - } else { - newDefer[ tuple[ 0 ] + "With" ]( - this, - fn ? [ returned ] : arguments - ); - } - } ); - } ); - fns = null; - } ).promise(); - }, - then: function ( onFulfilled, onRejected, onProgress ) { - var maxDepth = 0; - - function resolve( depth, deferred, handler, special ) { - return function () { - var that = this, - args = arguments, - mightThrow = function () { - var returned, then; - - // Support: Promises/A+ section 2.3.3.3.3 - // https://promisesaplus.com/#point-59 - // Ignore double-resolution attempts - if ( depth < maxDepth ) { - return; - } - - returned = handler.apply( that, args ); - - // Support: Promises/A+ section 2.3.1 - // https://promisesaplus.com/#point-48 - if ( returned === deferred.promise() ) { - throw new TypeError( "Thenable self-resolution" ); - } - - // Support: Promises/A+ sections 2.3.3.1, 3.5 - // https://promisesaplus.com/#point-54 - // https://promisesaplus.com/#point-75 - // Retrieve `then` only once - then = returned && - - // Support: Promises/A+ section 2.3.4 - // https://promisesaplus.com/#point-64 - // Only check objects and functions for thenability - ( typeof returned === "object" || - typeof returned === "function" ) && - returned.then; - - // Handle a returned thenable - if ( isFunction( then ) ) { - - // Special processors (notify) just wait for resolution - if ( special ) { - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ) - ); - - // Normal processors (resolve) also hook into progress - } else { - - // ...and disregard older resolution values - maxDepth++; - - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ), - resolve( maxDepth, deferred, Identity, - deferred.notifyWith ) - ); - } - - // Handle all other returned values - } else { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Identity ) { - that = undefined; - args = [ returned ]; - } - - // Process the value(s) - // Default process is resolve - ( special || deferred.resolveWith )( that, args ); - } - }, - - // Only normal processors (resolve) catch and reject exceptions - process = special ? - mightThrow : - function () { - try { - mightThrow(); - } catch ( e ) { - - if ( jQuery.Deferred.exceptionHook ) { - jQuery.Deferred.exceptionHook( e, - process.stackTrace ); - } - - // Support: Promises/A+ section 2.3.3.3.4.1 - // https://promisesaplus.com/#point-61 - // Ignore post-resolution exceptions - if ( depth + 1 >= maxDepth ) { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Thrower ) { - that = undefined; - args = [ e ]; - } - - deferred.rejectWith( that, args ); - } - } - }; - - // Support: Promises/A+ section 2.3.3.3.1 - // https://promisesaplus.com/#point-57 - // Re-resolve promises immediately to dodge false rejection from - // subsequent errors - if ( depth ) { - process(); - } else { - - // Call an optional hook to record the stack, in case of exception - // since it's otherwise lost when execution goes async - if ( jQuery.Deferred.getStackHook ) { - process.stackTrace = jQuery.Deferred.getStackHook(); - } - window.setTimeout( process ); - } - }; - } - - return jQuery.Deferred( function ( newDefer ) { - - // progress_handlers.add( ... ) - tuples[ 0 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onProgress ) ? - onProgress : - Identity, - newDefer.notifyWith - ) - ); - - // fulfilled_handlers.add( ... ) - tuples[ 1 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onFulfilled ) ? - onFulfilled : - Identity - ) - ); - - // rejected_handlers.add( ... ) - tuples[ 2 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onRejected ) ? - onRejected : - Thrower - ) - ); - } ).promise(); - }, - - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function ( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Add list-specific methods - jQuery.each( tuples, function ( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 5 ]; - - // promise.progress = list.add - // promise.done = list.add - // promise.fail = list.add - promise[ tuple[ 1 ] ] = list.add; - - // Handle state - if ( stateString ) { - list.add( - function () { - - // state = "resolved" (i.e., fulfilled) - // state = "rejected" - state = stateString; - }, - - // rejected_callbacks.disable - // fulfilled_callbacks.disable - tuples[ 3 - i ][ 2 ].disable, - - // rejected_handlers.disable - // fulfilled_handlers.disable - tuples[ 3 - i ][ 3 ].disable, - - // progress_callbacks.lock - tuples[ 0 ][ 2 ].lock, - - // progress_handlers.lock - tuples[ 0 ][ 3 ].lock - ); - } - - // progress_handlers.fire - // fulfilled_handlers.fire - // rejected_handlers.fire - list.add( tuple[ 3 ].fire ); - - // deferred.notify = function() { deferred.notifyWith(...) } - // deferred.resolve = function() { deferred.resolveWith(...) } - // deferred.reject = function() { deferred.rejectWith(...) } - deferred[ tuple[ 0 ] ] = function () { - deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); - return this; - }; - - // deferred.notifyWith = list.fireWith - // deferred.resolveWith = list.fireWith - // deferred.rejectWith = list.fireWith - deferred[ tuple[ 0 ] + "With" ] = list.fireWith; - } ); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function ( singleValue ) { - var - - // count of uncompleted subordinates - remaining = arguments.length, - - // count of unprocessed arguments - i = remaining, - - // subordinate fulfillment data - resolveContexts = Array( i ), - resolveValues = slice.call( arguments ), - - // the master Deferred - master = jQuery.Deferred(), - - // subordinate callback factory - updateFunc = function ( i ) { - return function ( value ) { - resolveContexts[ i ] = this; - resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; - if ( !( --remaining ) ) { - master.resolveWith( resolveContexts, resolveValues ); - } - }; - }; - - // Single- and empty arguments are adopted like Promise.resolve - if ( remaining <= 1 ) { - adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, - !remaining ); - - // Use .then() to unwrap secondary thenables (cf. gh-3000) - if ( master.state() === "pending" || - isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { - - return master.then(); - } - } - - // Multiple arguments are aggregated like Promise.all array elements - while ( i-- ) { - adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); - } - - return master.promise(); - } - } ); - - - // These usually indicate a programmer mistake during development, - // warn about them ASAP rather than swallowing them by default. - var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; - - jQuery.Deferred.exceptionHook = function ( error, stack ) { - - // Support: IE 8 - 9 only - // Console exists when dev tools are open, which can happen at any time - if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { - window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); - } - }; - - - - - jQuery.readyException = function ( error ) { - window.setTimeout( function () { - throw error; - } ); - }; - - - - - // The deferred used on DOM ready - var readyList = jQuery.Deferred(); - - jQuery.fn.ready = function ( fn ) { - - readyList - .then( fn ) - - // Wrap jQuery.readyException in a function so that the lookup - // happens at the time of error handling instead of callback - // registration. - .catch( function ( error ) { - jQuery.readyException( error ); - } ); - - return this; - }; - - jQuery.extend( { - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Handle when the DOM is ready - ready: function ( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - } - } ); - - jQuery.ready.then = readyList.then; - - // The ready event handler and self cleanup method - function completed() { - document.removeEventListener( "DOMContentLoaded", completed ); - window.removeEventListener( "load", completed ); - jQuery.ready(); - } - - // Catch cases where $(document).ready() is called - // after the browser event has already occurred. - // Support: IE <=9 - 10 only - // Older IE sometimes signals "interactive" too soon - if ( document.readyState === "complete" || - ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { - - // Handle it asynchronously to allow scripts the opportunity to delay ready - window.setTimeout( jQuery.ready ); - - } else { - - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed ); - } - - - - - // Multifunctional method to get and set values of a collection - // The value/s can optionally be executed if it's a function - var access = function ( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - len = elems.length, - bulk = key == null; - - // Sets many values - if ( toType( key ) === "object" ) { - chainable = true; - for ( i in key ) { - access( elems, fn, i, key[ i ], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function ( elem, _key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < len; i++ ) { - fn( - elems[ i ], key, raw ? - value : - value.call( elems[ i ], i, fn( elems[ i ], key ) ) - ); - } - } - } - - if ( chainable ) { - return elems; - } - - // Gets - if ( bulk ) { - return fn.call( elems ); - } - - return len ? fn( elems[ 0 ], key ) : emptyGet; - }; - - - // Matches dashed string for camelizing - var rmsPrefix = /^-ms-/, - rdashAlpha = /-([a-z])/g; - - // Used by camelCase as callback to replace() - function fcamelCase( _all, letter ) { - return letter.toUpperCase(); - } - - // Convert dashed to camelCase; used by the css and data modules - // Support: IE <=9 - 11, Edge 12 - 15 - // Microsoft forgot to hump their vendor prefix (#9572) - function camelCase( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); - } - var acceptData = function ( owner ) { - - // Accepts only: - // - Node - // - Node.ELEMENT_NODE - // - Node.DOCUMENT_NODE - // - Object - // - Any - return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); - }; - - - - - function Data() { - this.expando = jQuery.expando + Data.uid++; - } - - Data.uid = 1; - - Data.prototype = { - - cache: function ( owner ) { - - // Check if the owner object already has a cache - var value = owner[ this.expando ]; - - // If not, create one - if ( !value ) { - value = {}; - - // We can accept data for non-element nodes in modern browsers, - // but we should not, see #8335. - // Always return an empty object. - if ( acceptData( owner ) ) { - - // If it is a node unlikely to be stringify-ed or looped over - // use plain assignment - if ( owner.nodeType ) { - owner[ this.expando ] = value; - - // Otherwise secure it in a non-enumerable property - // configurable must be true to allow the property to be - // deleted when data is removed - } else { - Object.defineProperty( owner, this.expando, { - value: value, - configurable: true - } ); - } - } - } - - return value; - }, - set: function ( owner, data, value ) { - var prop, - cache = this.cache( owner ); - - // Handle: [ owner, key, value ] args - // Always use camelCase key (gh-2257) - if ( typeof data === "string" ) { - cache[ camelCase( data ) ] = value; - - // Handle: [ owner, { properties } ] args - } else { - - // Copy the properties one-by-one to the cache object - for ( prop in data ) { - cache[ camelCase( prop ) ] = data[ prop ]; - } - } - return cache; - }, - get: function ( owner, key ) { - return key === undefined ? - this.cache( owner ) : - - // Always use camelCase key (gh-2257) - owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; - }, - access: function ( owner, key, value ) { - - // In cases where either: - // - // 1. No key was specified - // 2. A string key was specified, but no value provided - // - // Take the "read" path and allow the get method to determine - // which value to return, respectively either: - // - // 1. The entire cache object - // 2. The data stored at the key - // - if ( key === undefined || - ( ( key && typeof key === "string" ) && value === undefined ) ) { - - return this.get( owner, key ); - } - - // When the key is not a string, or both a key and value - // are specified, set or extend (existing objects) with either: - // - // 1. An object of properties - // 2. A key and value - // - this.set( owner, key, value ); - - // Since the "set" path can have two possible entry points - // return the expected data based on which path was taken[*] - return value !== undefined ? value : key; - }, - remove: function ( owner, key ) { - var i, - cache = owner[ this.expando ]; - - if ( cache === undefined ) { - return; - } - - if ( key !== undefined ) { - - // Support array or space separated string of keys - if ( Array.isArray( key ) ) { - - // If key is an array of keys... - // We always set camelCase keys, so remove that. - key = key.map( camelCase ); - } else { - key = camelCase( key ); - - // If a key with the spaces exists, use it. - // Otherwise, create an array by matching non-whitespace - key = key in cache ? [ key ] : - ( key.match( rnothtmlwhite ) || [] ); - } - - i = key.length; - - while ( i-- ) { - delete cache[ key[ i ] ]; - } - } - - // Remove the expando if there's no more data - if ( key === undefined || jQuery.isEmptyObject( cache ) ) { - - // Support: Chrome <=35 - 45 - // Webkit & Blink performance suffers when deleting properties - // from DOM nodes, so set to undefined instead - // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) - if ( owner.nodeType ) { - owner[ this.expando ] = undefined; - } else { - delete owner[ this.expando ]; - } - } - }, - hasData: function ( owner ) { - var cache = owner[ this.expando ]; - return cache !== undefined && !jQuery.isEmptyObject( cache ); - } - }; - var dataPriv = new Data(); - - var dataUser = new Data(); - - - - // Implementation Summary - // - // 1. Enforce API surface and semantic compatibility with 1.9.x branch - // 2. Improve the module's maintainability by reducing the storage - // paths to a single mechanism. - // 3. Use the same single mechanism to support "private" and "user" data. - // 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) - // 5. Avoid exposing implementation details on user objects (eg. expando properties) - // 6. Provide a clear path for implementation upgrade to WeakMap in 2014 - - var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - rmultiDash = /[A-Z]/g; - - function getData( data ) { - if ( data === "true" ) { - return true; - } - - if ( data === "false" ) { - return false; - } - - if ( data === "null" ) { - return null; - } - - // Only convert to a number if it doesn't change the string - if ( data === +data + "" ) { - return +data; - } - - if ( rbrace.test( data ) ) { - return JSON.parse( data ); - } - - return data; - } - - function dataAttr( elem, key, data ) { - var name; - - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = getData( data ); - } catch ( e ) {} - - // Make sure we set the data so it isn't changed later - dataUser.set( elem, key, data ); - } else { - data = undefined; - } - } - return data; - } - - jQuery.extend( { - hasData: function ( elem ) { - return dataUser.hasData( elem ) || dataPriv.hasData( elem ); - }, - - data: function ( elem, name, data ) { - return dataUser.access( elem, name, data ); - }, - - removeData: function ( elem, name ) { - dataUser.remove( elem, name ); - }, - - // TODO: Now that all calls to _data and _removeData have been replaced - // with direct calls to dataPriv methods, these can be deprecated. - _data: function ( elem, name, data ) { - return dataPriv.access( elem, name, data ); - }, - - _removeData: function ( elem, name ) { - dataPriv.remove( elem, name ); - } - } ); - - jQuery.fn.extend( { - data: function ( key, value ) { - var i, name, data, - elem = this[ 0 ], - attrs = elem && elem.attributes; - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = dataUser.get( elem ); - - if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { - i = attrs.length; - while ( i-- ) { - - // Support: IE 11 only - // The attrs elements can be null (#14894) - if ( attrs[ i ] ) { - name = attrs[ i ].name; - if ( name.indexOf( "data-" ) === 0 ) { - name = camelCase( name.slice( 5 ) ); - dataAttr( elem, name, data[ name ] ); - } - } - } - dataPriv.set( elem, "hasDataAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each( function () { - dataUser.set( this, key ); - } ); - } - - return access( this, function ( value ) { - var data; - - // The calling jQuery object (element matches) is not empty - // (and therefore has an element appears at this[ 0 ]) and the - // `value` parameter was not undefined. An empty jQuery object - // will result in `undefined` for elem = this[ 0 ] which will - // throw an exception if an attempt to read a data cache is made. - if ( elem && value === undefined ) { - - // Attempt to get data from the cache - // The key will always be camelCased in Data - data = dataUser.get( elem, key ); - if ( data !== undefined ) { - return data; - } - - // Attempt to "discover" the data in - // HTML5 custom data-* attrs - data = dataAttr( elem, key ); - if ( data !== undefined ) { - return data; - } - - // We tried really hard, but the data doesn't exist. - return; - } - - // Set the data... - this.each( function () { - - // We always store the camelCased key - dataUser.set( this, key, value ); - } ); - }, null, value, arguments.length > 1, null, true ); - }, - - removeData: function ( key ) { - return this.each( function () { - dataUser.remove( this, key ); - } ); - } - } ); - - - jQuery.extend( { - queue: function ( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = dataPriv.get( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || Array.isArray( data ) ) { - queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function ( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function () { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // Clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // Not public - generate a queueHooks object, or return the current one - _queueHooks: function ( elem, type ) { - var key = type + "queueHooks"; - return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { - empty: jQuery.Callbacks( "once memory" ).add( function () { - dataPriv.remove( elem, [ type + "queue", key ] ); - } ) - } ); - } - } ); - - jQuery.fn.extend( { - queue: function ( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[ 0 ], type ); - } - - return data === undefined ? - this : - this.each( function () { - var queue = jQuery.queue( this, type, data ); - - // Ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - } ); - }, - dequeue: function ( type ) { - return this.each( function () { - jQuery.dequeue( this, type ); - } ); - }, - clearQueue: function ( type ) { - return this.queue( type || "fx", [] ); - }, - - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function ( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function () { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while ( i-- ) { - tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } - } ); - var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; - - var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); - - - var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; - - var documentElement = document.documentElement; - - - - var isAttached = function ( elem ) { - return jQuery.contains( elem.ownerDocument, elem ); - }, - composed = { - composed: true - }; - - // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only - // Check attachment across shadow DOM boundaries when possible (gh-3504) - // Support: iOS 10.0-10.2 only - // Early iOS 10 versions support `attachShadow` but not `getRootNode`, - // leading to errors. We need to check for `getRootNode`. - if ( documentElement.getRootNode ) { - isAttached = function ( elem ) { - return jQuery.contains( elem.ownerDocument, elem ) || - elem.getRootNode( composed ) === elem.ownerDocument; - }; - } - var isHiddenWithinTree = function ( elem, el ) { - - // isHiddenWithinTree might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - - // Inline style trumps all - return elem.style.display === "none" || - elem.style.display === "" && - - // Otherwise, check computed style - // Support: Firefox <=43 - 45 - // Disconnected elements can have computed display: none, so first confirm that elem is - // in the document. - isAttached( elem ) && - - jQuery.css( elem, "display" ) === "none"; - }; - - - - function adjustCSS( elem, prop, valueParts, tween ) { - var adjusted, scale, - maxIterations = 20, - currentValue = tween ? - function () { - return tween.cur(); - } : - function () { - return jQuery.css( elem, prop, "" ); - }, - initial = currentValue(), - unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), - - // Starting value computation is required for potential unit mismatches - initialInUnit = elem.nodeType && - ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && - rcssNum.exec( jQuery.css( elem, prop ) ); - - if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { - - // Support: Firefox <=54 - // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) - initial = initial / 2; - - // Trust units reported by jQuery.css - unit = unit || initialInUnit[ 3 ]; - - // Iteratively approximate from a nonzero starting point - initialInUnit = +initial || 1; - - while ( maxIterations-- ) { - - // Evaluate and update our best guess (doubling guesses that zero out). - // Finish if the scale equals or crosses 1 (making the old*new product non-positive). - jQuery.style( elem, prop, initialInUnit + unit ); - if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { - maxIterations = 0; - } - initialInUnit = initialInUnit / scale; - - } - - initialInUnit = initialInUnit * 2; - jQuery.style( elem, prop, initialInUnit + unit ); - - // Make sure we update the tween properties later on - valueParts = valueParts || []; - } - - if ( valueParts ) { - initialInUnit = +initialInUnit || +initial || 0; - - // Apply relative offset (+=/-=) if specified - adjusted = valueParts[ 1 ] ? - initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : - +valueParts[ 2 ]; - if ( tween ) { - tween.unit = unit; - tween.start = initialInUnit; - tween.end = adjusted; - } - } - return adjusted; - } - - - var defaultDisplayMap = {}; - - function getDefaultDisplay( elem ) { - var temp, - doc = elem.ownerDocument, - nodeName = elem.nodeName, - display = defaultDisplayMap[ nodeName ]; - - if ( display ) { - return display; - } - - temp = doc.body.appendChild( doc.createElement( nodeName ) ); - display = jQuery.css( temp, "display" ); - - temp.parentNode.removeChild( temp ); - - if ( display === "none" ) { - display = "block"; - } - defaultDisplayMap[ nodeName ] = display; - - return display; - } - - function showHide( elements, show ) { - var display, elem, - values = [], - index = 0, - length = elements.length; - - // Determine new display value for elements that need to change - for ( ; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - - display = elem.style.display; - if ( show ) { - - // Since we force visibility upon cascade-hidden elements, an immediate (and slow) - // check is required in this first loop unless we have a nonempty display value (either - // inline or about-to-be-restored) - if ( display === "none" ) { - values[ index ] = dataPriv.get( elem, "display" ) || null; - if ( !values[ index ] ) { - elem.style.display = ""; - } - } - if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { - values[ index ] = getDefaultDisplay( elem ); - } - } else { - if ( display !== "none" ) { - values[ index ] = "none"; - - // Remember what we're overwriting - dataPriv.set( elem, "display", display ); - } - } - } - - // Set the display of the elements in a second loop to avoid constant reflow - for ( index = 0; index < length; index++ ) { - if ( values[ index ] != null ) { - elements[ index ].style.display = values[ index ]; - } - } - - return elements; - } - - jQuery.fn.extend( { - show: function () { - return showHide( this, true ); - }, - hide: function () { - return showHide( this ); - }, - toggle: function ( state ) { - if ( typeof state === "boolean" ) { - return state ? this.show() : this.hide(); - } - - return this.each( function () { - if ( isHiddenWithinTree( this ) ) { - jQuery( this ).show(); - } else { - jQuery( this ).hide(); - } - } ); - } - } ); - var rcheckableType = ( /^(?:checkbox|radio)$/i ); - - var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); - - var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); - - - - ( function () { - var fragment = document.createDocumentFragment(), - div = fragment.appendChild( document.createElement( "div" ) ), - input = document.createElement( "input" ); - - // Support: Android 4.0 - 4.3 only - // Check state lost if the name is set (#11217) - // Support: Windows Web Apps (WWA) - // `name` and `type` must use .setAttribute for WWA (#14901) - input.setAttribute( "type", "radio" ); - input.setAttribute( "checked", "checked" ); - input.setAttribute( "name", "t" ); - - div.appendChild( input ); - - // Support: Android <=4.1 only - // Older WebKit doesn't clone checked state correctly in fragments - support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: IE <=11 only - // Make sure textarea (and checkbox) defaultValue is properly cloned - div.innerHTML = ""; - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; - - // Support: IE <=9 only - // IE <=9 replaces "; - support.option = !!div.lastChild; - } )(); - - - // We have to close these tags to support XHTML (#13200) - var wrapMap = { - - // XHTML parsers do not magically insert elements in the - // same way that tag soup parsers do. So we cannot shorten - // this by omitting or other required elements. - thead: [ 1, "", "
" ], - col: [ 2, "", "
" ], - tr: [ 2, "", "
" ], - td: [ 3, "", "
" ], - - _default: [ 0, "", "" ] - }; - - wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; - wrapMap.th = wrapMap.td; - - // Support: IE <=9 only - if ( !support.option ) { - wrapMap.optgroup = wrapMap.option = [ 1, "" ]; - } - - - function getAll( context, tag ) { - - // Support: IE <=9 - 11 only - // Use typeof to avoid zero-argument method invocation on host objects (#15151) - var ret; - - if ( typeof context.getElementsByTagName !== "undefined" ) { - ret = context.getElementsByTagName( tag || "*" ); - - } else if ( typeof context.querySelectorAll !== "undefined" ) { - ret = context.querySelectorAll( tag || "*" ); - - } else { - ret = []; - } - - if ( tag === undefined || tag && nodeName( context, tag ) ) { - return jQuery.merge( [ context ], ret ); - } - - return ret; - } - - - // Mark scripts as having already been evaluated - function setGlobalEval( elems, refElements ) { - var i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - dataPriv.set( - elems[ i ], - "globalEval", - !refElements || dataPriv.get( refElements[ i ], "globalEval" ) - ); - } - } - - - var rhtml = /<|&#?\w+;/; - - function buildFragment( elems, context, scripts, selection, ignored ) { - var elem, tmp, tag, wrap, attached, j, - fragment = context.createDocumentFragment(), - nodes = [], - i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( toType( elem ) === "object" ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, tmp.childNodes ); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Ensure the created nodes are orphaned (#12392) - tmp.textContent = ""; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ""; - - i = 0; - while ( ( elem = nodes[ i++ ] ) ) { - - // Skip elements already in the context collection (trac-4087) - if ( selection && jQuery.inArray( elem, selection ) > -1 ) { - if ( ignored ) { - ignored.push( elem ); - } - continue; - } - - attached = isAttached( elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( attached ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( ( elem = tmp[ j++ ] ) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; - } - - - var - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)/; - - function returnTrue() { - return true; - } - - function returnFalse() { - return false; - } - - // Support: IE <=9 - 11+ - // focus() and blur() are asynchronous, except when they are no-op. - // So expect focus to be synchronous when the element is already active, - // and blur to be synchronous when the element is not already active. - // (focus and blur are always synchronous in other supported browsers, - // this just defines when we can count on it). - function expectSync( elem, type ) { - return ( elem === safeActiveElement() ) === ( type === "focus" ); - } - - // Support: IE <=9 only - // Accessing document.activeElement can throw unexpectedly - // https://bugs.jquery.com/ticket/13393 - function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) {} - } - - function on( elem, types, selector, data, fn, one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - on( elem, type, selector, data, types[ type ], one ); - } - return elem; - } - - if ( data == null && fn == null ) { - - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return elem; - } - - if ( one === 1 ) { - origFn = fn; - fn = function ( event ) { - - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return elem.each( function () { - jQuery.event.add( this, types, fn, data, selector ); - } ); - } - - /* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ - jQuery.event = { - - global: {}, - - add: function ( elem, types, handler, data, selector ) { - - var handleObjIn, eventHandle, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.get( elem ); - - // Only attach events to objects that accept data - if ( !acceptData( elem ) ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Ensure that invalid selectors throw exceptions at attach time - // Evaluate against documentElement in case elem is a non-element node (e.g., document) - if ( selector ) { - jQuery.find.matchesSelector( documentElement, selector ); - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !( events = elemData.events ) ) { - events = elemData.events = Object.create( null ); - } - if ( !( eventHandle = elemData.handle ) ) { - eventHandle = elemData.handle = function ( e ) { - - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? - jQuery.event.dispatch.apply( elem, arguments ) : undefined; - }; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend( { - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join( "." ) - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !( handlers = events[ type ] ) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( !special.setup || - special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - }, - - // Detach an event or set of events from an element - remove: function ( elem, types, handler, selector, mappedTypes ) { - - var j, origCount, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); - - if ( !elemData || !( events = elemData.events ) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[ 2 ] && - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || - selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || - special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove data and the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - dataPriv.remove( elem, "handle events" ); - } - }, - - dispatch: function ( nativeEvent ) { - - var i, j, ret, matched, handleObj, handlerQueue, - args = new Array( arguments.length ), - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( nativeEvent ), - - handlers = ( - dataPriv.get( this, "events" ) || Object.create( null ) - )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[ 0 ] = event; - - for ( i = 1; i < arguments.length; i++ ) { - args[ i ] = arguments[ i ]; - } - - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( ( handleObj = matched.handlers[ j++ ] ) && - !event.isImmediatePropagationStopped() ) { - - // If the event is namespaced, then each handler is only invoked if it is - // specially universal or its namespaces are a superset of the event's. - if ( !event.rnamespace || handleObj.namespace === false || - event.rnamespace.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || - handleObj.handler ).apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( ( event.result = ret ) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function ( event, handlers ) { - var i, handleObj, sel, matchedHandlers, matchedSelectors, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - if ( delegateCount && - - // Support: IE <=9 - // Black-hole SVG instance trees (trac-13180) - cur.nodeType && - - // Support: Firefox <=42 - // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) - // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click - // Support: IE 11 only - // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) - !( event.type === "click" && event.button >= 1 ) ) { - - for ( ; cur !== this; cur = cur.parentNode || this ) { - - // Don't check non-elements (#13208) - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { - matchedHandlers = []; - matchedSelectors = {}; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matchedSelectors[ sel ] === undefined ) { - matchedSelectors[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) > -1 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matchedSelectors[ sel ] ) { - matchedHandlers.push( handleObj ); - } - } - if ( matchedHandlers.length ) { - handlerQueue.push( { - elem: cur, - handlers: matchedHandlers - } ); - } - } - } - } - - // Add the remaining (directly-bound) handlers - cur = this; - if ( delegateCount < handlers.length ) { - handlerQueue.push( { - elem: cur, - handlers: handlers.slice( delegateCount ) - } ); - } - - return handlerQueue; - }, - - addProp: function ( name, hook ) { - Object.defineProperty( jQuery.Event.prototype, name, { - enumerable: true, - configurable: true, - - get: isFunction( hook ) ? - function () { - if ( this.originalEvent ) { - return hook( this.originalEvent ); - } - } : function () { - if ( this.originalEvent ) { - return this.originalEvent[ name ]; - } - }, - - set: function ( value ) { - Object.defineProperty( this, name, { - enumerable: true, - configurable: true, - writable: true, - value: value - } ); - } - } ); - }, - - fix: function ( originalEvent ) { - return originalEvent[ jQuery.expando ] ? - originalEvent : - new jQuery.Event( originalEvent ); - }, - - special: { - load: { - - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - click: { - - // Utilize native event to ensure correct state for checkable inputs - setup: function ( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Claim the first handler - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - // dataPriv.set( el, "click", ... ) - leverageNative( el, "click", returnTrue ); - } - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function ( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Force setup before triggering a click - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - leverageNative( el, "click" ); - } - - // Return non-false to allow normal event-path propagation - return true; - }, - - // For cross-browser consistency, suppress native .click() on links - // Also prevent it if we're currently inside a leveraged native-event stack - _default: function ( event ) { - var target = event.target; - return rcheckableType.test( target.type ) && - target.click && nodeName( target, "input" ) && - dataPriv.get( target, "click" ) || - nodeName( target, "a" ); - } - }, - - beforeunload: { - postDispatch: function ( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined && event.originalEvent ) { - event.originalEvent.returnValue = event.result; - } - } - } - } - }; - - // Ensure the presence of an event listener that handles manually-triggered - // synthetic events by interrupting progress until reinvoked in response to - // *native* events that it fires directly, ensuring that state changes have - // already occurred before other listeners are invoked. - function leverageNative( el, type, expectSync ) { - - // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add - if ( !expectSync ) { - if ( dataPriv.get( el, type ) === undefined ) { - jQuery.event.add( el, type, returnTrue ); - } - return; - } - - // Register the controller as a special universal handler for all event namespaces - dataPriv.set( el, type, false ); - jQuery.event.add( el, type, { - namespace: false, - handler: function ( event ) { - var notAsync, result, - saved = dataPriv.get( this, type ); - - if ( ( event.isTrigger & 1 ) && this[ type ] ) { - - // Interrupt processing of the outer synthetic .trigger()ed event - // Saved data should be false in such cases, but might be a leftover capture object - // from an async native handler (gh-4350) - if ( !saved.length ) { - - // Store arguments for use when handling the inner native event - // There will always be at least one argument (an event object), so this array - // will not be confused with a leftover capture object. - saved = slice.call( arguments ); - dataPriv.set( this, type, saved ); - - // Trigger the native event and capture its result - // Support: IE <=9 - 11+ - // focus() and blur() are asynchronous - notAsync = expectSync( this, type ); - this[ type ](); - result = dataPriv.get( this, type ); - if ( saved !== result || notAsync ) { - dataPriv.set( this, type, false ); - } else { - result = {}; - } - if ( saved !== result ) { - - // Cancel the outer synthetic event - event.stopImmediatePropagation(); - event.preventDefault(); - return result.value; - } - - // If this is an inner synthetic event for an event with a bubbling surrogate - // (focus or blur), assume that the surrogate already propagated from triggering the - // native event and prevent that from happening again here. - // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the - // bubbling surrogate propagates *after* the non-bubbling base), but that seems - // less bad than duplication. - } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { - event.stopPropagation(); - } - - // If this is a native event triggered above, everything is now in order - // Fire an inner synthetic event with the original arguments - } else if ( saved.length ) { - - // ...and capture the result - dataPriv.set( this, type, { - value: jQuery.event.trigger( - - // Support: IE <=9 - 11+ - // Extend with the prototype to reset the above stopImmediatePropagation() - jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), - saved.slice( 1 ), - this - ) - } ); - - // Abort handling of the native event - event.stopImmediatePropagation(); - } - } - } ); - } - - jQuery.removeEvent = function ( elem, type, handle ) { - - // This "if" is needed for plain objects - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle ); - } - }; - - jQuery.Event = function ( src, props ) { - - // Allow instantiation without the 'new' keyword - if ( !( this instanceof jQuery.Event ) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented || - src.defaultPrevented === undefined && - - // Support: Android <=2.3 only - src.returnValue === false ? - returnTrue : - returnFalse; - - // Create target properties - // Support: Safari <=6 - 7 only - // Target should not be a text node (#504, #13143) - this.target = ( src.target && src.target.nodeType === 3 ) ? - src.target.parentNode : - src.target; - - this.currentTarget = src.currentTarget; - this.relatedTarget = src.relatedTarget; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || Date.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; - }; - - // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding - // https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html - jQuery.Event.prototype = { - constructor: jQuery.Event, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - isSimulated: false, - - preventDefault: function () { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - - if ( e && !this.isSimulated ) { - e.preventDefault(); - } - }, - stopPropagation: function () { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function () { - var e = this.originalEvent; - - this.isImmediatePropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopImmediatePropagation(); - } - - this.stopPropagation(); - } - }; - - // Includes all common event props including KeyEvent and MouseEvent specific props - jQuery.each( { - altKey: true, - bubbles: true, - cancelable: true, - changedTouches: true, - ctrlKey: true, - detail: true, - eventPhase: true, - metaKey: true, - pageX: true, - pageY: true, - shiftKey: true, - view: true, - "char": true, - code: true, - charCode: true, - key: true, - keyCode: true, - button: true, - buttons: true, - clientX: true, - clientY: true, - offsetX: true, - offsetY: true, - pointerId: true, - pointerType: true, - screenX: true, - screenY: true, - targetTouches: true, - toElement: true, - touches: true, - - which: function ( event ) { - var button = event.button; - - // Add which for key events - if ( event.which == null && rkeyEvent.test( event.type ) ) { - return event.charCode != null ? event.charCode : event.keyCode; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { - if ( button & 1 ) { - return 1; - } - - if ( button & 2 ) { - return 3; - } - - if ( button & 4 ) { - return 2; - } - - return 0; - } - - return event.which; - } - }, jQuery.event.addProp ); - - jQuery.each( { - focus: "focusin", - blur: "focusout" - }, function ( type, delegateType ) { - jQuery.event.special[ type ] = { - - // Utilize native event if possible so blur/focus sequence is correct - setup: function () { - - // Claim the first handler - // dataPriv.set( this, "focus", ... ) - // dataPriv.set( this, "blur", ... ) - leverageNative( this, type, expectSync ); - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function () { - - // Force setup before trigger - leverageNative( this, type ); - - // Return non-false to allow normal event-path propagation - return true; - }, - - delegateType: delegateType - }; - } ); - - // Create mouseenter/leave events using mouseover/out and event-time checks - // so that event delegation works in jQuery. - // Do the same for pointerenter/pointerleave and pointerover/pointerout - // - // Support: Safari 7 only - // Safari sends mouseenter too often; see: - // https://bugs.chromium.org/p/chromium/issues/detail?id=470258 - // for the description of the bug (it existed in older Chrome versions as well). - jQuery.each( { - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" - }, function ( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function ( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mouseenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; - } ); - - jQuery.fn.extend( { - - on: function ( types, selector, data, fn ) { - return on( this, types, selector, data, fn ); - }, - one: function ( types, selector, data, fn ) { - return on( this, types, selector, data, fn, 1 ); - }, - off: function ( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? - handleObj.origType + "." + handleObj.namespace : - handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each( function () { - jQuery.event.remove( this, types, fn, selector ); - } ); - } - } ); - - - var - - // Support: IE <=10 - 11, Edge 12 - 13 only - // In IE/Edge using regex groups here causes severe slowdowns. - // See https://connect.microsoft.com/IE/feedback/details/1736512/ - rnoInnerhtml = /\s*$/g; - - // Prefer a tbody over its parent table for containing new rows - function manipulationTarget( elem, content ) { - if ( nodeName( elem, "table" ) && - nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { - - return jQuery( elem ).children( "tbody" )[ 0 ] || elem; - } - - return elem; - } - - // Replace/restore the type attribute of script elements for safe DOM manipulation - function disableScript( elem ) { - elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; - return elem; - } - - function restoreScript( elem ) { - if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { - elem.type = elem.type.slice( 5 ); - } else { - elem.removeAttribute( "type" ); - } - - return elem; - } - - function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( dataPriv.hasData( src ) ) { - pdataOld = dataPriv.get( src ); - events = pdataOld.events; - - if ( events ) { - dataPriv.remove( dest, "handle events" ); - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - } - - // 2. Copy user data - if ( dataUser.hasData( src ) ) { - udataOld = dataUser.access( src ); - udataCur = jQuery.extend( {}, udataOld ); - - dataUser.set( dest, udataCur ); - } - } - - // Fix IE bugs, see support tests - function fixInput( src, dest ) { - var nodeName = dest.nodeName.toLowerCase(); - - // Fails to persist the checked state of a cloned checkbox or radio button. - if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - dest.checked = src.checked; - - // Fails to return the selected option to the default selected state when cloning options - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } - } - - function domManip( collection, args, callback, ignored ) { - - // Flatten any nested arrays - args = flat( args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = collection.length, - iNoClone = l - 1, - value = args[ 0 ], - valueIsFunction = isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( valueIsFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return collection.each( function ( index ) { - var self = collection.eq( index ); - if ( valueIsFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - domManip( self, args, callback, ignored ); - } ); - } - - if ( l ) { - fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - // Require either new content or an interest in ignored elements to invoke the callback - if ( first || ignored ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item - // instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( collection[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !dataPriv.access( node, "globalEval" ) && - jQuery.contains( doc, node ) ) { - - if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { - - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl && !node.noModule ) { - jQuery._evalUrl( node.src, { - nonce: node.nonce || node.getAttribute( "nonce" ) - }, doc ); - } - } else { - DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); - } - } - } - } - } - } - - return collection; - } - - function remove( elem, selector, keepData ) { - var node, - nodes = selector ? jQuery.filter( selector, elem ) : elem, - i = 0; - - for ( ; - ( node = nodes[ i ] ) != null; i++ ) { - if ( !keepData && node.nodeType === 1 ) { - jQuery.cleanData( getAll( node ) ); - } - - if ( node.parentNode ) { - if ( keepData && isAttached( node ) ) { - setGlobalEval( getAll( node, "script" ) ); - } - node.parentNode.removeChild( node ); - } - } - - return elem; - } - - jQuery.extend( { - htmlPrefilter: function ( html ) { - return html; - }, - - clone: function ( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = isAttached( elem ); - - // Fix IE cloning issues - if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && - !jQuery.isXMLDoc( elem ) ) { - - // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - fixInput( srcElements[ i ], destElements[ i ] ); - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - cloneCopyEvent( srcElements[ i ], destElements[ i ] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - // Return the cloned set - return clone; - }, - - cleanData: function ( elems ) { - var data, elem, type, - special = jQuery.event.special, - i = 0; - - for ( ; - ( elem = elems[ i ] ) !== undefined; i++ ) { - if ( acceptData( elem ) ) { - if ( ( data = elem[ dataPriv.expando ] ) ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataPriv.expando ] = undefined; - } - if ( elem[ dataUser.expando ] ) { - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataUser.expando ] = undefined; - } - } - } - } - } ); - - jQuery.fn.extend( { - detach: function ( selector ) { - return remove( this, selector, true ); - }, - - remove: function ( selector ) { - return remove( this, selector ); - }, - - text: function ( value ) { - return access( this, function ( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().each( function () { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - this.textContent = value; - } - } ); - }, null, value, arguments.length ); - }, - - append: function () { - return domManip( this, arguments, function ( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - } ); - }, - - prepend: function () { - return domManip( this, arguments, function ( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - } ); - }, - - before: function () { - return domManip( this, arguments, function ( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - } ); - }, - - after: function () { - return domManip( this, arguments, function ( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - } ); - }, - - empty: function () { - var elem, - i = 0; - - for ( ; - ( elem = this[ i ] ) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ""; - } - } - - return this; - }, - - clone: function ( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map( function () { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - } ); - }, - - html: function ( value ) { - return access( this, function ( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined && elem.nodeType === 1 ) { - return elem.innerHTML; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - - value = jQuery.htmlPrefilter( value ); - - try { - for ( ; i < l; i++ ) { - elem = this[ i ] || {}; - - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch ( e ) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function () { - var ignored = []; - - // Make the changes, replacing each non-ignored context element with the new content - return domManip( this, arguments, function ( elem ) { - var parent = this.parentNode; - - if ( jQuery.inArray( this, ignored ) < 0 ) { - jQuery.cleanData( getAll( this ) ); - if ( parent ) { - parent.replaceChild( elem, this ); - } - } - - // Force callback invocation - }, ignored ); - } - } ); - - jQuery.each( { - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" - }, function ( name, original ) { - jQuery.fn[ name ] = function ( selector ) { - var elems, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1, - i = 0; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone( true ); - jQuery( insert[ i ] )[ original ]( elems ); - - // Support: Android <=4.0 only, PhantomJS 1 only - // .get() because push.apply(_, arraylike) throws on ancient WebKit - push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; - } ); - var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); - - var getStyles = function ( elem ) { - - // Support: IE <=11 only, Firefox <=30 (#15098, #14150) - // IE throws on elements created in popups - // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" - var view = elem.ownerDocument.defaultView; - - if ( !view || !view.opener ) { - view = window; - } - - return view.getComputedStyle( elem ); - }; - - var swap = function ( elem, options, callback ) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for ( name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - ret = callback.call( elem ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; - }; - - - var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); - - - - ( function () { - - // Executing both pixelPosition & boxSizingReliable tests require only one layout - // so they're executed at the same time to save the second computation. - function computeStyleTests() { - - // This is a singleton, we need to execute it only once - if ( !div ) { - return; - } - - container.style.cssText = "position:absolute;left:-11111px;width:60px;" + - "margin-top:1px;padding:0;border:0"; - div.style.cssText = - "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + - "margin:auto;border:1px;padding:1px;" + - "width:60%;top:1%"; - documentElement.appendChild( container ).appendChild( div ); - - var divStyle = window.getComputedStyle( div ); - pixelPositionVal = divStyle.top !== "1%"; - - // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 - reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; - - // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 - // Some styles come back with percentage values, even though they shouldn't - div.style.right = "60%"; - pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; - - // Support: IE 9 - 11 only - // Detect misreporting of content dimensions for box-sizing:border-box elements - boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; - - // Support: IE 9 only - // Detect overflow:scroll screwiness (gh-3699) - // Support: Chrome <=64 - // Don't get tricked when zoom affects offsetWidth (gh-4029) - div.style.position = "absolute"; - scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; - - documentElement.removeChild( container ); - - // Nullify the div so it wouldn't be stored in the memory and - // it will also be a sign that checks already performed - div = null; - } - - function roundPixelMeasures( measure ) { - return Math.round( parseFloat( measure ) ); - } - - var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, - reliableTrDimensionsVal, reliableMarginLeftVal, - container = document.createElement( "div" ), - div = document.createElement( "div" ); - - // Finish early in limited (non-browser) environments - if ( !div.style ) { - return; - } - - // Support: IE <=9 - 11 only - // Style of cloned element affects source element cloned (#8908) - div.style.backgroundClip = "content-box"; - div.cloneNode( true ).style.backgroundClip = ""; - support.clearCloneStyle = div.style.backgroundClip === "content-box"; - - jQuery.extend( support, { - boxSizingReliable: function () { - computeStyleTests(); - return boxSizingReliableVal; - }, - pixelBoxStyles: function () { - computeStyleTests(); - return pixelBoxStylesVal; - }, - pixelPosition: function () { - computeStyleTests(); - return pixelPositionVal; - }, - reliableMarginLeft: function () { - computeStyleTests(); - return reliableMarginLeftVal; - }, - scrollboxSize: function () { - computeStyleTests(); - return scrollboxSizeVal; - }, - - // Support: IE 9 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Behavior in IE 9 is more subtle than in newer versions & it passes - // some versions of this test; make sure not to make it pass there! - reliableTrDimensions: function () { - var table, tr, trChild, trStyle; - if ( reliableTrDimensionsVal == null ) { - table = document.createElement( "table" ); - tr = document.createElement( "tr" ); - trChild = document.createElement( "div" ); - - table.style.cssText = "position:absolute;left:-11111px"; - tr.style.height = "1px"; - trChild.style.height = "9px"; - - documentElement - .appendChild( table ) - .appendChild( tr ) - .appendChild( trChild ); - - trStyle = window.getComputedStyle( tr ); - reliableTrDimensionsVal = parseInt( trStyle.height ) > 3; - - documentElement.removeChild( table ); - } - return reliableTrDimensionsVal; - } - } ); - } )(); - - - function curCSS( elem, name, computed ) { - var width, minWidth, maxWidth, ret, - - // Support: Firefox 51+ - // Retrieving style before computed somehow - // fixes an issue with getting wrong values - // on detached elements - style = elem.style; - - computed = computed || getStyles( elem ); - - // getPropertyValue is needed for: - // .css('filter') (IE 9 only, #12537) - // .css('--customProperty) (#3144) - if ( computed ) { - ret = computed.getPropertyValue( name ) || computed[ name ]; - - if ( ret === "" && !isAttached( elem ) ) { - ret = jQuery.style( elem, name ); - } - - // A tribute to the "awesome hack by Dean Edwards" - // Android Browser returns percentage for some values, - // but width seems to be reliably pixels. - // This is against the CSSOM draft spec: - // https://drafts.csswg.org/cssom/#resolved-values - if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { - - // Remember the original values - width = style.width; - minWidth = style.minWidth; - maxWidth = style.maxWidth; - - // Put in the new values to get a computed value out - style.minWidth = style.maxWidth = style.width = ret; - ret = computed.width; - - // Revert the changed values - style.width = width; - style.minWidth = minWidth; - style.maxWidth = maxWidth; - } - } - - return ret !== undefined ? - - // Support: IE <=9 - 11 only - // IE returns zIndex value as an integer. - ret + "" : - ret; - } - - - function addGetHookIf( conditionFn, hookFn ) { - - // Define the hook, we'll check on the first run if it's really needed. - return { - get: function () { - if ( conditionFn() ) { - - // Hook not needed (or it's not possible to use it due - // to missing dependency), remove it. - delete this.get; - return; - } - - // Hook needed; redefine it so that the support test is not executed again. - return ( this.get = hookFn ).apply( this, arguments ); - } - }; - } - - - var cssPrefixes = [ "Webkit", "Moz", "ms" ], - emptyStyle = document.createElement( "div" ).style, - vendorProps = {}; - - // Return a vendor-prefixed property or undefined - function vendorPropName( name ) { - - // Check for vendor prefixed names - var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), - i = cssPrefixes.length; - - while ( i-- ) { - name = cssPrefixes[ i ] + capName; - if ( name in emptyStyle ) { - return name; - } - } - } - - // Return a potentially-mapped jQuery.cssProps or vendor prefixed property - function finalPropName( name ) { - var final = jQuery.cssProps[ name ] || vendorProps[ name ]; - - if ( final ) { - return final; - } - if ( name in emptyStyle ) { - return name; - } - return vendorProps[ name ] = vendorPropName( name ) || name; - } - - - var - - // Swappable if display is none or starts with table - // except "table", "table-cell", or "table-caption" - // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - rcustomProp = /^--/, - cssShow = { - position: "absolute", - visibility: "hidden", - display: "block" - }, - cssNormalTransform = { - letterSpacing: "0", - fontWeight: "400" - }; - - function setPositiveNumber( _elem, value, subtract ) { - - // Any relative (+/-) values have already been - // normalized at this point - var matches = rcssNum.exec( value ); - return matches ? - - // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : - value; - } - - function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { - var i = dimension === "width" ? 1 : 0, - extra = 0, - delta = 0; - - // Adjustment may not be necessary - if ( box === ( isBorderBox ? "border" : "content" ) ) { - return 0; - } - - for ( ; i < 4; i += 2 ) { - - // Both box models exclude margin - if ( box === "margin" ) { - delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); - } - - // If we get here with a content-box, we're seeking "padding" or "border" or "margin" - if ( !isBorderBox ) { - - // Add padding - delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - - // For "border" or "margin", add border - if ( box !== "padding" ) { - delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - - // But still keep track of it otherwise - } else { - extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - - // If we get here with a border-box (content + padding + border), we're seeking "content" or - // "padding" or "margin" - } else { - - // For "content", subtract padding - if ( box === "content" ) { - delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } - - // For "content" or "padding", subtract border - if ( box !== "margin" ) { - delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } - } - - // Account for positive content-box scroll gutter when requested by providing computedVal - if ( !isBorderBox && computedVal >= 0 ) { - - // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border - // Assuming integer scroll gutter, subtract the rest and round down - delta += Math.max( 0, Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - computedVal - - delta - - extra - - 0.5 - - // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter - // Use an explicit zero to avoid NaN (gh-3964) - ) ) || 0; - } - - return delta; - } - - function getWidthOrHeight( elem, dimension, extra ) { - - // Start with computed style - var styles = getStyles( elem ), - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). - // Fake content-box until we know it's needed to know the true value. - boxSizingNeeded = !support.boxSizingReliable() || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - valueIsBorderBox = isBorderBox, - - val = curCSS( elem, dimension, styles ), - offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); - - // Support: Firefox <=54 - // Return a confounding non-pixel value or feign ignorance, as appropriate. - if ( rnumnonpx.test( val ) ) { - if ( !extra ) { - return val; - } - val = "auto"; - } - - - // Support: IE 9 - 11 only - // Use offsetWidth/offsetHeight for when box sizing is unreliable. - // In those cases, the computed value can be trusted to be border-box. - if ( ( !support.boxSizingReliable() && isBorderBox || - - // Support: IE 10 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Interestingly, in some cases IE 9 doesn't suffer from this issue. - !support.reliableTrDimensions() && nodeName( elem, "tr" ) || - - // Fall back to offsetWidth/offsetHeight when value is "auto" - // This happens for inline elements with no explicit setting (gh-3571) - val === "auto" || - - // Support: Android <=4.1 - 4.3 only - // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) - !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && - - // Make sure the element is visible & connected - elem.getClientRects().length ) { - - isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; - - // Where available, offsetWidth/offsetHeight approximate border box dimensions. - // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the - // retrieved value as a content box dimension. - valueIsBorderBox = offsetProp in elem; - if ( valueIsBorderBox ) { - val = elem[ offsetProp ]; - } - } - - // Normalize "" and auto - val = parseFloat( val ) || 0; - - // Adjust for the element's box model - return ( val + - boxModelAdjustment( - elem, - dimension, - extra || ( isBorderBox ? "border" : "content" ), - valueIsBorderBox, - styles, - - // Provide the current computed size to request scroll gutter calculation (gh-3589) - val - ) - ) + "px"; - } - - jQuery.extend( { - - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: { - opacity: { - get: function ( elem, computed ) { - if ( computed ) { - - // We should always get a number back from opacity - var ret = curCSS( elem, "opacity" ); - return ret === "" ? "1" : ret; - } - } - } - }, - - // Don't automatically add "px" to these possibly-unitless properties - cssNumber: { - "animationIterationCount": true, - "columnCount": true, - "fillOpacity": true, - "flexGrow": true, - "flexShrink": true, - "fontWeight": true, - "gridArea": true, - "gridColumn": true, - "gridColumnEnd": true, - "gridColumnStart": true, - "gridRow": true, - "gridRowEnd": true, - "gridRowStart": true, - "lineHeight": true, - "opacity": true, - "order": true, - "orphans": true, - "widows": true, - "zIndex": true, - "zoom": true - }, - - // Add in properties whose names you wish to fix before - // setting or getting the value - cssProps: {}, - - // Get and set the style property on a DOM Node - style: function ( elem, name, value, extra ) { - - // Don't set styles on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { - return; - } - - // Make sure that we're working with the right name - var ret, type, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ), - style = elem.style; - - // Make sure that we're working with the right name. We don't - // want to query the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Gets hook for the prefixed version, then unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // Check if we're setting a value - if ( value !== undefined ) { - type = typeof value; - - // Convert "+=" or "-=" to relative numbers (#7345) - if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { - value = adjustCSS( elem, name, ret ); - - // Fixes bug #9237 - type = "number"; - } - - // Make sure that null and NaN values aren't set (#7116) - if ( value == null || value !== value ) { - return; - } - - // If a number was passed in, add the unit (except for certain CSS properties) - // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append - // "px" to a few hardcoded values. - if ( type === "number" && !isCustomProp ) { - value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); - } - - // background-* props affect original clone's values - if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { - style[ name ] = "inherit"; - } - - // If a hook was provided, use that value, otherwise just set the specified value - if ( !hooks || !( "set" in hooks ) || - ( value = hooks.set( elem, value, extra ) ) !== undefined ) { - - if ( isCustomProp ) { - style.setProperty( name, value ); - } else { - style[ name ] = value; - } - } - - } else { - - // If a hook was provided get the non-computed value from there - if ( hooks && "get" in hooks && - ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { - - return ret; - } - - // Otherwise just get the value from the style object - return style[ name ]; - } - }, - - css: function ( elem, name, extra, styles ) { - var val, num, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ); - - // Make sure that we're working with the right name. We don't - // want to modify the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Try prefixed name followed by the unprefixed name - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // If a hook was provided get the computed value from there - if ( hooks && "get" in hooks ) { - val = hooks.get( elem, true, extra ); - } - - // Otherwise, if a way to get the computed value exists, use that - if ( val === undefined ) { - val = curCSS( elem, name, styles ); - } - - // Convert "normal" to computed value - if ( val === "normal" && name in cssNormalTransform ) { - val = cssNormalTransform[ name ]; - } - - // Make numeric if forced or a qualifier was provided and val looks numeric - if ( extra === "" || extra ) { - num = parseFloat( val ); - return extra === true || isFinite( num ) ? num || 0 : val; - } - - return val; - } - } ); - - jQuery.each( [ "height", "width" ], function ( _i, dimension ) { - jQuery.cssHooks[ dimension ] = { - get: function ( elem, computed, extra ) { - if ( computed ) { - - // Certain elements can have dimension info if we invisibly show them - // but it must have a current display style that would benefit - return rdisplayswap.test( jQuery.css( elem, "display" ) ) && - - // Support: Safari 8+ - // Table columns in Safari have non-zero offsetWidth & zero - // getBoundingClientRect().width unless display is changed. - // Support: IE <=11 only - // Running getBoundingClientRect on a disconnected node - // in IE throws an error. - ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? - swap( elem, cssShow, function () { - return getWidthOrHeight( elem, dimension, extra ); - } ) : - getWidthOrHeight( elem, dimension, extra ); - } - }, - - set: function ( elem, value, extra ) { - var matches, - styles = getStyles( elem ), - - // Only read styles.position if the test has a chance to fail - // to avoid forcing a reflow. - scrollboxSizeBuggy = !support.scrollboxSize() && - styles.position === "absolute", - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) - boxSizingNeeded = scrollboxSizeBuggy || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - subtract = extra ? - boxModelAdjustment( - elem, - dimension, - extra, - isBorderBox, - styles - ) : - 0; - - // Account for unreliable border-box dimensions by comparing offset* to computed and - // faking a content-box to get border and padding (gh-3699) - if ( isBorderBox && scrollboxSizeBuggy ) { - subtract -= Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - parseFloat( styles[ dimension ] ) - - boxModelAdjustment( elem, dimension, "border", false, styles ) - - 0.5 - ); - } - - // Convert to pixels if value adjustment is needed - if ( subtract && ( matches = rcssNum.exec( value ) ) && - ( matches[ 3 ] || "px" ) !== "px" ) { - - elem.style[ dimension ] = value; - value = jQuery.css( elem, dimension ); - } - - return setPositiveNumber( elem, value, subtract ); - } - }; - } ); - - jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, - function ( elem, computed ) { - if ( computed ) { - return ( parseFloat( curCSS( elem, "marginLeft" ) ) || - elem.getBoundingClientRect().left - - swap( elem, { - marginLeft: 0 - }, function () { - return elem.getBoundingClientRect().left; - } ) - ) + "px"; - } - } - ); - - // These hooks are used by animate to expand properties - jQuery.each( { - margin: "", - padding: "", - border: "Width" - }, function ( prefix, suffix ) { - jQuery.cssHooks[ prefix + suffix ] = { - expand: function ( value ) { - var i = 0, - expanded = {}, - - // Assumes a single number if not a string - parts = typeof value === "string" ? value.split( " " ) : [ value ]; - - for ( ; i < 4; i++ ) { - expanded[ prefix + cssExpand[ i ] + suffix ] = - parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; - } - - return expanded; - } - }; - - if ( prefix !== "margin" ) { - jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; - } - } ); - - jQuery.fn.extend( { - css: function ( name, value ) { - return access( this, function ( elem, name, value ) { - var styles, len, - map = {}, - i = 0; - - if ( Array.isArray( name ) ) { - styles = getStyles( elem ); - len = name.length; - - for ( ; i < len; i++ ) { - map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); - } - - return map; - } - - return value !== undefined ? - jQuery.style( elem, name, value ) : - jQuery.css( elem, name ); - }, name, value, arguments.length > 1 ); - } - } ); - - - function Tween( elem, options, prop, end, easing ) { - return new Tween.prototype.init( elem, options, prop, end, easing ); - } - jQuery.Tween = Tween; - - Tween.prototype = { - constructor: Tween, - init: function ( elem, options, prop, end, easing, unit ) { - this.elem = elem; - this.prop = prop; - this.easing = easing || jQuery.easing._default; - this.options = options; - this.start = this.now = this.cur(); - this.end = end; - this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); - }, - cur: function () { - var hooks = Tween.propHooks[ this.prop ]; - - return hooks && hooks.get ? - hooks.get( this ) : - Tween.propHooks._default.get( this ); - }, - run: function ( percent ) { - var eased, - hooks = Tween.propHooks[ this.prop ]; - - if ( this.options.duration ) { - this.pos = eased = jQuery.easing[ this.easing ]( - percent, this.options.duration * percent, 0, 1, this.options.duration - ); - } else { - this.pos = eased = percent; - } - this.now = ( this.end - this.start ) * eased + this.start; - - if ( this.options.step ) { - this.options.step.call( this.elem, this.now, this ); - } - - if ( hooks && hooks.set ) { - hooks.set( this ); - } else { - Tween.propHooks._default.set( this ); - } - return this; - } - }; - - Tween.prototype.init.prototype = Tween.prototype; - - Tween.propHooks = { - _default: { - get: function ( tween ) { - var result; - - // Use a property on the element directly when it is not a DOM element, - // or when there is no matching style property that exists. - if ( tween.elem.nodeType !== 1 || - tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { - return tween.elem[ tween.prop ]; - } - - // Passing an empty string as a 3rd parameter to .css will automatically - // attempt a parseFloat and fallback to a string if the parse fails. - // Simple values such as "10px" are parsed to Float; - // complex values such as "rotate(1rad)" are returned as-is. - result = jQuery.css( tween.elem, tween.prop, "" ); - - // Empty strings, null, undefined and "auto" are converted to 0. - return !result || result === "auto" ? 0 : result; - }, - set: function ( tween ) { - - // Use step hook for back compat. - // Use cssHook if its there. - // Use .style if available and use plain properties where available. - if ( jQuery.fx.step[ tween.prop ] ) { - jQuery.fx.step[ tween.prop ]( tween ); - } else if ( tween.elem.nodeType === 1 && ( - jQuery.cssHooks[ tween.prop ] || - tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { - jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); - } else { - tween.elem[ tween.prop ] = tween.now; - } - } - } - }; - - // Support: IE <=9 only - // Panic based approach to setting things on disconnected nodes - Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { - set: function ( tween ) { - if ( tween.elem.nodeType && tween.elem.parentNode ) { - tween.elem[ tween.prop ] = tween.now; - } - } - }; - - jQuery.easing = { - linear: function ( p ) { - return p; - }, - swing: function ( p ) { - return 0.5 - Math.cos( p * Math.PI ) / 2; - }, - _default: "swing" - }; - - jQuery.fx = Tween.prototype.init; - - // Back compat <1.8 extension point - jQuery.fx.step = {}; - - - - - var - fxNow, inProgress, - rfxtypes = /^(?:toggle|show|hide)$/, - rrun = /queueHooks$/; - - function schedule() { - if ( inProgress ) { - if ( document.hidden === false && window.requestAnimationFrame ) { - window.requestAnimationFrame( schedule ); - } else { - window.setTimeout( schedule, jQuery.fx.interval ); - } - - jQuery.fx.tick(); - } - } - - // Animations created synchronously will run synchronously - function createFxNow() { - window.setTimeout( function () { - fxNow = undefined; - } ); - return ( fxNow = Date.now() ); - } - - // Generate parameters to create a standard animation - function genFx( type, includeWidth ) { - var which, - i = 0, - attrs = { - height: type - }; - - // If we include width, step value is 1 to do all cssExpand values, - // otherwise step value is 2 to skip over Left and Right - includeWidth = includeWidth ? 1 : 0; - for ( ; i < 4; i += 2 - includeWidth ) { - which = cssExpand[ i ]; - attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; - } - - if ( includeWidth ) { - attrs.opacity = attrs.width = type; - } - - return attrs; - } - - function createTween( value, prop, animation ) { - var tween, - collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), - index = 0, - length = collection.length; - for ( ; index < length; index++ ) { - if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { - - // We're done with this property - return tween; - } - } - } - - function defaultPrefilter( elem, props, opts ) { - var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, - isBox = "width" in props || "height" in props, - anim = this, - orig = {}, - style = elem.style, - hidden = elem.nodeType && isHiddenWithinTree( elem ), - dataShow = dataPriv.get( elem, "fxshow" ); - - // Queue-skipping animations hijack the fx hooks - if ( !opts.queue ) { - hooks = jQuery._queueHooks( elem, "fx" ); - if ( hooks.unqueued == null ) { - hooks.unqueued = 0; - oldfire = hooks.empty.fire; - hooks.empty.fire = function () { - if ( !hooks.unqueued ) { - oldfire(); - } - }; - } - hooks.unqueued++; - - anim.always( function () { - - // Ensure the complete handler is called before this completes - anim.always( function () { - hooks.unqueued--; - if ( !jQuery.queue( elem, "fx" ).length ) { - hooks.empty.fire(); - } - } ); - } ); - } - - // Detect show/hide animations - for ( prop in props ) { - value = props[ prop ]; - if ( rfxtypes.test( value ) ) { - delete props[ prop ]; - toggle = toggle || value === "toggle"; - if ( value === ( hidden ? "hide" : "show" ) ) { - - // Pretend to be hidden if this is a "show" and - // there is still data from a stopped show/hide - if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { - hidden = true; - - // Ignore all other no-op show/hide data - } else { - continue; - } - } - orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); - } - } - - // Bail out if this is a no-op like .hide().hide() - propTween = !jQuery.isEmptyObject( props ); - if ( !propTween && jQuery.isEmptyObject( orig ) ) { - return; - } - - // Restrict "overflow" and "display" styles during box animations - if ( isBox && elem.nodeType === 1 ) { - - // Support: IE <=9 - 11, Edge 12 - 15 - // Record all 3 overflow attributes because IE does not infer the shorthand - // from identically-valued overflowX and overflowY and Edge just mirrors - // the overflowX value there. - opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; - - // Identify a display type, preferring old show/hide data over the CSS cascade - restoreDisplay = dataShow && dataShow.display; - if ( restoreDisplay == null ) { - restoreDisplay = dataPriv.get( elem, "display" ); - } - display = jQuery.css( elem, "display" ); - if ( display === "none" ) { - if ( restoreDisplay ) { - display = restoreDisplay; - } else { - - // Get nonempty value(s) by temporarily forcing visibility - showHide( [ elem ], true ); - restoreDisplay = elem.style.display || restoreDisplay; - display = jQuery.css( elem, "display" ); - showHide( [ elem ] ); - } - } - - // Animate inline elements as inline-block - if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { - if ( jQuery.css( elem, "float" ) === "none" ) { - - // Restore the original display value at the end of pure show/hide animations - if ( !propTween ) { - anim.done( function () { - style.display = restoreDisplay; - } ); - if ( restoreDisplay == null ) { - display = style.display; - restoreDisplay = display === "none" ? "" : display; - } - } - style.display = "inline-block"; - } - } - } - - if ( opts.overflow ) { - style.overflow = "hidden"; - anim.always( function () { - style.overflow = opts.overflow[ 0 ]; - style.overflowX = opts.overflow[ 1 ]; - style.overflowY = opts.overflow[ 2 ]; - } ); - } - - // Implement show/hide animations - propTween = false; - for ( prop in orig ) { - - // General show/hide setup for this element animation - if ( !propTween ) { - if ( dataShow ) { - if ( "hidden" in dataShow ) { - hidden = dataShow.hidden; - } - } else { - dataShow = dataPriv.access( elem, "fxshow", { - display: restoreDisplay - } ); - } - - // Store hidden/visible for toggle so `.stop().toggle()` "reverses" - if ( toggle ) { - dataShow.hidden = !hidden; - } - - // Show elements before animating them - if ( hidden ) { - showHide( [ elem ], true ); - } - - /* eslint-disable no-loop-func */ - - anim.done( function () { - - /* eslint-enable no-loop-func */ - - // The final step of a "hide" animation is actually hiding the element - if ( !hidden ) { - showHide( [ elem ] ); - } - dataPriv.remove( elem, "fxshow" ); - for ( prop in orig ) { - jQuery.style( elem, prop, orig[ prop ] ); - } - } ); - } - - // Per-property setup - propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); - if ( !( prop in dataShow ) ) { - dataShow[ prop ] = propTween.start; - if ( hidden ) { - propTween.end = propTween.start; - propTween.start = 0; - } - } - } - } - - function propFilter( props, specialEasing ) { - var index, name, easing, value, hooks; - - // camelCase, specialEasing and expand cssHook pass - for ( index in props ) { - name = camelCase( index ); - easing = specialEasing[ name ]; - value = props[ index ]; - if ( Array.isArray( value ) ) { - easing = value[ 1 ]; - value = props[ index ] = value[ 0 ]; - } - - if ( index !== name ) { - props[ name ] = value; - delete props[ index ]; - } - - hooks = jQuery.cssHooks[ name ]; - if ( hooks && "expand" in hooks ) { - value = hooks.expand( value ); - delete props[ name ]; - - // Not quite $.extend, this won't overwrite existing keys. - // Reusing 'index' because we have the correct "name" - for ( index in value ) { - if ( !( index in props ) ) { - props[ index ] = value[ index ]; - specialEasing[ index ] = easing; - } - } - } else { - specialEasing[ name ] = easing; - } - } - } - - function Animation( elem, properties, options ) { - var result, - stopped, - index = 0, - length = Animation.prefilters.length, - deferred = jQuery.Deferred().always( function () { - - // Don't match elem in the :animated selector - delete tick.elem; - } ), - tick = function () { - if ( stopped ) { - return false; - } - var currentTime = fxNow || createFxNow(), - remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), - - // Support: Android 2.3 only - // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) - temp = remaining / animation.duration || 0, - percent = 1 - temp, - index = 0, - length = animation.tweens.length; - - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( percent ); - } - - deferred.notifyWith( elem, [ animation, percent, remaining ] ); - - // If there's more to do, yield - if ( percent < 1 && length ) { - return remaining; - } - - // If this was an empty animation, synthesize a final progress notification - if ( !length ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - } - - // Resolve the animation and report its conclusion - deferred.resolveWith( elem, [ animation ] ); - return false; - }, - animation = deferred.promise( { - elem: elem, - props: jQuery.extend( {}, properties ), - opts: jQuery.extend( true, { - specialEasing: {}, - easing: jQuery.easing._default - }, options ), - originalProperties: properties, - originalOptions: options, - startTime: fxNow || createFxNow(), - duration: options.duration, - tweens: [], - createTween: function ( prop, end ) { - var tween = jQuery.Tween( elem, animation.opts, prop, end, - animation.opts.specialEasing[ prop ] || animation.opts.easing ); - animation.tweens.push( tween ); - return tween; - }, - stop: function ( gotoEnd ) { - var index = 0, - - // If we are going to the end, we want to run all the tweens - // otherwise we skip this part - length = gotoEnd ? animation.tweens.length : 0; - if ( stopped ) { - return this; - } - stopped = true; - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( 1 ); - } - - // Resolve when we played the last frame; otherwise, reject - if ( gotoEnd ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - deferred.resolveWith( elem, [ animation, gotoEnd ] ); - } else { - deferred.rejectWith( elem, [ animation, gotoEnd ] ); - } - return this; - } - } ), - props = animation.props; - - propFilter( props, animation.opts.specialEasing ); - - for ( ; index < length; index++ ) { - result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); - if ( result ) { - if ( isFunction( result.stop ) ) { - jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = - result.stop.bind( result ); - } - return result; - } - } - - jQuery.map( props, createTween, animation ); - - if ( isFunction( animation.opts.start ) ) { - animation.opts.start.call( elem, animation ); - } - - // Attach callbacks from options - animation - .progress( animation.opts.progress ) - .done( animation.opts.done, animation.opts.complete ) - .fail( animation.opts.fail ) - .always( animation.opts.always ); - - jQuery.fx.timer( - jQuery.extend( tick, { - elem: elem, - anim: animation, - queue: animation.opts.queue - } ) - ); - - return animation; - } - - jQuery.Animation = jQuery.extend( Animation, { - - tweeners: { - "*": [ function ( prop, value ) { - var tween = this.createTween( prop, value ); - adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); - return tween; - } ] - }, - - tweener: function ( props, callback ) { - if ( isFunction( props ) ) { - callback = props; - props = [ "*" ]; - } else { - props = props.match( rnothtmlwhite ); - } - - var prop, - index = 0, - length = props.length; - - for ( ; index < length; index++ ) { - prop = props[ index ]; - Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; - Animation.tweeners[ prop ].unshift( callback ); - } - }, - - prefilters: [ defaultPrefilter ], - - prefilter: function ( callback, prepend ) { - if ( prepend ) { - Animation.prefilters.unshift( callback ); - } else { - Animation.prefilters.push( callback ); - } - } - } ); - - jQuery.speed = function ( speed, easing, fn ) { - var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { - complete: fn || !fn && easing || - isFunction( speed ) && speed, - duration: speed, - easing: fn && easing || easing && !isFunction( easing ) && easing - }; - - // Go to the end state if fx are off - if ( jQuery.fx.off ) { - opt.duration = 0; - - } else { - if ( typeof opt.duration !== "number" ) { - if ( opt.duration in jQuery.fx.speeds ) { - opt.duration = jQuery.fx.speeds[ opt.duration ]; - - } else { - opt.duration = jQuery.fx.speeds._default; - } - } - } - - // Normalize opt.queue - true/undefined/null -> "fx" - if ( opt.queue == null || opt.queue === true ) { - opt.queue = "fx"; - } - - // Queueing - opt.old = opt.complete; - - opt.complete = function () { - if ( isFunction( opt.old ) ) { - opt.old.call( this ); - } - - if ( opt.queue ) { - jQuery.dequeue( this, opt.queue ); - } - }; - - return opt; - }; - - jQuery.fn.extend( { - fadeTo: function ( speed, to, easing, callback ) { - - // Show any hidden elements after setting opacity to 0 - return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() - - // Animate to the value specified - .end().animate( { - opacity: to - }, speed, easing, callback ); - }, - animate: function ( prop, speed, easing, callback ) { - var empty = jQuery.isEmptyObject( prop ), - optall = jQuery.speed( speed, easing, callback ), - doAnimation = function () { - - // Operate on a copy of prop so per-property easing won't be lost - var anim = Animation( this, jQuery.extend( {}, prop ), optall ); - - // Empty animations, or finishing resolves immediately - if ( empty || dataPriv.get( this, "finish" ) ) { - anim.stop( true ); - } - }; - doAnimation.finish = doAnimation; - - return empty || optall.queue === false ? - this.each( doAnimation ) : - this.queue( optall.queue, doAnimation ); - }, - stop: function ( type, clearQueue, gotoEnd ) { - var stopQueue = function ( hooks ) { - var stop = hooks.stop; - delete hooks.stop; - stop( gotoEnd ); - }; - - if ( typeof type !== "string" ) { - gotoEnd = clearQueue; - clearQueue = type; - type = undefined; - } - if ( clearQueue ) { - this.queue( type || "fx", [] ); - } - - return this.each( function () { - var dequeue = true, - index = type != null && type + "queueHooks", - timers = jQuery.timers, - data = dataPriv.get( this ); - - if ( index ) { - if ( data[ index ] && data[ index ].stop ) { - stopQueue( data[ index ] ); - } - } else { - for ( index in data ) { - if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { - stopQueue( data[ index ] ); - } - } - } - - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && - ( type == null || timers[ index ].queue === type ) ) { - - timers[ index ].anim.stop( gotoEnd ); - dequeue = false; - timers.splice( index, 1 ); - } - } - - // Start the next in the queue if the last step wasn't forced. - // Timers currently will call their complete callbacks, which - // will dequeue but only if they were gotoEnd. - if ( dequeue || !gotoEnd ) { - jQuery.dequeue( this, type ); - } - } ); - }, - finish: function ( type ) { - if ( type !== false ) { - type = type || "fx"; - } - return this.each( function () { - var index, - data = dataPriv.get( this ), - queue = data[ type + "queue" ], - hooks = data[ type + "queueHooks" ], - timers = jQuery.timers, - length = queue ? queue.length : 0; - - // Enable finishing flag on private data - data.finish = true; - - // Empty the queue first - jQuery.queue( this, type, [] ); - - if ( hooks && hooks.stop ) { - hooks.stop.call( this, true ); - } - - // Look for any active animations, and finish them - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && timers[ index ].queue === type ) { - timers[ index ].anim.stop( true ); - timers.splice( index, 1 ); - } - } - - // Look for any animations in the old queue and finish them - for ( index = 0; index < length; index++ ) { - if ( queue[ index ] && queue[ index ].finish ) { - queue[ index ].finish.call( this ); - } - } - - // Turn off finishing flag - delete data.finish; - } ); - } - } ); - - jQuery.each( [ "toggle", "show", "hide" ], function ( _i, name ) { - var cssFn = jQuery.fn[ name ]; - jQuery.fn[ name ] = function ( speed, easing, callback ) { - return speed == null || typeof speed === "boolean" ? - cssFn.apply( this, arguments ) : - this.animate( genFx( name, true ), speed, easing, callback ); - }; - } ); - - // Generate shortcuts for custom animations - jQuery.each( { - slideDown: genFx( "show" ), - slideUp: genFx( "hide" ), - slideToggle: genFx( "toggle" ), - fadeIn: { - opacity: "show" - }, - fadeOut: { - opacity: "hide" - }, - fadeToggle: { - opacity: "toggle" - } - }, function ( name, props ) { - jQuery.fn[ name ] = function ( speed, easing, callback ) { - return this.animate( props, speed, easing, callback ); - }; - } ); - - jQuery.timers = []; - jQuery.fx.tick = function () { - var timer, - i = 0, - timers = jQuery.timers; - - fxNow = Date.now(); - - for ( ; i < timers.length; i++ ) { - timer = timers[ i ]; - - // Run the timer and safely remove it when done (allowing for external removal) - if ( !timer() && timers[ i ] === timer ) { - timers.splice( i--, 1 ); - } - } - - if ( !timers.length ) { - jQuery.fx.stop(); - } - fxNow = undefined; - }; - - jQuery.fx.timer = function ( timer ) { - jQuery.timers.push( timer ); - jQuery.fx.start(); - }; - - jQuery.fx.interval = 13; - jQuery.fx.start = function () { - if ( inProgress ) { - return; - } - - inProgress = true; - schedule(); - }; - - jQuery.fx.stop = function () { - inProgress = null; - }; - - jQuery.fx.speeds = { - slow: 600, - fast: 200, - - // Default speed - _default: 400 - }; - - - // Based off of the plugin by Clint Helfers, with permission. - // https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ - jQuery.fn.delay = function ( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function ( next, hooks ) { - var timeout = window.setTimeout( next, time ); - hooks.stop = function () { - window.clearTimeout( timeout ); - }; - } ); - }; - - - ( function () { - var input = document.createElement( "input" ), - select = document.createElement( "select" ), - opt = select.appendChild( document.createElement( "option" ) ); - - input.type = "checkbox"; - - // Support: Android <=4.3 only - // Default value for a checkbox should be "on" - support.checkOn = input.value !== ""; - - // Support: IE <=11 only - // Must access selectedIndex to make default options select - support.optSelected = opt.selected; - - // Support: IE <=11 only - // An input loses its value after becoming a radio - input = document.createElement( "input" ); - input.value = "t"; - input.type = "radio"; - support.radioValue = input.value === "t"; - } )(); - - - var boolHook, - attrHandle = jQuery.expr.attrHandle; - - jQuery.fn.extend( { - attr: function ( name, value ) { - return access( this, jQuery.attr, name, value, arguments.length > 1 ); - }, - - removeAttr: function ( name ) { - return this.each( function () { - jQuery.removeAttr( this, name ); - } ); - } - } ); - - jQuery.extend( { - attr: function ( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set attributes on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === "undefined" ) { - return jQuery.prop( elem, name, value ); - } - - // Attribute hooks are determined by the lowercase version - // Grab necessary hook if one is defined - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - hooks = jQuery.attrHooks[ name.toLowerCase() ] || - ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); - } - - if ( value !== undefined ) { - if ( value === null ) { - jQuery.removeAttr( elem, name ); - return; - } - - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - elem.setAttribute( name, value + "" ); - return value; - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - ret = jQuery.find.attr( elem, name ); - - // Non-existent attributes return null, we normalize to undefined - return ret == null ? undefined : ret; - }, - - attrHooks: { - type: { - set: function ( elem, value ) { - if ( !support.radioValue && value === "radio" && - nodeName( elem, "input" ) ) { - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - } - }, - - removeAttr: function ( elem, value ) { - var name, - i = 0, - - // Attribute names can contain non-HTML whitespace characters - // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 - attrNames = value && value.match( rnothtmlwhite ); - - if ( attrNames && elem.nodeType === 1 ) { - while ( ( name = attrNames[ i++ ] ) ) { - elem.removeAttribute( name ); - } - } - } - } ); - - // Hooks for boolean attributes - boolHook = { - set: function ( elem, value, name ) { - if ( value === false ) { - - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - elem.setAttribute( name, name ); - } - return name; - } - }; - - jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function ( _i, name ) { - var getter = attrHandle[ name ] || jQuery.find.attr; - - attrHandle[ name ] = function ( elem, name, isXML ) { - var ret, handle, - lowercaseName = name.toLowerCase(); - - if ( !isXML ) { - - // Avoid an infinite loop by temporarily removing this function from the getter - handle = attrHandle[ lowercaseName ]; - attrHandle[ lowercaseName ] = ret; - ret = getter( elem, name, isXML ) != null ? - lowercaseName : - null; - attrHandle[ lowercaseName ] = handle; - } - return ret; - }; - } ); - - - - - var rfocusable = /^(?:input|select|textarea|button)$/i, - rclickable = /^(?:a|area)$/i; - - jQuery.fn.extend( { - prop: function ( name, value ) { - return access( this, jQuery.prop, name, value, arguments.length > 1 ); - }, - - removeProp: function ( name ) { - return this.each( function () { - delete this[ jQuery.propFix[ name ] || name ]; - } ); - } - } ); - - jQuery.extend( { - prop: function ( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set properties on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - return ( elem[ name ] = value ); - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - return elem[ name ]; - }, - - propHooks: { - tabIndex: { - get: function ( elem ) { - - // Support: IE <=9 - 11 only - // elem.tabIndex doesn't always return the - // correct value when it hasn't been explicitly set - // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - // Use proper attribute retrieval(#12072) - var tabindex = jQuery.find.attr( elem, "tabindex" ); - - if ( tabindex ) { - return parseInt( tabindex, 10 ); - } - - if ( - rfocusable.test( elem.nodeName ) || - rclickable.test( elem.nodeName ) && - elem.href - ) { - return 0; - } - - return -1; - } - } - }, - - propFix: { - "for": "htmlFor", - "class": "className" - } - } ); - - // Support: IE <=11 only - // Accessing the selectedIndex property - // forces the browser to respect setting selected - // on the option - // The getter ensures a default option is selected - // when in an optgroup - // eslint rule "no-unused-expressions" is disabled for this code - // since it considers such accessions noop - if ( !support.optSelected ) { - jQuery.propHooks.selected = { - get: function ( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent && parent.parentNode ) { - parent.parentNode.selectedIndex; - } - return null; - }, - set: function ( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent ) { - parent.selectedIndex; - - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - } - }; - } - - jQuery.each( [ - "tabIndex", - "readOnly", - "maxLength", - "cellSpacing", - "cellPadding", - "rowSpan", - "colSpan", - "useMap", - "frameBorder", - "contentEditable" - ], function () { - jQuery.propFix[ this.toLowerCase() ] = this; - } ); - - - - - // Strip and collapse whitespace according to HTML spec - // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace - function stripAndCollapse( value ) { - var tokens = value.match( rnothtmlwhite ) || []; - return tokens.join( " " ); - } - - - function getClass( elem ) { - return elem.getAttribute && elem.getAttribute( "class" ) || ""; - } - - function classesToArray( value ) { - if ( Array.isArray( value ) ) { - return value; - } - if ( typeof value === "string" ) { - return value.match( rnothtmlwhite ) || []; - } - return []; - } - - jQuery.fn.extend( { - addClass: function ( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function ( j ) { - jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - if ( cur.indexOf( " " + clazz + " " ) < 0 ) { - cur += clazz + " "; - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - removeClass: function ( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function ( j ) { - jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( !arguments.length ) { - return this.attr( "class", "" ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - - // This expression is here for better compressibility (see addClass) - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - - // Remove *all* instances - while ( cur.indexOf( " " + clazz + " " ) > -1 ) { - cur = cur.replace( " " + clazz + " ", " " ); - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - toggleClass: function ( value, stateVal ) { - var type = typeof value, - isValidValue = type === "string" || Array.isArray( value ); - - if ( typeof stateVal === "boolean" && isValidValue ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - - if ( isFunction( value ) ) { - return this.each( function ( i ) { - jQuery( this ).toggleClass( - value.call( this, i, getClass( this ), stateVal ), - stateVal - ); - } ); - } - - return this.each( function () { - var className, i, self, classNames; - - if ( isValidValue ) { - - // Toggle individual class names - i = 0; - self = jQuery( this ); - classNames = classesToArray( value ); - - while ( ( className = classNames[ i++ ] ) ) { - - // Check each className given, space separated list - if ( self.hasClass( className ) ) { - self.removeClass( className ); - } else { - self.addClass( className ); - } - } - - // Toggle whole class name - } else if ( value === undefined || type === "boolean" ) { - className = getClass( this ); - if ( className ) { - - // Store className if set - dataPriv.set( this, "__className__", className ); - } - - // If the element has a class name or if we're passed `false`, - // then remove the whole classname (if there was one, the above saved it). - // Otherwise bring back whatever was previously saved (if anything), - // falling back to the empty string if nothing was stored. - if ( this.setAttribute ) { - this.setAttribute( "class", - className || value === false ? - "" : - dataPriv.get( this, "__className__" ) || "" - ); - } - } - } ); - }, - - hasClass: function ( selector ) { - var className, elem, - i = 0; - - className = " " + selector + " "; - while ( ( elem = this[ i++ ] ) ) { - if ( elem.nodeType === 1 && - ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { - return true; - } - } - - return false; - } - } ); - - - - - var rreturn = /\r/g; - - jQuery.fn.extend( { - val: function ( value ) { - var hooks, ret, valueIsFunction, - elem = this[ 0 ]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.type ] || - jQuery.valHooks[ elem.nodeName.toLowerCase() ]; - - if ( hooks && - "get" in hooks && - ( ret = hooks.get( elem, "value" ) ) !== undefined - ) { - return ret; - } - - ret = elem.value; - - // Handle most common string cases - if ( typeof ret === "string" ) { - return ret.replace( rreturn, "" ); - } - - // Handle cases where value is null/undef or number - return ret == null ? "" : ret; - } - - return; - } - - valueIsFunction = isFunction( value ); - - return this.each( function ( i ) { - var val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( valueIsFunction ) { - val = value.call( this, i, jQuery( this ).val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - - } else if ( typeof val === "number" ) { - val += ""; - - } else if ( Array.isArray( val ) ) { - val = jQuery.map( val, function ( value ) { - return value == null ? "" : value + ""; - } ); - } - - hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - } ); - } - } ); - - jQuery.extend( { - valHooks: { - option: { - get: function ( elem ) { - - var val = jQuery.find.attr( elem, "value" ); - return val != null ? - val : - - // Support: IE <=10 - 11 only - // option.text throws exceptions (#14686, #14858) - // Strip and collapse whitespace - // https://html.spec.whatwg.org/#strip-and-collapse-whitespace - stripAndCollapse( jQuery.text( elem ) ); - } - }, - select: { - get: function ( elem ) { - var value, option, i, - options = elem.options, - index = elem.selectedIndex, - one = elem.type === "select-one", - values = one ? null : [], - max = one ? index + 1 : options.length; - - if ( index < 0 ) { - i = max; - - } else { - i = one ? index : 0; - } - - // Loop through all the selected options - for ( ; i < max; i++ ) { - option = options[ i ]; - - // Support: IE <=9 only - // IE8-9 doesn't update selected after form reset (#2551) - if ( ( option.selected || i === index ) && - - // Don't return options that are disabled or in a disabled optgroup - !option.disabled && - ( !option.parentNode.disabled || - !nodeName( option.parentNode, "optgroup" ) ) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - }, - - set: function ( elem, value ) { - var optionSet, option, - options = elem.options, - values = jQuery.makeArray( value ), - i = options.length; - - while ( i-- ) { - option = options[ i ]; - - /* eslint-disable no-cond-assign */ - - if ( option.selected = - jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 - ) { - optionSet = true; - } - - /* eslint-enable no-cond-assign */ - } - - // Force browsers to behave consistently when non-matching value is set - if ( !optionSet ) { - elem.selectedIndex = -1; - } - return values; - } - } - } - } ); - - // Radios and checkboxes getter/setter - jQuery.each( [ "radio", "checkbox" ], function () { - jQuery.valHooks[ this ] = { - set: function ( elem, value ) { - if ( Array.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); - } - } - }; - if ( !support.checkOn ) { - jQuery.valHooks[ this ].get = function ( elem ) { - return elem.getAttribute( "value" ) === null ? "on" : elem.value; - }; - } - } ); - - - - - // Return jQuery for attributes-only inclusion - - - support.focusin = "onfocusin" in window; - - - var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - stopPropagationCallback = function ( e ) { - e.stopPropagation(); - }; - - jQuery.extend( jQuery.event, { - - trigger: function ( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; - - cur = lastElement = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf( "." ) > -1 ) { - - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split( "." ); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf( ":" ) < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join( "." ); - event.rnamespace = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === ( elem.ownerDocument || document ) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { - lastElement = cur; - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( - dataPriv.get( cur, "events" ) || Object.create( null ) - )[ event.type ] && - dataPriv.get( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && handle.apply && acceptData( cur ) ) { - event.result = handle.apply( cur, data ); - if ( event.result === false ) { - event.preventDefault(); - } - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( ( !special._default || - special._default.apply( eventPath.pop(), data ) === false ) && - acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name as the event. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - - if ( event.isPropagationStopped() ) { - lastElement.addEventListener( type, stopPropagationCallback ); - } - - elem[ type ](); - - if ( event.isPropagationStopped() ) { - lastElement.removeEventListener( type, stopPropagationCallback ); - } - - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - // Piggyback on a donor event to simulate a different one - // Used only for `focus(in | out)` events - simulate: function ( type, elem, event ) { - var e = jQuery.extend( - new jQuery.Event(), - event, { - type: type, - isSimulated: true - } - ); - - jQuery.event.trigger( e, null, elem ); - } - - } ); - - jQuery.fn.extend( { - - trigger: function ( type, data ) { - return this.each( function () { - jQuery.event.trigger( type, data, this ); - } ); - }, - triggerHandler: function ( type, data ) { - var elem = this[ 0 ]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } - } ); - - - // Support: Firefox <=44 - // Firefox doesn't have focus(in | out) events - // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 - // - // Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 - // focus(in | out) events fire after focus & blur events, - // which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order - // Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 - if ( !support.focusin ) { - jQuery.each( { - focus: "focusin", - blur: "focusout" - }, function ( orig, fix ) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function ( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); - }; - - jQuery.event.special[ fix ] = { - setup: function () { - - // Handle: regular nodes (via `this.ownerDocument`), window - // (via `this.document`) & document (via `this`). - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ); - - if ( !attaches ) { - doc.addEventListener( orig, handler, true ); - } - dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); - }, - teardown: function () { - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ) - 1; - - if ( !attaches ) { - doc.removeEventListener( orig, handler, true ); - dataPriv.remove( doc, fix ); - - } else { - dataPriv.access( doc, fix, attaches ); - } - } - }; - } ); - } - var location = window.location; - - var nonce = { - guid: Date.now() - }; - - var rquery = ( /\?/ ); - - - - // Cross-browser xml parsing - jQuery.parseXML = function ( data ) { - var xml; - if ( !data || typeof data !== "string" ) { - return null; - } - - // Support: IE 9 - 11 only - // IE throws on parseFromString with invalid input. - try { - xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); - } catch ( e ) { - xml = undefined; - } - - if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { - jQuery.error( "Invalid XML: " + data ); - } - return xml; - }; - - - var - rbracket = /\[\]$/, - rCRLF = /\r?\n/g, - rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, - rsubmittable = /^(?:input|select|textarea|keygen)/i; - - function buildParams( prefix, obj, traditional, add ) { - var name; - - if ( Array.isArray( obj ) ) { - - // Serialize array item. - jQuery.each( obj, function ( i, v ) { - if ( traditional || rbracket.test( prefix ) ) { - - // Treat each array item as a scalar. - add( prefix, v ); - - } else { - - // Item is non-scalar (array or object), encode its numeric index. - buildParams( - prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", - v, - traditional, - add - ); - } - } ); - - } else if ( !traditional && toType( obj ) === "object" ) { - - // Serialize object item. - for ( name in obj ) { - buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); - } - - } else { - - // Serialize scalar item. - add( prefix, obj ); - } - } - - // Serialize an array of form elements or a set of - // key/values into a query string - jQuery.param = function ( a, traditional ) { - var prefix, - s = [], - add = function ( key, valueOrFunction ) { - - // If value is a function, invoke it and use its return value - var value = isFunction( valueOrFunction ) ? - valueOrFunction() : - valueOrFunction; - - s[ s.length ] = encodeURIComponent( key ) + "=" + - encodeURIComponent( value == null ? "" : value ); - }; - - if ( a == null ) { - return ""; - } - - // If an array was passed in, assume that it is an array of form elements. - if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { - - // Serialize the form elements - jQuery.each( a, function () { - add( this.name, this.value ); - } ); - - } else { - - // If traditional, encode the "old" way (the way 1.3.2 or older - // did it), otherwise encode params recursively. - for ( prefix in a ) { - buildParams( prefix, a[ prefix ], traditional, add ); - } - } - - // Return the resulting serialization - return s.join( "&" ); - }; - - jQuery.fn.extend( { - serialize: function () { - return jQuery.param( this.serializeArray() ); - }, - serializeArray: function () { - return this.map( function () { - - // Can add propHook for "elements" to filter or add form elements - var elements = jQuery.prop( this, "elements" ); - return elements ? jQuery.makeArray( elements ) : this; - } ) - .filter( function () { - var type = this.type; - - // Use .is( ":disabled" ) so that fieldset[disabled] works - return this.name && !jQuery( this ).is( ":disabled" ) && - rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && - ( this.checked || !rcheckableType.test( type ) ); - } ) - .map( function ( _i, elem ) { - var val = jQuery( this ).val(); - - if ( val == null ) { - return null; - } - - if ( Array.isArray( val ) ) { - return jQuery.map( val, function ( val ) { - return { - name: elem.name, - value: val.replace( rCRLF, "\r\n" ) - }; - } ); - } - - return { - name: elem.name, - value: val.replace( rCRLF, "\r\n" ) - }; - } ).get(); - } - } ); - - - var - r20 = /%20/g, - rhash = /#.*$/, - rantiCache = /([?&])_=[^&]*/, - rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, - - // #7653, #8125, #8152: local protocol detection - rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, - rnoContent = /^(?:GET|HEAD)$/, - rprotocol = /^\/\//, - - /* Prefilters - * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) - * 2) These are called: - * - BEFORE asking for a transport - * - AFTER param serialization (s.data is a string if s.processData is true) - * 3) key is the dataType - * 4) the catchall symbol "*" can be used - * 5) execution will start with transport dataType and THEN continue down to "*" if needed - */ - prefilters = {}, - - /* Transports bindings - * 1) key is the dataType - * 2) the catchall symbol "*" can be used - * 3) selection will start with transport dataType and THEN go to "*" if needed - */ - transports = {}, - - // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression - allTypes = "*/".concat( "*" ), - - // Anchor tag for parsing the document origin - originAnchor = document.createElement( "a" ); - originAnchor.href = location.href; - - // Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport - function addToPrefiltersOrTransports( structure ) { - - // dataTypeExpression is optional and defaults to "*" - return function ( dataTypeExpression, func ) { - - if ( typeof dataTypeExpression !== "string" ) { - func = dataTypeExpression; - dataTypeExpression = "*"; - } - - var dataType, - i = 0, - dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; - - if ( isFunction( func ) ) { - - // For each dataType in the dataTypeExpression - while ( ( dataType = dataTypes[ i++ ] ) ) { - - // Prepend if requested - if ( dataType[ 0 ] === "+" ) { - dataType = dataType.slice( 1 ) || "*"; - ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); - - // Otherwise append - } else { - ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); - } - } - } - }; - } - - // Base inspection function for prefilters and transports - function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { - - var inspected = {}, - seekingTransport = ( structure === transports ); - - function inspect( dataType ) { - var selected; - inspected[ dataType ] = true; - jQuery.each( structure[ dataType ] || [], function ( _, prefilterOrFactory ) { - var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); - if ( typeof dataTypeOrTransport === "string" && - !seekingTransport && !inspected[ dataTypeOrTransport ] ) { - - options.dataTypes.unshift( dataTypeOrTransport ); - inspect( dataTypeOrTransport ); - return false; - } else if ( seekingTransport ) { - return !( selected = dataTypeOrTransport ); - } - } ); - return selected; - } - - return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); - } - - // A special extend for ajax options - // that takes "flat" options (not to be deep extended) - // Fixes #9887 - function ajaxExtend( target, src ) { - var key, deep, - flatOptions = jQuery.ajaxSettings.flatOptions || {}; - - for ( key in src ) { - if ( src[ key ] !== undefined ) { - ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; - } - } - if ( deep ) { - jQuery.extend( true, target, deep ); - } - - return target; - } - - /* Handles responses to an ajax request: - * - finds the right dataType (mediates between content-type and expected dataType) - * - returns the corresponding response - */ - function ajaxHandleResponses( s, jqXHR, responses ) { - - var ct, type, finalDataType, firstDataType, - contents = s.contents, - dataTypes = s.dataTypes; - - // Remove auto dataType and get content-type in the process - while ( dataTypes[ 0 ] === "*" ) { - dataTypes.shift(); - if ( ct === undefined ) { - ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); - } - } - - // Check if we're dealing with a known content-type - if ( ct ) { - for ( type in contents ) { - if ( contents[ type ] && contents[ type ].test( ct ) ) { - dataTypes.unshift( type ); - break; - } - } - } - - // Check to see if we have a response for the expected dataType - if ( dataTypes[ 0 ] in responses ) { - finalDataType = dataTypes[ 0 ]; - } else { - - // Try convertible dataTypes - for ( type in responses ) { - if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { - finalDataType = type; - break; - } - if ( !firstDataType ) { - firstDataType = type; - } - } - - // Or just use first one - finalDataType = finalDataType || firstDataType; - } - - // If we found a dataType - // We add the dataType to the list if needed - // and return the corresponding response - if ( finalDataType ) { - if ( finalDataType !== dataTypes[ 0 ] ) { - dataTypes.unshift( finalDataType ); - } - return responses[ finalDataType ]; - } - } - - /* Chain conversions given the request and the original response - * Also sets the responseXXX fields on the jqXHR instance - */ - function ajaxConvert( s, response, jqXHR, isSuccess ) { - var conv2, current, conv, tmp, prev, - converters = {}, - - // Work with a copy of dataTypes in case we need to modify it for conversion - dataTypes = s.dataTypes.slice(); - - // Create converters map with lowercased keys - if ( dataTypes[ 1 ] ) { - for ( conv in s.converters ) { - converters[ conv.toLowerCase() ] = s.converters[ conv ]; - } - } - - current = dataTypes.shift(); - - // Convert to each sequential dataType - while ( current ) { - - if ( s.responseFields[ current ] ) { - jqXHR[ s.responseFields[ current ] ] = response; - } - - // Apply the dataFilter if provided - if ( !prev && isSuccess && s.dataFilter ) { - response = s.dataFilter( response, s.dataType ); - } - - prev = current; - current = dataTypes.shift(); - - if ( current ) { - - // There's only work to do if current dataType is non-auto - if ( current === "*" ) { - - current = prev; - - // Convert response if prev dataType is non-auto and differs from current - } else if ( prev !== "*" && prev !== current ) { - - // Seek a direct converter - conv = converters[ prev + " " + current ] || converters[ "* " + current ]; - - // If none found, seek a pair - if ( !conv ) { - for ( conv2 in converters ) { - - // If conv2 outputs current - tmp = conv2.split( " " ); - if ( tmp[ 1 ] === current ) { - - // If prev can be converted to accepted input - conv = converters[ prev + " " + tmp[ 0 ] ] || - converters[ "* " + tmp[ 0 ] ]; - if ( conv ) { - - // Condense equivalence converters - if ( conv === true ) { - conv = converters[ conv2 ]; - - // Otherwise, insert the intermediate dataType - } else if ( converters[ conv2 ] !== true ) { - current = tmp[ 0 ]; - dataTypes.unshift( tmp[ 1 ] ); - } - break; - } - } - } - } - - // Apply converter (if not an equivalence) - if ( conv !== true ) { - - // Unless errors are allowed to bubble, catch and return them - if ( conv && s.throws ) { - response = conv( response ); - } else { - try { - response = conv( response ); - } catch ( e ) { - return { - state: "parsererror", - error: conv ? e : "No conversion from " + prev + " to " + current - }; - } - } - } - } - } - } - - return { - state: "success", - data: response - }; - } - - jQuery.extend( { - - // Counter for holding the number of active queries - active: 0, - - // Last-Modified header cache for next request - lastModified: {}, - etag: {}, - - ajaxSettings: { - url: location.href, - type: "GET", - isLocal: rlocalProtocol.test( location.protocol ), - global: true, - processData: true, - async: true, - contentType: "application/x-www-form-urlencoded; charset=UTF-8", - - /* - timeout: 0, - data: null, - dataType: null, - username: null, - password: null, - cache: null, - throws: false, - traditional: false, - headers: {}, - */ - - accepts: { - "*": allTypes, - text: "text/plain", - html: "text/html", - xml: "application/xml, text/xml", - json: "application/json, text/javascript" - }, - - contents: { - xml: /\bxml\b/, - html: /\bhtml/, - json: /\bjson\b/ - }, - - responseFields: { - xml: "responseXML", - text: "responseText", - json: "responseJSON" - }, - - // Data converters - // Keys separate source (or catchall "*") and destination types with a single space - converters: { - - // Convert anything to text - "* text": String, - - // Text to html (true = no transformation) - "text html": true, - - // Evaluate text as a json expression - "text json": JSON.parse, - - // Parse text as xml - "text xml": jQuery.parseXML - }, - - // For options that shouldn't be deep extended: - // you can add your own custom options here if - // and when you create one that shouldn't be - // deep extended (see ajaxExtend) - flatOptions: { - url: true, - context: true - } - }, - - // Creates a full fledged settings object into target - // with both ajaxSettings and settings fields. - // If target is omitted, writes into ajaxSettings. - ajaxSetup: function ( target, settings ) { - return settings ? - - // Building a settings object - ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : - - // Extending ajaxSettings - ajaxExtend( jQuery.ajaxSettings, target ); - }, - - ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), - ajaxTransport: addToPrefiltersOrTransports( transports ), - - // Main method - ajax: function ( url, options ) { - - // If url is an object, simulate pre-1.5 signature - if ( typeof url === "object" ) { - options = url; - url = undefined; - } - - // Force options to be an object - options = options || {}; - - var transport, - - // URL without anti-cache param - cacheURL, - - // Response headers - responseHeadersString, - responseHeaders, - - // timeout handle - timeoutTimer, - - // Url cleanup var - urlAnchor, - - // Request state (becomes false upon send and true upon completion) - completed, - - // To know if global events are to be dispatched - fireGlobals, - - // Loop variable - i, - - // uncached part of the url - uncached, - - // Create the final options object - s = jQuery.ajaxSetup( {}, options ), - - // Callbacks context - callbackContext = s.context || s, - - // Context for global events is callbackContext if it is a DOM node or jQuery collection - globalEventContext = s.context && - ( callbackContext.nodeType || callbackContext.jquery ) ? - jQuery( callbackContext ) : - jQuery.event, - - // Deferreds - deferred = jQuery.Deferred(), - completeDeferred = jQuery.Callbacks( "once memory" ), - - // Status-dependent callbacks - statusCode = s.statusCode || {}, - - // Headers (they are sent all at once) - requestHeaders = {}, - requestHeadersNames = {}, - - // Default abort message - strAbort = "canceled", - - // Fake xhr - jqXHR = { - readyState: 0, - - // Builds headers hashtable if needed - getResponseHeader: function ( key ) { - var match; - if ( completed ) { - if ( !responseHeaders ) { - responseHeaders = {}; - while ( ( match = rheaders.exec( responseHeadersString ) ) ) { - responseHeaders[ match[ 1 ].toLowerCase() + " " ] = - ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) - .concat( match[ 2 ] ); - } - } - match = responseHeaders[ key.toLowerCase() + " " ]; - } - return match == null ? null : match.join( ", " ); - }, - - // Raw string - getAllResponseHeaders: function () { - return completed ? responseHeadersString : null; - }, - - // Caches the header - setRequestHeader: function ( name, value ) { - if ( completed == null ) { - name = requestHeadersNames[ name.toLowerCase() ] = - requestHeadersNames[ name.toLowerCase() ] || name; - requestHeaders[ name ] = value; - } - return this; - }, - - // Overrides response content-type header - overrideMimeType: function ( type ) { - if ( completed == null ) { - s.mimeType = type; - } - return this; - }, - - // Status-dependent callbacks - statusCode: function ( map ) { - var code; - if ( map ) { - if ( completed ) { - - // Execute the appropriate callbacks - jqXHR.always( map[ jqXHR.status ] ); - } else { - - // Lazy-add the new callbacks in a way that preserves old ones - for ( code in map ) { - statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; - } - } - } - return this; - }, - - // Cancel the request - abort: function ( statusText ) { - var finalText = statusText || strAbort; - if ( transport ) { - transport.abort( finalText ); - } - done( 0, finalText ); - return this; - } - }; - - // Attach deferreds - deferred.promise( jqXHR ); - - // Add protocol if not provided (prefilters might expect it) - // Handle falsy url in the settings object (#10093: consistency with old signature) - // We also use the url parameter if available - s.url = ( ( url || s.url || location.href ) + "" ) - .replace( rprotocol, location.protocol + "//" ); - - // Alias method option to type as per ticket #12004 - s.type = options.method || options.type || s.method || s.type; - - // Extract dataTypes list - s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; - - // A cross-domain request is in order when the origin doesn't match the current origin. - if ( s.crossDomain == null ) { - urlAnchor = document.createElement( "a" ); - - // Support: IE <=8 - 11, Edge 12 - 15 - // IE throws exception on accessing the href property if url is malformed, - // e.g. http://example.com:80x/ - try { - urlAnchor.href = s.url; - - // Support: IE <=8 - 11 only - // Anchor's host property isn't correctly set when s.url is relative - urlAnchor.href = urlAnchor.href; - s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== - urlAnchor.protocol + "//" + urlAnchor.host; - } catch ( e ) { - - // If there is an error parsing the URL, assume it is crossDomain, - // it can be rejected by the transport if it is invalid - s.crossDomain = true; - } - } - - // Convert data if not already a string - if ( s.data && s.processData && typeof s.data !== "string" ) { - s.data = jQuery.param( s.data, s.traditional ); - } - - // Apply prefilters - inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); - - // If request was aborted inside a prefilter, stop there - if ( completed ) { - return jqXHR; - } - - // We can fire global events as of now if asked to - // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) - fireGlobals = jQuery.event && s.global; - - // Watch for a new set of requests - if ( fireGlobals && jQuery.active++ === 0 ) { - jQuery.event.trigger( "ajaxStart" ); - } - - // Uppercase the type - s.type = s.type.toUpperCase(); - - // Determine if request has content - s.hasContent = !rnoContent.test( s.type ); - - // Save the URL in case we're toying with the If-Modified-Since - // and/or If-None-Match header later on - // Remove hash to simplify url manipulation - cacheURL = s.url.replace( rhash, "" ); - - // More options handling for requests with no content - if ( !s.hasContent ) { - - // Remember the hash so we can put it back - uncached = s.url.slice( cacheURL.length ); - - // If data is available and should be processed, append data to url - if ( s.data && ( s.processData || typeof s.data === "string" ) ) { - cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; - - // #9682: remove data so that it's not used in an eventual retry - delete s.data; - } - - // Add or update anti-cache param if needed - if ( s.cache === false ) { - cacheURL = cacheURL.replace( rantiCache, "$1" ); - uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + - uncached; - } - - // Put hash and anti-cache on the URL that will be requested (gh-1732) - s.url = cacheURL + uncached; - - // Change '%20' to '+' if this is encoded form body content (gh-2658) - } else if ( s.data && s.processData && - ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { - s.data = s.data.replace( r20, "+" ); - } - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - if ( jQuery.lastModified[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); - } - if ( jQuery.etag[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); - } - } - - // Set the correct header, if data is being sent - if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { - jqXHR.setRequestHeader( "Content-Type", s.contentType ); - } - - // Set the Accepts header for the server, depending on the dataType - jqXHR.setRequestHeader( - "Accept", - s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? - s.accepts[ s.dataTypes[ 0 ] ] + - ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : - s.accepts[ "*" ] - ); - - // Check for headers option - for ( i in s.headers ) { - jqXHR.setRequestHeader( i, s.headers[ i ] ); - } - - // Allow custom headers/mimetypes and early abort - if ( s.beforeSend && - ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { - - // Abort if not done already and return - return jqXHR.abort(); - } - - // Aborting is no longer a cancellation - strAbort = "abort"; - - // Install callbacks on deferreds - completeDeferred.add( s.complete ); - jqXHR.done( s.success ); - jqXHR.fail( s.error ); - - // Get transport - transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); - - // If no transport, we auto-abort - if ( !transport ) { - done( -1, "No Transport" ); - } else { - jqXHR.readyState = 1; - - // Send global event - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); - } - - // If request was aborted inside ajaxSend, stop there - if ( completed ) { - return jqXHR; - } - - // Timeout - if ( s.async && s.timeout > 0 ) { - timeoutTimer = window.setTimeout( function () { - jqXHR.abort( "timeout" ); - }, s.timeout ); - } - - try { - completed = false; - transport.send( requestHeaders, done ); - } catch ( e ) { - - // Rethrow post-completion exceptions - if ( completed ) { - throw e; - } - - // Propagate others as results - done( -1, e ); - } - } - - // Callback for when everything is done - function done( status, nativeStatusText, responses, headers ) { - var isSuccess, success, error, response, modified, - statusText = nativeStatusText; - - // Ignore repeat invocations - if ( completed ) { - return; - } - - completed = true; - - // Clear timeout if it exists - if ( timeoutTimer ) { - window.clearTimeout( timeoutTimer ); - } - - // Dereference transport for early garbage collection - // (no matter how long the jqXHR object will be used) - transport = undefined; - - // Cache response headers - responseHeadersString = headers || ""; - - // Set readyState - jqXHR.readyState = status > 0 ? 4 : 0; - - // Determine if successful - isSuccess = status >= 200 && status < 300 || status === 304; - - // Get response data - if ( responses ) { - response = ajaxHandleResponses( s, jqXHR, responses ); - } - - // Use a noop converter for missing script - if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) { - s.converters[ "text script" ] = function () {}; - } - - // Convert no matter what (that way responseXXX fields are always set) - response = ajaxConvert( s, response, jqXHR, isSuccess ); - - // If successful, handle type chaining - if ( isSuccess ) { - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - modified = jqXHR.getResponseHeader( "Last-Modified" ); - if ( modified ) { - jQuery.lastModified[ cacheURL ] = modified; - } - modified = jqXHR.getResponseHeader( "etag" ); - if ( modified ) { - jQuery.etag[ cacheURL ] = modified; - } - } - - // if no content - if ( status === 204 || s.type === "HEAD" ) { - statusText = "nocontent"; - - // if not modified - } else if ( status === 304 ) { - statusText = "notmodified"; - - // If we have data, let's convert it - } else { - statusText = response.state; - success = response.data; - error = response.error; - isSuccess = !error; - } - } else { - - // Extract error from statusText and normalize for non-aborts - error = statusText; - if ( status || !statusText ) { - statusText = "error"; - if ( status < 0 ) { - status = 0; - } - } - } - - // Set data for the fake xhr object - jqXHR.status = status; - jqXHR.statusText = ( nativeStatusText || statusText ) + ""; - - // Success/Error - if ( isSuccess ) { - deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); - } else { - deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); - } - - // Status-dependent callbacks - jqXHR.statusCode( statusCode ); - statusCode = undefined; - - if ( fireGlobals ) { - globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", - [ jqXHR, s, isSuccess ? success : error ] ); - } - - // Complete - completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); - - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); - - // Handle the global AJAX counter - if ( !( --jQuery.active ) ) { - jQuery.event.trigger( "ajaxStop" ); - } - } - } - - return jqXHR; - }, - - getJSON: function ( url, data, callback ) { - return jQuery.get( url, data, callback, "json" ); - }, - - getScript: function ( url, callback ) { - return jQuery.get( url, undefined, callback, "script" ); - } - } ); - - jQuery.each( [ "get", "post" ], function ( _i, method ) { - jQuery[ method ] = function ( url, data, callback, type ) { - - // Shift arguments if data argument was omitted - if ( isFunction( data ) ) { - type = type || callback; - callback = data; - data = undefined; - } - - // The url can be an options object (which then must have .url) - return jQuery.ajax( jQuery.extend( { - url: url, - type: method, - dataType: type, - data: data, - success: callback - }, jQuery.isPlainObject( url ) && url ) ); - }; - } ); - - jQuery.ajaxPrefilter( function ( s ) { - var i; - for ( i in s.headers ) { - if ( i.toLowerCase() === "content-type" ) { - s.contentType = s.headers[ i ] || ""; - } - } - } ); - - - jQuery._evalUrl = function ( url, options, doc ) { - return jQuery.ajax( { - url: url, - - // Make this explicit, since user can override this through ajaxSetup (#11264) - type: "GET", - dataType: "script", - cache: true, - async: false, - global: false, - - // Only evaluate the response if it is successful (gh-4126) - // dataFilter is not invoked for failure responses, so using it instead - // of the default converter is kludgy but it works. - converters: { - "text script": function () {} - }, - dataFilter: function ( response ) { - jQuery.globalEval( response, options, doc ); - } - } ); - }; - - - jQuery.fn.extend( { - wrapAll: function ( html ) { - var wrap; - - if ( this[ 0 ] ) { - if ( isFunction( html ) ) { - html = html.call( this[ 0 ] ); - } - - // The elements to wrap the target around - wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); - - if ( this[ 0 ].parentNode ) { - wrap.insertBefore( this[ 0 ] ); - } - - wrap.map( function () { - var elem = this; - - while ( elem.firstElementChild ) { - elem = elem.firstElementChild; - } - - return elem; - } ).append( this ); - } - - return this; - }, - - wrapInner: function ( html ) { - if ( isFunction( html ) ) { - return this.each( function ( i ) { - jQuery( this ).wrapInner( html.call( this, i ) ); - } ); - } - - return this.each( function () { - var self = jQuery( this ), - contents = self.contents(); - - if ( contents.length ) { - contents.wrapAll( html ); - - } else { - self.append( html ); - } - } ); - }, - - wrap: function ( html ) { - var htmlIsFunction = isFunction( html ); - - return this.each( function ( i ) { - jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); - } ); - }, - - unwrap: function ( selector ) { - this.parent( selector ).not( "body" ).each( function () { - jQuery( this ).replaceWith( this.childNodes ); - } ); - return this; - } - } ); - - - jQuery.expr.pseudos.hidden = function ( elem ) { - return !jQuery.expr.pseudos.visible( elem ); - }; - jQuery.expr.pseudos.visible = function ( elem ) { - return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); - }; - - - - - jQuery.ajaxSettings.xhr = function () { - try { - return new window.XMLHttpRequest(); - } catch ( e ) {} - }; - - var xhrSuccessStatus = { - - // File protocol always yields status code 0, assume 200 - 0: 200, - - // Support: IE <=9 only - // #1450: sometimes IE returns 1223 when it should be 204 - 1223: 204 - }, - xhrSupported = jQuery.ajaxSettings.xhr(); - - support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); - support.ajax = xhrSupported = !!xhrSupported; - - jQuery.ajaxTransport( function ( options ) { - var callback, errorCallback; - - // Cross domain only allowed if supported through XMLHttpRequest - if ( support.cors || xhrSupported && !options.crossDomain ) { - return { - send: function ( headers, complete ) { - var i, - xhr = options.xhr(); - - xhr.open( - options.type, - options.url, - options.async, - options.username, - options.password - ); - - // Apply custom fields if provided - if ( options.xhrFields ) { - for ( i in options.xhrFields ) { - xhr[ i ] = options.xhrFields[ i ]; - } - } - - // Override mime type if needed - if ( options.mimeType && xhr.overrideMimeType ) { - xhr.overrideMimeType( options.mimeType ); - } - - // X-Requested-With header - // For cross-domain requests, seeing as conditions for a preflight are - // akin to a jigsaw puzzle, we simply never set it to be sure. - // (it can always be set on a per-request basis or even using ajaxSetup) - // For same-domain requests, won't change header if already provided. - if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { - headers[ "X-Requested-With" ] = "XMLHttpRequest"; - } - - // Set headers - for ( i in headers ) { - xhr.setRequestHeader( i, headers[ i ] ); - } - - // Callback - callback = function ( type ) { - return function () { - if ( callback ) { - callback = errorCallback = xhr.onload = - xhr.onerror = xhr.onabort = xhr.ontimeout = - xhr.onreadystatechange = null; - - if ( type === "abort" ) { - xhr.abort(); - } else if ( type === "error" ) { - - // Support: IE <=9 only - // On a manual native abort, IE9 throws - // errors on any property access that is not readyState - if ( typeof xhr.status !== "number" ) { - complete( 0, "error" ); - } else { - complete( - - // File: protocol always yields status 0; see #8605, #14207 - xhr.status, - xhr.statusText - ); - } - } else { - complete( - xhrSuccessStatus[ xhr.status ] || xhr.status, - xhr.statusText, - - // Support: IE <=9 only - // IE9 has no XHR2 but throws on binary (trac-11426) - // For XHR2 non-text, let the caller handle it (gh-2498) - ( xhr.responseType || "text" ) !== "text" || - typeof xhr.responseText !== "string" ? { - binary: xhr.response - } : { - text: xhr.responseText - }, - xhr.getAllResponseHeaders() - ); - } - } - }; - }; - - // Listen to events - xhr.onload = callback(); - errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); - - // Support: IE 9 only - // Use onreadystatechange to replace onabort - // to handle uncaught aborts - if ( xhr.onabort !== undefined ) { - xhr.onabort = errorCallback; - } else { - xhr.onreadystatechange = function () { - - // Check readyState before timeout as it changes - if ( xhr.readyState === 4 ) { - - // Allow onerror to be called first, - // but that will not handle a native abort - // Also, save errorCallback to a variable - // as xhr.onerror cannot be accessed - window.setTimeout( function () { - if ( callback ) { - errorCallback(); - } - } ); - } - }; - } - - // Create the abort callback - callback = callback( "abort" ); - - try { - - // Do send the request (this may raise an exception) - xhr.send( options.hasContent && options.data || null ); - } catch ( e ) { - - // #14683: Only rethrow if this hasn't been notified as an error yet - if ( callback ) { - throw e; - } - } - }, - - abort: function () { - if ( callback ) { - callback(); - } - } - }; - } - } ); - - - - - // Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) - jQuery.ajaxPrefilter( function ( s ) { - if ( s.crossDomain ) { - s.contents.script = false; - } - } ); - - // Install script dataType - jQuery.ajaxSetup( { - accepts: { - script: "text/javascript, application/javascript, " + - "application/ecmascript, application/x-ecmascript" - }, - contents: { - script: /\b(?:java|ecma)script\b/ - }, - converters: { - "text script": function ( text ) { - jQuery.globalEval( text ); - return text; - } - } - } ); - - // Handle cache's special case and crossDomain - jQuery.ajaxPrefilter( "script", function ( s ) { - if ( s.cache === undefined ) { - s.cache = false; - } - if ( s.crossDomain ) { - s.type = "GET"; - } - } ); - - // Bind script tag hack transport - jQuery.ajaxTransport( "script", function ( s ) { - - // This transport only deals with cross domain or forced-by-attrs requests - if ( s.crossDomain || s.scriptAttrs ) { - var script, callback; - return { - send: function ( _, complete ) { - script = jQuery( " - - - - - - - - -
- - - - - - - - - - -
-
- - - - - - - -
-
- site search by - freefind - - advanced -
- - -
- - HTML TAG EXAMPLES - HTML PATTERN EXAMPLES - Navigation - Playground - Quiz Me - Text-Tools - Github HTML File - Previewer - - - My Blog Posts - Starred Repositories - - - -
-
-
-
- -
-
-
-
-
- - - - - - -
-
-
-
- -
- -
-
-
-
-
- -
Click me!
- - -

COMMENTS

- -
- Hit Counters - - - - - - - - - diff --git a/index.md b/index.md index 27bc2bb..756e3e8 100644 --- a/index.md +++ b/index.md @@ -1,797 +1,38 @@ -[HTML TAG EXAMPLES](./one-of-every-tag.html) -[Navigation](./directory.html) -[Playground](https://code-playground.netlify.app/) -[Quiz Me](https://web-dev-interview-prep-quiz-website.netlify.app/) -[Text-Tools](https://devtools42.netlify.app/) -[Github HTML FilePreviewer](https://githtmlpreview.netlify.app/)[simple-sidebar-template](./_Resources\simple-side-bar\directory.html) -[My Blog Posts](https://bryanguner.medium.com/) ------------------------------------------------------------------------- +# Prep-Work +## [deployment](https://60637489113cfe1345c7fcf9--jolly-shannon-bbcd09.netlify.app/) +0.\) Links: -[![](https://img.icons8.com/pastel-glyph/64/000000/home.png)](https://lambda-prep.netlify.app/)HOME +| Name | Hyperlink | +| :-------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| OKTA | [https://lambdaschoolsso.okta.com/login/login.htm?fromURI=%2Fapp%2FUserHome](https://lambdaschoolsso.okta.com/login/login.htm?fromURI=%2Fapp%2FUserHome) | +| Calendar | [https://calendar.google.com/calendar/u/0/embed?src=c\_2q0kvam9h9k5i6t40qp5n18dh8@group.calendar.google.com](https://calendar.google.com/calendar/u/0/embed?src=c_2q0kvam9h9k5i6t40qp5n18dh8@group.calendar.google.com) | +| Slack | [https://app.slack.com/client/T4JUEB3ME/G01QG65CN75](https://app.slack.com/client/T4JUEB3ME/G01QG65CN75) | +| | | +| | | +| | | +| | | +| | | +| Prep Work | [https://apply.lambdaschool.com/courses/web/](https://apply.lambdaschool.com/courses/web/) | -Resources -========= -Submit Resources For Me To Include Below! ------------------------------------------ - Title Link - ---------------- ------------------------------------------------------------- - Edabit - Free Code Camp - ExplainShell - - - - - - ---- +1.\) Platforms we need while attending class: -MAIN -**Links** -Description +2.\) Web Development Software: -[]{.underline} -Node Docs -[https://developer.mozilla.org/]{.underline} +3.\) Pre-Course Work -MDN DOCS -[]{.underline} - -npm Docs - - - -General Learning Links - -[]{.underline} - -[]{.underline} - -[]{.underline} - -[]{.underline} - -Coding Interview Advice - - - - -Git-Hub Repos - - - - - -Week1 - - - - - - - -week2 - - - - - - - -week3 - - - - - - - -week4 - - - - - - - -week5 - - - - - - - -week6 - - - - - - - - - - - - - - - - -⇧⇧⇧Edit In Playground Above!⇧⇧⇧ - -This is heading 1 -================= - -This is heading 2 followed by an embeded video of me playing guitar -------------------------------------------------------------------- - - - ------------------------------------------------------------------------- - -### This is heading 3 - -#### This is heading 4 - -##### This is heading 5 - -###### This is heading 6 - -**- Bold text **- Important text** *- Italic text* *- Emphasized text* - -Marked text [- Small text]{.small} ~~- Deleted text~~ [- Inserted -text]{.underline} ~-\ Subscript\ text~ ^-\ Superscript\ text^** - -The easiest thing you can do in HTML is write a sentence. To do this you -need to know one of the very basic and easy to use tags - the - -"Use q for short quotes" - -> The blockquote tag should be used when we want to talk about some long -> quote that is quoted from another source. - - -> your very long and interesting probably quote. - -![What your image is about](https://i.redd.it/tfugj4n3l6ez.png) -[MDN](https://developer.mozilla.org/en-US/) - -This is done with the target attribute. The target attribute specifies -where to open the linked document and it can have one of the following -values: -1. list item 1 -2. list item 2 -3. list item N - -- list item 1 -- list item 2 -- list item N - - - table row 1 first square table row 1 second square - -------------------------- --------------------------- - table row 2 first square table row 2 second square - table row 2 first square table row 2 second square - -The paragraph is a block-level element. - -A block-level element always starts on a new line and takes up the full -width available (stretches out to the left and right as far as it can). - -Examples of block-level elements: div h1 - h6 p form - -This span is an inline element - -This An inline element occupies only the space bounded by the tags that -define the inline element. Generally, inline elements may contain only -data and other inline elements. The following example demonstrates the -inline element\'s influence: is an inline element - - -Lisbon ------- - -Div Element The div element belongs to the block-level group, often used -as a container for other HTML elements. The div element has no required -attributes, but both style and class are common. When used together with -CSS, the div element can be used to style blocks of content, as we can -see in the example below: - -My super [Span Element The span element is a generic inline container for phrasing content, which does not inherently represent anything. It can be used to group elements for styling purposes (using the class or id attributes), or because they share attribute values, such as lang. The span is very much like a div element, but div is a block-level element whereas a span is an inline element.]{style="color:red"} Heading -===================================================================================================================================================================================================================================================================================================================================================================================================================================== - -Classes Using the html class attribute makes it possible to define equal -styles, for elements with the same class name. - -` ` - - - div.cities { - background-color: black; - color: white; - margin: 20px 0 20px 0; - padding: 20px; - } - - -London ------- - -London is the capital of England. - - -Kingston --------- - -Kingston is the capital city of Jamaica. - - -Tokyo ------ - -Tokyo is the capital of Japan, the center of the Greater Tokyo Area, and -the most populous metropolitan area in the world. - -My Ultra [Important]{.note} Heading -=================================== - -This is some random but [important]{.note} text. - -The button tag defines a clickable button. - -These buttons work and behave in exactly the same way as our -counterparts above. In addition to submitting the form, you can make -them disabled, add an accesskey or even specify a tabindex. - - -tag is that you can put useful HTML elements inside them, like images: - -``` {.language-html data-info="html" data-role="codeBlock"} - -``` - -\"Buttons created with the **BUTTON** element function just like buttons -created with the **INPUT** element,but they offer richer rendering possibilities: the **BUTTON** tag may -have content.For example:a **BUTTON** element that contains an image functions like and may -resemble an **INPUT** element whose type is set to "image\",but the **BUTTON** element type allows content.\" W3 - -``` {.language-html data-info="html" data-role="codeBlock"} - -``` - -*Tip*: Always specify the type attribute for a button element.Different browsers use different default types for the button element. - -Styles and Sizes (With Bootstrap) {#styles-and-sizes-with-bootstrap .mume-header} ---------------------------------- - - -Great Work!As we know, this is where we would start using only CSS to style and -size our buttons..? No!We are introducing you to Bootstrap (the most popular HTML, CSS, and -JavaScript framework for developing responsive,mobile-first web sites) because it´s an easier way to get the job done! - -### Do you prefer larger or smaller buttons? {#do-you-prefer-larger-or-smaller-buttons .mume-header} - - -Add .btn-lg (large), .btn-md(medium), .btn-sm(small), or -.btn-xs(extra-small) for additional sizes. - -``` {.language-html data-info="html" data-role="codeBlock"} - - - - -``` - -Create block level buttons --- those that span the full width of a -parent---by adding *.btn-block*: - -``` {.language-html data-info="html" data-role="codeBlock"} - -``` - -After you decide the size of your buttons it´s time to style them!Bootstrap provides different styles of buttons: - -- Basic -- Default -- Primary -- Success -- Info -- Warning -- Danger -- Link - -``` {.language-html data-info="html" data-role="codeBlock"} - - - - - - - - - - - - - - -``` - -### Outline buttons {#outline-buttons .mume-header} - - -Replace the default modifier classes with the *.btn-outline-* ones to -remove all background images and colors on any button. - -``` {.language-html data-info="html" data-role="codeBlock"} - - - - - - -``` - -### Great resources to learn HTML5 {#great-resources-to-learn-html5 .mume-header} - - - - -- Name: -- E-mail: -- Message: - - -Animations! -=========== - - - - - - ---- - -# Readme: -[![](https://img.icons8.com/pastel-glyph/64/000000/home.png)](https://lambda-prep.netlify.app/) -HOME - -Prep-Work -========= - -**Notes** -========= - -**How to learn effectively** ----------------------------- - -**Learning**: The acquisition of skills and the ability to apply them in -the future. - -**What makes an Effective learner?** - -- They are active listeners. -- They are engaged with the material. -- They are receptive of feedback. -- They are open to difficulty. - -**Why do active learning techniques feel difficult?** - -- It feels difficult because you are constantly receiving feedback, - and so you are constantly adapting and perfecting the material. - -**Desirable Difficulty** - -- The skills we wish to obtain is often a difficult one. -- We want challenging but possible lessons based on current level of - skill. - -**Effective learners space their practice** - -- Consistent effort \> cramming =\> for **durable knowledge** - ------------------------------------------------------------------------- - -**Hello World** ---------------- - -- **console.log** : command used to print something onto the screen. - -- **syntax** : the exact arrangement of the symbols, characters, and - keywords in our code. -- **//** : notation for creating a code comment in JS. -- **code comment** : useful for annotating pieces of code to explain - how something works, ignored by computer. - -> "Simplicity is prerequisite for reliability." -- Edsger W. Dijkstra - ------------------------------------------------------------------------- - -**The Number Data Type** ------------------------- - -The **number** data type in JS is used to represent any numerical -values, including integers and decimal numbers. - -**Basic Arithmetic Operators** - -Operators are the symbols that perform particular operations. - -- **+** (addition) -- **-** (subtraction) -- **asterisk** (multiplication) -- **/** (division) -- **%** (modulo) - -JS evaluates more complex expressions using the general math order of -operations aka PEMDAS. - -- **PEMDAS** : Parentheses, Exponents, Multiplication, Division, - Modulo, Addition, Subtraction. -- *To force a specific order of operation, use the group operator ( ) - around a part of the expression.* - -**Modulo** : Very useful operation to check divisibility of numbers, -check for even & odd, whether a number is prime, and much more! -*(Discrete Math concept, circular problems can be solved with modulo)* - -- Whenever you have a smaller number % a larger number, the answer - will just be the initial small number. - - ``` {.sourceCode .js data-initialized="true" data-gclp-id="0"} - console.log(7 % 10); // => 7; - ``` - ------------------------------------------------------------------------- - -**The String Data Type** ------------------------- - -The **string** data type is a primitive data type that used to represent -textual data. - -- can be wrapped by either **single** or **double** quotation marks, - *best to choose one and stick with it for consistency*. -- If your string contains quotation marks inside, can layer single or - double quotation marks to allow it to work. - - ``` {.sourceCode .js data-initialized="true" data-gclp-id="1"} - "That's a great string"; (valid) - - 'Shakespeare wrote, "To be or not to be"'; (valid) - - 'That's a bad string'; (invalid) - ``` - - - Alt. way to add other quotes within strings is to use template - literals. - - ``` {.sourceCode .js data-initialized="true" data-gclp-id="2"} - `This is a temp'l'ate literal ${function}` // use ${} to invoke functions within. - ``` - -- **.length** : property that can be appended to data to return the - length. - - empty strings have a length of zero. -- **indices** : indexes of data that begin at 0, can call upon index - by using the bracket notation \[ \]. - - ``` {.sourceCode .js data-initialized="true" data-gclp-id="3"} - console.log("bootcamp"[0]); // => "b" - console.log("bootcamp"[10]); // => "undefined" - console.log("boots"[1 * 2]); // => "o" - console.log("boots"["boot".length - 1]); // => "t" - ``` - - - we can pass expressions through the brackets as well since JS - always evaluates expressions first. - -- The index of the last character of a string is always one less than - it's length. -- **indexOf()** : method used to find the first index of a given - character within a string. - - ``` {.sourceCode .js data-initialized="true" data-gclp-id="4"} - console.log("bagel".indexOf("b")); // => 0 - console.log("bagel".indexOf("z")); // => -1 - ``` - - - if the character inside the indexOf() search does not exist in - the string, the output will be -1. - - the indexOf() search will return the first instanced index of - the the char in the string. - - **concatenate** : word to describe joining strings together into - a single string. - ------------------------------------------------------------------------- - -**The Boolean Data Type** -------------------------- - -The **boolean** data type is the simplest data type since there are only -two values: **true** and **false**. - -- **Logical Operators** (B*oolean Operators*) are used to establish - logic in our code. - - - **!** (not) : reverses a boolean value. - - ``` {.sourceCode .js data-initialized="true" data-gclp-id="5"} - console.log(!true); // => false - console.log(!!false); // => false - ``` - - - **&&** (and) **Truth Table** - - Input Input Output - ------- ------- -------- - T T T - T F F - F T F - F F F - - - **\|\|** (or) **Truth Table** - - Input Input Output - ------- ------- -------- - T T T - T F T - F T T - F F F - -- **Logical Order of Operations** : JS will evaluate !, then &&, then - \|\|. -- **De Morgan's Law** : Common mistake in boolean logic is incorrectly - distributing ! across parentheses. - - ``` {.sourceCode .js data-initialized="true" data-gclp-id="6"} - !(A || B) === !A && !B; - !(A && B) === !A || !B; - ``` - - - In summary, to correctly distribute ! across parentheses we must - also flip the operation within. - -- **Short-Circuit Evaluation** : Because JS evalutes from left to - right, expressions can "short-circuit". For example if we have true - on the left of an \|\| logical comparison, it will stop evaluating - and yield true instead of wasting resources on processing the rest - of the statement. - - ``` {.sourceCode .js data-initialized="true" data-gclp-id="7"} - console.log(true || !false); // => stops after it sees "true ||" - ``` - - ------------------------------------------------------------------------ - -**Comparison Operators** ------------------------- - -All comparison operators will result in a boolean output. - -**The relative comparators** - -- **\>** (greater than) -- **\<** (less than) -- **\>=** (greater than or equal to) -- **\<=** (less than or equal to) -- **===** (equal to) -- **!==** (not equal to) - -> Fun Fact: "a" \< "b" is considered valid JS Code because string -> comparisons are compared lexicographically (meaning dictionary order), -> so "a" is less than "b" because it appears earlier! - -> If there is ever a standstill comparison of two string -> lexicographically (i.e. app vs apple) the comparison will deem the -> shorter string lesser. - -**Difference between == and ===** - -- **===** : Strict Equality, will only return true if the two - comparisons are entirely the same. -- **==** : Loose Equality, will return true even if the values are of - a different type, due to coercion. (Avoid using this) - ------------------------------------------------------------------------- - -**Variables** -------------- - -Variables are used to store information to be referenced and manipulated -in a program. - -- We initialize a variable by using the **let** keyword and a **=** - single equals sign (assignment operator). - - ``` {.sourceCode .js data-initialized="true" data-gclp-id="8"} - let bootcamp = "Lambda"; - console.log(bootcamp); // "Lambda" - ``` - -- JS variable names can contain any alphanumeric characters, - underscores, or dollar signs (cannot being with a number). -- If you do not declare a value for a variable, undefined is - automatically set. - - ``` {.sourceCode .js data-initialized="true" data-gclp-id="9"} - let bootcamp; - console.log(bootcamp); // undefined - ``` - -- We can change the value of a previously declared variable (let, not - const) by re-assigning it another value. -- **let** is the updated version of **var**; there are some - differences in terms of hoisting and global/block scope - will be - covered later in the course (common interview question!) - -**Assignment Shorthand** - -``` {.sourceCode .js data-initialized="true" data-gclp-id="10"} -let num = 0; -num += 10; // same as num = num + 10 -num -= 2; // same as num = num - 2 -num /= 4; // same as num = num / 4 -num *= 7; // same as num = num * 7 ``` - -- In general, any nonsensical arithmetic will result in **NaN** ; - usually operations that include undefined. - -- **declaration** : process of simply introducing a variable name. -- **initialization** : process of both declaring and assigning a - variable on the same line. - ------------------------------------------------------------------------- - -**Functions** -------------- - -A function is a procedure of code that will run when called. Functions -are used so that we do not have to rewrite code to do the same thing -over and over. (Think of them as 'subprograms') - -- **Function Declaration** : Process when we first initially write our - function. - - Includes three things: - - Name of the function. - - A list of *parameters* () - - The code to execute {} -- **Function Calls** : We can call upon our function whenever and - wherever\* we want. (\*wherever is only after the initial - declaration) - - JS evaluates code top down, left to right. - - When we execute a declared function later on in our program we - refer to this as **invoking** our function. - - Every function in JS returns undefined unless otherwise - specified. - - When we hit a **return** statement in a function we immediately - exit the function and return to where we called the function. -- When naming functions in JS always use camelCase and name it - something appropriate. \> Greate code reads like English and almost - explains itself. Think: Elegant, readable, and maintainable! - ------------------------------------------------------------------------- - -**Parameters and Arguments** ----------------------------- - -- **Parameters** : Comma seperated variables specified as part of a - function's declaration. -- **Arguments** : Values passed to the function when it is invoked. - -- *If the number of arguments passed during a function invocation is - different than the number of paramters listed, it will still work.* -- However, is there are not enough arguments provided for parameters - our function will likely yield **Nan**. - ------------------------------------------------------------------------- - - - - - - - - - - - - -[]{style="margin: 0px auto; border: 2px dotted rgb(0, 0, 0); position: absolute; z-index: 2147483647; visibility: hidden; left: 1024px; width: 0px; top: 3258px; height: 0px;"}[]{style="z-index: 2147483647; position: absolute; visibility: hidden; left: 1009px; width: 50px; top: 3243px; height: 20px; font-size: 10px; color: black;"} - -[deployment](https://60637489113cfe1345c7fcf9--jolly-shannon-bbcd09.netlify.app/) ---------------------------------------------------------------------------------- - -0.) Links: - - ------------------------------------------------------------------------------------------------------------------------------------------------- - Name Hyperlink - ----------------------------------- ------------------------------------------------------------------------------------------------------------- - OKTA - - Calendar - - Slack - - - - - - - - - - - - Prep Work - ------------------------------------------------------------------------------------------------------------------------------------------------- - -1.) Platforms we need while attending class: - -2.) Web Development Software: - -3.) Pre-Course Work - -Prep-Work {#prep-work .mume-header} -========= - -[deployment](https://60637489113cfe1345c7fcf9--jolly-shannon-bbcd09.netlify.app/) {#deploymenthttps60637489113cfe1345c7fcf9-jolly-shannon-bbcd09netlifyapp .mume-header} ---------------------------------------------------------------------------------- - -0.) Links: - -Name - -Hyperlink - -OKTA - - - -Calendar - - - -Slack - - - -Prep Work - - - -1.) Platforms we need while attending class: - -2.) Web Development Software: - -3.) Pre-Course Work - -``` {.language- data-role="codeBlock" data-info=""} . ├── README.html ├── README.md @@ -803,296 +44,296 @@ Prep Work ├── directory.html ├── index.html ├── javascript-practice -│   ├── 00_expressions_variables -│   │   ├── exercises -│   │   │   ├── A_executing_code_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   ├── B_expressions_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   ├── C_variables_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   ├── D_string_indexing_and_methods_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   -│   │   ├── -│   │   └── solutions -│   │   ├── A_executing_code_solution -│   │   │   ├── age.js -│   │   │   ├── greeting.js -│   │   │   ├── -│   │   │   ├── thirsty.js -│   │   │   └── whoami.js -│   │   ├── B_expressions_solution -│   │   │   ├── boolean-expressions.js -│   │   │   ├── comparisons.js -│   │   │   ├── number-expressions.js -│   │   │   ├── -│   │   │   └── string-expressions.js -│   │   ├── C_variables_solution -│   │   │   ├── four.js -│   │   │   ├── one.js -│   │   │   ├── -│   │   │   ├── three.js -│   │   │   ├── two.js -│   │   │   └── zero.js -│   │   ├── D_string_indexing_and_methods_solution -│   │   │   ├── a-tedious-task.js -│   │   │   ├── dare-to-decipher.js -│   │   │   ├── proper-patterns.js -│   │   │   ├── -│   │   │   └── small-string-snippets.js -│   │   -│   ├── 01_conditionals -│   │   ├── exercises -│   │   │   ├── A_conditionals_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   -│   │   ├── -│   │   └── solutions -│   │   ├── A_conditionals_solution -│   │   │   ├── one.js -│   │   │   ├── -│   │   │   ├── three.js -│   │   │   ├── two.js -│   │   │   └── zero.js -│   │   -│   ├── 02_functions -│   │   ├── exercises -│   │   │   ├── A_functions_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   ├── B_functions_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   ├── C_functions_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   -│   │   ├── -│   │   └── solutions -│   │   ├── A_functions_solution -│   │   │   ├── average.js -│   │   │   ├── ends-with-t.js -│   │   │   ├── half.js -│   │   │   ├── is-div-by-4.js -│   │   │   ├── is-long.js -│   │   │   ├── keep-it-quiet.js -│   │   │   ├── -│   │   │   ├── snippet-0-1.js -│   │   │   ├── snippet-0-2.js -│   │   │   ├── snippet-0-3.js -│   │   │   └── snippet-0-4.js -│   │   ├── B_functions_solution -│   │   │   ├── ends-in-ly.js -│   │   │   ├── funny-sound.js -│   │   │   ├── longer.js -│   │   │   ├── one-or-none.js -│   │   │   ├── parity.js -│   │   │   ├── -│   │   │   ├── starts-with-r.js -│   │   │   ├── string-size.js -│   │   │   └── wacky-word.js -│   │   ├── C_functions_solution -│   │   │   ├── average-of-four.js -│   │   │   ├── case-changer.js -│   │   │   ├── contains.js -│   │   │   ├── divisible.js -│   │   │   ├── in-range.js -│   │   │   ├── larger.js -│   │   │   ├── number-change.js -│   │   │   -│   │   -│   ├── 03_loops -│   │   ├── exercises -│   │   │   ├── A_loops_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   ├── B_loops_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   ├── C_loops_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   -│   │   ├── -│   │   └── solutions -│   │   ├── A_loops_solution -│   │   │   ├── count-up.js -│   │   │   ├── evens.js -│   │   │   ├── min-to-max.js -│   │   │   ├── one-to-four.js -│   │   │   ├── -│   │   │   ├── snippet-1.js -│   │   │   ├── snippet-2.js -│   │   │   ├── snippet-3.js -│   │   │   ├── snippet-4.js -│   │   │   ├── snippet-5.js -│   │   │   └── string-iterate.js -│   │   ├── B_loops_solution -│   │   │   ├── div-by-either.js -│   │   │   ├── five-multiples-of.js -│   │   │   ├── no-ohs.js -│   │   │   ├── odd-sum.js -│   │   │   ├── product-up-to.js -│   │   │   ├── -│   │   │   ├── string-repeater.js -│   │   │   └── sum-up-to.js -│   │   ├── C_loops_solution -│   │   │   ├── censor-e.js -│   │   │   ├── divisible-range.js -│   │   │   ├── fizz-buzz.js -│   │   │   ├── raise-power.js -│   │   │   ├── remove-capitals.js -│   │   │   ├── reverse-iterate.js -│   │   │   -│   │   -│   ├── 04_arrays -│   │   ├── exercises -│   │   │   ├── A_arrays_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   ├── B_arrays_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   ├── C_arrays_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   -│   │   ├── -│   │   └── solutions -│   │   ├── A_arrays_solution -│   │   │   ├── bleep-vowels.js -│   │   │   ├── divisors.js -│   │   │   ├── filter-long-words.js -│   │   │   ├── num-odds.js -│   │   │   ├── -│   │   │   ├── stay-positive.js -│   │   │   ├── strings-to-lengths.js -│   │   │   └── total.js -│   │   ├── B_arrays_solution -│   │   │   ├── choose-divisibles.js -│   │   │   ├── make-acronym.js -│   │   │   ├── maximum.js -│   │   │   ├── reverse-array.js -│   │   │   ├── -│   │   │   ├── word-count.js -│   │   │   └── your-average-function.js -│   │   ├── C_arrays_solution -│   │   │   ├── alternating-caps.js -│   │   │   ├── common-elements.js -│   │   │   ├── lengthiest-word.js -│   │   │   ├── number-range.js -│   │   │   ├── remove-short-words.js -│   │   │   -│   │   -│   ├── 05_nesting -│   │   ├── exercises -│   │   │   ├── A_nested_loops_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   ├── B_two_dimensional_arrays_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   ├── C_more_problems_exercise -│   │   │   │   ├── README.html -│   │   │   │   ├── README.md -│   │   │   │   -│   │   │   -│   │   ├── -│   │   └── solutions -│   │   ├── A_nested_loops_solution -│   │   │   ├── pair-print.js -│   │   │   ├── print-combinations.js -│   │   │   ├── -│   │   │   ├── snippet-1.js -│   │   │   ├── snippet-2.js -│   │   │   ├── snippet-3.js -│   │   │   ├── snippet-4.js -│   │   │   ├── snippet-5.js -│   │   │   └── two-sum.js -│   │   ├── B_two_dimensional_arrays_solution -│   │   │   ├── make-matrix.js -│   │   │   ├── print-2d.js -│   │   │   ├── -│   │   │   ├── total-product.js -│   │   │   ├── two-sum-pairs.js -│   │   │   └── zipper.js -│   │   ├── C_more_problems_solution -│   │   │   ├── remove-dupes.js -│   │   │   ├── remove-first-vowel.js -│   │   │   ├── remove-vowels.js -│   │   │   ├── -│   │   │   ├── shorten-long-words.js -│   │   │   └── spam.js -│   │   -│   ├── 06_decomposition_pattern -│   │   ├── A_decomposing_problems_exercise -│   │   │   ├── README.html -│   │   │   ├── README.md -│   │   │   -│   │   ├── B_decomposing_problems_exercise -│   │   │   ├── README.html -│   │   │   ├── README.md -│   │   │   -│   │   ├── C_decomposing_problems_exercise -│   │   │   ├── README.html -│   │   │   ├── README.md -│   │   │   -│   │   -│   ├── 07_objects -│   │   ├── A_objects_exercise -│   │   │   ├── README.html -│   │   │   ├── README.md -│   │   │   -│   │   ├── B_objects_exercise -│   │   │   ├── README.html -│   │   │   ├── README.md -│   │   │   -│   │   ├── C_objects_exercise -│   │   │   ├── README.html -│   │   │   ├── README.md -│   │   │   -│   │   -│   ├── 08_higher_order_functions -│   │   ├── A_native_callback_methods_exercise -│   │   │   ├── README.html -│   │   │   ├── README.md -│   │   │   -│   │   ├── B_native_callback_methods_exercise -│   │   │   ├── README.html -│   │   │   ├── README.md -│   │   │   -│   │   -│   +│ ├── 00_expressions_variables +│ │ ├── exercises +│ │ │ ├── A_executing_code_exercise +│ │ │ │ ├── README.html +│ │ │ │ ├── README.md +│ │ │ │ +│ │ │ ├── B_expressions_exercise +│ │ │ │ ├── README.html +│ │ │ │ ├── README.md +│ │ │ │ +│ │ │ ├── C_variables_exercise +│ │ │ │ ├── README.html +│ │ │ │ ├── README.md +│ │ │ │ +│ │ │ ├── D_string_indexing_and_methods_exercise +│ │ │ │ ├── README.html +│ │ │ │ ├── README.md +│ │ │ │ +│ │ │ +│ │ ├── +│ │ └── solutions +│ │ ├── A_executing_code_solution +│ │ │ ├── age.js +│ │ │ ├── greeting.js +│ │ │ ├── +│ │ │ ├── thirsty.js +│ │ │ └── whoami.js +│ │ ├── B_expressions_solution +│ │ │ ├── boolean-expressions.js +│ │ │ ├── comparisons.js +│ │ │ ├── number-expressions.js +│ │ │ ├── +│ │ │ └── string-expressions.js +│ │ ├── C_variables_solution +│ │ │ ├── four.js +│ │ │ ├── one.js +│ │ │ ├── +│ │ │ ├── three.js +│ │ │ ├── two.js +│ │ │ └── zero.js +│ │ ├── D_string_indexing_and_methods_solution +│ │ │ ├── a-tedious-task.js +│ │ │ ├── dare-to-decipher.js +│ │ │ ├── proper-patterns.js +│ │ │ ├── +│ │ │ └── small-string-snippets.js +│ │ +│ ├── 01_conditionals +│ │ ├── exercises +│ │ │ ├── A_conditionals_exercise +│ │ │ │ ├── README.html +│ │ │ │ ├── README.md +│ │ │ │ +│ │ │ +│ │ ├── +│ │ └── solutions +│ │ ├── A_conditionals_solution +│ │ │ ├── one.js +│ │ │ ├── +│ │ │ ├── three.js +│ │ │ ├── two.js +│ │ │ └── zero.js +│ │ +│ ├── 02_functions +│ │ ├── exercises +│ │ │ ├── A_functions_exercise +│ │ │ │ ├── README.html +│ │ │ │ ├── README.md +│ │ │ │ +│ │ │ ├── B_functions_exercise +│ │ │ │ ├── README.html +│ │ │ │ ├── README.md +│ │ │ │ +│ │ │ ├── C_functions_exercise +│ │ │ │ ├── README.html +│ │ │ │ ├── README.md +│ │ │ │ +│ │ │ +│ │ ├── +│ │ └── solutions +│ │ ├── A_functions_solution +│ │ │ ├── average.js +│ │ │ ├── ends-with-t.js +│ │ │ ├── half.js +│ │ │ ├── is-div-by-4.js +│ │ │ ├── is-long.js +│ │ │ ├── keep-it-quiet.js +│ │ │ ├── +│ │ │ ├── snippet-0-1.js +│ │ │ ├── snippet-0-2.js +│ │ │ ├── snippet-0-3.js +│ │ │ └── snippet-0-4.js +│ │ ├── B_functions_solution +│ │ │ ├── ends-in-ly.js +│ │ │ ├── funny-sound.js +│ │ │ ├── longer.js +│ │ │ ├── one-or-none.js +│ │ │ ├── parity.js +│ │ │ ├── +│ │ │ ├── starts-with-r.js +│ │ │ ├── string-size.js +│ │ │ └── wacky-word.js +│ │ ├── C_functions_solution +│ │ │ ├── average-of-four.js +│ │ │ ├── case-changer.js +│ │ │ ├── contains.js +│ │ │ ├── divisible.js +│ │ │ ├── in-range.js +│ │ │ ├── larger.js +│ │ │ ├── number-change.js +│ │ │ +│ │ +│ ├── 03_loops +│ │ ├── exercises +│ │ │ ├── A_loops_exercise +│ │ │ │ ├── README.html +│ │ │ │ ├── README.md +│ │ │ │ +│ │ │ ├── B_loops_exercise +│ │ │ │ ├── README.html +│ │ │ │ ├── README.md +│ │ │ │ +│ │ │ ├── C_loops_exercise +│ │ │ │ ├── README.html +│ │ │ │ ├── README.md +│ │ │ │ +│ │ │ +│ │ ├── +│ │ └── solutions +│ │ ├── A_loops_solution +│ │ │ ├── count-up.js +│ │ │ ├── evens.js +│ │ │ ├── min-to-max.js +│ │ │ ├── one-to-four.js +│ │ │ ├── +│ │ │ ├── snippet-1.js +│ │ │ ├── snippet-2.js +│ │ │ ├── snippet-3.js +│ │ │ ├── snippet-4.js +│ │ │ ├── snippet-5.js +│ │ │ └── string-iterate.js +│ │ ├── B_loops_solution +│ │ │ ├── div-by-either.js +│ │ │ ├── five-multiples-of.js +│ │ │ ├── no-ohs.js +│ │ │ ├── odd-sum.js +│ │ │ ├── product-up-to.js +│ │ │ ├── +│ │ │ ├── string-repeater.js +│ │ │ └── sum-up-to.js +│ │ ├── C_loops_solution +│ │ │ ├── censor-e.js +│ │ │ ├── divisible-range.js +│ │ │ ├── fizz-buzz.js +│ │ │ ├── raise-power.js +│ │ │ ├── remove-capitals.js +│ │ │ ├── reverse-iterate.js +│ │ │ +│ │ +│ ├── 04_arrays +│ │ ├── exercises +│ │ │ ├── A_arrays_exercise +│ │ │ │ ├── README.html +│ │ │ │ ├── README.md +│ │ │ │ +│ │ │ ├── B_arrays_exercise +│ │ │ │ ├── README.html +│ │ │ │ ├── README.md +│ │ │ │ +│ │ │ ├── C_arrays_exercise +│ │ │ │ ├── README.html +│ │ │ │ ├── README.md +│ │ │ │ +│ │ │ +│ │ ├── +│ │ └── solutions +│ │ ├── A_arrays_solution +│ │ │ ├── bleep-vowels.js +│ │ │ ├── divisors.js +│ │ │ ├── filter-long-words.js +│ │ │ ├── num-odds.js +│ │ │ ├── +│ │ │ ├── stay-positive.js +│ │ │ ├── strings-to-lengths.js +│ │ │ └── total.js +│ │ ├── B_arrays_solution +│ │ │ ├── choose-divisibles.js +│ │ │ ├── make-acronym.js +│ │ │ ├── maximum.js +│ │ │ ├── reverse-array.js +│ │ │ ├── +│ │ │ ├── word-count.js +│ │ │ └── your-average-function.js +│ │ ├── C_arrays_solution +│ │ │ ├── alternating-caps.js +│ │ │ ├── common-elements.js +│ │ │ ├── lengthiest-word.js +│ │ │ ├── number-range.js +│ │ │ ├── remove-short-words.js +│ │ │ +│ │ +│ ├── 05_nesting +│ │ ├── exercises +│ │ │ ├── A_nested_loops_exercise +│ │ │ │ ├── README.html +│ │ │ │ ├── README.md +│ │ │ │ +│ │ │ ├── B_two_dimensional_arrays_exercise +│ │ │ │ ├── README.html +│ │ │ │ ├── README.md +│ │ │ │ +│ │ │ ├── C_more_problems_exercise +│ │ │ │ ├── README.html +│ │ │ │ ├── README.md +│ │ │ │ +│ │ │ +│ │ ├── +│ │ └── solutions +│ │ ├── A_nested_loops_solution +│ │ │ ├── pair-print.js +│ │ │ ├── print-combinations.js +│ │ │ ├── +│ │ │ ├── snippet-1.js +│ │ │ ├── snippet-2.js +│ │ │ ├── snippet-3.js +│ │ │ ├── snippet-4.js +│ │ │ ├── snippet-5.js +│ │ │ └── two-sum.js +│ │ ├── B_two_dimensional_arrays_solution +│ │ │ ├── make-matrix.js +│ │ │ ├── print-2d.js +│ │ │ ├── +│ │ │ ├── total-product.js +│ │ │ ├── two-sum-pairs.js +│ │ │ └── zipper.js +│ │ ├── C_more_problems_solution +│ │ │ ├── remove-dupes.js +│ │ │ ├── remove-first-vowel.js +│ │ │ ├── remove-vowels.js +│ │ │ ├── +│ │ │ ├── shorten-long-words.js +│ │ │ └── spam.js +│ │ +│ ├── 06_decomposition_pattern +│ │ ├── A_decomposing_problems_exercise +│ │ │ ├── README.html +│ │ │ ├── README.md +│ │ │ +│ │ ├── B_decomposing_problems_exercise +│ │ │ ├── README.html +│ │ │ ├── README.md +│ │ │ +│ │ ├── C_decomposing_problems_exercise +│ │ │ ├── README.html +│ │ │ ├── README.md +│ │ │ +│ │ +│ ├── 07_objects +│ │ ├── A_objects_exercise +│ │ │ ├── README.html +│ │ │ ├── README.md +│ │ │ +│ │ ├── B_objects_exercise +│ │ │ ├── README.html +│ │ │ ├── README.md +│ │ │ +│ │ ├── C_objects_exercise +│ │ │ ├── README.html +│ │ │ ├── README.md +│ │ │ +│ │ +│ ├── 08_higher_order_functions +│ │ ├── A_native_callback_methods_exercise +│ │ │ ├── README.html +│ │ │ ├── README.md +│ │ │ +│ │ ├── B_native_callback_methods_exercise +│ │ │ ├── README.html +│ │ │ ├── README.md +│ │ │ +│ │ +│ ├── js.js ├── one-of-every-tag.html ├── readme -│   ├── README.html -│   ├── README_files -│   │   ├── katex.min.css -│   │   -│   +│ ├── README.html +│ ├── README_files +│ │ ├── katex.min.css +│ │ +│ ├── resources.html ├── resources.md ├── script.js @@ -1104,293 +345,235 @@ Prep Work -``` - -WEEK 1 *Introduction to JavaScript (Part 1)* {#week-1brintroduction-to-javascript-part-1 .mume-header .undefined} -============================================ - ------------------------------------------------------------------------- - -[**Expression Learning Objectives**](#expression-learning-objectives)[**Intro to Functions Learning -Objectives**](#intro-to-functions-learning-objectives) - -- [Hello World](#hello-world) - - [Getting visual feedback in your - programs](#getting-visual-feedback-in-your-programs) - - [Code comments](#code-comments) -- [The Number Type](#the-number-type) - - [All the numbers](#all-the-numbers) - - [The basic arithmetic - operators](#the-basic-arithmetic-operators) -- [The String Type](#the-string-type) - - [Writing a valid string](#writing-a-valid-string) - - [Calculating length](#calculating-length) - - [Indexing a string](#indexing-a-string) - - [Concatenation](#concatenation) -- [The Boolean Type](#the-boolean-type) - - [Logical Operators](#logical-operators) - - [De Morgan\'s Law](#de-morgans-law) -- [Comparison Operators](#comparison-operators) - - [The relative comparators](#the-relative-comparators) - - [=== vs ==](#vs) -- [Basic Variables](#basic-variables) - - [Initializing a variable](#initializing-a-variable) - - [Manipulating variables](#manipulating-variables) - - [NaN](#nan) -- [Introduction to Functions](#introduction-to-functions) - - [Writing Functions](#writing-functions) - - [Invoking or \"calling\" a - function](#invoking-or-calling-a-function) - - [Returning a value](#returning-a-value) - - [The importance of naming](#the-importance-of-naming) -- [Parameters and Arguments](#parameters-and-arguments) - - [The difference between Parameters and - Arguments](#the-difference-between-parameters-and-arguments) - -[**Control Flow and Array Learning -Objectives**](#control-flow-and-array-learning-objectives) - -- [Control Flow - Conditional - Statements](#control-flow-conditional-statements) - - [A Quick Word on Syntax](#a-quick-word-on-syntax) - - [Writing Conditional - Statements](#writing-conditional-statements) -- [Mutually Exclusive Conditions](#mutually-exclusive-conditions) - - [When to use if statements](#when-to-use-if-statements) -- [Control Flow - Looping](#control-flow-looping) - - [Looping](#looping) - - [Translating From One Loop to - Another](#translating-from-one-loop-to-another) -- [The Array Type](#the-array-type) - - [Using arrays](#using-arrays) - - [Indexing arrays](#indexing-arrays) - - [Working with arrays](#working-with-arrays) - - [Concatenation with arrays](#concatenation-with-arrays) - -[**Intermediate Functions Learning -Objectives**](#intermediate-functions-learning-objectives) - -- [Function Expressions](#function-expressions) - - [Functions as first-class - objects](#functions-as-first-class-objects) -- [Two-Dimensional Arrays (2D - Arrays)](#two-dimensional-arrays-2d-arrays) - - [Multidimensional Arrays](#multidimensional-arrays) - - [Iterating through 2D Arrays](#iterating-through-2d-arrays) - - [When is a 2D array practical?](#when-is-a-2d-array-practical) -- [Mutability in JavaScript](#mutability-in-javascript) - - [What is mutability?](#what-is-mutability) - - [Mutable or immutable, that is the - question](#mutable-or-immutable-that-is-the-question) - - [The mutability misconception](#the-mutability-misconception) -- [Array Splice](#array-splice) - - [Notation](#notation) - - [What can Array\#splice do?](#what-can-arraysplice-do) -- [String\#split and Array\#join](#stringsplit-and-arrayjoin) - - [String\#split](#stringsplit) - - [Array\#join](#arrayjoin) - - [A clever combination](#a-clever-combination) -- [Determining Types](#determining-types) - - [The typeof operator](#the-typeof-operator) - - [How to tell if a value is an - array](#how-to-tell-if-a-value-is-an-array) - - [Practical use in \"real\" code](#practical-use-in-real-code) -- [The Null Type (And Undefined)](#the-null-type-and-undefined) - - [A type with only one value](#a-type-with-only-one-value) - - [The meaning of null](#the-meaning-of-null) - - [The absence of a value](#the-absence-of-a-value) - - [An unknown value](#an-unknown-value) - - [Checking if a value is null](#checking-if-a-value-is-null) - - [Oh, and there\'s that undefined value, - too](#oh-and-theres-that-undefined-value-too) - - [What happens when\...](#what-happens-when) -- [Catch Me If You Can](#catch-me-if-you-can) - - [Structured exception handling](#structured-exception-handling) - - [Try and catch](#try-and-catch) - - [How can I make my own errors?](#how-can-i-make-my-own-errors) - - [What else is there?](#what-else-is-there) - - [How do I best use this?](#how-do-i-best-use-this) - ------------------------------------------------------------------------- - -Introduction - ------------------------------------------------------------------------- - -Expression Learning Objectives {#expression-learning-objectives .mume-header} -============================== - -Below is a complete list of the terminal learning objectives for this -lesson.When you complete this lesson, you should be able to perform each of -thefollowing objectives. These objectives capture how you may be evaluated -on theassessment for this lesson. - -1. Given a working REPL interface, write and execute a statement that - will print \"hello world\" using console.log - -2. Identify that strings are a list of characters defined by using - double or single quotes - -3. Given an arithmetic expression using +, -, \*, /, %, compute its - value - -4. Given an expression, predict if its value is NaN - -5. Construct the truth tables for &&, \|\|, ! - -6. Given an expression consisting of \>, \>=, ===, \<, \<=, compute - it\'s value - -7. Apply De Morgan\'s law to a boolean expression - -8. Given an expression that utilizes operator precedence, compute its - value - -9. Given an expression, use the grouping operator to change it\'s - evaluation +``` +# WEEK 1
*Introduction to JavaScript (Part 1)* {ignore=true} +________________________________________________________________________________ + + + +[**Expression Learning Objectives**](#expression-learning-objectives) +[**Intro to Functions Learning Objectives**](#intro-to-functions-learning-objectives) +- [Hello World](#hello-world) + - [Getting visual feedback in your programs](#getting-visual-feedback-in-your-programs) + - [Code comments](#code-comments) +- [The Number Type](#the-number-type) + - [All the numbers](#all-the-numbers) + - [The basic arithmetic operators](#the-basic-arithmetic-operators) +- [The String Type](#the-string-type) + - [Writing a valid string](#writing-a-valid-string) + - [Calculating length](#calculating-length) + - [Indexing a string](#indexing-a-string) + - [Concatenation](#concatenation) +- [The Boolean Type](#the-boolean-type) + - [Logical Operators](#logical-operators) + - [De Morgan's Law](#de-morgans-law) +- [Comparison Operators](#comparison-operators) + - [The relative comparators](#the-relative-comparators) + - [=== vs ==](#vs) +- [Basic Variables](#basic-variables) + - [Initializing a variable](#initializing-a-variable) + - [Manipulating variables](#manipulating-variables) + - [NaN](#nan) +- [Introduction to Functions](#introduction-to-functions) + - [Writing Functions](#writing-functions) + - [Invoking or "calling" a function](#invoking-or-calling-a-function) + - [Returning a value](#returning-a-value) + - [The importance of naming](#the-importance-of-naming) +- [Parameters and Arguments](#parameters-and-arguments) + - [The difference between Parameters and Arguments](#the-difference-between-parameters-and-arguments) + +[**Control Flow and Array Learning Objectives**](#control-flow-and-array-learning-objectives) +- [Control Flow - Conditional Statements](#control-flow-conditional-statements) + - [A Quick Word on Syntax](#a-quick-word-on-syntax) + - [Writing Conditional Statements](#writing-conditional-statements) +- [Mutually Exclusive Conditions](#mutually-exclusive-conditions) + - [When to use if statements](#when-to-use-if-statements) +- [Control Flow - Looping](#control-flow-looping) + - [Looping](#looping) + - [Translating From One Loop to Another](#translating-from-one-loop-to-another) +- [The Array Type](#the-array-type) + - [Using arrays](#using-arrays) + - [Indexing arrays](#indexing-arrays) + - [Working with arrays](#working-with-arrays) + - [Concatenation with arrays](#concatenation-with-arrays) + +[**Intermediate Functions Learning Objectives**](#intermediate-functions-learning-objectives) +- [Function Expressions](#function-expressions) + - [Functions as first-class objects](#functions-as-first-class-objects) +- [Two-Dimensional Arrays (2D Arrays)](#two-dimensional-arrays-2d-arrays) + - [Multidimensional Arrays](#multidimensional-arrays) + - [Iterating through 2D Arrays](#iterating-through-2d-arrays) + - [When is a 2D array practical?](#when-is-a-2d-array-practical) +- [Mutability in JavaScript](#mutability-in-javascript) + - [What is mutability?](#what-is-mutability) + - [Mutable or immutable, that is the question](#mutable-or-immutable-that-is-the-question) + - [The mutability misconception](#the-mutability-misconception) +- [Array Splice](#array-splice) + - [Notation](#notation) + - [What can Array#splice do?](#what-can-arraysplice-do) +- [String#split and Array#join](#stringsplit-and-arrayjoin) + - [String#split](#stringsplit) + - [Array#join](#arrayjoin) + - [A clever combination](#a-clever-combination) +- [Determining Types](#determining-types) + - [The typeof operator](#the-typeof-operator) + - [How to tell if a value is an array](#how-to-tell-if-a-value-is-an-array) + - [Practical use in "real" code](#practical-use-in-real-code) +- [The Null Type (And Undefined)](#the-null-type-and-undefined) + - [A type with only one value](#a-type-with-only-one-value) + - [The meaning of null](#the-meaning-of-null) + - [The absence of a value](#the-absence-of-a-value) + - [An unknown value](#an-unknown-value) + - [Checking if a value is null](#checking-if-a-value-is-null) + - [Oh, and there's that undefined value, too](#oh-and-theres-that-undefined-value-too) + - [What happens when...](#what-happens-when) +- [Catch Me If You Can](#catch-me-if-you-can) + - [Structured exception handling](#structured-exception-handling) + - [Try and catch](#try-and-catch) + - [How can I make my own errors?](#how-can-i-make-my-own-errors) + - [What else is there?](#what-else-is-there) + - [How do I best use this?](#how-do-i-best-use-this) + + +________________________________________________________________________________ +# WEEK-01 DAY-1
*Function Introduction* {ignore=true} +________________________________________________________________________________ +# Expression Learning Objectives + +Below is a complete list of the terminal learning objectives for this lesson. +When you complete this lesson, you should be able to perform each of the +following objectives. These objectives capture how you may be evaluated on the +assessment for this lesson. + +1. Given a working REPL interface, write and execute a statement that will print + "hello world" using console.log +2. Identify that strings are a list of characters defined by using double or + single quotes +3. Given an arithmetic expression using +, -, \*, /, %, compute its value +4. Given an expression, predict if its value is NaN +5. Construct the truth tables for &&, ||, ! +6. Given an expression consisting of >, >=, ===, <, <=, compute it's value +7. Apply De Morgan's law to a boolean expression +8. Given an expression that utilizes operator precedence, compute its value +9. Given an expression, use the grouping operator to change it's evaluation 10. Given expressions using == and ===, compute their values - -11. Given a code snippet using postfix ++, postfix \--, +=, -=, /=, \*=, - predict the value of labeled lines - -12. Create and assign a variable using `let` to a string, integer, and - a boolean. Read its value and print to the console.l learning - objectives for this lesson. When you complete this lesson, you should be able to perform each of - the following objectives. These objectives capture how you may be - evaluated on the assessment for this lesson. - -13. Given a working REPL interface, write and execute a statement that - will print \"hello world\" using console.log - -14. Identify that strings are a list of characters defined by using - double or single quotes - -15. Given an arithmetic expression using +, -, \*, /, %, compute its - value - -16. Given an expression, predict if its value is NaN - -17. Construct the truth tables for &&, \|\|, ! - -18. Given an expression consisting of \>, \>=, ===, \<, \<=, compute - it\'s value - -19. Apply De Morgan\'s law to a boolean expression - -20. Given an expression that utilizes operator precedence, compute its - value - -21. Given an expression, use the grouping operator to change it\'s - evaluation - -22. Given expressions using == and ===, compute their values - -23. Given a code snippet using postfix ++, postfix \--, +=, -=, /=, \*=, - predict the value of labeled lines - -24. Create and assign a variable using `let` to a string, integer, and - a boolean. Read its value and print to the console. - ------------------------------------------------------------------------- - -Intro to Functions Learning Objectives {#intro-to-functions-learning-objectives .mume-header} -====================================== - -Below is a complete list of the terminal learning objectives for this -lesson.When you complete this lesson, you should be able to perform each of -thefollowing objectives. These objectives capture how you may be evaluated -on theassessment for this lesson. - -1. Define a function using function declaration - -2. Define a function that calculates the average of two numbers, call - it, pass in arguments, and print it\'s return value - -3. Identify the difference between parameters vs argument terminal - learning objectives for this lesson. When you complete this lesson, you should be able to perform each of - the following objectives. These objectives capture how you may be - evaluated on the assessment for this lesson. - -4. Define a function using function declaration - -5. Define a function that calculates the average of two numbers, call - it, pass in arguments, and print it\'s return value - -6. Identify the difference between parameters vs arguments - ------------------------------------------------------------------------- - -Hello World {#hello-world .mume-header} -=========== - -Hey Programmer! Welcome to the JavaScript module. In the next few -sections,we\'ll be learning the fundamentals of the JavaScript programming -language. Ifit\'s your first time programming, don\'t worry; we designed this -courseespecially for you. We\'ll have you executing your first lines of code -in notime! +11. Given a code snippet using postfix ++, postfix --, +=, -=, /=, \*=, predict + the value of labeled lines +12. Create and assign a variable using `let` to a string, integer, and a + boolean. Read its value and print to the console.l learning objectives for this lesson. +When you complete this lesson, you should be able to perform each of the +following objectives. These objectives capture how you may be evaluated on the +assessment for this lesson. + +1. Given a working REPL interface, write and execute a statement that will print + "hello world" using console.log +2. Identify that strings are a list of characters defined by using double or + single quotes +3. Given an arithmetic expression using +, -, \*, /, %, compute its value +4. Given an expression, predict if its value is NaN +5. Construct the truth tables for &&, ||, ! +6. Given an expression consisting of >, >=, ===, <, <=, compute it's value +7. Apply De Morgan's law to a boolean expression +8. Given an expression that utilizes operator precedence, compute its value +9. Given an expression, use the grouping operator to change it's evaluation +10. Given expressions using == and ===, compute their values +11. Given a code snippet using postfix ++, postfix --, +=, -=, /=, \*=, predict + the value of labeled lines +12. Create and assign a variable using `let` to a string, integer, and a + boolean. Read its value and print to the console. + +________________________________________________________________________________ +# Intro to Functions Learning Objectives + +Below is a complete list of the terminal learning objectives for this lesson. +When you complete this lesson, you should be able to perform each of the +following objectives. These objectives capture how you may be evaluated on the +assessment for this lesson. + +1. Define a function using function declaration +2. Define a function that calculates the average of two numbers, call it, + pass in arguments, and print it's return value +3. Identify the difference between parameters vs argument terminal learning objectives for this lesson. +When you complete this lesson, you should be able to perform each of the +following objectives. These objectives capture how you may be evaluated on the +assessment for this lesson. + +1. Define a function using function declaration +2. Define a function that calculates the average of two numbers, call it, + pass in arguments, and print it's return value +3. Identify the difference between parameters vs arguments +________________________________________________________________________________ +# Hello World + +Hey Programmer! Welcome to the JavaScript module. In the next few sections, +we'll be learning the fundamentals of the JavaScript programming language. If +it's your first time programming, don't worry; we designed this course +especially for you. We'll have you executing your first lines of code in no +time! When you finish this article, you should be able to: -- use the `console.log` command to print out messages -- use double slashes (`//`) to write code comments +- use the `console.log` command to print out messages +- use double slashes (`//`) to write code comments -Getting visual feedback in your programs {#getting-visual-feedback-in-your-programs .mume-header} ----------------------------------------- +## Getting visual feedback in your programs -The first command we\'ll learn in JavaScript is `console.log`. This -command isused to *print* something onto the screen. As we write our first lines -of code,we\'ll be using `console.log` frequently as a way to visually see the -output ofour programs. Let\'s write our first program: +The first command we'll learn in JavaScript is `console.log`. This command is +used to _print_ something onto the screen. As we write our first lines of code, +we'll be using `console.log` frequently as a way to visually see the output of +our programs. Let's write our first program: -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript console.log("hello world"); console.log("how are you?"); ``` Executing the program above would print out the following: -``` {.language-plaintext data-role="codeBlock" data-info="plaintext"} +```plaintext hello world how are you? ``` -Nothing too ground breaking here, but pay close attention to the exact -way wewrote the program. In particular, notice how we lay out the periods,parentheses, and quotation marks. We\'ll also terminate lines with -semicolons(😉. +Nothing too ground breaking here, but pay close attention to the exact way we +wrote the program. In particular, notice how we lay out the periods, +parentheses, and quotation marks. We'll also terminate lines with semicolons +(;). -> Depending on how you structure your code, sometimes you\'ll be able to -> omit> semicolons at the end of lines. For now, you\'ll want to include them> just as we do. +> Depending on how you structure your code, sometimes you'll be able to omit +> semicolons at the end of lines. For now, you'll want to include them +> just as we do. -### Syntax {#syntax .mume-header} +### Syntax -We refer to the exact arrangement of the symbols, characters, and -keywords as**syntax**. These details matter - your computer will only be able to"understand\" proper JavaScript syntax. A programming language is -similar to aspoken language. A spoken language like English has grammar rules that -we shouldfollow in order to be understood by fellow speakers. In the same way, aprogramming language like JavaScript has syntax rules that we ought to -follow! +We refer to the exact arrangement of the symbols, characters, and keywords as +**syntax**. These details matter - your computer will only be able to +"understand" proper JavaScript syntax. A programming language is similar to a +spoken language. A spoken language like English has grammar rules that we should +follow in order to be understood by fellow speakers. In the same way, a +programming language like JavaScript has syntax rules that we ought to follow! -As you write your first lines of code in this new language, you may make -manysyntax errors. Don\'t get frustrated! This is normal - all new -programmers gothrough this phase. Every time we recognize an error in our code, we -have anopportunity to reinforce your understanding of correct syntax. Adopt a -growthmindset and learn from your mistakes. +As you write your first lines of code in this new language, you may make many +syntax errors. Don't get frustrated! This is normal - all new programmers go +through this phase. Every time we recognize an error in our code, we have an +opportunity to reinforce your understanding of correct syntax. Adopt a growth +mindset and learn from your mistakes. -Additionally, one of the best things about programming is that we can -get suchimmediate feedback from our creations. There is no penalty for making a -mistakewhen programming. Write some code, run the code, read the errors, fix -theerrors, rinse and repeat! +Additionally, one of the best things about programming is that we can get such +immediate feedback from our creations. There is no penalty for making a mistake +when programming. Write some code, run the code, read the errors, fix the +errors, rinse and repeat! -Code comments {#code-comments .mume-header} -------------- +## Code comments -Occasionally we\'ll want to leave **comments** or notes in our code. -Commentedlines will be ignored by our computer. This means that we can use -comments towrite plain english or temporarily avoid execution of some JavaScript -lines. Theproper *syntax* for writing a comment is to begin the line with double -forwardslashes (`//`): +Occasionally we'll want to leave **comments** or notes in our code. Commented +lines will be ignored by our computer. This means that we can use comments to +write plain english or temporarily avoid execution of some JavaScript lines. The +proper _syntax_ for writing a comment is to begin the line with double forward +slashes (`//`): -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript // let's write another program!!! console.log("hello world"); @@ -1401,105 +584,99 @@ console.log("goodbye moon"); The program above would only print: -``` {.language-plaintext data-role="codeBlock" data-info="plaintext"} +```plaintext hello world goodbye moon ``` -Comments are useful when annotating pieces of code to offer an -explanation ofhow the code works. We\'ll want to strive to write straightforward code -that isself-explanatory when possible, but we can also use comments to add -additionalclarity. The real art of programming is to write code so elegantly that -it iseasy to follow. - -\"Simplicity is prerequisite for reliability.\" --- Edsger W. Dijkstra +Comments are useful when annotating pieces of code to offer an explanation of +how the code works. We'll want to strive to write straightforward code that is +self-explanatory when possible, but we can also use comments to add additional +clarity. The real art of programming is to write code so elegantly that it is +easy to follow. -Remember {#what-youve-learned .mume-header} --------- +"Simplicity is prerequisite for reliability." — Edsger W. Dijkstra -- `console.log` can be used to print to the screen -- using `//` at the front of a line will turn it into a comment; - comments are ignored by JavaScript +## What you've learned ------------------------------------------------------------------------- +- `console.log` can be used to print to the screen +- using `//` at the front of a line will turn it into a comment; comments are + ignored by JavaScript -The Number Type {#the-number-type .mume-header} -=============== +________________________________________________________________________________ +# The Number Type -The **Number** data type in JavaScript does exactly what you expect! It -is usedto represent any numerical values, this includes integers and decimal -numbers.As one of our first data types, we\'ll be interested in what operations -we canuse with numbers. +The **Number** data type in JavaScript does exactly what you expect! It is used +to represent any numerical values, this includes integers and decimal numbers. +As one of our first data types, we'll be interested in what operations we can +use with numbers. When you finish this article, you should be able to: -- predict the evaluation of arithmetic expressions -- explain the order of operations for JavaScript\'s arithmetic - operators -- use the grouping operator, `()`, to manipulate the order of - operations in an expression +- predict the evaluation of arithmetic expressions +- explain the order of operations for JavaScript's arithmetic operators +- use the grouping operator, `()`, to manipulate the order of operations in an + expression -All the numbers {#all-the-numbers .mume-header} ---------------- +## All the numbers -JavaScript\'s **Number** encompasses numerical values. All of the -following values are of number type: +JavaScript's **Number** encompasses numerical values. All of the following values are of number type: -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript 42; -5; 3.14159; 7.0; ``` -The basic arithmetic operators {#the-basic-arithmetic-operators .mume-header} ------------------------------- +## The basic arithmetic operators -For any given data type, we\'re interested in what operations we can -perform withthat type. We use the word *operator* to refer to the symbol that -performs aparticular *operation*. For example, the `+` operator performs the -additionoperation. Here are the common arithmetic operators in JS: +For any given data type, we're interested in what operations we can perform with +that type. We use the word _operator_ to refer to the symbol that performs a +particular _operation_. For example, the `+` operator performs the addition +operation. Here are the common arithmetic operators in JS: -- `+` (addition) -- `-` (subtraction) -- `*` (multiplication) -- `/` (division) -- `%` (modulo) +- `+` (addition) +- `-` (subtraction) +- `*` (multiplication) +- `/` (division) +- `%` (modulo) -With number values and arithmetic operators in hand, we can evaluate our -firstexpressions: +With number values and arithmetic operators in hand, we can evaluate our first +expressions: -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript console.log(2 + 3); // => 5 console.log(42 - 42); // => 0 console.log(-4 * 1.5); // => -6 console.log(25 / 8); // => 3.125 ``` -Nothing too groundbreaking about the results above. An expression -consists ofvalues and operators. JavaScript will evaluate an expression into a -singlevalue. +Nothing too groundbreaking about the results above. An expression consists of +values and operators. JavaScript will evaluate an expression into a single +value. -We can write more complex expressions using multiple operators. However, -we\'llwant to be aware of the general math order of operations. That is, we -performmultiplication-division operations first and then addition-subtractionoperations. To force a specific order of operation, we can use the -groupingoperator, `( )`, around a part of the expression: +We can write more complex expressions using multiple operators. However, we'll +want to be aware of the general math order of operations. That is, we perform +multiplication-division operations first and then addition-subtraction +operations. To force a specific order of operation, we can use the grouping +operator, `( )`, around a part of the expression: -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript console.log(5 * 3 + 2); // => 17 console.log(2 + 3 * 5); // => 17 console.log((2 + 3) * 5); // => 25 ``` -### The modulo operation {#the-modulo-operation .mume-header} +### The modulo operation -All of the math operators listed above are the simple operations you -useeveryday, except for maybe modulo `%`. **Modulo gives us the remainder -thatresults from a division.** For example, `10 % 3` is 1 because when we -divide 10by 3, we are left with a remainder of 1. We can read `10 % 3` as \"ten -modulothree\" or \"ten mod three.\" +All of the math operators listed above are the simple operations you use +everyday, except for maybe modulo `%`. **Modulo gives us the remainder that +results from a division.** For example, `10 % 3` is 1 because when we divide 10 +by 3, we are left with a remainder of 1. We can read `10 % 3` as "ten modulo +three" or "ten mod three." -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript console.log(10 % 3); // => 1 console.log(14 % 5); // => 4 console.log(20 % 17); // => 3 @@ -1507,58 +684,54 @@ console.log(18 % 6); // => 0 console.log(7 % 9); // => 7 ``` -Modulo is a very useful operation in the realm of computers. We can use -it tocheck the divisibility of numbers, whether numbers are even, whether -they areprime, and much, much more. Don\'t take this seemingly simple operation -fromgranted! We\'ll provide a ton of practice using these modulo patterns as -we move through the course. +Modulo is a very useful operation in the realm of computers. We can use it to +check the divisibility of numbers, whether numbers are even, whether they are +prime, and much, much more. Don't take this seemingly simple operation from +granted! We'll provide a ton of practice using these modulo patterns as we move through the course. -In the order of operations, modulo has the the same precedence asmultiplication-division. So our complete order of math operations in JS -isparentheses, multiplication-division-modulo, addition-subtraction. +In the order of operations, modulo has the the same precedence as +multiplication-division. So our complete order of math operations in JS is +parentheses, multiplication-division-modulo, addition-subtraction. -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript // modulo has precedence over addition console.log(4 + 12 % 5); // => 6 console.log((4 + 12) % 5); // => 1 ``` -Remember {#what-youve-learned-1 .mume-header} --------- - -- The **Number** type is used to represent integer and decimal values -- The operators `+`, `-`, `/`, `*` perform the normal math operations - of addition, subtraction, division, multiplication respectively -- `a % b` returns the remainder when we divide `a` by `b`; we call - this operation modulo -- JavaScript follows the usual mathematical order of operations and we - can use the `()` to force precedence +## What you've learned ------------------------------------------------------------------------- +- The **Number** type is used to represent integer and decimal values +- The operators `+`, `-`, `/`, `*` perform the normal math operations of + addition, subtraction, division, multiplication respectively +- `a % b` returns the remainder when we divide `a` by `b`; we call this + operation modulo +- JavaScript follows the usual mathematical order of operations and we can use + the `()` to force precedence -The String Type {#the-string-type .mume-header} -=============== +________________________________________________________________________________ +# The String Type -This article is about one of JavaScript\'s primitive data types, -**String**.Strings are what we\'ll use to represent textual data. This means that -stringsare useful in representing things like messages, names, poems, and so -on. Astring is a sequence of characters. +This article is about one of JavaScript's primitive data types, **String**. +Strings are what we'll use to represent textual data. This means that strings +are useful in representing things like messages, names, poems, and so on. A +string is a sequence of characters. When you finish this article, you should be able to: -- Write strings using correct syntax -- Use `.length` to obtain a count of the numbers of characters that - comprise a string -- Index a string to refer to a single character -- Concatenate strings together +- Write strings using correct syntax +- Use `.length` to obtain a count of the numbers of characters that comprise a + string +- Index a string to refer to a single character +- Concatenate strings together -Writing a valid string {#writing-a-valid-string .mume-header} ----------------------- +## Writing a valid string -Strings are always wrapped by a pair of single quotation marks (`'`) or -by apair of double quotation marks (`"`). Between the enclosing quotation -marks, wecan put any characters! Here are a six examples of strings: +Strings are always wrapped by a pair of single quotation marks (`'`) or by a +pair of double quotation marks (`"`). Between the enclosing quotation marks, we +can put any characters! Here are a six examples of strings: -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript "potato"; "New York"; "azablan@.io"; @@ -1567,50 +740,47 @@ marks, wecan put any characters! Here are a six examples of strings: ""; ``` -Above, notice that we are free to mix in **any** characters into a -string. Thisincludes spaces, numerics, punctuation, and other symbols. The sixth -stringabove is the empty string; it contains zero characters! +Above, notice that we are free to mix in **any** characters into a string. This +includes spaces, numerics, punctuation, and other symbols. The sixth string +above is the empty string; it contains zero characters! -You are probably wondering why we are allowed to use either single or -doublequotes when denoting a string - why is this useful? Maybe we want a -string that*contains* quotation marks: +You are probably wondering why we are allowed to use either single or double +quotes when denoting a string - why is this useful? Maybe we want a string that +_contains_ quotation marks: -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript // valid strings 'Shakespeare wrote, "To be or not to be"'; "That's a great string"; ``` -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript // invalid string 'That's a bad string' ``` -If we want to use a single quote as a character of a string, we simply -need toenclose the string in double quotes, and vice versa. +If we want to use a single quote as a character of a string, we simply need to +enclose the string in double quotes, and vice versa. -Calculating length {#calculating-length .mume-header} ------------------- +## Calculating length -Since a single string can contain any number of characters, we may find -ituseful to count the number of characters in a string using `.length`: +Since a single string can contain any number of characters, we may find it +useful to count the number of characters in a string using `.length`: -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript console.log("ramen".length); // => 5 console.log("go home!".length); // => 8 console.log("".length); // => 0 ``` -Indexing a string {#indexing-a-string .mume-header} ------------------ +## Indexing a string -Strings consist of multiple characters. These characters are numbered -by**indices** starting at 0. So in the string `'bootcamp'`, `'b'` is at -index 0,`'o'` is at index 1, `'o'` is at index 2, `'t'` is at index 3, and so -on. We canlook at particular characters of a string by using `[]` and specifying -an index: +Strings consist of multiple characters. These characters are numbered by +**indices** starting at 0. So in the string `'bootcamp'`, `'b'` is at index 0, +`'o'` is at index 1, `'o'` is at index 2, `'t'` is at index 3, and so on. We can +look at particular characters of a string by using `[]` and specifying an index: -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript console.log("bootcamp"[0]); // => 'b' console.log("bootcamp"[1]); // => 'o' console.log("bootcamp"[2]); // => 'o' @@ -1620,226 +790,203 @@ console.log("bootcamp"[10]); // => undefined console.log("bootcamp"[-3]); // => undefined ``` -In general, when we index a string using the expression `string[i]`, we -get backthe **single character** at position `i`. Looking at the last two -examplesabove, if we use an invalid index with a string, the value returned is`undefined`. This makes since because there is no character at the -givenposition! It\'s also worth mentioning that an index should always be a -number. +In general, when we index a string using the expression `string[i]`, we get back +the **single character** at position `i`. Looking at the last two examples +above, if we use an invalid index with a string, the value returned is +`undefined`. This makes since because there is no character at the given +position! It's also worth mentioning that an index should always be a number. -### The classic \"off by one\" error {#the-classic-off-by-one-error .mume-header} +### The classic "off by one" error -Bear in mind that indices begin at 0 and not 1! Forgetting this nuance -can leadto incorrect code for both new and experienced programmers alike. Let\'s -hone inon an important distinction: the index of the last character of a string -isalways one less than it\'s length. +Bear in mind that indices begin at 0 and not 1! Forgetting this nuance can lead +to incorrect code for both new and experienced programmers alike. Let's hone in +on an important distinction: the index of the last character of a string is +always one less than it's length. -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript console.log("cat".length); // => 3 console.log("cat"[3]); // => undefined console.log("cat"[2]); // => 't' ``` -In other words, although the `length` of `'cat'` is 3, the index of the -lastcharacter (`'t'`) is 2. +In other words, although the `length` of `'cat'` is 3, the index of the last +character (`'t'`) is 2. -### Using indexOf {#using-indexof .mume-header} +### Using indexOf -We can also calculate the index of a given character within a string by -using`indexOf`: +We can also calculate the index of a given character within a string by using +`indexOf`: -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript console.log("bagel".indexOf("b")); // => 0 console.log("bagel".indexOf("a")); // => 1 console.log("bagel".indexOf("l")); // => 4 console.log("bagel".indexOf("z")); // => -1 ``` -If we attempt to search for a character that is **not** present in a -string,`indexOf` will return -1. This makes sense because we know that -1 is -not avalid string index. The smallest index possible is 0! +If we attempt to search for a character that is **not** present in a string, +`indexOf` will return -1. This makes sense because we know that -1 is not a +valid string index. The smallest index possible is 0! -If we search for a character that appears more than once in a string,`indexOf` will return the index of the first occurance of that -character. +If we search for a character that appears more than once in a string, +`indexOf` will return the index of the first occurance of that character. -We can also use `indexOf` to search for a substring of characters. Under -thiscircumstance, `indexOf` will return the index where the substring begins -in themain string: +We can also use `indexOf` to search for a substring of characters. Under this +circumstance, `indexOf` will return the index where the substring begins in the +main string: -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript console.log("door hinge".indexOf("oor")); // => 1 console.log("door hinge".indexOf("hi")); // => 5 console.log("door hinge".indexOf("hint")); // => -1 ``` -Concatenation {#concatenation .mume-header} -------------- +## Concatenation -Concatenation is just a fancy word for joining strings together into a -singlestring. To concatenate strings, we use the `+` operator: +Concatenation is just a fancy word for joining strings together into a single +string. To concatenate strings, we use the `+` operator: -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript console.log("hello" + "world"); // => 'helloworld' console.log("goodbye" + " " + "moon"); // => 'goodbye moon' ``` -Remember {#what-youve-learned-2 .mume-header} --------- +## What you've learned -- a **String** is a data type that contains multiple characters - enclosed in quotation marks -- `string.length` returns the number of characters in the `string` -- each character of a string is associated with a number index; the - first character of a string is at index 0 -- we can use `string.indexOf(char)` to obtain the index of `char` - within `string`; if `char` is not found, then -1 is returned -- we can use `+` to concatenate multiple strings, combining them into - a single string +- a **String** is a data type that contains multiple characters enclosed in + quotation marks +- `string.length` returns the number of characters in the `string` +- each character of a string is associated with a number index; the first + character of a string is at index 0 +- we can use `string.indexOf(char)` to obtain the index of `char` within + `string`; if `char` is not found, then -1 is returned +- we can use `+` to concatenate multiple strings, combining them into a single + string ------------------------------------------------------------------------- +________________________________________________________________________________ +# The Boolean Type -The Boolean Type {#the-boolean-type .mume-header} -================ - -The **Boolean** data type is perhaps the simplest type since there are -only twopossible values, `true` and `false`. However, we\'ll find booleans very -usefulbecause they will act as components of later concepts. As programmers, -we\'ll usebooleans to describe the validity of statements. In an abstract sense, -*\"Todayis Monday\"* and *\"one plus one equals ten\"* are examples of -statements withboolean values. That is, they are either `true` or `false`. +The **Boolean** data type is perhaps the simplest type since there are only two +possible values, `true` and `false`. However, we'll find booleans very useful +because they will act as components of later concepts. As programmers, we'll use +booleans to describe the validity of statements. In an abstract sense, _"Today +is Monday"_ and _"one plus one equals ten"_ are examples of statements with +boolean values. That is, they are either `true` or `false`. When you finish this article, you should be able to: -- predict the evaluation of expressions that use the boolean - operations of `!`, `||`, and `&&` -- explain DeMorgan\'s law +- predict the evaluation of expressions that use the boolean operations of `!`, + `||`, and `&&` +- explain DeMorgan's law -Logical Operators {#logical-operators .mume-header} ------------------ +## Logical Operators -In the long run, we\'ll be using booleans to establish logic in our -code. Forthis reason, the *boolean operators* can also be referred to as the -*logicaloperators*. There are only three such operators: +In the long run, we'll be using booleans to establish logic in our code. For +this reason, the _boolean operators_ can also be referred to as the _logical +operators_. There are only three such operators: -- `!` (not) -- `&&` (and) -- `||` (or) +- `!` (not) +- `&&` (and) +- `||` (or) -### Logical NOT {#logical-not .mume-header} +### Logical NOT The not (`!`) operator will reverse a boolean value: -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript console.log(!true); // => false console.log(!false); // => true console.log(!!false); // => false ``` -It\'s worth mentioning that `!` is a unary operator. This means that the -notoperation is applied to a single value. This is in contrast to a binary -operatorsuch as multiplication, which is applied between two values. It does not -makesense to `!` two values together. +It's worth mentioning that `!` is a unary operator. This means that the not +operation is applied to a single value. This is in contrast to a binary operator +such as multiplication, which is applied between two values. It does not make +sense to `!` two values together. -### Logical AND {#logical-and .mume-header} +### Logical AND -The and (`&&`) operator will take two boolean values and will only -evaluate to`true` when both input values are `true`. Otherwise, it will return -`false`: +The and (`&&`) operator will take two boolean values and will only evaluate to +`true` when both input values are `true`. Otherwise, it will return `false`: -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript console.log(false && false); // => false console.log(false && true); // => false console.log(true && false); // => false console.log(true && true); // => true ``` -### Logical OR {#logical-or .mume-header} +### Logical OR -The or (`||`) operator will take two boolean values and will only -evaluate to`false` when both input values are `false`. Otherwise, it will return -`true`: +The or (`||`) operator will take two boolean values and will only evaluate to +`false` when both input values are `false`. Otherwise, it will return `true`: -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript console.log(false || false); // => false console.log(false || true); // => true console.log(true || false); // => true console.log(true || true); // => true ``` -### Logical order of operations {#logical-order-of-operations .mume-header} +### Logical order of operations -We can write boolean expressions that consist of multiple logical -operations, but we should be aware of the order of operations. -JavaScript will evaluate `!` then `&&` then `||`. +We can write boolean expressions that consist of multiple logical operations, but we should be aware of the order of operations. JavaScript will evaluate `!` then `&&` then `||`. -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript console.log(true || true && false); // => true console.log(false && !(false || true)); // => false ``` -In general, `A || B && C` is equivalent to `A || (B && C)` where `A`, -`B`, `C` are booleans. +In general, `A || B && C` is equivalent to `A || (B && C)` where `A`, `B`, `C` are booleans. -De Morgan\'s Law {#de-morgans-law .mume-header} ----------------- +## De Morgan's Law -A common mistake in boolean logic is to incorrectly distribute `!` -across parentheses. Say we had boolean values of `A`, `B`. Here is -something to remember: +A common mistake in boolean logic is to incorrectly distribute `!` across parentheses. Say we had boolean values of `A`, `B`. Here is something to remember: -- `!(A || B)` is equivalent to `!A && !B` -- `!(A && B)` is equivalent to `!A || !B` +* `!(A || B)` is equivalent to `!A && !B` +* `!(A && B)` is equivalent to `!A || !B` -In other words, to correctly distribute `!` across parentheses, we must -also flip the operation within parentheses. Beware that: -- `!(A || B)` is not equivalent to `!A || !B` -- `!(A && B)` is not equivalent to `!A && !B` +In other words, to correctly distribute `!` across parentheses, we must also flip the operation within parentheses. Beware that: -We call this property **De Morgan\'s Law**. Shout out to Augustus De -Morgan of Great Britain. +* `!(A || B)` is not equivalent to `!A || !B` +* `!(A && B)` is not equivalent to `!A && !B` -Remember {#what-youve-learned-3 .mume-header} --------- +We call this property **De Morgan's Law**. Shout out to Augustus De Morgan of Great Britain. -- `!`, `&&`, `||` are the boolean operators that we can use to - establish logic in our code -- De Morgan\'s Law should be used to distribute `!` against - parentheses +## What you've learned -These are just the basics of the type. We\'ll be seeing more booleans in -the upcoming section, so stay tuned for that! +* `!`, `&&`, `||` are the boolean operators that we can use to establish logic in our code +* De Morgan's Law should be used to distribute `!` against parentheses ------------------------------------------------------------------------- +These are just the basics of the type. We'll be seeing more booleans in the upcoming section, so stay tuned for that! -Comparison Operators {#comparison-operators .mume-header} -==================== +________________________________________________________________________________ +# Comparison Operators -In our previous introduction to the boolean data type, we described -booleans asway to represent the validity of an expression. We\'ll continue this -conversationby exploring **comparison** operators. As you learn about these -operators, bearin mind that all comparisons will result in a boolean, `true` or -`false`. +In our previous introduction to the boolean data type, we described booleans as +way to represent the validity of an expression. We'll continue this conversation +by exploring **comparison** operators. As you learn about these operators, bear +in mind that all comparisons will result in a boolean, `true` or `false`. When you finish this article, you should be able to: -- Predict the result of expressions that utilize the operators `>`, - `<`, `>=` `<=`, `===`, and `!==` -- Explain the difference between the equality operators `==` and `===` +- Predict the result of expressions that utilize the operators `>`, `<`, `>=` + `<=`, `===`, and `!==` +- Explain the difference between the equality operators `==` and `===` -The relative comparators {#the-relative-comparators .mume-header} ------------------------- +## The relative comparators -- `>` (greater than) -- `<` (less than) -- `>=` (greater than or equal to) -- `<=` (less than or equal to) -- `===` (equal to) -- `!==` (not equal to) +- `>` (greater than) +- `<` (less than) +- `>=` (greater than or equal to) +- `<=` (less than or equal to) +- `===` (equal to) +- `!==` (not equal to) -Using these operators is pretty straightforward. Here are a few -examples: +Using these operators is pretty straightforward. Here are a few examples: -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript console.log(10 > 5); // => true console.log(10 < 5); // => false console.log(1 < 7); // => true @@ -1850,80 +997,78 @@ console.log("a" !== "A"); // => true console.log(false === false); // => true ``` -Notice that a comparison expression always evaluate to a boolean value -(`true`or `false`). Comparison operators like `===` are a useful to compare -strings,booleans, etc. not just numbers. +Notice that a comparison expression always evaluate to a boolean value (`true` +or `false`). Comparison operators like `===` are a useful to compare strings, +booleans, etc. not just numbers. -**Did you know?** `'a' < 'b'` is valid JS code? When you relatively -comparestrings using `>` or `<` you will be comparing them lexicographically.Lexicographically is fancy shmancy talk for \"dictionary\" order! A -\"lesser\"string is one that would appear earlier in the dictionary: +**Did you know?** `'a' < 'b'` is valid JS code? When you relatively compare +strings using `>` or `<` you will be comparing them lexicographically. +Lexicographically is fancy shmancy talk for "dictionary" order! A "lesser" +string is one that would appear earlier in the dictionary: -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript console.log("a" < "b"); // => true console.log("apple" < "abacus"); // => false console.log("app" < "apple"); // => true console.log("zoo" > "mississippi"); // => true ``` -**Gotcha** capitilized letters are considered lexicographically less -thanlower case letters. i.e \"A\" \< \"z\" // =\> true. +**Gotcha** capitilized letters are considered lexicographically less than +lower case letters. i.e "A" < "z" // => true. + -=== vs == {#vs .mume-header} ---------- +## === vs == -In JavaScript there are two equality operators triple-equals (`===`) -anddouble-equals (`==`). The operators differ in how they compare across -differingtypes. Triple-equals performs the *strict equality*, meaning it will -only return`true` if the types are the same. Double-equals performs the *loose -equality*,meaning it can return `true` even if the values are of different type.Double-equals may *coerce* a value into another type for the comparison, -andthis behavior is hard to predict: +In JavaScript there are two equality operators triple-equals (`===`) and +double-equals (`==`). The operators differ in how they compare across differing +types. Triple-equals performs the _strict equality_, meaning it will only return +`true` if the types are the same. Double-equals performs the _loose equality_, +meaning it can return `true` even if the values are of different type. +Double-equals may _coerce_ a value into another type for the comparison, and +this behavior is hard to predict: -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript console.log(5 === "5"); // false console.log(5 == "5"); // true console.log(0 === false); // false console.log(0 == false); //true ``` -Whoa! Surprised by these results? It can be hard to predict how `==` -behaves, sowe will avoid using it in this course and as a best practice. Stick to -using`===` because it respects data types. - -Remember {#what-youve-learned-4 .mume-header} --------- +Whoa! Surprised by these results? It can be hard to predict how `==` behaves, so +we will avoid using it in this course and as a best practice. Stick to using +`===` because it respects data types. -- `>`, `<`, `>=`,`<=`, `===`, and `!==` can be used to compare values -- we prefer to use `===` to check for equality because it takes the - type into account. +## What you've learned ------------------------------------------------------------------------- +- `>`, `<`, `>=`,`<=`, `===`, and `!==` can be used to compare values +- we prefer to use `===` to check for equality because it takes the type into + account. -Basic Variables {#basic-variables .mume-header} -=============== +________________________________________________________________________________ +# Basic Variables -Variables are used to store information to be referenced and manipulated -in acomputer program. They also provide a way of labeling data with a -descriptivename, so our programs can be understood more clearly by programmers. It -ishelpful to think of variables as containers that hold information. Their -solepurpose is to label and store data in computer memory. This data can -then beused and even changed throughout the lifetime of your program. +Variables are used to store information to be referenced and manipulated in a +computer program. They also provide a way of labeling data with a descriptive +name, so our programs can be understood more clearly by programmers. It is +helpful to think of variables as containers that hold information. Their sole +purpose is to label and store data in computer memory. This data can then be +used and even changed throughout the lifetime of your program. When you finish this reading, you should be able to: -- declare variables using the `let` keyword -- assign values to variables using the assignment operator (`=`) -- use the shortcuts `+=`, `-=`, `++`, `--` to reassign variables -- identify `undefined` as the default value for unassigned variables +- declare variables using the `let` keyword +- assign values to variables using the assignment operator (`=`) +- use the shortcuts `+=`, `-=`, `++`, `--` to reassign variables +- identify `undefined` as the default value for unassigned variables -Initializing a variable {#initializing-a-variable .mume-header} ------------------------ +## Initializing a variable -To initialize a variable in JavaScript we\'ll need two new pieces of -syntax:`let` and `=`. We can give the variable any name that we wish and assign -it avalue. Once we initialize a variable, the variable will evaluate to the -valueassigned: +To initialize a variable in JavaScript we'll need two new pieces of syntax: +`let` and `=`. We can give the variable any name that we wish and assign it a +value. Once we initialize a variable, the variable will evaluate to the value +assigned: -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript let bootcamp = ""; console.log(bootcamp); // '' @@ -1931,55 +1076,53 @@ let birthYear = 2012; console.log(birthYear); // 2012 ``` -**Did you know?** JavaScript variables names can contain any -alphanumericcharacters, underscore (\_), or dollar sign (\$). However, they *cannot* -beginwith a number. +**Did you know?** JavaScript variables names can contain any alphanumeric +characters, underscore (\_), or dollar sign (\$). However, they _cannot_ begin +with a number. -Above are examples of how you\'ll create variables most of the time, so -we\'llgrow very familiar with the syntax. As a best practice, we should name -ourvariables in a way that is descriptive and concise. +Above are examples of how you'll create variables most of the time, so we'll +grow very familiar with the syntax. As a best practice, we should name our +variables in a way that is descriptive and concise. -The variable initializations above really consist of two steps: -*declaration*with `let` and *assignment* with `=`. Let\'s break these two steps down. +The variable initializations above really consist of two steps: _declaration_ +with `let` and _assignment_ with `=`. Let's break these two steps down. -### Declaring a variable {#declaring-a-variable .mume-header} +### Declaring a variable -In JavaScript, in order to use a variable, we must *declare* it. -Variable**declaration** is the act of introducing the variable to the -environment. +In JavaScript, in order to use a variable, we must _declare_ it. Variable +**declaration** is the act of introducing the variable to the environment. -To declare a variable, use the `let` keyword, followed by a space and -then thename of the variable. +To declare a variable, use the `let` keyword, followed by a space and then the +name of the variable. -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript let bootcamp; console.log(bootcamp); // undefined ``` -Once a variable is declared, it will contain `undefined` as it\'s -value.`undefined` is a common default value in JavaScript, we\'ll see it come -up in afew different places. You can think of `undefined` as showing that the -variableis empty. +Once a variable is declared, it will contain `undefined` as it's value. +`undefined` is a common default value in JavaScript, we'll see it come up in a +few different places. You can think of `undefined` as showing that the variable +is empty. -### Assigning a variable {#assigning-a-variable .mume-header} +### Assigning a variable -Once a variable has been declared, we can assign it a value using -single-equals`=` : +Once a variable has been declared, we can assign it a value using single-equals +`=` : -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript let bootcamp; console.log(bootcamp); // undefined bootcamp = ""; console.log(bootcamp); // '' ``` -Manipulating variables {#manipulating-variables .mume-header} ----------------------- +## Manipulating variables -To change the value of a variable, we need to reassign it to a new value -with`=` : +To change the value of a variable, we need to reassign it to a new value with +`=` : -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript let num = 42; console.log(num + 8); // => 50 console.log(num); // => 42 @@ -1988,16 +1131,16 @@ num = num + 10; console.log(num); // => 52 ``` -In the code above, `num + 8` will evaluate to `50`, but it will not -change the `num`variable to `50`. If we want to change the `num` variable, we must -reassign toit. +In the code above, `num + 8` will evaluate to `50`, but it will not change the `num` +variable to `50`. If we want to change the `num` variable, we must reassign to +it. -### Assignment Shorthand {#assignment-shorthand .mume-header} +### Assignment Shorthand -Changing the value of a number variable is something fairly common in -theprogramming world. Luckily there is some shorthand operators we can use: +Changing the value of a number variable is something fairly common in the +programming world. Luckily there is some shorthand operators we can use: -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript let number = 0; number += 10; // equivalent to number = number + 10 number -= 2; // equivalent to number = number - 2 @@ -2006,10 +1149,10 @@ number *= 7; // equivalent to number = number * 7 console.log(number); // 14 ``` -We also have other shorthand to add or subtract exactly 1 from a -variable, theincrement (`++`) and decrement (`--`) operators: +We also have other shorthand to add or subtract exactly 1 from a variable, the +increment (`++`) and decrement (`--`) operators: -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript let year = 3004; year++; console.log(year); // 3005 @@ -2017,64 +1160,59 @@ year--; console.log(year); // 3004 ``` -NaN {#nan .mume-header} ---- +## NaN -Now that we have the ability to perform arithmetic with variables, -let\'s take alook at a common programming mistake, getting a result of `NaN` (not a -number): +Now that we have the ability to perform arithmetic with variables, let's take a +look at a common programming mistake, getting a result of `NaN` (not a number): -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript let num; console.log(num + 3); // NaN ``` -The above code gives `NaN` because the unassigned `num` variable -contains`undefined`; adding `3` to `undefined` results in `NaN`. In general, -anynonsensical arithmetic will result in `NaN`. Math operations involving`undefined` is perhaps the most common mistake: +The above code gives `NaN` because the unassigned `num` variable contains +`undefined`; adding `3` to `undefined` results in `NaN`. In general, any +nonsensical arithmetic will result in `NaN`. Math operations involving +`undefined` is perhaps the most common mistake: -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript console.log(undefined + 3); // NaN console.log("fish" * 2); // NaN ``` -Remember {#what-youve-learned-5 .mume-header} --------- +## What you've learned -- variables are declared with `let` and will contain the value - `undefined` by default -- we can use single-equals `=` to assign variables -- changing a variable requires a reassignment, for which there are - many shortcuts for (`+=`, `-=`, etc.) +- variables are declared with `let` and will contain the value `undefined` by + default +- we can use single-equals `=` to assign variables +- changing a variable requires a reassignment, for which there are many + shortcuts for (`+=`, `-=`, etc.) ------------------------------------------------------------------------- +________________________________________________________________________________ +# Introduction to Functions -Introduction to Functions {#introduction-to-functions .mume-header} -========================= - -We hope you are ready - because you are on the brink of one of the most -funparts of writing JavaScript: writing **functions**. A function is a -procedure ofcode that will run when called. We only \"write\" a function once -(**functiondeclaration**), but we can \"use\" it as many times as we please -(**functioncalls**). Functions are the fundamental building blocks of JavaScript -andmastering them is a big step on the road to JavaScript mastery. +We hope you are ready - because you are on the brink of one of the most fun +parts of writing JavaScript: writing **functions**. A function is a procedure of +code that will run when called. We only "write" a function once (**function +declaration**), but we can "use" it as many times as we please (**function +calls**). Functions are the fundamental building blocks of JavaScript and +mastering them is a big step on the road to JavaScript mastery. When you finish this reading, you should be able to: -1. Describe what a function in JavaScript is. -2. Demonstrate how to invoke a function. -3. Write a function using function declaration. -4. Use the `return` keyword to return a value from a function. +1. Describe what a function in JavaScript is. +2. Demonstrate how to invoke a function. +3. Write a function using function declaration. +4. Use the `return` keyword to return a value from a function. -Writing Functions {#writing-functions .mume-header} ------------------ +## Writing Functions -A function is a set procedure of code that will run when called. -Functionsreally start to make sense when put in the perspective of solving -problems. Sofor example say you want to find the average of two given numbers. -Meaning wewant to take two numbers, add them together then divide by 2: +A function is a set procedure of code that will run when called. Functions +really start to make sense when put in the perspective of solving problems. So +for example say you want to find the average of two given numbers. Meaning we +want to take two numbers, add them together then divide by 2: -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js > (5 + 5) / 2 5 @@ -2085,23 +1223,23 @@ Meaning wewant to take two numbers, add them together then divide by 2: 4.5 ``` -Writing out the same code again and again gets tedious fast. What you -can doinstead is write a new *function*. +Writing out the same code again and again gets tedious fast. What you can do +instead is write a new _function_. -### Function Declaration {#function-declaration .mume-header} +### Function Declaration -A *function definition* consists of the function keyword, followed by -threethings: +A _function definition_ consists of the function keyword, followed by three +things: -1. The **name** of the function. -2. A list of *parameters* to the function, enclosed in parentheses, - `()`. -3. The code to be run when this function is run, enclosed in curly brackets,`{ }`. +1. The **name** of the function. +2. A list of _parameters_ to the function, enclosed in parentheses, `()`. +3. The code to be run when this function is run, enclosed in curly + brackets,`{ }`. -So for our above example of averaging two numbers we could write a -function thatwould do that for us! We would write something like the following: +So for our above example of averaging two numbers we could write a function that +would do that for us! We would write something like the following: -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js // 1. average is the name of the function // 2. number1 & number2 are the parameters being passed in function average(number1, number2) { @@ -2110,51 +1248,50 @@ function average(number1, number2) { } ``` -First thing to notice for the above `average` function is that we -didn\'t use any*real* numbers. You always want to write functions to accept as wide a -range ofdata as possible. Utilizing the incoming *parameters* to a function is -one ofthe keys to making functions flexible. +First thing to notice for the above `average` function is that we didn't use any +_real_ numbers. You always want to write functions to accept as wide a range of +data as possible. Utilizing the incoming _parameters_ to a function is one of +the keys to making functions flexible. -In the case of the `average` function, we want to use it to calculate -theaverage of any two numbers. `number1` and `number2` are the *parameters* -for the`average` function. In other words, the `average` function expects to be -giventwo numbers, `number1` and `number2`. We\'ll be talking a lot more -aboutparameters later - but for now know that when you define a function -withparameters you are declaring those parameters as usable variables within -thatfunction. +In the case of the `average` function, we want to use it to calculate the +average of any two numbers. `number1` and `number2` are the _parameters_ for the +`average` function. In other words, the `average` function expects to be given +two numbers, `number1` and `number2`. We'll be talking a lot more about +parameters later - but for now know that when you define a function with +parameters you are declaring those parameters as usable variables within that +function. -The beauty of a function is that if we define it in a clever way, it -will workon a whole slew of data! For example, we want `average` to work on any -twonumbers, whether or not they are whole numbers, decimal, negative, etc. +The beauty of a function is that if we define it in a clever way, it will work +on a whole slew of data! For example, we want `average` to work on any two +numbers, whether or not they are whole numbers, decimal, negative, etc. -Invoking or \"calling\" a function {#invoking-or-calling-a-function .mume-header} ----------------------------------- +## Invoking or "calling" a function -Now that we\'ve written a function how do we actually use it? Once -defined afunction can be invoked or \"called\" as many times as we please. +Now that we've written a function how do we actually use it? Once defined a +function can be invoked or "called" as many times as we please. -### Order of code {#order-of-code .mume-header} +### Order of code -Let\'s step away from `average` for a bit to see how a simple function -callworks. Say we run JavaScript code that looks like this: +Let's step away from `average` for a bit to see how a simple function call +works. Say we run JavaScript code that looks like this: -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js console.log("First!"); console.log("Second!"); ``` -Running this code will return exactly as we expect. We will see `First!` -printedout, followed by `Second!`. In other words, JavaScript will evaluate -your codeleft-to-right and top-to-bottom. Very intuitive! It\'s exactly how you -arereading these notes right now. +Running this code will return exactly as we expect. We will see `First!` printed +out, followed by `Second!`. In other words, JavaScript will evaluate your code +left-to-right and top-to-bottom. Very intuitive! It's exactly how you are +reading these notes right now. -However, when JavaScript sees a function definition, JavaScript will -**not**evaluate the code inside of the definition. It will only \"remember\" -the code sowe can execute it later. The code below only prints `First!` followed -by`Fourth!`: +However, when JavaScript sees a function definition, JavaScript will **not** +evaluate the code inside of the definition. It will only "remember" the code so +we can execute it later. The code below only prints `First!` followed by +`Fourth!`: -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js console.log("First!"); function callMe() { @@ -2169,10 +1306,10 @@ console.log("Fourth"); // "Fourth" ``` -To actually get the code within `callMe` to evaluate, we must *call* it -by using`callMe()`. The code below will now print out in order: +To actually get the code within `callMe` to evaluate, we must _call_ it by using +`callMe()`. The code below will now print out in order: -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js function callMe() { console.log("Second!"); console.log("Third!"); @@ -2190,31 +1327,31 @@ console.log("Fourth!"); // "Fourth" ``` -Let\'s say JavaScript is running the file above. Here are the steps it -wouldtake, starting from the tippy top of the code: +Let's say JavaScript is running the file above. Here are the steps it would +take, starting from the tippy top of the code: -1. JS sees a definition for `callMe`. It will remember this definition - in case we call the function later. It will **not** evaluate the code inside - the function yet. -2. JS prints out `First!` -3. JS sees that we are calling `callMe()`. At this point it will look - at the prior `callMe` definition and run the code inside. It is as if we - are \"jumping\" to inside the function definition. This means it will - print `Second!` followed by `Third!` -4. JS sees there is no more code to be run inside of `callMe`, so it - \"jumps\" back to where we originally called `callMe()` -5. JS will continue evaluating in order and print `Fourth!` +1. JS sees a definition for `callMe`. It will remember this definition in case + we call the function later. It will **not** evaluate the code inside the + function yet. +2. JS prints out `First!` +3. JS sees that we are calling `callMe()`. At this point it will look at the + prior `callMe` definition and run the code inside. It is as if we are + "jumping" to inside the function definition. This means it will print + `Second!` followed by `Third!` +4. JS sees there is no more code to be run inside of `callMe`, so it "jumps" + back to where we originally called `callMe()` +5. JS will continue evaluating in order and print `Fourth!` -### An average example {#an-average-example .mume-header} +### An average example -So a declared function is \"saved for later use\", and will be executed -later,when it is called, also known as being **invoked**. So thinking back to -ouraverage function we can declare the function and then *invoke* it. +So a declared function is "saved for later use", and will be executed later, +when it is called, also known as being **invoked**. So thinking back to our +average function we can declare the function and then _invoke_ it. -When we specify what data to use for a function call, we refer to that -process**passing arguments to the function**. +When we specify what data to use for a function call, we refer to that process +**passing arguments to the function**. -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js // this is a function definition function average(number1, number2) { return (number1 + number2) / 2; @@ -2229,23 +1366,23 @@ function average(number1, number2) { 7.5 ``` -When we call the function `average(15, 3)`, we run the code inside the*definition* for `average`. That is, we plug in the parameters with real -numbers(`number1` becomes `10` and `number2` becomes 16). Think of `number1` -and`number2` as *variables* that contain the values we pass in when we -called thefunction. Then we proceed by running the code inside the function. The -parameternames `number1` and `number2` used through the body of the function and -behavelike variables. +When we call the function `average(15, 3)`, we run the code inside the +_definition_ for `average`. That is, we plug in the parameters with real numbers +(`number1` becomes `10` and `number2` becomes 16). Think of `number1` and +`number2` as _variables_ that contain the values we pass in when we called the +function. Then we proceed by running the code inside the function. The parameter +names `number1` and `number2` used through the body of the function and behave +like variables. -Returning a value {#returning-a-value .mume-header} ------------------ +## Returning a value -Now that we know how functions are declared and invoked let\'s talk -about theinside of the function. We\'ll start with a statement: *Every function -inJavaScript returns `undefined` unless otherwise specified.* +Now that we know how functions are declared and invoked let's talk about the +inside of the function. We'll start with a statement: _Every function in +JavaScript returns `undefined` unless otherwise specified._ -Now what does that mean? We\'ll start with a simple example: +Now what does that mean? We'll start with a simple example: -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js function sayNumber(number) { console.log(number); } @@ -2255,19 +1392,19 @@ function sayNumber(number) { undefined ``` -So what happened there? Let\'s do a quick step by step: +So what happened there? Let's do a quick step by step: -1. We declared the `sayNumber` function -2. `sayNumber` was called handing in the argument of 1 -3. The `number` parameter is printed to the console -4. Then the function ends without encountering a `return` statement. - Since nothing was specifically returned then the function returned the - default value for a function which is `undefined`. +1. We declared the `sayNumber` function +2. `sayNumber` was called handing in the argument of 1 +3. The `number` parameter is printed to the console +4. Then the function ends without encountering a `return` statement. Since + nothing was specifically returned then the function returned the default + value for a function which is `undefined`. -Now let\'s change our above example to use the keyword `return` to -return avalue: +Now let's change our above example to use the keyword `return` to return a +value: -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js function sayNumber(number) { console.log(number); return true; @@ -2278,10 +1415,10 @@ function sayNumber(number) { true // but now sayNumber returns as true ``` -Let\'s go back to our previous `average` function and talk about the -`return` weused there: +Let's go back to our previous `average` function and talk about the `return` we +used there: -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js function average(number1, number2) { return (number1 + number2) / 2; } @@ -2297,20 +1434,20 @@ console.log(result); // prints `13` console.log(average(10, 16)); ``` -When we *call* a function, we jump to the function definition and run -the codeinside. When we hit a `return` statement, we immediately **exit** the -function,jump back to where we *called* the function, and evaluate the function -call tothe value it *returned*. +When we _call_ a function, we jump to the function definition and run the code +inside. When we hit a `return` statement, we immediately **exit** the function, +jump back to where we _called_ the function, and evaluate the function call to +the value it _returned_. -**Every function call evaluates to it\'s return value!** In other words, -theexpression `average(10, 16)` evaluates to `13` just like how the -expression`1 + 1` evaluates to `2`. +**Every function call evaluates to it's return value!** In other words, the +expression `average(10, 16)` evaluates to `13` just like how the expression +`1 + 1` evaluates to `2`. -Another important rule of the return statement is that it stops -functionexecution immediately. This means that any code after a `return` will -not beexecuted! +Another important rule of the return statement is that it stops function +execution immediately. This means that any code after a `return` will not be +executed! -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js function average(number1, number2) { let sum = number1 + number2; return sum; @@ -2326,75 +1463,71 @@ function average(number1, number2) { So the three things to remember about return statements is: -1. Every function call evaluates to it\'s return value. -2. Every function in JavaScript returns `undefined` unless a `return` - is specified -3. Once a `return` statement is encountered the function will - immediately stop and return the value, ignoring any code below the `return` - statement. +1. Every function call evaluates to it's return value. +2. Every function in JavaScript returns `undefined` unless a `return` is + specified +3. Once a `return` statement is encountered the function will immediately stop + and return the value, ignoring any code below the `return` statement. -The importance of naming {#the-importance-of-naming .mume-header} ------------------------- +## The importance of naming -A quick but very important side note about good naming. Take this to -heart rightnow: **Good names are important**. Do yourself, and every other -programmerreading your code, a favor by always using significant function and -variablenames. +A quick but very important side note about good naming. Take this to heart right +now: **Good names are important**. Do yourself, and every other programmer +reading your code, a favor by always using significant function and variable +names. -For example, `x` is a very non-descriptive name for a variable or -function. Aswe tackle more complicated problems and our code grows to be more -complex, weare likely to forget what badly named variables originally stood for and -whattheir purpose was. Non-descriptive names make our code error-prone. -**Great codereads like English and almost explains itself.** As programmers, our -goal is towrite code that is not only \"correct\", but also elegant, readable, -andmaintainable! Hold yourself to this high standard. +For example, `x` is a very non-descriptive name for a variable or function. As +we tackle more complicated problems and our code grows to be more complex, we +are likely to forget what badly named variables originally stood for and what +their purpose was. Non-descriptive names make our code error-prone. **Great code +reads like English and almost explains itself.** As programmers, our goal is to +write code that is not only "correct", but also elegant, readable, and +maintainable! Hold yourself to this high standard. -As far as syntax goes in JavaScript we always name our functions and -variables`camelCase` for multiple words. (Ex: `tipCalculator`, `currentNumber`,`puppyPartyFinder`). Other languages use other conventions so it\'s best -to pickup the standard for your chosen language and stick with it. +As far as syntax goes in JavaScript we always name our functions and variables +`camelCase` for multiple words. (Ex: `tipCalculator`, `currentNumber`, +`puppyPartyFinder`). Other languages use other conventions so it's best to pick +up the standard for your chosen language and stick with it. -Review {#review .mume-header} ------- +## Review -By writing a function we can reuse code over and over again to solve -similarproblems with different input data (arguments). This will make your life -easierand allow you to start working on more complex problems. +By writing a function we can reuse code over and over again to solve similar +problems with different input data (arguments). This will make your life easier +and allow you to start working on more complex problems. This reading covered: -- How to define and invoke a function in JavaScript. -- How to use the `return` keyword to return a value from a function. -- Writing readable JavaScript code by using significant names and - following `camelCase` conventions for multiple word variables and functions - ------------------------------------------------------------------------- +- How to define and invoke a function in JavaScript. +- How to use the `return` keyword to return a value from a function. +- Writing readable JavaScript code by using significant names and following + `camelCase` conventions for multiple word variables and functions -Parameters and Arguments {#parameters-and-arguments .mume-header} -======================== +________________________________________________________________________________ +# Parameters and Arguments -When talking about functions one of the first things we mentioned was -the word*parameters*. In this reading we will be covering what exactly a -parameter is -as well as the differentiation between *parameters* and *arguments*. +When talking about functions one of the first things we mentioned was the word +_parameters_. In this reading we will be covering what exactly a parameter is - +as well as the differentiation between _parameters_ and _arguments_. When you finish this reading, you should be able to: -1. Identify the difference between parameters and arguments. -2. Write a function that utilizes declared parameters. -3. Invoking a function with passed in arguments. +1. Identify the difference between parameters and arguments. +2. Write a function that utilizes declared parameters. +3. Invoking a function with passed in arguments. -The difference between Parameters and Arguments {#the-difference-between-parameters-and-arguments .mume-header} ------------------------------------------------ +## The difference between Parameters and Arguments -Let\'s start off by talking about the difference between *arguments* -and*parameters* and how to identify which is which. +Let's start off by talking about the difference between _arguments_ and +_parameters_ and how to identify which is which. -1. **Parameters** are comma separated variables specified as part of a function\'s declaration. -2. **Arguments** are values passed to the function when it is invoked. +1. **Parameters** are comma separated variables specified as part of a + function's declaration. +2. **Arguments** are values passed to the function when it is invoked. -So by defining *parameters* when we declare our function we are -effectivelysetting accessible variables within the function: +So by defining _parameters_ when we declare our function we are effectively +setting accessible variables within the function: -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js function add(firstParameter, secondParameter) { console.log(firstParameter + secondParameter); } @@ -2403,28 +1536,27 @@ function add(firstParameter, secondParameter) { > add(1, 2); //=> 3 ``` -In the above example we declared our parameters when we declared our -function.Now *arguments* work slightly differently - when the function is invoked -we arepassing in *arguments*. So in the above example when we invoked -`add(1, 2)` the`(1,2)` were the *arguments* being passed in. So when a function is -invoked thevalue of the declared parameters is assigned to the passed in -*arguments*. +In the above example we declared our parameters when we declared our function. +Now _arguments_ work slightly differently - when the function is invoked we are +passing in _arguments_. So in the above example when we invoked `add(1, 2)` the +`(1,2)` were the _arguments_ being passed in. So when a function is invoked the +value of the declared parameters is assigned to the passed in _arguments_. -You can think of it *parameters* and *arguments* like a recipe. A recipe -is alist of ingredients (*parameters*) and list of steps (the code to be -run). Whensomeone cooks the recipe (*invokes* the function) they add the -ingredients theyactually have(*arguments*). The result of cooking the recipe is the -delicious`return` value! +You can think of it _parameters_ and _arguments_ like a recipe. A recipe is a +list of ingredients (_parameters_) and list of steps (the code to be run). When +someone cooks the recipe (_invokes_ the function) they add the ingredients they +actually have(_arguments_). The result of cooking the recipe is the delicious +`return` value! -### Extra arguments {#extra-arguments .mume-header} +### Extra arguments -In JavaScript a function will not throw an error if the number of -*arguments*passed during a function invocation is different than the number of -parameterslisted during function declaration. This is very important to know! +In JavaScript a function will not throw an error if the number of _arguments_ +passed during a function invocation is different than the number of parameters +listed during function declaration. This is very important to know! -Let\'s use the above function to demonstrate: +Let's use the above function to demonstrate: -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js function add(firstParameter, secondParameter) { console.log(firstParameter + secondParameter); } @@ -2434,15 +1566,14 @@ function add(firstParameter, secondParameter) { > add(1, 2, 17, 14); //=> 3 ``` -Notice in the above example we passed in 4 arguments (1, 2, 17, 14) to -`add`.Since the function was only looking for two parameters that is all it -uses. +Notice in the above example we passed in 4 arguments (1, 2, 17, 14) to `add`. +Since the function was only looking for two parameters that is all it uses. -### Not enough arguments {#not-enough-arguments .mume-header} +### Not enough arguments Now what happens if we pass in less arguments then needed? -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js function add(firstParameter, secondParameter) { console.log(firstParameter + secondParameter); } @@ -2450,140 +1581,115 @@ function add(firstParameter, secondParameter) { > add(5); //=> NaN ``` -Whoa what happened there? Let\'s do a play-by-play: - -1. `firstParameter` was set to equal the first passed in argument which - in the above case is 5. -2. Since there is no second argument then `secondParameter` is declared - as a variable but is set to the default value of `undefined`. -3. The function then tries to add 5 to `undefined` which is definitely - not a number! So we get `NaN` (which means `Not A Number`) printed to the - console. - -As you write more functions you\'ll grow very comfortable using both -argumentsand parameters to accomplish your function\'s goal. - -Review {#review-1 .mume-header} ------- - -- Parameters are variables defined as a part of a function\'s - declaration. -- Arguments are values passed to the function when it is invoked. -- JavaScript functions can intake a different number of arguments than - the number of parameters listed during function declaration. - ------------------------------------------------------------------------- - ------------------------------------------------------------------------- - -Control Flow and Array Learning Objectives {#control-flow-and-array-learning-objectives .mume-header} -========================================== - -Below is a complete list of the terminal learning objectives for this -lesson.When you complete this lesson, you should be able to perform each of -thefollowing objectives. These objectives capture how you may be evaluated -on theassessment for this lesson. - -1. Define a function that accepts a sentence string and two words as - args. The function should return a boolean indicating if the sentence includes - either word. - -2. Identify a pair of mutually exclusive conditions - -3. Given a for loop, translate it into a while loop, and vice-versa - -4. Write a function that iterates through a provided string argument - -5. Given a description of pig latin, write a function that takes in a - string argument and utilizes String\#slice to translate the string into pig - latin. - -6. Write a function that takes in an array of words and a string as - arguments and returns a boolean indicating whether the string is located - inside of the array. The function must use Array\#indexOf. - -7. Define that an array literal is an ordered list of values defined by - using bracket and individual values are read by indexing. - -8. Prevent code that can throw an exception from causing the program to - crash. the terminal learning objectives for this lesson. When you complete this lesson, you should be able to perform each of - the following objectives. These objectives capture how you may be - evaluated on the assessment for this lesson. - -9. Define a function that accepts a sentence string and two words as - args. The function should return a boolean indicating if the sentence includes - either word. - -10. Identify a pair of mutually exclusive conditions - -11. Given a for loop, translate it into a while loop, and vice-versa - -12. Write a function that iterates through a provided string argument - -13. Given a description of pig latin, write a function that takes in a - string argument and utilizes String\#slice to translate the string into pig - latin. - -14. Write a function that takes in an array of words and a string as - arguments and returns a boolean indicating whether the string is located - inside of the array. The function must use Array\#indexOf. - -15. Define that an array literal is an ordered list of values defined by - using bracket and individual values are read by indexing. - -16. Prevent code that can throw an exception from causing the program to - crash. - ------------------------------------------------------------------------- - -Control Flow - Conditional Statements {#control-flow-conditional-statements .mume-header} -===================================== - -So far the code you\'ve written has been pretty direct in it\'s intent. -You candefine functions and variables but, so far the functions you\'ve created -haven\'tbeen able to do that much for you *yet*. It\'s time to start writing -functionsthat can do things *conditionally* by utilizing *control flow*. - -In simple terms - **control flow** is the order in which instructions -areexecuted within a program. One modifies control flow using *control -structures*,expressions that alter the control flow based on given parameters. The -controlstructures within JavaScript allow the program flow to change within a -unit ofcode or a function. - -This reading will be covering one of the two main *control structures* -youwill use time and time again - *Conditional statements*. *Conditionalstatements* are used to perform different actions based on different -conditions. +Whoa what happened there? Let's do a play-by-play: + +1. `firstParameter` was set to equal the first passed in argument which in the + above case is 5. +2. Since there is no second argument then `secondParameter` is declared as a + variable but is set to the default value of `undefined`. +3. The function then tries to add 5 to `undefined` which is definitely not a + number! So we get `NaN` (which means `Not A Number`) printed to the console. + +As you write more functions you'll grow very comfortable using both arguments +and parameters to accomplish your function's goal. + +## Review + +- Parameters are variables defined as a part of a function's declaration. +- Arguments are values passed to the function when it is invoked. +- JavaScript functions can intake a different number of arguments than the + number of parameters listed during function declaration. + +________________________________________________________________________________ +# WEEK-01 DAY-2
*Control Flow* {ignore=true} +________________________________________________________________________________ +# Control Flow and Array Learning Objectives + +Below is a complete list of the terminal learning objectives for this lesson. +When you complete this lesson, you should be able to perform each of the +following objectives. These objectives capture how you may be evaluated on the +assessment for this lesson. + +1. Define a function that accepts a sentence string and two words as args. The + function should return a boolean indicating if the sentence includes either + word. +2. Identify a pair of mutually exclusive conditions +3. Given a for loop, translate it into a while loop, and vice-versa +4. Write a function that iterates through a provided string argument +5. Given a description of pig latin, write a function that takes in a string + argument and utilizes String#slice to translate the string into pig latin. +6. Write a function that takes in an array of words and a string as arguments + and returns a boolean indicating whether the string is located inside of the + array. The function must use Array#indexOf. +7. Define that an array literal is an ordered list of values defined by using + bracket and individual values are read by indexing. +8. Prevent code that can throw an exception from causing the program to crash. the terminal learning objectives for this lesson. +When you complete this lesson, you should be able to perform each of the +following objectives. These objectives capture how you may be evaluated on the +assessment for this lesson. + +1. Define a function that accepts a sentence string and two words as args. The + function should return a boolean indicating if the sentence includes either + word. +2. Identify a pair of mutually exclusive conditions +3. Given a for loop, translate it into a while loop, and vice-versa +4. Write a function that iterates through a provided string argument +5. Given a description of pig latin, write a function that takes in a string + argument and utilizes String#slice to translate the string into pig latin. +6. Write a function that takes in an array of words and a string as arguments + and returns a boolean indicating whether the string is located inside of the + array. The function must use Array#indexOf. +7. Define that an array literal is an ordered list of values defined by using + bracket and individual values are read by indexing. +8. Prevent code that can throw an exception from causing the program to crash. + +________________________________________________________________________________ +# Control Flow - Conditional Statements + +So far the code you've written has been pretty direct in it's intent. You can +define functions and variables but, so far the functions you've created haven't +been able to do that much for you _yet_. It's time to start writing functions +that can do things _conditionally_ by utilizing _control flow_. + +In simple terms - **control flow** is the order in which instructions are +executed within a program. One modifies control flow using _control structures_, +expressions that alter the control flow based on given parameters. The control +structures within JavaScript allow the program flow to change within a unit of +code or a function. + +This reading will be covering one of the two main _control structures_ you +will use time and time again - _Conditional statements_. _Conditional +statements_ are used to perform different actions based on different conditions. When you finish this reading, you should be able to: -- Write `if`, `else if`, `if...else` conditional statements. -- Know that conditional statements can have only one `if` and one - `else` statement. -- Identify that conditional statements can be nested. +- Write `if`, `else if`, `if...else` conditional statements. +- Know that conditional statements can have only one `if` and one `else` + statement. +- Identify that conditional statements can be nested. -A Quick Word on Syntax {#a-quick-word-on-syntax .mume-header} ----------------------- +## A Quick Word on Syntax -Before we get started we\'ll quickly go over the terms we\'ll be using -torepresent syntax. +Before we get started we'll quickly go over the terms we'll be using to +represent syntax. -1. `[ ]` are square **brackets** -2. `{ }` are curly **braces** -3. `( )` are **parentheses** +1. `[ ]` are square **brackets** +2. `{ }` are curly **braces** +3. `( )` are **parentheses** -Writing Conditional Statements {#writing-conditional-statements .mume-header} ------------------------------- +## Writing Conditional Statements -Conditional Statements are the second fundamental *control structure* -forwriting JavaScript and are pretty straight forward. The simplest -conditionalstatement is the `if` statement. An `if` statement has two parts, the -*testexpression* (the code that immediately follows the `if` which goes inparentheses), and the *then expression* (this code belongs in braces -after the`if` expression). The *then* expression will only run when the `if` -expressionis truthy. +Conditional Statements are the second fundamental _control structure_ for +writing JavaScript and are pretty straight forward. The simplest conditional +statement is the `if` statement. An `if` statement has two parts, the _test +expression_ (the code that immediately follows the `if` which goes in +parentheses), and the _then expression_ (this code belongs in braces after the +`if` expression). The _then_ expression will only run when the `if` expression +is truthy. Here is an example of a simple `if` statement: -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js // this is the test expression if (3 === 3) { // this is the then expression @@ -2592,12 +1698,13 @@ if (3 === 3) { } ``` -The `if` statement above allows you to specify what should happen if -yourparticular expression evaluates to true. You can chain additional *testexpressions* onto this `if` statement by using a `else if` statement. +The `if` statement above allows you to specify what should happen if your +particular expression evaluates to true. You can chain additional _test +expressions_ onto this `if` statement by using a `else if` statement. The syntax for `else if` is very similar as an `if` statement: -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js function mathFun() { let x = 2 + 3; @@ -2615,13 +1722,13 @@ function mathFun() { mathFun(); // => "we have a 5" ``` -The `else if` and `if` statements do not, however, provide the option to -specifysomething else that should happen in the event that all of the above -expressionsevaluate to be `falsey`. The `if...else` statement reads just like -English. TheJS interpreter will execute the `else` statement if all the above -conditionsgiven are `falsey`. See below for an example: +The `else if` and `if` statements do not, however, provide the option to specify +something else that should happen in the event that all of the above expressions +evaluate to be `falsey`. The `if...else` statement reads just like English. The +JS interpreter will execute the `else` statement if all the above conditions +given are `falsey`. See below for an example: -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js function mathFun() { let x = 19; if (x === 3) { @@ -2636,16 +1743,17 @@ function mathFun() { mathFun(); // => "I will return if everything above me is falsey!" ``` -You can chain an arbitrary number of `else if` statements but there can -only beone `if` statement and one optional `else` statement. The `if` -introduces the controlstructure and the `else` acts as a fail safe to catch everything that -didn\'tmeet the above conditions. +You can chain an arbitrary number of `else if` statements but there can only be +one `if` statement and one optional `else` statement. The `if` introduces the control +structure and the `else` acts as a fail safe to catch everything that didn't +meet the above conditions. -Only one *then expression* is ever executed in an `if`, `if...else`, or`if...else` statement. If one of the *test expressions* is truthy, then -theresult of its *then expression* is the result of the **entire** -conditionalstatement: +Only one _then expression_ is ever executed in an `if`, `if...else`, or +`if...else` statement. If one of the _test expressions_ is truthy, then the +result of its _then expression_ is the result of the **entire** conditional +statement: -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js let x = 3; if (x === 3) { console.log("this will run"); @@ -2654,10 +1762,10 @@ if (x === 3) { } ``` -Additionally, you can nest conditional statements within each other but -it willget hard to read pretty quickly and is discouraged: +Additionally, you can nest conditional statements within each other but it will +get hard to read pretty quickly and is discouraged: -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js function mathFun(x) { if (x === "math") { if (x === "math" && x[0] === "m") { @@ -2677,38 +1785,33 @@ function mathFun(x) { mathFun("math"); // => "this got confusing fast" ``` -Review {#review-2 .mume-header} ------- - -- Conditional statements allow us to control what actions should be - taken based on a boolean (truthy or falsey) expression -- In a chain of *then expressions* (`if...else if...else`), only one - of the *then expressions* will be executed. -- Conditional statements can have only one `if` and one `else` - statement. -- Conditional statements can be nested. +## Review ------------------------------------------------------------------------- +- Conditional statements allow us to control what actions should be taken based + on a boolean (truthy or falsey) expression +- In a chain of _then expressions_ (`if...else if...else`), only one of the + _then expressions_ will be executed. +- Conditional statements can have only one `if` and one `else` statement. +- Conditional statements can be nested. -Mutually Exclusive Conditions {#mutually-exclusive-conditions .mume-header} -============================= +________________________________________________________________________________ +# Mutually Exclusive Conditions -You have now learned how to write conditional statements. Now we\'ll -talk alittle bit more about how to write them using best practices. +You have now learned how to write conditional statements. Now we'll talk a +little bit more about how to write them using best practices. When you finish this reading, you should be able to: -- Identify a pair of mutually exclusive conditions. +- Identify a pair of mutually exclusive conditions. -When to use if statements {#when-to-use-if-statements .mume-header} -------------------------- +## When to use if statements -Say you are given the challenge to write a function that that will call -anotherfunction named `bigNumber` if the given argument is **greater** than 100 -or calla function named `smallNumber` if it the given argument is smaller. You -couldwrite a function to do that which would look like this: +Say you are given the challenge to write a function that that will call another +function named `bigNumber` if the given argument is **greater** than 100 or call +a function named `smallNumber` if it the given argument is smaller. You could +write a function to do that which would look like this: -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js function numberSeparator(number) { if (number < 100) { // number is smaller than 100 so we invoke smallNumber @@ -2725,25 +1828,25 @@ function numberSeparator(number) { } ``` -As you can probably tell the above function uses a lot of code to do a -simpletask. To be clear the function above would work for our aim - but it -repeatsitself. There is an age old principal for writing good code named -**DRY** or**Don\'t repeat yourself**. As good programmers we always want our code -to beclear, concise, and efficient. +As you can probably tell the above function uses a lot of code to do a simple +task. To be clear the function above would work for our aim - but it repeats +itself. There is an age old principal for writing good code named **DRY** or +**Don't repeat yourself**. As good programmers we always want our code to be +clear, concise, and efficient. -A general rule of thumb is that if you are working with a condition that -is**mutually exclusive**, meaning if one condition is true the other -conditionmust be false, then you should use an `if/else` statement. You can also -think of**mutually exclusivity** like a coin flip - it can be either heads or -tails butnot both. +A general rule of thumb is that if you are working with a condition that is +**mutually exclusive**, meaning if one condition is true the other condition +must be false, then you should use an `if/else` statement. You can also think of +**mutually exclusivity** like a coin flip - it can be either heads or tails but +not both. -Going back to the original problem at hand we can see it makes intuitive -sensewith the way the challenge is phrased: If the number is larger than 100 -thenwe\'ll call `bigNumber`, otherwise we invoke is `smallNumber`. +Going back to the original problem at hand we can see it makes intuitive sense +with the way the challenge is phrased: If the number is larger than 100 then +we'll call `bigNumber`, otherwise we invoke is `smallNumber`. -So let\'s rewrite the above function to read a little more clearly: +So let's rewrite the above function to read a little more clearly: -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js function numberSeparator(number) { if (number > 100) { bigNumber(); @@ -2762,77 +1865,74 @@ function numberSeparator(number) { } ``` -Look at how much clearer that is! Writing good code is an art - devote -yourselfto becoming an artist! - -Review {#review-3 .mume-header} ------- +Look at how much clearer that is! Writing good code is an art - devote yourself +to becoming an artist! -- How to identify a pair of mutually exclusive conditions. -- DRY - don\'t repeat yourself! +## Review ------------------------------------------------------------------------- +- How to identify a pair of mutually exclusive conditions. +- DRY - don't repeat yourself! -Control Flow - Looping {#control-flow-looping .mume-header} -====================== +________________________________________________________________________________ +# Control Flow - Looping -A quick reminder before we start - **control flow** is the order in -whichinstructions are executed within a program. One modifies control flow -using*control structures*, expressions that alter the control flow based on -givenparameters. This reading will be covering the second of the main -*controlstructures* you will use time and time again - *loops*. +A quick reminder before we start - **control flow** is the order in which +instructions are executed within a program. One modifies control flow using +_control structures_, expressions that alter the control flow based on given +parameters. This reading will be covering the second of the main _control +structures_ you will use time and time again - _loops_. When you finish this reading, you should be able to: -1. Know how to write a `while` loop and a `for` loop. - - Know how to convert a `for` loop into a `while` loop -2. Know that index variables conventionally start at zero. -3. Explain what an *iteration* is. - -Looping {#looping .mume-header} -------- - -Imagine you are at a friend\'s house and your friend has six dogs. -Someone leftthe back gate open and all the dogs go out in the yard and get super -muddy. Nowyour friend wants to clean their dogs but they only have one bathtub! -You can\'twash all the dogs at once. So the only option is to give the dogs a bath -one ata time until they are all clean. When you start 0 dogs are clean and 6 -dogs aredirty. - -*While* there are still dirty dogs you still have a job to do. That is -your**condition** - you will stop giving baths once all 6 dogs are clean. So -afterone bath you you have 1 clean dog and 5 dirty dogs. You\'ve*incremented*(increased by one) your number of clean dogs. After each -bath youcheck your **condition** again until you have 6 clean dogs so you know -you canstop! - -What we\'ve described above is the idea of looping - setting a -condition,executing an action, doing something to make sure our condition will be -meteventually, and rechecking our condition before executing our next -action. - -Loops are a fundamental *control structure* for writing JavaScript.Loops will repeatedly execute a section of code while a condition is -true. Loopsare simple to write and incredibly powerful! There are many variations -of loopbut we will be covering the two most fundamental loops now - **while** -loops and**for** loops. - -### While Loops {#while-loops .mume-header} - -One of the simplest loops in `JavaScript` is the `while` loop. As with -allloops, the `while` loop will execute a block of code as long as a -specifiedcondition is true. The while loop starts with the keyword `while` then -states acondition in parentheses. The code in the following braces will be run -until theabove condition is met. - -``` {.language-javascript data-role="codeBlock" data-info="js"} +1. Know how to write a `while` loop and a `for` loop. + - Know how to convert a `for` loop into a `while` loop +2. Know that index variables conventionally start at zero. +3. Explain what an _iteration_ is. + +## Looping + +Imagine you are at a friend's house and your friend has six dogs. Someone left +the back gate open and all the dogs go out in the yard and get super muddy. Now +your friend wants to clean their dogs but they only have one bathtub! You can't +wash all the dogs at once. So the only option is to give the dogs a bath one at +a time until they are all clean. When you start 0 dogs are clean and 6 dogs are +dirty. + +_While_ there are still dirty dogs you still have a job to do. That is your +**condition** - you will stop giving baths once all 6 dogs are clean. So after +one bath you you have 1 clean dog and 5 dirty dogs. You've +_incremented_(increased by one) your number of clean dogs. After each bath you +check your **condition** again until you have 6 clean dogs so you know you can +stop! + +What we've described above is the idea of looping - setting a condition, +executing an action, doing something to make sure our condition will be met +eventually, and rechecking our condition before executing our next action. + +Loops are a fundamental _control structure_ for writing JavaScript. +Loops will repeatedly execute a section of code while a condition is true. Loops +are simple to write and incredibly powerful! There are many variations of loop +but we will be covering the two most fundamental loops now - **while** loops and +**for** loops. + +### While Loops + +One of the simplest loops in `JavaScript` is the `while` loop. As with all +loops, the `while` loop will execute a block of code as long as a specified +condition is true. The while loop starts with the keyword `while` then states a +condition in parentheses. The code in the following braces will be run until the +above condition is met. + +```js while (condition) { // code block to be executed } ``` -In the following example, the code in the loop will run, over and over -again, aslong as a variable (`index`) is less than 10: +In the following example, the code in the loop will run, over and over again, as +long as a variable (`index`) is less than 10: -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js let index = 0; // this is the condition that will be checked every time this loop is run @@ -2843,12 +1943,12 @@ while (index < 10) { } ``` -The most important thing to remember when writing any loop is to always -beworking towards your condition. In the example above if we did not -increment the`index` variable by 1 each time the loop ran then we would be stuck with -what wecall an **infinite loop**: +The most important thing to remember when writing any loop is to always be +working towards your condition. In the example above if we did not increment the +`index` variable by 1 each time the loop ran then we would be stuck with what we +call an **infinite loop**: -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js let index = 0; // this is an infinite loop because our condition will never be met @@ -2859,21 +1959,19 @@ while (index < 10) { } ``` -The above code will run until whatever interpreter you are using -crashes. +The above code will run until whatever interpreter you are using crashes. -### Important Loop Knowledge {#important-loop-knowledge .mume-header} +### Important Loop Knowledge A quick word before we learn about the next loop. -The *index* is the traditional word for the variable that keeps track of -howmany times the loop has been run. Don\'t write loops with indices -starting atone; you\'ll confuse other programmers and yourself. Indices have -started at zerofor a long time, and for good reason. It\'s much easier to use loops -that startwith an index of zero because Array and String indices also start at -zero. +The _index_ is the traditional word for the variable that keeps track of how +many times the loop has been run. Don't write loops with indices starting at +one; you'll confuse other programmers and yourself. Indices have started at zero +for a long time, and for good reason. It's much easier to use loops that start +with an index of zero because Array and String indices also start at zero. -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js let array = [0, 1, 2]; let index = 0; @@ -2885,44 +1983,43 @@ while (index < array.length) { } ``` -In the above code we will do one loop for each digit in the Array above. -We calleach of those loops an \"iteration\". An iteration is the act of -repeating aprocedure, hence looping is an **iterative** technique. Each repetition -itselfis also called an \"iteration.\" So you can use loops to *iterate* -through Arraysand Strings. +In the above code we will do one loop for each digit in the Array above. We call +each of those loops an "iteration". An iteration is the act of repeating a +procedure, hence looping is an **iterative** technique. Each repetition itself +is also called an "iteration." So you can use loops to _iterate_ through Arrays +and Strings. -### For Loops {#for-loops .mume-header} +### For Loops A `for` loop can be broken down into three sections: -1. The *initial expression* which will be run once at the beginning of - the loop. -2. The *condition* which is checked every time the loop is run. If - this condition is true the loop will run again. If this condition is - false the loop will end. -3. The *loopEnd expression* which will be run at the end of the loop - before checking the *condition* again. +1. The _initial expression_ which will be run once at the beginning of the loop. +2. The _condition_ which is checked every time the loop is run. If this + condition is true the loop will run again. If this condition is false the + loop will end. +3. The _loopEnd expression_ which will be run at the end of the loop before + checking the _condition_ again. -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js for (;;) ``` The `for` loop is usually used with an integer counter: -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js for (let index = 0; index < 10; index += 1) { // the code inside this block will run 10 times } ``` -While the *loopEnd expression* is normally used to increase a variable -by oneper loop iteration, it can contain any statement, such as one that -decreasingthe counter, or increasing it by 2. +While the _loopEnd expression_ is normally used to increase a variable by one +per loop iteration, it can contain any statement, such as one that decreasing +the counter, or increasing it by 2. -You can use the `for` loop to iterate through all kinds of things. Check -out theexample below for how to iterate through a String: +You can use the `for` loop to iterate through all kinds of things. Check out the +example below for how to iterate through a String: -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js let testString = "testing"; // we can use the testString's length as our condition! @@ -2934,17 +2031,16 @@ for (let index = 0; index < testString.length; index += 1) { } ``` -These are the most basic types of loops. If all else fails, you can -always fallback on these two loops. All the other loop forms are just more -convenient formsof these basic loop styles. +These are the most basic types of loops. If all else fails, you can always fall +back on these two loops. All the other loop forms are just more convenient forms +of these basic loop styles. -Translating From One Loop to Another {#translating-from-one-loop-to-another .mume-header} ------------------------------------- +## Translating From One Loop to Another -So far we have covered both `while` and `for` loops. Once you understand -theconcept of looping it\'s easy to translate one loop to another: +So far we have covered both `while` and `for` loops. Once you understand the +concept of looping it's easy to translate one loop to another: -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js // these two do the exact same thing! function forLoopDoubler (array) { // it is convention to shorten index to just i in most cases @@ -2967,45 +2063,39 @@ forLoopDoubler([1, 2, 3]); // => [2,4,6] whileLoopDoubler([1, 2, 3]); //=> [2,4,6] ``` -Review {#review-4 .mume-header} ------- +## Review -- We can use a `for` or `while` loop to repeat a block of code - repeatedly. -- While the loop condition is true, we will execute another iteration - of the loop. -- When the loop condition is false, we will exit the loop. +- We can use a `for` or `while` loop to repeat a block of code repeatedly. +- While the loop condition is true, we will execute another iteration of the + loop. +- When the loop condition is false, we will exit the loop. ------------------------------------------------------------------------- +________________________________________________________________________________ +# The Array Type -The Array Type {#the-array-type .mume-header} -============== - -This reading will be about one of JavaScript\'s global objects, the -**Array**type. JavaScript arrays are used to store multiple values all within a -singlestructure, much like a creating a list. Arrays can hold strings, -integers andeven other arrays! Arrays are incredibly useful for holding a bunch of -differentinformation all in one place. +This reading will be about one of JavaScript's global objects, the **Array** +type. JavaScript arrays are used to store multiple values all within a single +structure, much like a creating a list. Arrays can hold strings, integers and +even other arrays! Arrays are incredibly useful for holding a bunch of different +information all in one place. When you finish this reading, you should be able to: -- Write arrays using correct syntax -- Identify that an array is an ordered list of values defined by using - brackets -- Use `.length` to obtain a count of the numbers of elements that - comprise an array -- Index an array to refer to a single value -- Concatenate multiple arrays together +- Write arrays using correct syntax +- Identify that an array is an ordered list of values defined by using brackets +- Use `.length` to obtain a count of the numbers of elements that comprise an + array +- Index an array to refer to a single value +- Concatenate multiple arrays together -Using arrays {#using-arrays .mume-header} ------------- +## Using arrays -While coding you will find that you often find yourself needing to refer -to abunch of data at once. For instance, what if you wanted to refer to the -entireEnglish alphabet. Sure, you could create a bunch variables for each -letter inthe alphabet: +While coding you will find that you often find yourself needing to refer to a +bunch of data at once. For instance, what if you wanted to refer to the entire +English alphabet. Sure, you could create a bunch variables for each letter in +the alphabet: -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js let a = "a"; let b = "b"; let c = "c"; @@ -3013,14 +2103,15 @@ let d = "d"; // and so on for way too long... ``` -However this becomes cumbersome and unmanageable quickly. An Array is a -datastructure that solves this problem. Arrays are always wrapped in squarebrackets, `[]`, and store their comma separated values in sequential -order.Arrays in JavaScript are also very flexible: we can put elements into an -array,replace elements in an array, and remove elements from the array. +However this becomes cumbersome and unmanageable quickly. An Array is a data +structure that solves this problem. Arrays are always wrapped in square +brackets, `[]`, and store their comma separated values in sequential order. +Arrays in JavaScript are also very flexible: we can put elements into an array, +replace elements in an array, and remove elements from the array. So going back to our first example of containing the alphabet: -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js let alphabet = [ "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", @@ -3030,100 +2121,96 @@ let alphabet = [ ]; ``` -Indexing arrays {#indexing-arrays .mume-header} ---------------- +## Indexing arrays -### Calculating the length of an array {#calculating-the-length-of-an-array .mume-header} +### Calculating the length of an array -Since an array can container any number of values you will find it -useful tocount the number of values available to you using `.length`: +Since an array can container any number of values you will find it useful to +count the number of values available to you using `.length`: -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js console.log([4, 7, 9].length); // => 3 console.log([1, 2].length); // => 2 console.log([].length); // => 0 ``` -### Properly indexing an array {#properly-indexing-an-array .mume-header} +### Properly indexing an array -Arrays consist of multiple values all stored in sequential order. These -valueare numbered by **indices** starting at 0 (just like indexing a -string!). Sogiven the below example: +Arrays consist of multiple values all stored in sequential order. These value +are numbered by **indices** starting at 0 (just like indexing a string!). So +given the below example: -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js let numbersAndLetters = ["b", "z", 17, "cat"]; ``` -In the above `numbersAndLetters` array if we access `numbersAndLetters` -at theindex of 0 we get back the value of \"b\". If we access -`numbersAndLetters` at theindex of 1 we get \"z\", at the index of 3 we get 17, etc. We can -specify whichvalue we\'d like to access in an array by using square brackets,`[]`, -andspecifying an index: +In the above `numbersAndLetters` array if we access `numbersAndLetters` at the +index of 0 we get back the value of "b". If we access `numbersAndLetters` at the +index of 1 we get "z", at the index of 3 we get 17, etc. We can specify which +value we'd like to access in an array by using square brackets,`[]`, and +specifying an index: -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js console.log(numbersAndLetters[0]); // => "b" console.log(numbersAndLetters[1]); // => "z" console.log(numbersAndLetters[2]); // => 17 console.log(numbersAndLetters[3]); // => "cat" ``` -Notice that even though the index at `numbersAndLetters[3]` has the -value of astring with multiple characters (\"cat\") we return the *entire value* -listed atthat index. +Notice that even though the index at `numbersAndLetters[3]` has the value of a +string with multiple characters ("cat") we return the _entire value_ listed at +that index. -**Reminder:** Arrays **always** start at the index of 0, not 1. This is -theconvention in programming. Additionally, indices should always be a -number. +**Reminder:** Arrays **always** start at the index of 0, not 1. This is the +convention in programming. Additionally, indices should always be a number. -We can access a value in an array directly by providing an index for the -valuewe\'d like to access in that array (`array[index]`). See below for an -example: +We can access a value in an array directly by providing an index for the value +we'd like to access in that array (`array[index]`). See below for an example: -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js console.log(["a", "b", "c"][0]); // => "a" console.log(["a", "b", "c"][1]); // => "b" console.log(["a", "b", "c"][2]); // => "c" console.log(["a", "b", "c"][3]); // => `undefined` ``` -As we see in the code above, if we try to access an element at an index -that isnot inside the array, we get back `undefined`. This makes sense because -there isno value at that given position! +As we see in the code above, if we try to access an element at an index that is +not inside the array, we get back `undefined`. This makes sense because there is +no value at that given position! -### The classic \"off by one\" error {#the-classic-off-by-one-error-1 .mume-header} +### The classic "off by one" error -Arrays are similar to strings in that both of their indices start at 0 -insteadof 1. Forgetting this fact can lead to some pretty confusing situations. -Let\'sfocus on an important distinction: the index of the last value of an -array isalways one less than its length. +Arrays are similar to strings in that both of their indices start at 0 instead +of 1. Forgetting this fact can lead to some pretty confusing situations. Let's +focus on an important distinction: the index of the last value of an array is +always one less than its length. -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript console.log([4, 7, 9].length); // => 3 console.log([4, 7, 9][3]); // => undefined console.log([4, 7, 9][2]); // => 9 ``` -In other words, although the `length` of `[4, 7, 9]` is 3, the index of -the lastvalue (`9`) is 2. A good rule of thumb of accessing the last index of an -arrayis to find the length and then subtract one: +In other words, although the `length` of `[4, 7, 9]` is 3, the index of the last +value (`9`) is 2. A good rule of thumb of accessing the last index of an array +is to find the length and then subtract one: -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js let testArray = [4, 7, 9]; let finalIndex = testArray.length - 1; // => (3 - 1) = 2 console.log(testArray[finalIndex]); // => 9 ``` -Working with arrays {#working-with-arrays .mume-header} -------------------- +## Working with arrays -### Containing data in arrays {#containing-data-in-arrays .mume-header} +### Containing data in arrays -By packaging groups of related data into a single array, we gain the -addedbenefit of being able to refer to that data as a single collection. -Arrays don\'thave to just hold single characters- they are capable of holding entire -strings,numbers, and even other arrays! +By packaging groups of related data into a single array, we gain the added +benefit of being able to refer to that data as a single collection. Arrays don't +have to just hold single characters- they are capable of holding entire strings, +numbers, and even other arrays! -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js let wackyArray = [2, 17, "apple", "cat", ["apple"]]; console.log(wackyArray[0]); // => 2 @@ -3132,18 +2219,17 @@ console.log(wackyArray[3]); // => "cat" console.log(wackyArray[4]); // => ["apple"] ``` -Just think of all the possibilities of what you can store in a single -array!However, just because you can *doesn\'t* mean you should. In practice we -willalmost always be storing similar kinds of data, that are coming from a -commonsource (i.e. items in a shopping list, ID numbers, tasks on a todo -list). +Just think of all the possibilities of what you can store in a single array! +However, just because you can _doesn't_ mean you should. In practice we will +almost always be storing similar kinds of data, that are coming from a common +source (i.e. items in a shopping list, ID numbers, tasks on a todo list). -### Using indexOf with arrays {#using-indexof-with-arrays .mume-header} +### Using indexOf with arrays -We can also calculate the index of a given value within an array by -using`indexOf`: +We can also calculate the index of a given value within an array by using +`indexOf`: -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript console.log([1, 3, 5, "apple", "jet"].indexOf(3)); // => 1 console.log([1, 3, 5, "apple", "jet"].indexOf(5)); // => 2 console.log([1, 3, 5, "apple", "jet"].indexOf("jet")); // => 4 @@ -3152,140 +2238,113 @@ console.log([1, 3, 5, "apple", "jet"].indexOf("jet")); // => 4 console.log([1, 3, 5, "apple", "jet"].indexOf("potato")); // => -1 ``` -If we attempt to search for a value that is **not** present in an -array,`indexOf` will return -1. This makes sense because we know that -1 is -not avalid array index. The smallest index possible is 0! +If we attempt to search for a value that is **not** present in an array, +`indexOf` will return -1. This makes sense because we know that -1 is not a +valid array index. The smallest index possible is 0! -Concatenation with arrays {#concatenation-with-arrays .mume-header} -------------------------- +## Concatenation with arrays -As a reminder, concatenation is just a fancy word for joining things -togetherinto a single collection. Now, this is where arrays will differ from -strings.The `+` operator only exists for numbers and strings. If you try to use -the `+`on an array it will try to help you out by *converting your arrays intostrings*. +As a reminder, concatenation is just a fancy word for joining things together +into a single collection. Now, this is where arrays will differ from strings. +The `+` operator only exists for numbers and strings. If you try to use the `+` +on an array it will try to help you out by _converting your arrays into +strings_. -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js console.log([1, 2, 3] + [4, 5, 6]); // => 1,2,34,5,6 ``` -JavaScript was just trying to help! However that is probably not what -you meantto do. Good thing JavaScript has a seperate method for putting two -arraytogether. To concatenate arrays, we can use the aptly named `.concat` -method: +JavaScript was just trying to help! However that is probably not what you meant +to do. Good thing JavaScript has a seperate method for putting two array +together. To concatenate arrays, we can use the aptly named `.concat` method: -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript console.log([1, 2, 3].concat([4, 5, 6])); // => [1, 2, 3, 4, 5, 6] ``` -Remember {#what-youve-learned-6 .mume-header} --------- - -- An **Array** is a data type that contains a list of in order values - surrounded in square brackets `[]`. -- `array.length` returns the number of values in the `array`. -- Each value of an array is associated with a number index; the first - value of an array is at the index of 0. -- We can use `array.indexOf(value)` to obtain the index of `value` - within `array`; if `value` is not found, then -1 is returned. -- We can use `.concat` to concatenate multiple arrays, combining them - into a single array. - ------------------------------------------------------------------------- - -DAY-3*Intermediate Functions* - ------------------------------------------------------------------------- - -Intermediate Functions Learning Objectives {#intermediate-functions-learning-objectives .mume-header} -========================================== - -Below is a complete list of the terminal learning objectives across all"Intermediate Function\" lessons. When you complete these lessons, you -should beable to perform each of the following objectives. These objectives -capture howyou may be evaluated on the assessment for these lessons. - -1. Identify that strings are immutable and arrays are mutable - -2. Define a function using both function declaration and function - expression syntax - -3. Utilize Array\#push, \#pop, \#shift, \#unshift to mutate an array - -4. List the arguments that can be used with Array\#splice - -5. Write a function that sums up elements of an array, given an array - of numbers as an argument - -6. Utilize Array\#forEach, \#map, \#filter, \#reduce in a function - -7. Define a function that takes in an array of numbers and returns a - new array containing only the primes - -8. Define a function that takes in a 2D array of numbers and returns - the total sum of all elements in the array - -9. Define a function that takes in an array of elements and returns a - 2d array where the subarrays represent unique pairs of elements - -10. Define a function that takes in an array of numbers as an argument - and returns the smallest value in the array; if the array is empty - return null the terminal learning objectives across all \"Intermediate Function\" lessons. When you complete these lessons, - you should be able to perform each of the following objectives. These objectives - capture how you may be evaluated on the assessment for these lessons. - -11. Identify that strings are immutable and arrays are mutable - -12. Define a function using both function declaration and function - expression syntax - -13. Utilize Array\#push, \#pop, \#shift, \#unshift to mutate an array - -14. List the arguments that can be used with Array\#splice - -15. Write a function that sums up elements of an array, given an array - of numbers as an argument - -16. Utilize Array\#forEach, \#map, \#filter, \#reduce in a function - -17. Define a function that takes in an array of numbers and returns a - new array containing only the primes - -18. Define a function that takes in a 2D array of numbers and returns - the total sum of all elements in the array - -19. Define a function that takes in an array of elements and returns a - 2d array where the subarrays represent unique pairs of elements - -20. Define a function that takes in an array of numbers as an argument - and returns the smallest value in the array; if the array is empty - return null - ------------------------------------------------------------------------- - -Function Expressions {#function-expressions .mume-header} -==================== - -You may have noticed that we\'ve been writing many functions so far in -thecourse! We will continue to do so since functions are the building -blocks of theeventual applications that we will build. That being said, let\'s begin -tobroaden the way we think about functions. In particular, we\'ll want -think offunctions as expressions that we can store in variables - just like our -classicdata types of number, string, boolean, array, and object! +## What you've learned + +- An **Array** is a data type that contains a list of in order values surrounded + in square brackets `[]`. +- `array.length` returns the number of values in the `array`. +- Each value of an array is associated with a number index; the first value of + an array is at the index of 0. +- We can use `array.indexOf(value)` to obtain the index of `value` within + `array`; if `value` is not found, then -1 is returned. +- We can use `.concat` to concatenate multiple arrays, combining them into a + single array. + +________________________________________________________________________________ +# WEEK-01 DAY-3
*Intermediate Functions* {ignore=true} +________________________________________________________________________________ +# Intermediate Functions Learning Objectives + +Below is a complete list of the terminal learning objectives across all +"Intermediate Function" lessons. When you complete these lessons, you should be +able to perform each of the following objectives. These objectives capture how +you may be evaluated on the assessment for these lessons. + +1. Identify that strings are immutable and arrays are mutable +2. Define a function using both function declaration and function expression + syntax +3. Utilize Array#push, #pop, #shift, #unshift to mutate an array +4. List the arguments that can be used with Array#splice +5. Write a function that sums up elements of an array, given an array of numbers + as an argument +6. Utilize Array#forEach, #map, #filter, #reduce in a function +7. Define a function that takes in an array of numbers and returns a new array + containing only the primes +8. Define a function that takes in a 2D array of numbers and returns the total + sum of all elements in the array +9. Define a function that takes in an array of elements and returns a 2d array + where the subarrays represent unique pairs of elements +10. Define a function that takes in an array of numbers as an argument and + returns the smallest value in the array; if the array is empty return null the terminal learning objectives across all +"Intermediate Function" lessons. When you complete these lessons, you should be +able to perform each of the following objectives. These objectives capture how +you may be evaluated on the assessment for these lessons. + +1. Identify that strings are immutable and arrays are mutable +2. Define a function using both function declaration and function expression + syntax +3. Utilize Array#push, #pop, #shift, #unshift to mutate an array +4. List the arguments that can be used with Array#splice +5. Write a function that sums up elements of an array, given an array of numbers + as an argument +6. Utilize Array#forEach, #map, #filter, #reduce in a function +7. Define a function that takes in an array of numbers and returns a new array + containing only the primes +8. Define a function that takes in a 2D array of numbers and returns the total + sum of all elements in the array +9. Define a function that takes in an array of elements and returns a 2d array + where the subarrays represent unique pairs of elements +10. Define a function that takes in an array of numbers as an argument and + returns the smallest value in the array; if the array is empty return null + +________________________________________________________________________________ +# Function Expressions + +You may have noticed that we've been writing many functions so far in the +course! We will continue to do so since functions are the building blocks of the +eventual applications that we will build. That being said, let's begin to +broaden the way we think about functions. In particular, we'll want think of +functions as expressions that we can store in variables - just like our classic +data types of number, string, boolean, array, and object! When you finish this article, you should be able to: -- identify functions as first-class objects in JavaScript -- define a function using function expression syntax +- identify functions as first-class objects in JavaScript +- define a function using function expression syntax -Functions as first-class objects {#functions-as-first-class-objects .mume-header} --------------------------------- +## Functions as first-class objects -JavaScript is well known for being a programming language that treats -functionsas \"first-class objects\". This fancy talk means that you can treat a -function asa \"normal\" value by storing it in a variable. We\'ll leverage this key -concept invery clever ways later in the course. For now, let\'s begin with a -simple examplethat shows the \"first-class object\" nature of functions: +JavaScript is well known for being a programming language that treats functions +as "first-class objects". This fancy talk means that you can treat a function as +a "normal" value by storing it in a variable. We'll leverage this key concept in +very clever ways later in the course. For now, let's begin with a simple example +that shows the "first-class object" nature of functions: -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript let calculateAverage = function(a, b) { return (a + b) / 2; }; @@ -3293,16 +2352,16 @@ let calculateAverage = function(a, b) { console.log(calculateAverage(10, 20)); // 15 ``` -In the code snippet above, we define the `calculateAverage` by assigning -avariable to contain the function\'s definition. By doing this, the -variable\'sname is effectively the function\'s name. So to call the function, we -simplyrefer to the variable name. Note that we do not write the function\'s -name afterthe `function` keyword, where we normally would. We will refer to this -new wayof defining functions as *function expression syntax* and the classic -way ofdefining functions as *function declaration syntax*. In general, we can -definefunctions using either syntax: +In the code snippet above, we define the `calculateAverage` by assigning a +variable to contain the function's definition. By doing this, the variable's +name is effectively the function's name. So to call the function, we simply +refer to the variable name. Note that we do not write the function's name after +the `function` keyword, where we normally would. We will refer to this new way +of defining functions as _function expression syntax_ and the classic way of +defining functions as _function declaration syntax_. In general, we can define +functions using either syntax: -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript // function declaration syntax function myFunctionName(arg1, arg2) {} @@ -3310,28 +2369,28 @@ function myFunctionName(arg1, arg2) {} let myFunctionName = function(arg1, arg2) {}; ``` -In the coming sections, we\'ll highlight moments when we\'ll prefer one -syntaxover the other. For now, get acquainted with the new syntax as it is -somethingyou\'ll be seeing a lot of as a programmer! +In the coming sections, we'll highlight moments when we'll prefer one syntax +over the other. For now, get acquainted with the new syntax as it is something +you'll be seeing a lot of as a programmer! -### A peek under the hood {#a-peek-under-the-hood .mume-header} +### A peek under the hood -Perhaps you\'re finding it tough to understand what it means for a -variable tocontain a function - it is indeed a very abstract idea for new -programmers.Let\'s draw a comparison. We know that when we assign an expression to -variable,the expression first evaluates to a single value, which we then store in -thevariable name: +Perhaps you're finding it tough to understand what it means for a variable to +contain a function - it is indeed a very abstract idea for new programmers. +Let's draw a comparison. We know that when we assign an expression to variable, +the expression first evaluates to a single value, which we then store in the +variable name: -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript let myNum = 4 + 4; console.log(myNum); // prints 8 console.log(myNum * 3); // prints 24 ``` -In the same way we can treat a function definition as an expression -thatevaluates! +In the same way we can treat a function definition as an expression that +evaluates! -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript let myFunc = function() { console.log("I'm a function"); }; @@ -3340,43 +2399,45 @@ console.log(myFunc); // prints [Function: myFunc] myFunc(); // prints "I'm a function" ``` -Looking at the snippet immediately above, you\'ll notice that when we -print the`myFunc` variable directly, without calling the function with -parentheses,JavaScript simply says the variable contains a function named myFunc(`[Function: myFunc]`). You can truly imagine a function as a value that -we canstore and use as we please. +Looking at the snippet immediately above, you'll notice that when we print the +`myFunc` variable directly, without calling the function with parentheses, +JavaScript simply says the variable contains a function named myFunc +(`[Function: myFunc]`). You can truly imagine a function as a value that we can +store and use as we please. -> The term *anonymous function* may also be used to describe a function> expression before it is assigned to any variable. Following the -> example above,> we\'ll use the word *anonymous function* to describe the function -> expression> *before* the assignment to the `myFunc` variable is complete. Once -> the> assignment is complete, it would be silly to refer to `myFunc` as an> `anonymous function` because an *anonymous function* has no name. +> The term _anonymous function_ may also be used to describe a function +> expression before it is assigned to any variable. Following the example above, +> we'll use the word _anonymous function_ to describe the function expression +> _before_ the assignment to the `myFunc` variable is complete. Once the +> assignment is complete, it would be silly to refer to `myFunc` as an +> `anonymous function` because an _anonymous function_ has no name. -Remember {#what-youve-learned-7 .mume-header} --------- +## What you've learned -- functions can be stored in variables; just like any other values in JavaScript! +- functions can be stored in variables; just like any other values in + JavaScript! ------------------------------------------------------------------------- +________________________________________________________________________________ +# Two-Dimensional Arrays (2D Arrays) -Two-Dimensional Arrays (2D Arrays) {#two-dimensional-arrays-2d-arrays .mume-header} -================================== - -Time to broaden our understanding of arrays! We\'ve already explore thefundamentals of arrays. Mainly, we can store any type of data we please -aselements of an array and even mix types together. However, what happens -if westore an array as an element of an array? +Time to broaden our understanding of arrays! We've already explore the +fundamentals of arrays. Mainly, we can store any type of data we please as +elements of an array and even mix types together. However, what happens if we +store an array as an element of an array? When you finish this article, you should be able to: -- index into the inner elements of a 2D array -- use nested loops to iterate through a 2D array +- index into the inner elements of a 2D array +- use nested loops to iterate through a 2D array -Multidimensional Arrays {#multidimensional-arrays .mume-header} ------------------------ +## Multidimensional Arrays -When we store arrays as elements of other arrays, we refer to those -structuresas multidimensional arrays. If the \"depth\" of the nested arrays is at -exactly 2 (anouter array containing inner arrays), then we\'ll refer to it as atwo-dimensional array: +When we store arrays as elements of other arrays, we refer to those structures +as multidimensional arrays. If the "depth" of the nested arrays is at exactly 2 (an +outer array containing inner arrays), then we'll refer to it as a +two-dimensional array: -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript let twoDimensional = [["a", "b", "c"], ["d", "e"], ["f", "g", "h"]]; console.log(twoDimensional[1]); // [ 'd', 'e' ] @@ -3386,15 +2447,14 @@ let subArr = twoDimensional[1]; console.log(subArr[0]); // 'd' ``` -Note that indexing the outer `twoDimensional` array will return an -element likeusual, it\'s just that element happens to be another array. To gain -access to theinnermost elements, we simply need to apply another set of indexing -brackets! +Note that indexing the outer `twoDimensional` array will return an element like +usual, it's just that element happens to be another array. To gain access to the +innermost elements, we simply need to apply another set of indexing brackets! -If we style our 2D arrays nicely so that each subarray is on a new line, -we caninterpret the double indices as `[row][column]`: +If we style our 2D arrays nicely so that each subarray is on a new line, we can +interpret the double indices as `[row][column]`: -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript let twoDimensional = [ ["a", "b", "c"], ["d", "e"], @@ -3404,13 +2464,12 @@ let twoDimensional = [ console.log(twoDimensional[0][2]); // 'c' ``` -Iterating through 2D Arrays {#iterating-through-2d-arrays .mume-header} ---------------------------- +## Iterating through 2D Arrays -Since a 2D array is just an array of arrays. We\'ll need to use a loop -within aloop to iterate through a 2D array: +Since a 2D array is just an array of arrays. We'll need to use a loop within a +loop to iterate through a 2D array: -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript let array = [["a", "b", "c"], ["d", "e"], ["f", "g", "h"]]; for (let i = 0; i < array.length; i++) { @@ -3423,13 +2482,13 @@ for (let i = 0; i < array.length; i++) { } ``` -In the nested loops above, the `i` index refers to the current \"row\" -and the `j`index refers to the current \"column\". It\'s worth noting that since -the innersubArrays have different length, we\'ll want to specifically reference -the lengthof that subarray in our inner loop condition `j < subArray.length`. The -codeabove will print: +In the nested loops above, the `i` index refers to the current "row" and the `j` +index refers to the current "column". It's worth noting that since the inner +subArrays have different length, we'll want to specifically reference the length +of that subarray in our inner loop condition `j < subArray.length`. The code +above will print: -``` {.language-plaintext data-role="codeBlock" data-info="plaintext"} +```plaintext [ 'a', 'b', 'c' ] a b @@ -3443,53 +2502,47 @@ g h ``` -When is a 2D array practical? {#when-is-a-2d-array-practical .mume-header} ------------------------------ - -As a preview of things to come let\'s briefly mention when you\'ll find -a 2D arrayuseful in your future projects. Imagine how\'d you represent a \"grid\": +## When is a 2D array practical? -- tic-tac-toe (3x3 grid) -- chess (8x8 grid) -- sudoku (9x9 grid) -- excel (a sheet is an arbitrarily sized 2D array) +As a preview of things to come let's briefly mention when you'll find a 2D array +useful in your future projects. Imagine how'd you represent a "grid": -Remember {#what-youve-learned-8 .mume-header} --------- +- tic-tac-toe (3x3 grid) +- chess (8x8 grid) +- sudoku (9x9 grid) +- excel (a sheet is an arbitrarily sized 2D array) -- an array can contain arrays as elements, we call this a 2D arrays -- to iterate through a 2D array, used nested loops +## What you've learned ------------------------------------------------------------------------- +- an array can contain arrays as elements, we call this a 2D arrays +- to iterate through a 2D array, used nested loops -Mutability in JavaScript {#mutability-in-javascript .mume-header} -======================== +________________________________________________________________________________ +# Mutability in JavaScript -So far in the course we\'ve explored a handful of methods that -manipulate data.We\'ll be growing our arsenal of methods further overtime, so we\'ll -want to gainawareness for **exactly** how we should expect these methods to -manipulate thedata we give them. To this end, let\'s analyze which methods will modify -existingdata and which methods do not. We refer to this concept as -**mutability**. +So far in the course we've explored a handful of methods that manipulate data. +We'll be growing our arsenal of methods further overtime, so we'll want to gain +awareness for **exactly** how we should expect these methods to manipulate the +data we give them. To this end, let's analyze which methods will modify existing +data and which methods do not. We refer to this concept as **mutability**. When you finish this article, you should be able to: -- Explain what \"mutability\" is -- Correctly label JavaScript data types as immutable or mutable +- Explain what "mutability" is +- Correctly label JavaScript data types as immutable or mutable -What is mutability? {#what-is-mutability .mume-header} -------------------- +## What is mutability? -At its face value, *mutability* is a simple concept. You may be familiar -withthe word *mutation*, which refers to a alteration (usually in DNA). -Somethingthat is *mutable* can be changed, while something that is *immutable* -isunchanging and permanent. To illustrate this concept, we\'ll begin with -stringsand arrays. We\'ve spent some time with these two data types and by now -werecognize that the two types share many similarities. Both have -indices,`length`, and even share common methods like `slice`. However, they -differgreatly in their mutability: +At its face value, _mutability_ is a simple concept. You may be familiar with +the word _mutation_, which refers to a alteration (usually in DNA). Something +that is _mutable_ can be changed, while something that is _immutable_ is +unchanging and permanent. To illustrate this concept, we'll begin with strings +and arrays. We've spent some time with these two data types and by now we +recognize that the two types share many similarities. Both have indices, +`length`, and even share common methods like `slice`. However, they differ +greatly in their mutability: -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript let myArr = ["b", "e", "a", "m"]; myArr[0] = "s"; console.log(myArr); // 'seam' @@ -3499,231 +2552,221 @@ myStr[0] = "s"; console.log(myStr); // 'beam' ``` -Above we have shown that we can assign a new element to an index of an -array,but we cannot assign a new character to an index of a string. In other -words,arrays are *mutable*, but strings are *immutable*. +Above we have shown that we can assign a new element to an index of an array, +but we cannot assign a new character to an index of a string. In other words, +arrays are _mutable_, but strings are _immutable_. -An implication of this discovery is that there are *some* array methods -thatwill modify an existing array but *zero* methods that will modify an -existingstring. Methods that manipulate string data typically return a *new* -string andnever modify an existing one. A prime example is `toUpperCase`: +An implication of this discovery is that there are _some_ array methods that +will modify an existing array but _zero_ methods that will modify an existing +string. Methods that manipulate string data typically return a _new_ string and +never modify an existing one. A prime example is `toUpperCase`: -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript let word = "piñata"; let newWord = word.toUpperCase(); console.log(word); // 'piñata' console.log(newWord); // 'PIÑATA' ``` -Above, notice that the `toUpperCase` method returns a capitalized -version of thestring, but does not change the original string. It\'s also worth noting -that notevery array method will mutate. For example, the `slice` method does not -mutatefor both strings and arrays. As we learn about methods in the future, -we\'ll becertain to note what mutates and what does not. +Above, notice that the `toUpperCase` method returns a capitalized version of the +string, but does not change the original string. It's also worth noting that not +every array method will mutate. For example, the `slice` method does not mutate +for both strings and arrays. As we learn about methods in the future, we'll be +certain to note what mutates and what does not. -Mutable or immutable, that is the question {#mutable-or-immutable-that-is-the-question .mume-header} ------------------------------------------- +## Mutable or immutable, that is the question -Now that we have a grasp of *mutability*, let\'s take inventory and -identifyJavaScript\'s data types as mutable or immutable. +Now that we have a grasp of _mutability_, let's take inventory and identify +JavaScript's data types as mutable or immutable. **Mutable** -- array -- object (we\'ll learn these soon) +- array +- object (we'll learn these soon) **Immutable** -- number -- string -- boolean +- number +- string +- boolean -A quick way to remember the above list is to identify that the composite -types(the types that can contain multiple values) of array and object are -mutable.The remaining \"simpler\" types of number, string, and boolean are -immutable. +A quick way to remember the above list is to identify that the composite types +(the types that can contain multiple values) of array and object are mutable. +The remaining "simpler" types of number, string, and boolean are immutable. -The mutability misconception {#the-mutability-misconception .mume-header} ----------------------------- +## The mutability misconception -Maybe you are having a tough time believing what we have just claimed. -We don\'tblame you, you\'ve probably heard the saying that change is the only -constant inthe universe. Let\'s debunk a common argument to turn you into a -believer. Theskeptical programmer may use this as an argument to show that numbers -aremutable: +Maybe you are having a tough time believing what we have just claimed. We don't +blame you, you've probably heard the saying that change is the only constant in +the universe. Let's debunk a common argument to turn you into a believer. The +skeptical programmer may use this as an argument to show that numbers are +mutable: -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript let myNum = 42; myNum += 8; console.log(myNum); // 50 ``` -Because the `myNum` variable now contains `50` where it once contained -`42`, itmay seem we have mutated the number, but this is not truly the case. -Recall that`myNum += 8` is shorthand for `myNum = myNum + 8`. Since the right hand -side ofthe assignment evaluates first, we are simply taking the new number of -`50` andreassigning it to the `myNum` variable. This reassignment of a variable -name isnot a mutation of the original number. - -Remember {#what-youve-learned-9 .mume-header} --------- +Because the `myNum` variable now contains `50` where it once contained `42`, it +may seem we have mutated the number, but this is not truly the case. Recall that +`myNum += 8` is shorthand for `myNum = myNum + 8`. Since the right hand side of +the assignment evaluates first, we are simply taking the new number of `50` and +reassigning it to the `myNum` variable. This reassignment of a variable name is +not a mutation of the original number. -- data types that can be changed are mutable, those that cannot be - changed are immutable -- arrays and objects are mutable -- numbers, strings, and booleans are immutable +## What you've learned ------------------------------------------------------------------------- +- data types that can be changed are mutable, those that cannot be changed are + immutable +- arrays and objects are mutable +- numbers, strings, and booleans are immutable -Array Splice {#array-splice .mume-header} -============ +________________________________________________________________________________ +# Array Splice -Time to a learn yet another array method! The -[Array\#splice](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice) -methoddeserves its own reading because of how versatile it is. Feel free to -use thisarticle as a quick reference; let\'s jump right in. +Time to a learn yet another array method! The [Array#splice][mdn-splice] method +deserves its own reading because of how versatile it is. Feel free to use this +article as a quick reference; let's jump right in. When you finish reading this article, you should be able to: -- list all possible arguments that can be used with the `Array#splice` - method +- list all possible arguments that can be used with the `Array#splice` method -Notation {#notation .mume-header} --------- +## Notation -For clarity in this article and moving forward in the course, we\'ll be -notatingmethods with `#` to clarify how they should be called. For example,`Array#splice` refers to the method that should be called on an array,`arr.splice()` where `arr` is some array variable. Likewise -`String#toUpperCase`refers to the method that should be called on a string, -`str.toUpperCase()`where `str` is some string variable. We\'ll opt to refer to methods -using thisnotation because some methods can be called on multiple data types, such -as`Array#slice` and `String#slice`. +For clarity in this article and moving forward in the course, we'll be notating +methods with `#` to clarify how they should be called. For example, +`Array#splice` refers to the method that should be called on an array, +`arr.splice()` where `arr` is some array variable. Likewise `String#toUpperCase` +refers to the method that should be called on a string, `str.toUpperCase()` +where `str` is some string variable. We'll opt to refer to methods using this +notation because some methods can be called on multiple data types, such as +`Array#slice` and `String#slice`. -What can Array\#splice do? {#what-can-arraysplice-do .mume-header} --------------------------- +## What can Array#splice do? -Before we explore the nitty-gritty details of the `Array#splice` method, -thefirst thing to be aware of is that the method will **mutate** the array -that itis called on. That is, `Array#splice` will modify the existing array and -*not*return a new array. +Before we explore the nitty-gritty details of the `Array#splice` method, the +first thing to be aware of is that the method will **mutate** the array that it +is called on. That is, `Array#splice` will modify the existing array and _not_ +return a new array. -### Using splice to remove {#using-splice-to-remove .mume-header} +### Using splice to remove -The usage of the `Array#splice` method is easy to mix up because it can -be usedto remove or insert elements into an array. That\'s right - it can -perform"opposite\" operations, even at the same time! For now, we\'ll begin by -*only*removing elements from an array: +The usage of the `Array#splice` method is easy to mix up because it can be used +to remove or insert elements into an array. That's right - it can perform +"opposite" operations, even at the same time! For now, we'll begin by _only_ +removing elements from an array: -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript let colors = ["red", "yellow", "blue", "green", "orange", "brown", "gray"]; let returnVal = colors.splice(2, 3); console.log(colors); // [ 'red', 'yellow', 'brown', 'gray' ] console.log(returnVal); // [ 'blue', 'green', 'orange' ] ``` -The first two arguments for splice correspond to 1) the target index and -2) howmany elements to remove. The call `colors.splice(2, 3)`, will remove the -nextthree elements beginning at index 2. This means that the elements at -indices 2,3, and 4 are removed. +The first two arguments for splice correspond to 1) the target index and 2) how +many elements to remove. The call `colors.splice(2, 3)`, will remove the next +three elements beginning at index 2. This means that the elements at indices 2, +3, and 4 are removed. -Note that splice returns an array containing the elements that were -removed andalso has the effect of removing the elements from the *original* array, -mutatingit in-place. +Note that splice returns an array containing the elements that were removed and +also has the effect of removing the elements from the _original_ array, mutating +it in-place. -### Using splice to insert {#using-splice-to-insert .mume-header} +### Using splice to insert -To use the splice method to insert new elements into an array, we can -pass inany number of additional arguments representing the values to insert: +To use the splice method to insert new elements into an array, we can pass in +any number of additional arguments representing the values to insert: -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript let colors = ["red", "yellow", "blue"]; let returnVal = colors.splice(1, 0, "RebeccaPurple", "CornflowerBlue"); console.log(colors); // [ 'red', 'RebeccaPurple', 'CornflowerBlue', 'yellow', 'blue' ] console.log(returnVal); // [] ``` -The method call -`colors.splice(1, 0, 'RebeccaPurple', 'CornflowerBlue')`translates to \"target index 1, remove the next 0 elements, then insert`'RebeccaPurple'` and `'CornflowerBlue'`.\" +The method call `colors.splice(1, 0, 'RebeccaPurple', 'CornflowerBlue')` +translates to "target index 1, remove the next 0 elements, then insert +`'RebeccaPurple'` and `'CornflowerBlue'`." -### Using splice like a pro {#using-splice-like-a-pro .mume-header} +### Using splice like a pro -Naturally, we can combine these two functionalities! Say we wanted to -targetindex 2, remove the next 3 elements, then insert `'Gainsboro'`, -`'Ivory'`, and`'Khaki'`: +Naturally, we can combine these two functionalities! Say we wanted to target +index 2, remove the next 3 elements, then insert `'Gainsboro'`, `'Ivory'`, and +`'Khaki'`: -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript let colors = ["red", "yellow", "blue", "green", "black", "beige"]; let removed = colors.splice(2, 3, "Gainsboro", "Ivory", "Khaki"); console.log(colors); // [ 'red', 'yellow', 'Gainsboro', 'Ivory', 'Khaki', 'beige' ] console.log(removed); // [ 'blue', 'green', 'black' ] ``` -Bam. What a versatile method! Always feel free to reference the[documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice) -for the method when you are struggling to rememberits usage: +Bam. What a versatile method! Always feel free to reference the +[documentation][mdn-splice] for the method when you are struggling to remember +its usage: -Remember {#what-youve-learned-10 .mume-header} --------- +## What you've learned -- Array\#splice has two required arguments - - the target index - - the number of elements to remove beginning at that target index -- Array\#splice can also take in any number of values to be inserted - at the target index +- Array#splice has two required arguments + - the target index + - the number of elements to remove beginning at that target index +- Array#splice can also take in any number of values to be inserted at the + target index ------------------------------------------------------------------------- +[mdn-splice]: + https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice -String\#split and Array\#join {#stringsplit-and-arrayjoin .mume-header} -============================= +________________________________________________________________________________ +# String#split and Array#join -We\'ve seen previously that strings and arrays share many similar -properties. Forexample, strings and arrays both have a `length` and can have multiple -indices.Because of this, you may find it useful to \"convert\" between the two -types. +We've seen previously that strings and arrays share many similar properties. For +example, strings and arrays both have a `length` and can have multiple indices. +Because of this, you may find it useful to "convert" between the two types. When you finish this article, you should be able to: -- use the `String#split` method to turn a string into an array -- use the `Array#join` method to turn an array into a string +- use the `String#split` method to turn a string into an array +- use the `Array#join` method to turn an array into a string -String\#split {#stringsplit .mume-header} -------------- +## String#split -The -[String\#split](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split) -method is called on a string and accepts a"separator\" string as an argument. The method will return an array -where theelements are the resulting substrings when we cut at the \"separators\": +The [String#split][string-split-mdn] method is called on a string and accepts a +"separator" string as an argument. The method will return an array where the +elements are the resulting substrings when we cut at the "separators": -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript let sentence = "follow the yellow brick road"; let words = sentence.split(" "); console.log(words); // [ 'follow', 'the', 'yellow', 'brick', 'road' ] console.log(sentence); // 'follow the yellow brick road' ``` -Note that the original string is *not mutated*, rather a new array is -returned.A common pattern is to split a sentence string on a space (\' \'), but -you cansplit on any separator as you see fit: +Note that the original string is _not mutated_, rather a new array is returned. +A common pattern is to split a sentence string on a space (' '), but you can +split on any separator as you see fit: -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript let sentence = "follow the yellow brick road"; console.log(sentence.split(" ")); // [ 'follow', 'the', 'yellow', 'brick', 'road' ] console.log(sentence.split("the")); // [ 'follow ', ' yellow brick road' ] console.log(sentence.split("o")); // [ 'f', 'll', 'w the yell', 'w brick r', 'ad' ] ``` -A pattern you may find useful is that when you split on a separator -string, itis guaranteed that that separator will not be in the resulting array,effectively removing it. See the example of `sentence.split('the')` -above. Thismay come in handy, so keep it in mind! +A pattern you may find useful is that when you split on a separator string, it +is guaranteed that that separator will not be in the resulting array, +effectively removing it. See the example of `sentence.split('the')` above. This +may come in handy, so keep it in mind! -Array\#join {#arrayjoin .mume-header} ------------ +## Array#join -The -[Array\#join](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/join) -method is called on an array and accepts a"separator\" string as an argument. The method will return a string -whereelements of the array are concatenated together with the \"separator\" -betweeneach element: +The [Array#join][array-join-mdn] method is called on an array and accepts a +"separator" string as an argument. The method will return a string where +elements of the array are concatenated together with the "separator" between +each element: -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript let words = ["run", "around", "the", "block"]; let sentence = words.join(" "); console.log(sentence); // 'run around the block' @@ -3733,75 +2776,72 @@ console.log(words.join("_")); // 'run_around_the_block' console.log(words.join("HI")); // 'runHIaroundHItheHIblock' ``` -`Array#join` does not mutate the original array, instead it will return -a newstring. +`Array#join` does not mutate the original array, instead it will return a new +string. -A clever combination {#a-clever-combination .mume-header} --------------------- +## A clever combination -It\'s pretty evident that `String#split` and `Array#join` are -\"opposite\" methods.That is: +It's pretty evident that `String#split` and `Array#join` are "opposite" methods. +That is: -- we use split to turn a string into a array -- we use join to turn an array into a string +- we use split to turn a string into a array +- we use join to turn an array into a string By combining these two methods we can accomplish some cool behavior: -``` {.language-javascript data-role="codeBlock" data-info="javascript"} +```javascript let str = "I don't know what I want to eat"; let newStr = str.split("I").join("we"); console.log(newStr); // 'we don't know what we want to eat' ``` -Whoa! We were able to replace every substring \"I\" with the substring -\"we\". Weknow that the line `str.split('I').join('we')` evaluates from left to -right.This means that the `split` will cut the string wherever there is an -\'I\',leaving a gap where the \'I\'s were. Then, the `join` will fill those -gaps with\'we\'s. +Whoa! We were able to replace every substring "I" with the substring "we". We +know that the line `str.split('I').join('we')` evaluates from left to right. +This means that the `split` will cut the string wherever there is an 'I', +leaving a gap where the 'I's were. Then, the `join` will fill those gaps with +'we's. -Remember {#what-youve-learned-11 .mume-header} --------- +## What you've learned -- we can use `String#split` and `Array#join` to convert between - strings and arrays -- both methods do not mutate their input +- we can use `String#split` and `Array#join` to convert between strings and + arrays +- both methods do not mutate their input ------------------------------------------------------------------------- +[string-split-mdn]: + https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split +[array-join-mdn]: + https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/join ------------------------------------------------------------------------- +________________________________________________________________________________ +# WEEK-01 DAY-5
*Control Flow* {ignore=true} +________________________________________________________________________________ +# Determining Types -Determining Types {#determining-types .mume-header} -================= +Sometimes you want to know the type of value store in a variable so that you can +safely do things with it. If your function expects an array in its parameter but +gets a number, you can't call the `map` method on that! -Sometimes you want to know the type of value store in a variable so that -you cansafely do things with it. If your function expects an array in its -parameter butgets a number, you can\'t call the `map` method on that! +In this article you will learn how to figure out if a value in a variable is -In this article you will learn how to figure out if a value in a -variable is +* A string +* A number +* A function +* An array -- A string -- A number -- A function -- An array +## The typeof operator -The typeof operator {#the-typeof-operator .mume-header} -------------------- +Not all operators in JavaScript require two arguments like the `+` operator for +addition, the `=` for assignment, and the `%` operator for modulo division. +Those are all called _binary_ operators because they take two (bi-) operands, +or things that are operated on. -Not all operators in JavaScript require two arguments like the `+` -operator foraddition, the `=` for assignment, and the `%` operator for modulo -division.Those are all called *binary* operators because they take two (bi-) -operands,or things that are operated on. +JavaScript kindly gives you the operator `typeof` which acts on a single value. +Operators that take only one operand are called _unary_ operators because "u +only give them one value!" (That's a joke. "uni-" or "una-" is one.) -JavaScript kindly gives you the operator `typeof` which acts on a single -value.Operators that take only one operand are called *unary* operators -because \"uonly give them one value!\" (That\'s a joke. \"uni-\" or \"una-\" is -one.) +Here are some examples of what you'd expect to see with the `typeof` operator. -Here are some examples of what you\'d expect to see with the `typeof` -operator. - -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js let s = 'This is a string'; console.log(typeof s); // 'string' @@ -3814,10 +2854,10 @@ let sum = function (a, b) { console.log(typeof sum); // 'function' ``` -Note that the value returned from the `typeof` operator is a String data -type.So, if you want to check if a value is a number, you could do this. +Note that the value returned from the `typeof` operator is a String data type. +So, if you want to check if a value is a number, you could do this. -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js if (typeof n === 'number') { // It is a number. Do some maths! } else { @@ -3825,26 +2865,24 @@ if (typeof n === 'number') { } ``` -How to tell if a value is an array {#how-to-tell-if-a-value-is-an-array .mume-header} ----------------------------------- +## How to tell if a value is an array -Unfortunately, due to a *really old bug* in the way that JavaScript -works, a bugthat no one can fix because people wrote code that relies on the bug -fordecades, you cannot use the `typeof` operator to figure out if something -is anarray. +Unfortunately, due to a _really old bug_ in the way that JavaScript works, a bug +that no one can fix because people wrote code that relies on the bug for +decades, you cannot use the `typeof` operator to figure out if something is an +array. -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js let a = [1, 2, 3]; console.log(typeof a); // 'object' ``` -Gee, JavaScript. That\'s not helpful. Thanks. +Gee, JavaScript. That's not helpful. Thanks. -Luckily, it only took 12 years for JavaScript to include a way to test -if avalue is an array. To do so, you use the `Array.isArray` method like -this. +Luckily, it only took 12 years for JavaScript to include a way to test if a +value is an array. To do so, you use the `Array.isArray` method like this. -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js let a = [1, 2, 3]; Array.isArray(a); // true @@ -3855,29 +2893,28 @@ let f = function () {} Array.isArray(f); // false ``` -Practical use in \"real\" code {#practical-use-in-real-code .mume-header} ------------------------------- +## Practical use in "real" code -Oddly enough, you won\'t see a lot of code in real-world applications -testing ifa value is one type or another. A lot of JavaScript functions just -*assume* thatthey will get arguments of the right kind because the parameter names -imply whatkind of value to pass in. For example, the following function has a -parameternamed `sentence`. +Oddly enough, you won't see a lot of code in real-world applications testing if +a value is one type or another. A lot of JavaScript functions just _assume_ that +they will get arguments of the right kind because the parameter names imply what +kind of value to pass in. For example, the following function has a parameter +named `sentence`. -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js function reverseTheSentence(sentence) { // ... code here ... } ``` -Most developers will know that the function probably wants `sentence` to -be astring value. They just won\'t pass in an array or number or \... well, -anythingother than a string. Because that\'s just not polite. They\'d expect any -otherkind of value to cause the `reverseTheSentence` to malfunction. Only -when youknow that people that don\'t respect your code will use it should you -add in somekind of check like this. +Most developers will know that the function probably wants `sentence` to be a +string value. They just won't pass in an array or number or ... well, anything +other than a string. Because that's just not polite. They'd expect any other +kind of value to cause the `reverseTheSentence` to malfunction. Only when you +know that people that don't respect your code will use it should you add in some +kind of check like this. -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js function reverseTheSentence(sentence) { if (typeof sentence !== 'string') { // Tell the developer they are using @@ -3887,37 +2924,32 @@ function reverseTheSentence(sentence) { } ``` -Remember {#what-youve-seen .mume-header} --------- +## What you've seen -This article has shown you two ways to determine if a value is a kind of -type: +This article has shown you two ways to determine if a value is a kind of type: -- the `typeof` operator to use to test if a value is a number, a - string, or a function; and, -- the `Array.isArray` method to check if a value is an array. +* the `typeof` operator to use to test if a value is a number, a string, or + a function; and, +* the `Array.isArray` method to check if a value is an array. Use them as much (or as little) as you need! ------------------------------------------------------------------------- - -The Null Type (And Undefined) {#the-null-type-and-undefined .mume-header} -============================= +________________________________________________________________________________ +# The Null Type (And Undefined) -You\'ve met numbers and string, Booleans and arrays. There\'s another -type oftenused in JavaScript: the Null type. And, it\'s a special type. +You've met numbers and string, Booleans and arrays. There's another type often +used in JavaScript: the Null type. And, it's a special type. -In this article, you will learn about the Null type, its value, and how -to workwith it in JavaScript. +In this article, you will learn about the Null type, its value, and how to work +with it in JavaScript. -A type with only one value {#a-type-with-only-one-value .mume-header} --------------------------- +## A type with only one value -You have seen that the String type can have an \"infinite\" number of -values(within the limits of your computer memory). For example, the String -typerepresents *any* of the following values. +You have seen that the String type can have an "infinite" number of values +(within the limits of your computer memory). For example, the String type +represents _any_ of the following values. -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js // Examples of values with the String type 'hello, world' "this is a string" @@ -3926,10 +2958,10 @@ typerepresents *any* of the following values. 'A really long string.........................................................' ``` -The Number type also has this aspect. Any number that you can reasonable -expressin JavaScript has the Number type. +The Number type also has this aspect. Any number that you can reasonable express +in JavaScript has the Number type. -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js // Examples of values with the Number type -100 99 @@ -3939,61 +2971,53 @@ Infinity You also know about the Boolean type. It can have only two values. -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js // The only two values of Boolean type true false ``` -There are not *more* Boolean values. You can\'t dream up more. There are -onlytwo, those two. +There are not _more_ Boolean values. You can't dream up more. There are only +two, those two. The Null type has one and exactly one value. -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js // The only value that has the Null type null ``` -It\'s just that word: `null`. No quotation marks. No other fancy things. -Just`null`. +It's just that word: `null`. No quotation marks. No other fancy things. Just +`null`. -The meaning of null {#the-meaning-of-null .mume-header} -------------------- +## The meaning of null -This is a harder subject to tackle because it\'s a *philosophical* -subject. Manypeople ask, \"What does the value of `null` mean in a program?\" There -are acouple of answers that programmers give to this. None of them are wrong. -None ofthem are right. They just are. In the presence of `null`, the code you -writedetermines which of the following meanings `null` has. +This is a harder subject to tackle because it's a _philosophical_ subject. Many +people ask, "What does the value of `null` mean in a program?" There are a +couple of answers that programmers give to this. None of them are wrong. None of +them are right. They just are. In the presence of `null`, the code you write +determines which of the following meanings `null` has. -- The value `null` means *the absence of a value* or *no value* -- The value `null` means *an unknown value* -- The value `null` is a nuisance and I hate it and wish it were never - invented +* The value `null` means _the absence of a value_ or _no value_ +* The value `null` means _an unknown value_ +* The value `null` is a nuisance and I hate it and wish it were never invented -During your software programming career, you will likely have all three -of thoseopinions, sometimes at the same time. Let\'s take a look at some -examples to tryto figure this out. +During your software programming career, you will likely have all three of those +opinions, sometimes at the same time. Let's take a look at some examples to try +to figure this out. -The absence of a value {#the-absence-of-a-value .mume-header} ----------------------- +## The absence of a value -Let\'s say you wrote a function that splits a string into words, -reverses them,and puts them back together in reverse order. You can do that with the -methods +Let's say you wrote a function that splits a string into words, reverses them, +and puts them back together in reverse order. You can do that with the methods -- `String#split` - [link](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/split); -- `Array#reverse` - [link](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reverse); - and, -- `Array#join` - [link](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/join). +* `String#split` [link][split]; +* `Array#reverse` [link][reverse]; and, +* `Array#join` [link][join]. That function could look like this. -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js function reverseTheSentence(sentence) { let parts = sentence.split(' '); parts.reverse(); @@ -4001,14 +3025,14 @@ function reverseTheSentence(sentence) { } ``` -That\'s great! It works! But, what happens if someone doesn\'t care -about whatyour function and just decides to pass in something that\'s not a -string? Itwould make sense that reversing something that is not a string should -lead to novalue, the absence of a value, because the input to the function -doesn\'t makesense. In that case, you can just return a `null` because there is *no -value*that the function can return that would make sense. +That's great! It works! But, what happens if someone doesn't care about what +your function and just decides to pass in something that's not a string? It +would make sense that reversing something that is not a string should lead to no +value, the absence of a value, because the input to the function doesn't make +sense. In that case, you can just return a `null` because there is _no value_ +that the function can return that would make sense. -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js function reverseTheSentence(sentence) { if (typeof sentence !== 'string') { return null; @@ -4019,34 +3043,32 @@ function reverseTheSentence(sentence) { } ``` -An unknown value {#an-unknown-value .mume-header} ----------------- +## An unknown value -There are a lot of programmers that will argue that `null` cannot be an -unknownvalue. \"The value is known!\" they\'ll exclaim. \"The value is -\'null\'! It\'s known!It\'s \'null\'! Stop saying it\'s not known!\" +There are a lot of programmers that will argue that `null` cannot be an unknown +value. "The value is known!" they'll exclaim. "The value is 'null'! It's known! +It's 'null'! Stop saying it's not known!" There are programmers that vehemently disagree with that. -![shrug](file:///C:\NEW_BOOTCAMP\Lambda\CIRRICULUMN\prep\images\woman-shrugging_1f937-200d-2640-fe0f.png) +![shrug](images/woman-shrugging_1f937-200d-2640-fe0f.png) -Checking if a value is null {#checking-if-a-value-is-null .mume-header} ---------------------------- +## Checking if a value is null -If you had hoped that you could use the `typeof` operator to check if a -value is`null`, then you\'re out of luck. +If you had hoped that you could use the `typeof` operator to check if a value is +`null`, then you're out of luck. -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js // Useless code. console.log(typeof null); // 'object' ``` -Silly JavaScript. Instead of using the `typeof` operator, you can just -*compare*the value to `null` because there is only one value of the Null data -type andit\'s always `null`. Take a look at the following code and figure out -what youthink it will produce. +Silly JavaScript. Instead of using the `typeof` operator, you can just _compare_ +the value to `null` because there is only one value of the Null data type and +it's always `null`. Take a look at the following code and figure out what you +think it will produce. -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js let a = []; let x = null; @@ -4057,30 +3079,28 @@ if (a === null) { } ``` -Oh, and there\'s that undefined value, too {#oh-and-theres-that-undefined-value-too .mume-header} ------------------------------------------- +## Oh, and there's that undefined value, too -Just like the `null` value that is the only value of the Null data type, -thereis `undefined` which is the only value of the Undefined data type. +Just like the `null` value that is the only value of the Null data type, there +is `undefined` which is the only value of the Undefined data type. -If you\'re asking yourself, \"Wait, if \'null\' is no value or the -absence of avalue, then what the heck does \'undefined\' mean?\", well you\'re not -the only one. +If you're asking yourself, "Wait, if 'null' is no value or the absence of a +value, then what the heck does 'undefined' mean?", well you're not the only one. Have a look at this code. -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js let value; value = 6.28; console.log(value); ``` -You probably will not be surprised to see that it will print out -\"6.28\" becausethat\'s the value of `value`. But, what if you did this? What does that -new`console.log` print? +You probably will not be surprised to see that it will print out "6.28" because +that's the value of `value`. But, what if you did this? What does that new +`console.log` print? -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js let value; console.log(value); // <- what does this print? @@ -4088,20 +3108,20 @@ value = 6.28; console.log(value); ``` -If you guessed that it prints \"undefined\", you\'re right! When you -declare avariable, it\'s very first value is `undefined`. Most of the time, -though, you\'lljust immediately set it to a value. +If you guessed that it prints "undefined", you're right! When you declare a +variable, it's very first value is `undefined`. Most of the time, though, you'll +just immediately set it to a value. -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js let value = 6.28; ``` -So, an uninitialized variable has the value `undefined` which is the -only valueof the Undefined data type. To test for it, you can use the `typeof` -operator*or* the strict equality operator. Using the strict equality operator is -themore common way to do that, now. +So, an uninitialized variable has the value `undefined` which is the only value +of the Undefined data type. To test for it, you can use the `typeof` operator +_or_ the strict equality operator. Using the strict equality operator is the +more common way to do that, now. -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js // Test if a value is undefined if (value === undefined) { // do a thing @@ -4114,13 +3134,12 @@ if (typeof value === 'undefined') { } ``` -What happens when\... {#what-happens-when .mume-header} ---------------------- +## What happens when... -Interestingly enough, all functions actually *do* return values. Have a -look atthis function. What value does it return? (Not a trick question.) +Interestingly enough, all functions actually _do_ return values. Have a look at +this function. What value does it return? (Not a trick question.) -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js function returnsTrue() { return true; } @@ -4128,90 +3147,85 @@ function returnsTrue() { Yes, it returns the value `true`. But, what about this function? -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js function returnsWhat() { return; } ``` -There\'s a `return` statement there but it does not specify a value. If -there isnot value specified, what do you think this function returns? Try -putting thefunction definition above and the code below into a code runner and -seeing whathappens. +There's a `return` statement there but it does not specify a value. If there is +not value specified, what do you think this function returns? Try putting the +function definition above and the code below into a code runner and seeing what +happens. -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js console.log(returnsWhat()); ``` -One you figure that out, try the same experiment but with this function. -Whatdo you think it returns. It doesn\'t even have a `return` statement in -it! +One you figure that out, try the same experiment but with this function. What +do you think it returns. It doesn't even have a `return` statement in it! -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js function whatIsThis() { } ``` -Remember {#what-youve-learned-12 .mume-header} --------- +## What you've learned -There is a special value in JavaScript represented as `null` which means -\"novalue\" or \"unknown value\". It is the only value of the Null data -type. You cancheck that a value is `null` by using the strict equality operator -`x === null`. +There is a special value in JavaScript represented as `null` which means "no +value" or "unknown value". It is the only value of the Null data type. You can +check that a value is `null` by using the strict equality operator `x === null`. -The value `undefined` is used by JavaScript for variables that have not -beenassigned a value. Also, functions that do not return an explicit value -returnthe value `undefined`. You can test if a value is `undefined` by using -thestrict equality operator `x === undefined`. +The value `undefined` is used by JavaScript for variables that have not been +assigned a value. Also, functions that do not return an explicit value return +the value `undefined`. You can test if a value is `undefined` by using the +strict equality operator `x === undefined`. ------------------------------------------------------------------------- +[reverse]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reverse +[split]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/split +[join]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/join -Catch Me If You Can {#catch-me-if-you-can .mume-header} -=================== +________________________________________________________________________________ +# Catch Me If You Can -Sometimes bad things happen to good programs. Some person may enter some -badlyformatted information. Another computer may try to attack your program -bysending it wonky data. A network could go down. A file can become -corrupt. Whenthis happens, your running software will have some errors. This article -is abouthow you can recover from those errors with \"structured exception -handling\". +Sometimes bad things happen to good programs. Some person may enter some badly +formatted information. Another computer may try to attack your program by +sending it wonky data. A network could go down. A file can become corrupt. When +this happens, your running software will have some errors. This article is about +how you can recover from those errors with "structured exception handling". -In this article you\'ll learn the answers to: +In this article you'll learn the answers to: -- What *is* structured exception handling? -- How can I do that in JavaScript? -- How can I make my own errors? -- What else can I do with it? -- Shouldn\'t I just always do this? +* What _is_ structured exception handling? +* How can I do that in JavaScript? +* How can I make my own errors? +* What else can I do with it? +* Shouldn't I just always do this? -Structured exception handling {#structured-exception-handling .mume-header} ------------------------------ +## Structured exception handling -Oddly enough, there are very few error-handling mechanisms in use, -today, in allprogramming languages. There are really only three ways that -programminglanguage provide structured exception handling. +Oddly enough, there are very few error-handling mechanisms in use, today, in all +programming languages. There are really only three ways that programming +language provide structured exception handling. -- **Error or error code reporting** as found in languages like C and - Go -- **Continuable exceptions** as found in Common Lisp -- **Stack unwinding** which is found in almost every modern - programming language including JavaScript and Python +* **Error or error code reporting** as found in languages like C and Go +* **Continuable exceptions** as found in Common Lisp +* **Stack unwinding** which is found in almost every modern programming + language including JavaScript and Python -In the stack-unwinding paradigm, which is the one you\'ll use in -JavaScript, whenan error occurs, the JavaScript interpreter (the thing running your -JavaScriptcode) looks for some kind of handler for that error. It has a very -specific wayof searching for those handlers. The way JavaScript searches for the -handlers isvery similar to the way it happens in Python, C++, Java, C\#, and a lot -of otherlanguages. Once you learn it, here, you will be able to handle errors -whenwriting code in all of those languages. +In the stack-unwinding paradigm, which is the one you'll use in JavaScript, when +an error occurs, the JavaScript interpreter (the thing running your JavaScript +code) looks for some kind of handler for that error. It has a very specific way +of searching for those handlers. The way JavaScript searches for the handlers is +very similar to the way it happens in Python, C++, Java, C#, and a lot of other +languages. Once you learn it, here, you will be able to handle errors when +writing code in all of those languages. -Try and catch {#try-and-catch .mume-header} -------------- +## Try and catch Say you have some code that may have an error. For example: -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js function sumArray(array) { let sum = 0; for (let i = 0; i < array.length; i += 1) { @@ -4221,21 +3235,21 @@ function sumArray(array) { } ``` -If someone calls the above function with the code `sumArray(null)`, then -theywill get the error because the `for` loop is trying to get the `length` -propertyof the `array` parameter which is `null`. +If someone calls the above function with the code `sumArray(null)`, then they +will get the error because the `for` loop is trying to get the `length` property +of the `array` parameter which is `null`. -``` {.language- data-role="codeBlock" data-info=""} +``` TypeError: Cannot read property 'length' of null ``` -To prevent this from ruining your program, you wrap code that may have -an errorin a **try block**. Now, you\'ve seen other blocks already: `if` blocks, -`for`blocks, `function` blocks. Basically, if there are curly braces around -somelines of code, that\'s a **code block** of some kind. A *try block* is -just somecurly braces with the `try` keyword. +To prevent this from ruining your program, you wrap code that may have an error +in a **try block**. Now, you've seen other blocks already: `if` blocks, `for` +blocks, `function` blocks. Basically, if there are curly braces around some +lines of code, that's a **code block** of some kind. A _try block_ is just some +curly braces with the `try` keyword. -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js // THIS IS AN INCOMPLETE BLOCK OF CODE function sumArray(array) { let sum = 0; @@ -4254,16 +3268,16 @@ function sumArray(array) { } ``` -The `try` block tells JavaScript that it needs to watch the code inside -thecurly braces for an error. Now, you have to tell JavaScript what to do -whenthere *is* an error. You do that in the `catch` block that should -immediatelyfollow the `try` block. The `catch` block accepts a single parameter -that(usually) contains an object that describes the error that occurred. In -thecase of the `sumArray` method, if an error occurs, you could return the -value`undefined` rather than letting an error terminate your program. You -could alsolog the error to the \"error\" output. +The `try` block tells JavaScript that it needs to watch the code inside the +curly braces for an error. Now, you have to tell JavaScript what to do when +there _is_ an error. You do that in the `catch` block that should immediately +follow the `try` block. The `catch` block accepts a single parameter that +(usually) contains an object that describes the error that occurred. In the +case of the `sumArray` method, if an error occurs, you could return the value +`undefined` rather than letting an error terminate your program. You could also +log the error to the "error" output. -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js function sumArray(array) { let sum = 0; @@ -4282,15 +3296,14 @@ function sumArray(array) { sumArray(null); ``` -Just to state it, again: the *catch block* runs when an error occurs in -the *tryblock*. If no error occurs in the *try block*, the *catch block* **does -notrun**. +Just to state it, again: the _catch block_ runs when an error occurs in the _try +block_. If no error occurs in the _try block_, the _catch block_ **does not +run**. -That `(e)` after the word `catch` is a variable that contains any error -that wasthrown and caught by this `try-catch` block. It doesn\'t have to be -named `e`. +That `(e)` after the word `catch` is a variable that contains any error that was +thrown and caught by this `try-catch` block. It doesn't have to be named `e`. -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js function sumArray(array) { let sum = 0; @@ -4309,30 +3322,30 @@ function sumArray(array) { sumArray(null); ``` -Here is the same code but, instead of a variable named \"e\", there is a -variablenamed \"pancakes\". Now, if an error is thrown, the variable -\"pancakes\" willcontain it. By long-standing tradition, the variables used with the -catch blockare normally \"e\", \"err\", or \"error\". +Here is the same code but, instead of a variable named "e", there is a variable +named "pancakes". Now, if an error is thrown, the variable "pancakes" will +contain it. By long-standing tradition, the variables used with the catch block +are normally "e", "err", or "error". -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js // CODE SNIPPET, WILL NOT RUN } catch (e) { ``` -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js // CODE SNIPPET, WILL NOT RUN } catch (err) { ``` -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js // CODE SNIPPET, WILL NOT RUN } catch (error) { ``` -Now, when you run the code `sumArray(null)`, you should see something -like thefollowing, if you run it in the online code editor. +Now, when you run the code `sumArray(null)`, you should see something like the +following, if you run it in the online code editor. -``` {.language- data-role="codeBlock" data-info=""} +``` TypeError: Cannot read property 'length' of null at sumArray (/tmp/file.js:5:31) at Object. (/tmp/file.js:16:1) @@ -4344,42 +3357,40 @@ TypeError: Cannot read property 'length' of null at internal/main/run_main_module.js:18:47 ``` -In that code sample, after the `sumArray(null)` call, the lines that -begins`TypeError` is the error that occurred. The next 10 lines are what is -known as a**stack trace**. You\'ll end up seeing these a lot, most likely, as you -continueyour career in software programming. This is the first line in -understandingerrors in your code. The *stack trace* shows on the first line where the -erroroccurred: `sumArray (/tmp/file.js:5:31)` means that it occurred in the`sumArray` method on line 5 of the content, at character 31. If you open -up oneof the coding problems, paste that code block in, and run it, you\'ll -see similaroutput in the output block. +In that code sample, after the `sumArray(null)` call, the lines that begins +`TypeError` is the error that occurred. The next 10 lines are what is known as a +**stack trace**. You'll end up seeing these a lot, most likely, as you continue +your career in software programming. This is the first line in understanding +errors in your code. The _stack trace_ shows on the first line where the error +occurred: `sumArray (/tmp/file.js:5:31)` means that it occurred in the +`sumArray` method on line 5 of the content, at character 31. If you open up one +of the coding problems, paste that code block in, and run it, you'll see similar +output in the output block. -The last line `undefined` is the return value of the `sumArray(null)` -invocationthat now happens when an error occurs. +The last line `undefined` is the return value of the `sumArray(null)` invocation +that now happens when an error occurs. That is how the so-called **try-catch block** works. -How can I make my own errors? {#how-can-i-make-my-own-errors .mume-header} ------------------------------ +## How can I make my own errors? -To create your own errors with structured exception handling, you first -need tocreate an error object with the message that describes the error. Then, -you needto \"throw\" the error. That code would look like either of these two -lines, theonly difference being the `new` keyword. They both work exactly the -same. +To create your own errors with structured exception handling, you first need to +create an error object with the message that describes the error. Then, you need +to "throw" the error. That code would look like either of these two lines, the +only difference being the `new` keyword. They both work exactly the same. -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js throw Error('this happened because I wanted it to'); throw new Error('this happened because I wanted it to'); ``` -What else is there? {#what-else-is-there .mume-header} -------------------- +## What else is there? -Turns out that you can have one more block on the *try-catch block*. It -is the**finally block**. The *finally block* runs whether or not an error -occurs. It*always* runs. +Turns out that you can have one more block on the _try-catch block_. It is the +**finally block**. The _finally block_ runs whether or not an error occurs. It +_always_ runs. -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js function sumArray(array) { let sum = 0; @@ -4398,24 +3409,22 @@ function sumArray(array) { } ``` -How do I best use this? {#how-do-i-best-use-this .mume-header} ------------------------ +## How do I best use this? -At this point, you may be asking yourself, \"Self, since errors can -occureverywhere, shouldn\'t I just wrap *all* of my code in these *try-catch -blocks*?\" +At this point, you may be asking yourself, "Self, since errors can occur +everywhere, shouldn't I just wrap _all_ of my code in these _try-catch blocks_?" -No. No, you shouldn\'t. +No. No, you shouldn't. -Every **try-catch block** introduces another slow-down in your code. If -you\'rewriting code that you want to run as fast as possible, then you write as -few*try-catch blocks* as possible. Also, it makes the code pretty cluttered -withall of the indentation and curly braces. When at all possible, you -should write**defensive code** which checks for bad values before errors get thrown -in yourcode. Rather than using a *try-catch block* in the `sumArray` function, -youcould defend against bad values of the `array` parameter like so. +Every **try-catch block** introduces another slow-down in your code. If you're +writing code that you want to run as fast as possible, then you write as few +_try-catch blocks_ as possible. Also, it makes the code pretty cluttered with +all of the indentation and curly braces. When at all possible, you should write +**defensive code** which checks for bad values before errors get thrown in your +code. Rather than using a _try-catch block_ in the `sumArray` function, you +could defend against bad values of the `array` parameter like so. -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js function sumArray(array) { if (array === null) { return null; @@ -4429,170 +3438,18 @@ function sumArray(array) { } ``` -Review {#review-5 .mume-header} ------- +## Review -The *try-catch-finally block* is a mechanism to handle errors in your -code. Youshould *not* wrap all of your code in these blocks because it can -seriouslydegrade the performance of your application. Instead, only wrap those -portionsof the code that you want to guard against throwing exceptions. +The _try-catch-finally block_ is a mechanism to handle errors in your code. You +should _not_ wrap all of your code in these blocks because it can seriously +degrade the performance of your application. Instead, only wrap those portions +of the code that you want to guard against throwing exceptions. -A better choice, in JavaScript and all programming languages, is to bedefensive about your programming and choose to check that the value that -youhave has the functionality that you desire by adding code like +A better choice, in JavaScript and all programming languages, is to be +defensive about your programming and choose to check that the value that you +have has the functionality that you desire by adding code like -``` {.language-javascript data-role="codeBlock" data-info="js"} +```js if (value !== undefined) {} if (value !== null) {} ``` - -- [Prep-Work](#prep-work) - - [deployment](#deploymenthttps60637489113cfe1345c7fcf9-jolly-shannon-bbcd09netlifyapp) -- [Expression Learning Objectives](#expression-learning-objectives) -- [Intro to Functions Learning - Objectives](#intro-to-functions-learning-objectives) -- [Hello World](#hello-world) - - [Getting visual feedback in your - programs](#getting-visual-feedback-in-your-programs) - - [Syntax](#syntax) - - [Code comments](#code-comments) - - [Remember](#what-youve-learned) -- [The Number Type](#the-number-type) - - [All the numbers](#all-the-numbers) - - [The basic arithmetic - operators](#the-basic-arithmetic-operators) - - [The modulo operation](#the-modulo-operation) - - [Remember](#what-youve-learned-1) -- [The String Type](#the-string-type) - - [Writing a valid string](#writing-a-valid-string) - - [Calculating length](#calculating-length) - - [Indexing a string](#indexing-a-string) - - [The classic \"off by one\" - error](#the-classic-off-by-one-error) - - [Using indexOf](#using-indexof) - - [Concatenation](#concatenation) - - [Remember](#what-youve-learned-2) -- [The Boolean Type](#the-boolean-type) - - [Logical Operators](#logical-operators) - - [Logical NOT](#logical-not) - - [Logical AND](#logical-and) - - [Logical OR](#logical-or) - - [Logical order of operations](#logical-order-of-operations) - - [De Morgan\'s Law](#de-morgans-law) - - [Remember](#what-youve-learned-3) -- [Comparison Operators](#comparison-operators) - - [The relative comparators](#the-relative-comparators) - - [=== vs ==](#vs) - - [Remember](#what-youve-learned-4) -- [Basic Variables](#basic-variables) - - [Initializing a variable](#initializing-a-variable) - - [Declaring a variable](#declaring-a-variable) - - [Assigning a variable](#assigning-a-variable) - - [Manipulating variables](#manipulating-variables) - - [Assignment Shorthand](#assignment-shorthand) - - [NaN](#nan) - - [Remember](#what-youve-learned-5) -- [Introduction to Functions](#introduction-to-functions) - - [Writing Functions](#writing-functions) - - [Function Declaration](#function-declaration) - - [Invoking or \"calling\" a - function](#invoking-or-calling-a-function) - - [Order of code](#order-of-code) - - [An average example](#an-average-example) - - [Returning a value](#returning-a-value) - - [The importance of naming](#the-importance-of-naming) - - [Review](#review) -- [Parameters and Arguments](#parameters-and-arguments) - - [The difference between Parameters and - Arguments](#the-difference-between-parameters-and-arguments) - - [Extra arguments](#extra-arguments) - - [Not enough arguments](#not-enough-arguments) - - [Review](#review-1) -- [Control Flow and Array Learning - Objectives](#control-flow-and-array-learning-objectives) -- [Control Flow - Conditional - Statements](#control-flow-conditional-statements) - - [A Quick Word on Syntax](#a-quick-word-on-syntax) - - [Writing Conditional - Statements](#writing-conditional-statements) - - [Review](#review-2) -- [Mutually Exclusive Conditions](#mutually-exclusive-conditions) - - [When to use if statements](#when-to-use-if-statements) - - [Review](#review-3) -- [Control Flow - Looping](#control-flow-looping) - - [Looping](#looping) - - [While Loops](#while-loops) - - [Important Loop Knowledge](#important-loop-knowledge) - - [For Loops](#for-loops) - - [Translating From One Loop to - Another](#translating-from-one-loop-to-another) - - [Review](#review-4) -- [The Array Type](#the-array-type) - - [Using arrays](#using-arrays) - - [Indexing arrays](#indexing-arrays) - - [Calculating the length of an - array](#calculating-the-length-of-an-array) - - [Properly indexing an array](#properly-indexing-an-array) - - [The classic \"off by one\" - error](#the-classic-off-by-one-error-1) - - [Working with arrays](#working-with-arrays) - - [Containing data in arrays](#containing-data-in-arrays) - - [Using indexOf with arrays](#using-indexof-with-arrays) - - [Concatenation with arrays](#concatenation-with-arrays) - - [Remember](#what-youve-learned-6) -- [Intermediate Functions Learning - Objectives](#intermediate-functions-learning-objectives) -- [Function Expressions](#function-expressions) - - [Functions as first-class - objects](#functions-as-first-class-objects) - - [A peek under the hood](#a-peek-under-the-hood) - - [Remember](#what-youve-learned-7) -- [Two-Dimensional Arrays (2D - Arrays)](#two-dimensional-arrays-2d-arrays) - - [Multidimensional Arrays](#multidimensional-arrays) - - [Iterating through 2D Arrays](#iterating-through-2d-arrays) - - [When is a 2D array practical?](#when-is-a-2d-array-practical) - - [Remember](#what-youve-learned-8) -- [Mutability in JavaScript](#mutability-in-javascript) - - [What is mutability?](#what-is-mutability) - - [Mutable or immutable, that is the - question](#mutable-or-immutable-that-is-the-question) - - [The mutability misconception](#the-mutability-misconception) - - [Remember](#what-youve-learned-9) -- [Array Splice](#array-splice) - - [Notation](#notation) - - [What can Array\#splice do?](#what-can-arraysplice-do) - - [Using splice to remove](#using-splice-to-remove) - - [Using splice to insert](#using-splice-to-insert) - - [Using splice like a pro](#using-splice-like-a-pro) - - [Remember](#what-youve-learned-10) -- [String\#split and Array\#join](#stringsplit-and-arrayjoin) - - [String\#split](#stringsplit) - - [Array\#join](#arrayjoin) - - [A clever combination](#a-clever-combination) - - [Remember](#what-youve-learned-11) -- [Determining Types](#determining-types) - - [The typeof operator](#the-typeof-operator) - - [How to tell if a value is an - array](#how-to-tell-if-a-value-is-an-array) - - [Practical use in \"real\" code](#practical-use-in-real-code) - - [Remember](#what-youve-seen) -- [The Null Type (And Undefined)](#the-null-type-and-undefined) - - [A type with only one value](#a-type-with-only-one-value) - - [The meaning of null](#the-meaning-of-null) - - [The absence of a value](#the-absence-of-a-value) - - [An unknown value](#an-unknown-value) - - [Checking if a value is null](#checking-if-a-value-is-null) - - [Oh, and there\'s that undefined value, - too](#oh-and-theres-that-undefined-value-too) - - [What happens when\...](#what-happens-when) - - [Remember](#what-youve-learned-12) -- [Catch Me If You Can](#catch-me-if-you-can) - - [Structured exception handling](#structured-exception-handling) - - [Try and catch](#try-and-catch) - - [How can I make my own errors?](#how-can-i-make-my-own-errors) - - [What else is there?](#what-else-is-there) - - [How do I best use this?](#how-do-i-best-use-this) - - [Review](#review-5) - -[≡]{#sidebar-toc-btn} - diff --git a/javascript-practice/-ALL-JS-Files/_COMBINED.js b/javascript-practice/-ALL-JS-Files/_COMBINED.js deleted file mode 100644 index cc58bea..0000000 --- a/javascript-practice/-ALL-JS-Files/_COMBINED.js +++ /dev/null @@ -1,3964 +0,0 @@ -let str = 'MIICWwIBAAKBgGEdLjFEFbegPZ2AwJWkalksXr7PzWL7wIc7pOFZxXwYPWtQxvANyceCwpkqbPLsfEx7nqxAris2hYOdeN1OTFqvTyNmVuzbUPcXShn6ZoDCB30voHkeu4F3cUw5RQEUDdLscSnv4HMxHam5qgl6vXoumVNHbjyKA5UtAnfjAgMBAAECgYAmjEyvpZTxRJvwjxDi1VaZevFI0Hd4WPH9PAGgqdnH84vGXnAGFj1WikqKYcqKMQW2kdjAsWwH9D9FfrkIcDDHdZ9XuGSGkFzWtOwajWMQl7qNV1hZ288gdpIQQMOTLDgauZY6pw1cV7h4v316qJB8knQGoBNpJCfTYQJBAKV1ctsJq0Zg4QumD2hyODepP3LfLeaQsERLqVAWeuOuTY5mK5gIwsSqvcSVfY7Ze1FWIsApNFRv67azKcJPwsCQQCNlyApZFJEVNY70Er7Uu5NL9t4CYJJC9uVVkoEHEY6d7sVslqa0vP2q0zXx9YedbMBvQjxXIbY0waXUy63FvoBGJAkB3OTJWUjVgzDY1Br5wu2Yu59NjKVKLWzCsu1gaCNBfhVDX7SyIyC9EYKRfUAoQxwsmPWPyQ9QVG4WKcPZJAkBRheAotPCBE2RLHHfvpiStnMhX0UXdVyaJp5tcZ6wYV61ohyBvCOkYhUxBJzeIGrVZcvLZSLeUzXoqRPpxQxAkEAkdCZXF0gHahpZgF5y0wWcqf9ECRT1E4Hv8bk3Mf0Exp2aW34JeI6I7Xqd1NV4I9H7prQ8m3y39lFwWO8PmQ'; -console.log( str.indexOf( 'HEY' ) ); -console.log( 0 ); -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `alternatingCaps` that accepts a sentence string as an argument. The function should -// return the sentence where words alternate between lowercase and uppercase. -let alternatingCaps = sentence => { - let words = sentence.split( ' ' ); - let newWords = []; - for ( let i = 0; i < words.length; i++ ) { - let word = words[ i ]; - if ( i % 2 === 0 ) { - newWords.push( word.toLowerCase() ); - } else { - newWords.push( word.toUpperCase() ); - } - } - return newWords.join( ' ' ); -}; -console.log( alternatingCaps( "take them to school" ) ); // 'take THEM to SCHOOL' -console.log( alternatingCaps( "What did ThEy EAT before?" ) ); // 'what DID they EAT before?' -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `averageOfFour(num1, num2, num3, num4)` that accepts four numbers as arguments. The -// function should return the average of all four numbers. -let averageOfFour = ( num1, num2, num3, num4 ) => { - let sum = num1 + num2 + num3 + num4; - return sum / 4; -}; -console.log( averageOfFour( 10, 4, 12, 3 ) ); // 7.25 -console.log( averageOfFour( -20, 50, 4, 21 ) ); // 13.75 -console.log( averageOfFour( 10, 4, 12, 3 ) ); // 7.25 -console.log( averageOfFour( 5, 5, 3, 7 ) ); // 5 -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `average` that accepts three numbers as arguments. The function should return the -// average of the three numbers. -let average = ( num1, num2, num3 ) => ( num1 + num2 + num3 ) / 3; -console.log( average( 3, 10, 8 ) ); // 7 -console.log( average( 10, 5, 12 ) ); // 9 -console.log( average( 6, 20, 40 ) ); // 22 -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `bleepVowels` that accepts a string as an argument. The function should return -// a new string where all vowels are replaced with `*`s. Vowels are the letters a, e, i, o, u. -let bleepVowels = str => { - let vowels = [ "a", "e", "i", "o", "u" ]; - let bleeped = ""; - for ( let char of str ) { - if ( vowels.includes( char ) ) { - bleeped += "*"; - } else { - bleeped += char; - } - } - return bleeped; -}; -console.log( bleepVowels( "skateboard" ) ); // 'sk*t*b**rd' -console.log( bleepVowels( "slipper" ) ); // 'sl*pp*r' -console.log( bleepVowels( "range" ) ); // 'r*ng*' -console.log( bleepVowels( "brisk morning" ) ); // 'br*sk m*rn*ng' -console.log( false ); // false -console.log( !true ); // false -console.log( !false ); // true -console.log( !!true ); // true -console.log( false && false ); // false -console.log( false && true ); // false -console.log( true && false ); // false -console.log( true && true ); // true -console.log( false || false ); // false -console.log( false || true ); // true -console.log( true || false ); // true -console.log( true || true ); // true -console.log( !false || false ); // true -console.log( false || ( true && true ) ); // true -console.log( false || !( true && true ) ); // false -console.log( !true && ( true ) ); // false -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `caseChange` that accepts a string and a boolean as arguments. The function should -// return the uppercase version of the string if the boolean is true. The function should return the -// lowercase version of the string if the boolean is false. -let caseChange = ( str, shouldUpperCase ) => { - if ( shouldUpperCase ) { - return str.toUpperCase(); - } else { - return str.toLowerCase(); - } -}; -console.log( caseChange( "Super", true ) ); // 'SUPER' -console.log( caseChange( "Super", false ) ); // 'super' -console.log( caseChange( "tAmBourine", true ) ); // 'TAMBOURINE' -console.log( caseChange( "tAmBourine", false ) ); // 'tambourine' -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `censorE` that accepts a string as an argument. The function should return the a new -// version of string where all characters that are 'e's are replaced with '*'s. -let censorE = str => { - let newStr = ''; - for ( let char of str ) { - if ( char === 'e' ) { - newStr += '*'; - } else { - newStr += char; - } - } - return newStr; -}; -console.log( censorE( "speedy" ) ); // 'sp**dy' -console.log( censorE( "pending" ) ); // 'p*nding' -console.log( censorE( "scene" ) ); // 'sc*n*' -console.log( censorE( "heat" ) ); // 'h*at' -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `chooseDivisibles(numbers, target)` that accepts an array of numbers and a -// target number as arguments. The function should return an array containing elements of the original -// array that are divisible by the target. -let chooseDivisibles = ( numbers, target ) => { - let divisibles = []; - for ( let num of numbers ) { - if ( num % target === 0 ) { - divisibles.push( num ); - } - } - return divisibles; -}; -console.log( chooseDivisibles( [ 40, 7, 22, 20, 24 ], 4 ) ); // [40, 20, 24] -console.log( chooseDivisibles( [ 9, 33, 8, 17 ], 3 ) ); // [9, 33] -console.log( chooseDivisibles( [ 4, 25, 1000 ], 10 ) ); // [1000] -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `commonElements` that accepts two arrays as arguments. The function should return -// a new array containing the elements that are found in both of the input arrays. The order of -// the elements in the output array doesn't matter as long as the function returns the correct elements. -let commonElements = ( array1, array2 ) => { - let common = []; - for ( let ele of array1 ) { - if ( array2.includes( ele ) ) { - common.push( ele ); - } - } - return common; -}; -let arr1 = [ "a", "c", "d", "b" ]; -let arr2 = [ "b", "a", "y" ]; -console.log( commonElements( arr1, arr2 ) ); // ['a', 'b'] -let arr3 = [ 4, 7 ]; -let arr4 = [ 32, 7, 1, 4 ]; -console.log( commonElements( arr3, arr4 ) ); // [4, 7] -console.log( true === false ); // false -console.log( false === false ); // true -console.log( false !== true ); // true -console.log( !true === false ); // true -console.log( 2 + 3 === 5 ); // true -console.log( 4 < 0 ); // false -console.log( 10 >= 10 ); // true -console.log( 10.3 >= 10 ); // true -console.log( 100 / 2 === 50 ); // true -console.log( 100 % 2 === 0 ); // true -console.log( 11 % 2 === 0 ); // false -console.log( 7.0 === 7 ); // true -console.log( 13 % 5 > 0 ); // true -console.log( "potato" === "potato" ); // true -console.log( "Tomato" === "tomato" ); // false -console.log( "42" === 42 ); // false -console.log( 5 > 3 && 1 === 0 ); // false -t -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `contains(str1, str2)` that accepts two strings as arguments. The function should -// return a boolean indicating whether or not `str2` is contained within `str1`. The function should -// ignore any differences in capitalization. -let contains = ( str1, str2 ) => { - let lowerStr1 = str1.toLowerCase(); - let lowerStr2 = str2.toLowerCase(); - return lowerStr1.includes( lowerStr2 ); -}; -console.log( contains( "caterpillar", "pill" ) ); // true -console.log( contains( "lion's share", "on" ) ); // true -console.log( contains( "SORRY", "or" ) ); // true -console.log( contains( "tangent", "gem" ) ); // false -console.log( contains( "clock", "ok" ) ); // false -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `countUp(max)` that accepts a max number as an argument. The function should print -// all numbers from 1 up to and including the max. The function doesn't need to return any value. It -// should just print to the terminal. -let countUp = max => { - for ( let i = 1; i <= max; i++ ) { - console.log( i ); - } -}; -countUp( 5 ); -// prints -// 1 -// 2 -// 3 -// 4 -// 5 -countUp( 3 ); -// prints -// 1 -// 2 -// 3 -let phrase = "that's all folks"; -console.log( phrase[ phrase.length ] ); // undefined -console.log( phrase[ phrase.length - 1 ] ); // s -console.log( phrase[ phrase.length - 2 ] ); // k -const i = 9; -const char = phrase[ i ]; -console.log( char ); // l -console.log( phrase.indexOf( char ) ); // 8 -console.log( phrase.slice( 2, 8 ) ); // at's a -console.log( "abcdefg".slice( 1, 3 ) ); // bc -console.log( "abcdefg".slice( 2 ) ); // cdefg -console.log( "abcdefg".slice( 4 ) ); // efg -console.log( "abcdefg".slice( 2, -1 ) ); // cdef -console.log( "abcdefg".slice( 2, -2 ) ); // cde -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function named `divByEither(num1, num2, max)` that accepts three numbers as arguments. -// The function should print out all positive numbers less than max that are divisible by num1 or num2. -// The function doesn't need to return any value. It should just print to the terminal. -let divByEither = ( num1, num2, max ) => { - for ( let i = 1; i < max; i++ ) { - if ( i % num1 === 0 || i % num2 === 0 ) { - console.log( i ); - } - } -}; -divByEither( 4, 3, 16 ); -// prints -// 3 -// 4 -// 6 -// 8 -// 9 -// 12 -// 15 -divByEither( 7, 5, 20 ); -// prints -// 5 -// 7 -// 10 -// 14 -// 15 -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `divisibleRange(min, max, num)` that accepts three numbers as arguments. The -// function should print all numbers between `min` and `max` (exclusive) that are also divisible by -// num. -let divisibleRange = ( min, max, num ) => { - for ( let i = min + 1; i < max; i++ ) { - if ( i % num === 0 ) { - console.log( i ); - } - } -}; -divisibleRange( 17, 40, 9 ); -// prints -// 18 -// 27 -// 36 -divisibleRange( 10, 24, 4 ); -// prints -// 12 -// 16 -// 20 -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `divisible(num1, num2)` that accepts two numbers as arguments. The function should -// return a boolean indicating whether or not `num1` is divisible by `num2`. -let divisible = ( num1, num2 ) => num1 % num2 === 0; -// let divisible = function (num1, num2) { -// if (num1 % num2 === 0) { -// return true; -// } else { -// return false; -// } -// }; -console.log( divisible( 12, 3 ) ); // true -console.log( divisible( 12, 5 ) ); // false -console.log( divisible( 60, 4 ) ); // true -console.log( divisible( 60, 11 ) ); // false -console.log( divisible( 21, 7 ) ); // true -console.log( divisible( 21, 6 ) ); // false -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `divisors` that accepts a number as an argument. The function should return an -// array containing all positive numbers that can divide into the argument. -let divisors = n => { - let numbers = []; - for ( let i = 1; i <= n; i++ ) { - if ( n % i === 0 ) { - numbers.push( i ); - } - } - return numbers; -}; -console.log( divisors( 15 ) ); // [1, 3, 5, 15] -console.log( divisors( 7 ) ); // [1, 7] -console.log( divisors( 24 ) ); // [1, 2, 3, 4, 6, 8, 12, 24] -g -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `endsInLy` that accepts a string as an argument and returns a boolean indicating -// whether or not the string ends in the substring 'ly'. -let endsInLy = str => { - let secondLast = str[ str.length - 2 ]; - let last = str[ str.length - 1 ]; - return secondLast === 'l' && last === 'y'; -}; -// let endsInLy = function (str) { -// return str.endsWith('ly'); -// }; -console.log( endsInLy( "pretty" ) ); // false -console.log( endsInLy( "instant" ) ); // false -console.log( endsInLy( "analytic" ) ); // false -console.log( endsInLy( "timidly" ) ); // true -console.log( endsInLy( "fly" ) ); // true -console.log( endsInLy( "gallantly" ) ); // true -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `endsWithT` that accepts a string as an argument. The function should return a -// boolean indicating whether or not the string ends with the character 't'. -let endsWithT = str => { - let lastChar = str[ str.length - 1 ]; - return lastChar === 't'; -}; -console.log( endsWithT( "smart" ) ); // true -console.log( endsWithT( "racket" ) ); // true -console.log( endsWithT( "taco" ) ); // false -console.log( endsWithT( "boomerang" ) ); // false -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `evens(max)` that accepts a max number as an argument. The function should print -// all positive even numbers that are less than the max. -let evens = max => { - for ( let i = 1; i < max; i++ ) { - if ( i % 2 === 0 ) { - console.log( i ); - } - } -}; -evens( 11 ); -// prints -// 2 -// 4 -// 6 -// 8 -// 10 -evens( 8 ); -// prints -// 2 -// 4 -// 6 -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `filterLongWords` that accepts an array of strings as an argument. The function -// should return a new array containing only the strings that are less than 5 characters long. -let filterLongWords = words => { - let chosenWords = []; - for ( let word of words ) { - if ( word.length < 5 ) { - chosenWords.push( word ); - } - } - return chosenWords; -}; -console.log( filterLongWords( [ "kale", "cat", "retro", "axe", "heirloom" ] ) ); -// ['kale', 'cat', 'axe'] -console.log( filterLongWords( [ "disrupt", "pour", "trade", "pic" ] ) ); -// ['pour', 'pic'] -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function named `fiveMultiplesOf` that accepts a number as an argument. The function should -// print out the first five multiples of the given number. The function doesn't need to return any -// value. It should just print to the terminal. -let fiveMultiplesOf = num => { - for ( let i = 1; i <= 5; i++ ) { - console.log( i * num ); - } -}; -fiveMultiplesOf( 7 ); -// prints -// 7 -// 14 -// 21 -// 28 -// 35 -fiveMultiplesOf( 3 ); -// prints -// 3 -// 6 -// 9 -// 12 -// 15 -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `fizzBuzz` that accepts a max number as an argument. The function should -// print all numbers less than or equal to max that are divisible by either 3 or 5 but not both 3 -// and 5. The function doesn't need to return any value. It should just print to the terminal. -let fizzBuzz = max => { - for ( let i = 1; i <= max; i++ ) { - if ( ( i % 3 === 0 || i % 5 === 0 ) && !( i % 3 === 0 && i % 5 === 0 ) ) { - console.log( i ); - } - } -}; -fizzBuzz( 18 ); -// prints -// 3 -// 5 -// 6 -// 9 -// 10 -// 12 -// 18 -fizzBuzz( 33 ); -// prints -// 3 -// 5 -// 6 -// 9 -// 10 -// 12 -// 18 -// 20 -// 21 -// 24 -// 25 -// 27 -// 33 -let movie = 'Fight Club'; -let views = 4; -console.log( `I watched ${ movie } about ${ views } number of times` ); -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `funnySound` that accepts two strings as arguments. The function should return a -// new string containing the first three characters of both strings concatenated together. -// You can assume that the arguments are both at least three characters long. -let funnySound = ( str1, str2 ) => str1.slice( 0, 3 ) + str2.slice( 0, 3 ); -console.log( funnySound( "tiger", "spoon" ) ); // 'tigspo' -console.log( funnySound( "computer", "phone" ) ); // 'compho' -console.log( funnySound( "skate", "bottle" ) ); // 'skabot' -console.log( funnySound( "frog", "ashtray" ) ); // 'froash' -console.log( 'hello world' ); -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `half` that accepts a number as an argument. The function should return half of the -// number. -let half = n => n / 2; -console.log( half( 8 ) ); // 4 -console.log( half( 15 ) ); // 7.5 -console.log( half( 90 ) ); // 45 -gi -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `inRange(min, max, n)` that accepts three numbers as arguments. The function should -// return a boolean indicating if `n` is between `min` and `max` inclusive. -let inRange = ( min, max, n ) => n >= min && n <= max; -console.log( inRange( 5, 13, 8 ) ); // true -console.log( inRange( 5, 13, 29 ) ); // false -console.log( inRange( 100, 125, 100 ) ); // true -console.log( inRange( 100, 125, 99 ) ); // false -console.log( inRange( 40, 45, 44 ) ); // true -console.log( inRange( 40, 45, 45 ) ); // true -console.log( inRange( 40, 45, 46 ) ); // false -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `isDivBy4` that accepts a number as an argument. The function should return a -// boolean indicating whether or not the number is divisible by 4. -let isDivBy4 = num => { - if ( num % 4 === 0 ) { - return true; - } else { - return false; - } -}; -// let isDivBy4 = function (num) { -// return num % 4 === 0; -// }; -console.log( isDivBy4( 8 ) ); // true -console.log( isDivBy4( 12 ) ); // true -console.log( isDivBy4( 24 ) ); // true -console.log( isDivBy4( 9 ) ); // false -console.log( isDivBy4( 10 ) ); // false -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `isLong` that accepts a string as an argument. The function should return a boolean -// indicating whether or not the string is longer than 5 characters -let isLong = ( { - length -} ) => length > 5; -// let isLong = function (str) { -// if (str.length > 5) { -// return true; -// } else { -// return false; -// } -// }; -console.log( isLong( "pie" ) ); // false -console.log( isLong( "kite" ) ); // false -console.log( isLong( "kitty" ) ); // false -console.log( isLong( "telescope" ) ); // true -console.log( isLong( "thermometer" ) ); // true -console.log( isLong( "restaurant" ) ); // true -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `keepItQuiet` that accepts a string as an argument. The function should return the -// lowercase version of the string with 3 periods added to the end of it. -let keepItQuiet = str => `${ str.toLowerCase() }...`; -console.log( keepItQuiet( "HOORAY" ) ); // 'hooray...' -console.log( keepItQuiet( "Doggo" ) ); // 'doggo...' -console.log( keepItQuiet( "WHAT?!?!" ) ); // 'what?!?!...' -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `larger` that accepts two numbers as arguments. The function should return the -// larger number. -let larger = ( num1, num2 ) => { - if ( num1 > num2 ) { - return num1; - } else { - return num2; - } -}; -console.log( larger( 256, 400 ) ); // 400 -console.log( larger( 31, 4 ) ); // 31 -console.log( larger( -6, 7 ) ); // 7 -console.log( larger( 11.3, 11.2 ) ); // 11.3 -console.log( larger( -10, -3 ) ); // -3 -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `lengthiestWord` that accepts a sentence string as an argument. The function should -// return the longest word of the sentence. If there is a tie, return the word that appears later -// in the sentence. -let lengthiestWord = sentence => { - let words = sentence.split( ' ' ); - let longest = words[ 0 ]; // pretty - for ( let i = 1; i < words.length; i++ ) { - let word = words[ i ]; - if ( word.length >= longest.length ) { - longest = word; - } - } - return longest; -}; -console.log( lengthiestWord( "I am pretty hungry" ) ); // 'hungry' -console.log( lengthiestWord( "we should think outside of the box" ) ); // 'outside' -console.log( lengthiestWord( "down the rabbit hole" ) ); // 'rabbit' -console.log( lengthiestWord( "simmer down" ) ); // 'simmer' -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `longer` that accepts two strings as arguments. The function should return the -// string that is longer. If the strings have the same length, then return the first string. -let longer = ( str1, str2 ) => { - if ( str1.length >= str2.length ) { - return str1; - } else { - return str2; - } -}; -console.log( longer( "drum", "piranha" ) ); // 'piranha' -console.log( longer( "basket", "fork" ) ); // 'basket' -console.log( longer( "flannel", "sustainable" ) ); // 'sustainable' -console.log( longer( "disrupt", "ability" ) ); // 'disrupt' -console.log( longer( "bird", "shoe" ) ); // 'bird' -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `makeAcronym` that accepts a sentence string as an argument. The function should -// return a string containing the first character of each word in the sentence. -let makeAcronym = sentence => { - let words = sentence.split( ' ' ); - let acronym = ''; - for ( let word of words ) { - acronym += word[ 0 ]; - } - return acronym.toUpperCase(); -}; -console.log( makeAcronym( "New York" ) ); // NY -console.log( makeAcronym( "same stuff different day" ) ); // SSDD -console.log( makeAcronym( "Laugh out loud" ) ); // LOL -console.log( makeAcronym( "don't over think stuff" ) ); // DOTS -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `makeMatrix(m, n, value)` that accepts three arguments. The function should return -// a 2-dimensional array of height `m` and width `n` that contains the `value` as every element. -let makeMatrix = ( m, n, value ) => { - let matrix = []; - for ( let i = 0; i < m; i++ ) { - let row = []; - for ( let j = 0; j < n; j++ ) { - row.push( value ); - } - matrix.push( row ); - } - return matrix; -}; -console.log( makeMatrix( 3, 5, null ) ); -// [ -// [ null, null, null, null, null ], -// [ null, null, null, null, null ], -// [ null, null, null, null, null ] -// ] -console.log( makeMatrix( 4, 2, "x" ) ); -// [ -// [ 'x', 'x' ], -// [ 'x', 'x' ], -// [ 'x', 'x' ], -// [ 'x', 'x' ] -// ] -console.log( makeMatrix( 2, 2, 0 ) ); -// [ -// [ 0, 0 ], -// [ 0, 0 ] -// ] -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `maximum` that accepts an array of numbers as an argument. The function should -// return the largest number of the array. If the array is empty, then the function should return null. -let maximum = numbers => { - if ( numbers.length === 0 ) { - return null; - } - let currentMax = numbers[ 0 ]; - for ( let i = 1; i < numbers.length; i++ ) { - if ( numbers[ i ] > currentMax ) { - currentMax = numbers[ i ]; - } - } - return currentMax; -}; -console.log( maximum( [ 5, 6, 3, 7 ] ) ); // 7 -console.log( maximum( [ 17, 15, 19, 11, 2 ] ) ); // 19 -console.log( maximum( [] ) ); // null -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `minToMax(min, max)` that accepts two numbers as arguments. The function should -// print all numbers from min to max inclusive. The function doesn't need to return any value. It -// should just print to the terminal. -let minToMax = ( min, max ) => { - for ( let i = min; i <= max; i++ ) { - console.log( i ); - } -}; -minToMax( 5, 9 ); -// prints -// 5 -// 6 -// 7 -// 8 -// 9 -minToMax( 11, 13 ); -// prints -// 11 -// 12 -// 13 -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function named `noOhs` that accepts a string as an argument. The functions should print the -// characters of the string one by one except the character 'o'. The function doesn't need to return -// any value. It should just print to the terminal. -let noOhs = str => { - for ( let char of str ) { - if ( char !== 'o' ) { - console.log( char ); - } - } -}; -noOhs( "code" ); -// prints -// c -// d -// e -noOhs( "school" ); -// prints -// s -// c -// h -// l -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `numOdds` that accepts an array of numbers as an argument. The function should -// return a number representing the count of odd elements in the array. - -let numOdds = function ( numbers ) { - let count = 0; - - for ( let i = 0; i < numbers.length; i++ ) { - if ( numbers[ i ] % 2 === 1 ) { - count += 1; - } - } - - return count; -}; - -console.log( numOdds( [ 4, 7, 2, 5, 9 ] ) ); // 3 -console.log( numOdds( [ 11, 31, 58, 99, 21, 60 ] ) ); // 4 -console.log( numOdds( [ 100, 40, 4 ] ) ); // 0 - -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `numberChange` that accepts a number as an argument. The function should return -// half the number if it is even. The function should return double the number if it is odd. -let numberChange = n => { - if ( n % 2 === 0 ) { - return n / 2; - } else { - return n * 2; - } -}; -console.log( numberChange( 6 ) ); // 3 -console.log( numberChange( 7 ) ); // 14 -console.log( numberChange( 16 ) ); // 8 -console.log( numberChange( 21 ) ); // 42 -console.log( 2 + 3 ); // 5 -console.log( 10 - 15 ); // -5 -console.log( 4 + 1 - 5 ); // 0 -console.log( 4 * 3 ); // 12 -console.log( 7 / 2 ); // 3.5 -console.log( 4 + 2 * 3 ); // 10 -console.log( ( 4 + 2 ) * 3 ); // 18 -console.log( 5 % 2 ); // 1 -console.log( 6 % 2 ); // 0 -console.log( 7 % 2 ); // 1 -console.log( 8 % 2 ); // 0 -console.log( 19 % 8 ); // 3 -console.log( 24 % 8 ); // 0 -console.log( 7 % 4 ); // 3 -console.log( 4 % 7 ); // 4 -console.log( 5 + ( 10 % 5 ) ); // 5 -console.log( ( 5 + 10 ) % 5 ); // 0 -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `numberRange(min, max, step)` that accepts three numbers as arguments, `min`, -// `max`, and `step`. The function should return all numbers between `min` and `max` at `step` intervals. -// `min` and `max` are inclusive. -let numberRange = ( min, max, step ) => { - let range = []; - for ( let i = min; i <= max; i += step ) { - range.push( i ); - } - return range; -}; -console.log( numberRange( 10, 40, 5 ) ); // [10, 15, 20, 25, 30, 35, 40] -console.log( numberRange( 14, 24, 3 ) ); // [14, 17, 20, 23] -console.log( numberRange( 8, 35, 6 ) ); // [8, 14, 20, 26, 32] -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function named `oddSum(max)` that accepts a max number as an argument. The function should -// return the total sum of all odd numbers from 1 to the max, inclusive. -// -// For example, oddSum(10) should return 25 because 1 + 3 + 5 + 7 + 9 = 25 -let oddSum = max => { - let sum = 0; - for ( let i = 1; i <= max; i++ ) { - if ( i % 2 === 1 ) { - sum += i; - } - } - return sum; -}; -console.log( oddSum( 10 ) ); // 25 -console.log( oddSum( 5 ) ); // 9 -let word = "bye"; -console.log( `${ word } felicia` ); // 'bye felicia' -console.log( word ); // 'bye' -let num = 10; -num = num * 2; -console.log( num ); // 20 -let bottlesOfBeer = 99; -let around = bottlesOfBeer - 1; -console.log( around ); // 98 -console.log( bottlesOfBeer ); // 99 -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `oneOrNone` that accepts two booleans as arguments. The function should return true -// if exactly one of the arguments is true. If BOTH arguments are true, then it should return false. -let oneOrNone = ( val1, val2 ) => { - if ( ( val1 || val2 ) && !( val1 && val2 ) ) { - return true; - } else { - return false; - } -}; -console.log( oneOrNone( false, false ) ); // false -console.log( oneOrNone( true, false ) ); // true -console.log( oneOrNone( false, true ) ); // true -console.log( oneOrNone( true, true ) ); // false -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `oneToFour` that prints all whole numbers from one to four, inclusive. The function -// takes in no arguments and doesn't need to return any value. It should just print to the terminal. -let oneToFour = () => { - for ( let i = 1; i <= 4; i++ ) { - console.log( i ); - } -}; -oneToFour(); -// prints -// 1 -// 2 -// 3 -// 4 -// snippet 1-0 -let qty = 38; -if ( qty > 30 && qty % 5 === 4 ) { - console.log( "swish" ); -} else { - console.log( "swoosh" ); // prints -} -if ( qty > 0 ) { - console.log( "pos" ); // prints -} -// snippet 1-1 -let a = "celery"; -let b = "SQUASH"; -if ( a === a.toUpperCase() ) { - console.log( "alpha" ); -} -if ( b === b.toUpperCase() ) { - console.log( "beta" ); // prints -} -// snippet 1-2 -let number = 9; -if ( number > 4 ) { - console.log( "ding" ); // prints -} else if ( number % 3 === 0 ) { - console.log( "dong" ); -} -// snippet 1-3 -let z = 12; -if ( z > 10 ) { - console.log( "vroom" ); // prints -} -if ( z % 3 === 0 ) { - console.log( "skrrt" ); // prints -} -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `pairPrint` that accepts an array as an argument. The function should print -// all unique pairs of elements in the array. The function doesn't need to return any value. It -// should just print to the terminal. - -let pairPrint = function ( array ) { - for ( let i = 0; i < array.length; i++ ) { - for ( let j = i + 1; j < array.length; j++ ) { - console.log( array[ i ] + ' - ' + array[ j ] ); - } - } -}; - -pairPrint( [ "artichoke", "broccoli", "carrot", "daikon" ] ); -// prints -// artichoke - broccoli -// artichoke - carrot -// artichoke - daikon -// broccoli - carrot -// broccoli - daikon -// carrot - daikon - -pairPrint( [ "apple", "banana", "clementine" ] ); -// prints -// apple - banana -// apple - clementine -// banana - clementine - -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `parity` that accepts a number as an argument. The function should return the -// string 'even' if the number is even. It should return the string 'odd' if the number is odd. -let parity = function ( num ) { - if ( num % 2 === 0 ) { - return 'even'; - } else { - return 'odd'; - } -}; -console.log( parity( 5 ) ); // 'odd' -console.log( parity( 7 ) ); // 'odd' -console.log( parity( 13 ) ); // 'odd' -console.log( parity( 32 ) ); // 'even' -console.log( parity( 10 ) ); // 'even' -console.log( parity( 602348 ) ); // 'even' -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `print2d` that accepts a two-dimensional array as an argument. The function -// should print all inner elements of the array. - -let print2d = function ( array ) { - for ( let i = 0; i < array.length; i++ ) { - let subarray = array[ i ]; - for ( let j = 0; j < subarray.length; j++ ) { - console.log( subarray[ j ] ); - } - } -}; - - -let array1 = [ - [ "a", "b", "c", "d" ], - [ "e", "f" ], - [ "g", "h", "i" ], -]; -print2d( array1 ); -// prints -// a -// b -// c -// d -// e -// f -// g -// h -// i - -let array2 = [ - [ 9, 3, 4 ], - [ 11 ], - [ 42, 100 ] -]; -print2d( array2 ); -// prints -// 9 -// 3 -// 4 -// 11 -// 42 -// 100 - -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -/// Write a function `printCombinations`that accepts two arrays as arguments. The function should -// print all combinations of the elements generated by taking an element from the first array and -// and an element from the second array. The function doesn't need to return any value. It -// should just print to the terminal. - - -let printCombinations = function ( array1, array2 ) { - for ( let i = 0; i < array1.length; i++ ) { - let ele1 = array1[ i ]; - - for ( let j = 0; j < array2.length; j++ ) { - let ele2 = array2[ j ]; - console.log( ele1, ele2 ); - } - } -}; - -let colors = [ "gray", "cream", "cyan" ]; -let clothes = [ "shirt", "flannel" ]; -printCombinations( colors, clothes ); -// prints -// gray shirt -// gray flannel -// cream shirt -// cream flannel -// cyan shirt -// cyan flannel - -printCombinations( [ "hot", "cold" ], [ "soup", "tea" ] ); -// prints -// hot soup -// hot tea -// cold soup -// cold tea - -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function named `productUpTo(max)` that accepts a max number as an argument. The function -// should return the total product of all whole numbers from 1 to the max, inclusive. A product is a -// number obtained from multiplying numbers together. -// -// For example, productUpTo(4) should return 24 because 1 * 2 * 3 * 4 = 24 -let productUpTo = function ( max ) { - let product = 1; - for ( let i = 1; i <= max; i++ ) { - product *= i; - } - return product; -}; -console.log( productUpTo( 4 ) ); // 24 -console.log( productUpTo( 5 ) ); // 120 -console.log( productUpTo( 7 ) ); // 5040 -let word = "suspension bridge"; -console.log( word[ 4 ] ); // e -console.log( word.length > 5 && word[ 0 ] === "d" ); // false -console.log( word.length > 5 && word[ 0 ] === "s" ); // true -console.log( word.indexOf( "o" ) > -1 ); // true -console.log( word.indexOf( "z" ) > -1 ); // false -let str = "foggy"; -console.log( str[ 2 + 1 ] ); // g -console.log( str[ str.length - 1 ] ); // y -str = " day"; -console.log( str ); // ' day' -console.log( str.length ); // 4 -console.log( str.indexOf( "ogg" ) ); // -1 -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `raisePower(base, exponent)` that accepts two numbers, `base` and `exponent`. The -// function should return `base` raised to the `exponent` power. -// -// For example, raisePower(2, 5) should return 32 because 2 * 2 * 2 * 2 * 2 = 32 -// For example, raisePower(4, 3) should return 64 because 4 * 4 * 4 = 64 -let raisePower = function ( base, exponent ) { - let product = 1; - for ( let i = 1; i <= exponent; i++ ) { - product *= base; - } - return product; -}; -console.log( raisePower( 2, 5 ) ); // 32 -console.log( raisePower( 4, 3 ) ); // 64 -console.log( raisePower( 10, 4 ) ); // 10000 -console.log( raisePower( 7, 2 ) ); // 49 -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `removeCapitals` that accepts a string as an argument. The function should return a -// new version of the string with all capital letters removed. - -let removeCapitals = function ( str ) { - let newStr = ''; - - for ( let i = 0; i < str.length; i++ ) { - let char = str[ i ]; - if ( char === char.toLowerCase() ) { - newStr += char; - } - } - - return newStr; -}; - -console.log( removeCapitals( "fOrEver" ) ); // 'frver' -console.log( removeCapitals( "raiNCoat" ) ); // 'raioat' -console.log( removeCapitals( "cElLAr Door" ) ); // 'clr oor' - -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `removeDupes` that accepts an array as an argument. The function should return a -// new array where each element only appears once. - -let removeDupes = function ( array ) { - let uniques = []; - - for ( let i = 0; i < array.length; i++ ) { - let ele = array[ i ]; - if ( !uniques.includes( ele ) ) { - uniques.push( ele ); - } - } - - return uniques; -}; - -console.log( removeDupes( [ "x", "y", "y", "x", "z" ] ) ); // ['x', 'y', 'z'] -console.log( removeDupes( [ false, false, true, false ] ) ); // [false, true] -console.log( removeDupes( [ 42, 5, 7, 42, 7, 3, 7, 7 ] ) ); // [42, 5, 7, 3] - - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `removeFirstVowel` that accepts a string as an argument. The function should return - // the string with it's first vowel removed. - let removeFirstVowel = function ( str ) { - let vowels = 'aeiou'; - for ( let i = 0; i < str.length; { - let char = str[ i ]; - if ( vowels.includes( char ) ) { - return str.slice( 0, i ) + str.slice( i + 1 ); - } - } - return str; - }; - console.log( removeFirstVowel( "volcano" ) ); // 'vlcano' - console.log( removeFirstVowel( "celery" ) ); // 'clery' - console.log( removeFirstVowel( "juice" ) ); // 'jice' - console.log( removeFirstVowel( "bridge" ) ); // 'brdge' - console.log( removeFirstVowel( "try" ) ); // 'try' - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `removeShortWords` that accepts a sentence string as an argument. The function - // should return a new sentence where all of the words shorter than 4 characters are removed. - let removeShortWords = function ( sentence ) { - let words = sentence.split( ' ' ); - let chosenWords = []; - for ( let i = 0; i < words.length; { - let word = words[ i ]; - if ( word.length >= 4 ) { - chosenWords.push( word ); - } - } - return chosenWords.join( ' ' ); - }; - console.log( removeShortWords( "knock on the door will you" ) ); // 'knock door will' - console.log( removeShortWords( "a terrible plan" ) ); // 'terrible plan' - console.log( removeShortWords( "run faster that way" ) ); // 'faster that' - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `removeVowels` that accepts a string as an argument. The function should return - // a version of the string where all vowels are removed. - let removeVowels = function ( str ) { - let newStr = ''; - let vowels = 'aeiou'; - for ( let i = 0; i < str.length; { - let char = str[ i ]; - if ( !vowels.includes( char ) ) { - newStr += char; - } - } - return newStr; - }; - console.log( removeVowels( "jello" ) ); // jll - console.log( removeVowels( "sensitivity" ) ); // snstvty - console.log( removeVowels( "cellar door" ) ); // cllr dr - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `reverseArray` that accepts an array as an argument. The function should return a - // array containing the elements of the original array in reverse order. - let reverseArray1 = function ( array ) { - let reversed = []; - for ( let i = array.length - 1; i >= 0; i-- ) { - reversed.push( array[ i ] ); - } - return reversed; - }; - console.log( reverseArray1( [ "zero", "one", "two", "three" ] ) ); // ['three', 'two', 'one', 'zero'] - console.log( reverseArray1( [ 7, 1, 8 ] ) ); // [8, 1, 7] - let reverseArray2 = function ( array ) { - let reversed = []; - for ( let i = 0; i < array.length; { - reversed.unshift( array[ i ] ); - } - return reversed; - }; - console.log( reverseArray2( [ "zero", "one", "two", "three" ] ) ); // ['three', 'two', 'one', 'zero'] - console.log( reverseArray2( [ 7, 1, 8 ] ) ); // [8, 1, 7] - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `reverseIterate` that accepts a string as an argument. The function should print - // the characters of the string one by one, in reverse order. The function doesn't need to return any - // value. It should just print to the terminal. - let reverseIterate = function ( str ) { - for ( let i = str.length - 1; i >= 0; i-- ) { - console.log( str[ i ] ); - } - }; - reverseIterate( "carrot" ); - // prints - // t - // o - // r - // r - // a - // c - reverseIterate( "box" ); - // prints - // x - // o - // b - - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `shortenLongWords` that accepts a sentence string as an argument. The function - // should return the same sentence where words longer than 4 characters have their vowels removed. - let removeVowels = function ( str ) { - let newStr = ''; - let vowels = 'aeiou'; - for ( let i = 0; i < str.length; { - let char = str[ i ]; - if ( !vowels.includes( char ) ) { - newStr += char; - } - } - return newStr; - }; - let shortenLongWords = function ( sentence ) { - let words = sentence.split( ' ' ); - let newWords = []; - for ( let i = 0; i < words.length; { - let word = words[ i ]; - if ( word.length > 4 ) { - let noVowels = removeVowels( word ); - newWords.push( noVowels ); - } else { - // leave it the same - newWords.push( word ); - } - } - return newWords.join( ' ' ); - }; - console.log( shortenLongWords( "they are very noble people" ) ); // 'they are very nbl ppl' - console.log( shortenLongWords( "stick with it" ) ); // 'stck with it' - console.log( shortenLongWords( "ballerina, you must have seen her" ) ); // 'bllrna, you must have seen her - console.log( "promenade" [ 3 ] ); // m - console.log( "tiger" [ 1 ] ); // i - console.log( "wheel".length ); // 5 - console.log( "wheel".length - 1 ); // 4 - console.log( "noMAD".toUpperCase() ); // NOMAD - console.log( "hey programmers" [ 2 ] === "y" ); // true - console.log( "volleyball".length > 20 ); // false - console.log( "treasure".indexOf( "r" ) ); // 1 - console.log( "treasure".indexOf( "e" ) ); // 2 - console.log( "web" [ 5 ] ); // undefined - console.log( "red".indexOf( "x" ) ); // -1 - console.log( "red".indexOf( "R" ) ); // -1 - // snippet 0-1 - let greet = function () { - console.log( "hey" ); - console.log( "programmers" ); - }; - let whistle = function () { - console.log( "doot" ); - }; - console.log( "first" ); - console.log( "second" ); - greet(); - console.log( "third" ); - console.log( "fourth" ); - whistle(); - // first - // second - // hey - // programmers - // third - // fourth - // doot - // snippet 0-2 - let howMany = function () { - return 42; - }; - console.log( howMany ); - console.log( howMany() ); - const theAnswer = howMany(); - console.log( theAnswer ); - let howMuch = function () { - 5; - }; - console.log( howMuch() ); - // [Function: howMany] - // 42 - // 42 - // undefined - // snippet 0-3 - let average = function ( num1, num2 ) { - console.log( "calculating..." ); - return ( num1 + num2 ) / 2; - }; - console.log( average( 5, 10 ) ); - console.log( average( 20, 26 ) ); - console.log( average( 50, 100 ) + 2 ); - let a = 21 + 3; - let b = 20; - let n = average( a, b ); - console.log( average( n, 18 ) ); - // calculating... - // 7.5 - // calculating... - // 23 - // calculating... - // 77 - // calculating... - // calculating... - // 20 - // snippet 0-4 - let exclaim = function ( str ) { - let capitalized = str.toUpperCase(); - return capitalized + "!!"; - }; - let result = exclaim( "potato" ); - console.log( result ); - console.log( result.length ); - console.log( result[ 0 ] ); - console.log( result[ result.length - 1 ] ); - // POTATO!! - // 8 - // P - // ! - // snippet 1 - console.log( "hello" ); - for ( let i = 0; i < 5; i++ ) { - console.log( "code" ); - } - console.log( "goodbye" ); - hello - code - code - code - code - code - goodbye - // snippet 1 - for ( let i = 1; i <= 4; i++ ) { - for ( let j = 1; j <= 3; j++ ) { - console.log( i, j ); - } - } - // 1 1 - // 1 2 - // 1 3 - // 2 1 - // 2 2 - // 2 3 - // 3 1 - // 3 2 - // 3 3 - // 4 1 - // 4 2 - // 4 3 - // snippet 2 - console.log( "hi" ); - for ( let i = 3; i <= 7; i++ ) { - console.log( "program" ); - console.log( i ); - } - console.log( "bye" ); - // hi - // program - // 3 - // program - // 4 - // program - // 5 - // program - // 6 - // program - // 7 - // bye - // snippet 2 - for ( let n = 0; n < 2; n++ ) { - console.log( "n=" + n ); - for ( let m = 0; m < 5; m++ ) { - console.log( " m=" + m ); - } - console.log( "n=" + n ); - } - // n=0 - // m=0 - // m=1 - // m=2 - // m=3 - // m=4 - // n=0 - // n=1 - // m=0 - // m=1 - // m=2 - // m=3 - // m=4 - // n=1 - // snippet 3 - let foo = function () { - for ( let num = 10; num > 0; num -= 2 ) { - console.log( num ); - } - }; - console.log( "begin" ); - foo(); - console.log( "end" ); - foo(); - // begin - // 10 - // 8 - // 6 - // 4 - // 2 - // end - // 10 - // 8 - // 6 - // 4 - // 2 - // snippet 3 - let friends = [ "philip", "abby", "phelipe", "simcha" ]; - for ( let i = 0; i < friends.length; { - for ( let j = 0; j < friends.length; { - console.log( friends[ i ], friends[ j ] ); - } - } - // philip philip - // philip abby - // philip phelipe - // philip simcha - // abby philip - // abby abby - // abby phelipe - // abby simcha - // phelipe philip - // phelipe abby - // phelipe phelipe - // phelipe simcha - // simcha philip - // simcha abby - // simcha phelipe - // simcha simcha - // snippet 4 - let word = "street"; - for ( let i = 0; i < word.length; { - console.log( i ); - console.log( word[ i ] ); - } - // 0 - // s - // 1 - // t - // 2 - // r - // 3 - // e - // 4 - // e - // 5 - // t - // snippet 4 - let locations = [ "flatbush", "williamsburg", "bushwick", "greenpoint" ]; - for ( let i = 0; i < locations.length; { - for ( let j = i + 1; j < locations.length; { - console.log( locations[ i ], locations[ j ] ); - } - } - // flatbush williamsburg - // flatbush bushwick - // flatbush greenpoint - // williamsburg bushwick - // williamsburg greenpoint - // bushwick greenpoint - // snippet 5 - let total = 0; // 10 - for ( let i = 1; i < 5; i++ ) { - total += i; - console.log( total ); - } - console.log( "grand total: " + total ); - // 1 - // 3 - // 6 - // 10 - // grand total: 10 - // snippet 5 - let colors = [ "red", "purple", "orange" ]; - for ( let i = 0; i < colors.length; { - let colorStr = colors[ i ]; - console.log( colorStr ); - for ( let j = 0; j < colorStr.length; { - let char = colorStr[ j ]; - console.log( char ); - } - } - // red - // r - // e - // d - // purple - // p - // u - // r - // p - // l - // e - // orange - // o - // r - // a - // n - // g - // e - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `spam` that accepts a 2D array as an argument. The array contains pairs as elements. - // The first element of every pair is a number and the second element is a word. The function should - // return a string containing the words repeated the specified number of times. See the examples. - let spam = function ( pairs ) { - let words = []; - for ( let i = 0; i < pairs.length; { - let pair = pairs[ i ]; - let word = pair[ 0 ]; - let num = pair[ 1 ]; - for ( let j = 0; j < num; { - words.push( word ); - } - } - return words.join( ' ' ); - }; - let array1 = [ - [ "hi", 3 ], - [ "bye", 2 ], - ]; console.log( spam( array1 ) ); // 'hi hi hi bye bye' - let array2 = [ - [ "cat", 1 ], - [ "dog", 2 ], - [ "bird", 4 ], - ]; console.log( spam( array2 ) ); // 'cat dog dog bird bird bird bird' - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `startsWithR` that accepts a string as an argument and returns a boolean indicating - // whether or not the string starts with 'r' or 'R'. - let startsWithR = function ( str ) { - return str[ 0 ] === 'r' || str[ 0 ] === 'R'; - }; console.log( startsWithR( "roger that" ) ); // true - console.log( startsWithR( "Row, row, row your boat" ) ); // true - console.log( startsWithR( "slip" ) ); // false - console.log( startsWithR( "Taxicab" ) ); // false - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `stayPositive` that accepts an array of numbers as an argument. The function should - // return an array containing only the positive numbers. - let stayPositive = function ( numbers ) { - let positives = []; - for ( let i = 0; i < numbers.length; { - if ( numbers[ i ] > 0 ) { - positives.push( numbers[ i ] ); - } - } - return positives; - }; - console.log( stayPositive( [ 10, -4, 3, 6 ] ) ); // [10, 3, 6] - console.log( stayPositive( [ -5, 11, -40, 30.3, -2 ] ) ); // [11, 30.3] - console.log( stayPositive( [ -11, -30 ] ) ); // [] - console.log( "river" + "town" ); - console.log( "cat" + "dog" ); - console.log( "New" + " York" ); - console.log( "runner's knee" + "!" ); - console.log( "man" + "bear" + "pig" ); - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `stringIterate` that accepts a string as an argument. The function should print out - // each character of the string, one by one. The function doesn't need to return any value. It should - // just print to the terminal. - let stringIterate = function ( string ) { - for ( let i = 0; i < string.length; { - console.log( string[ i ] ); - } - }; - stringIterate( "celery" ); - // prints - // c - // e - // l - // e - // r - // y - stringIterate( "hat" ); - // prints - // h - // a - // t - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function named `stringRepeater(str, num)` that accepts a string and a number as arguments. - // The function should return a new string consisting of the `str` repeated `num` number of times. - let stringRepeater = function ( str, num ) { - let repeatedStr = ''; - for ( let i = 1; i <= num; i++ ) { - repeatedStr += str - } - return repeatedStr; - }; - console.log( stringRepeater( "q", 4 ) ); // 'qqqq' - console.log( stringRepeater( "go", 2 ) ); // 'gogo' - console.log( stringRepeater( "tac", 3 ) ); // 'tactactac' - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `stringSize` that accepts a string as an argument. The function should return the - // string 'small' if the argument is shorter than 5 characters, 'medium' if it is exactly 5 characters, and - // 'large' if it is longer than 5 characters. - let stringSize = function ( str ) { - if ( str.length < 5 ) { - return 'small'; - } else if ( str.length > 5 ) { - return 'large'; - } else { - return 'medium'; - } - }; - console.log( stringSize( "cat" ) ); // 'small' - console.log( stringSize( "bell" ) ); // 'small' - console.log( stringSize( "ready" ) ); // 'medium' - console.log( stringSize( "shirt" ) ); // 'medium' - console.log( stringSize( "shallow" ) ); // 'large' - console.log( stringSize( "intelligence" ) ); // 'large' - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `stringsToLengths` that accepts an array of strings as an argument. The function - // should return a new array containing the lengths of the elements of the original array. - let stringsToLengths = function ( words ) { - let lengths = []; - for ( let i = 0; i < words.length; { - lengths.push( words[ i ].length ); - } - return lengths; - }; - console.log( stringsToLengths( [ "belly", "echo", "irony", "pickled" ] ) ); - // [5, 4, 5, 7] - console.log( stringsToLengths( [ "on", "off", "handmade" ] ) ); - // [2, 3, 8] - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function named `sumUpTo(max)` that accepts a max number as an argument. The function should - // return the total sum of all whole numbers from 1 to the max, inclusive. - // - // For example, sumUpTo(4) should return 10 because 1 + 2 + 3 + 4 = 10. - let sumUpTo = function ( max ) { - let sum = 0; - for ( let i = 1; i <= max; i++ ) { - sum += i - } - return sum; - }; - console.log( sumUpTo( 4 ) ); // 10 - console.log( sumUpTo( 5 ) ); // 15 - console.log( sumUpTo( 2 ) ); // 3 - console.log( 'coffee' ); - let qty = 15 % 4; - console.log( qty ); // 3 - let num = 38 + 3; - num++; - console.log( num + " is a great number" ); // '42 is a great number' - let isNumEven = num % 2 === 0; - console.log( num + " is even? " + isNumEven ); // '42 is even? true' - let isQtyEven = qty % 2 === 0; - console.log( qty + " is even? " + isQtyEven ); // '3 is even? false' - glet longStr = "AIICXAIBAAKBgQCuw0YyucjI9bf7yRhIkyg4Ru6kYU7O6fIn2JoFDzCZNkzDdsuXFGh6BXNvbu8uZUT289ERzYP1QjryMEKWzcbtsioyQApL7AgOZyFc3JJ7wvupHhIj2sqxJNtpAh7HQFG08rYh2Pb3HwOm83rbTomM6LnnjooGcoDeuWkuPqXsRlwIDAQABAoGAeQkbPBR5n9y2QLaEjcDGv7dVpFiMGHMaZZVDX34rZPy1EkZNZqlQU0jopLVvLyLESMh9A7gKhqoyMAbgZPpdb0CvniTJPpKYk24mLBeym8rBMW3XBmKk1xIOcJPGXMxeJW61jxPg6doah0aCIjf8n0Z8t8B81kLFojpECQQDzlCp0Nzka3AVZVPdBuuPg0fzeV8ugpiPEp6wQLjIMDFqYtGoAOEy4JpkmkK7zwsQsHZ8jbOtqIFdRLPrvAkEAruU321Ie1CnYCHX4Q79vLcDeWOUpdzEHp2uzDIfzP1gv7RIktGgSZWKhrnNWdeH4Y0CFb9lu6TQYJwNJvug2QJBANX0m3Uds9P9pLbQlI9WWmAtYqIZrsBElcAjOgAik0uOfawholNiw5B3ADvIYqPkLW4dGk1dO6zxW8ZF83MdMCQHGfhxLuFgsOBSfF7Bj4UX6T9FGhUGSXiqUsd06E2mMRLAjWUUUw82DLwucxMrSsV4z1aN57asC8YuQ9FkCQGirlVCt4ccXeGLCHcCsI8AYQJFRzbMs381M16jEpnaKUGrtdbMW018gWJ0EoD4tS2YZpr1hEbtiOkPJaaTKQ"; - if ( longStr.indexOf( 'coDe' ) > -1 ) { - console.log( 'FOUND' ); - } else { - console.log( 'NOT FOUND' ); - } - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `totalProduct(array)` that accepts a 2D array of numbers. The function should return - // the total product of all numbers in the array. - let totalProduct = function ( array ) { - let product = 1; - for ( let i = 0; i < array.length; { - let subarray = array[ i ]; - for ( let j = 0; j < subarray.length; { - product *= subarray[ j ]; - } - } - return product; - }; - let array1 = [ - [ 3, 5, 2 ], - [ 6, 2 ], - ]; console.log( totalProduct( array1 ) ); // 360 - let array2 = [ - [ 4, 6 ], - [ 2, 3 ], - [ 1, 2 ], - ]; console.log( totalProduct( array2 ) ); // 288 - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `total` that accepts an array of numbers as an argument. The function should return - // the total sum of all elements of the array. - let total = function ( numbers ) { - let sum = 0; - for ( let i = 0; i < numbers.length; { - sum += numbers[ i ]; - } - return sum; - }; - console.log( total( [ 3, 2, 8 ] ) ); // 13 - console.log( total( [ -5, 7, 4, 6 ] ) ); // 12 - console.log( total( [ 7 ] ) ); // 7 - console.log( total( [] ) ); // 0 - let apple; - console.log( apple ); // undefined - apple = 5; - console.log( apple ); // 5 - apple + 1; - console.log( apple ); // 5 - apple += 1; - console.log( apple ); // 6 - let banana = apple; - console.log( banana ); // 6 - banana = banana / 2; - console.log( banana ); // 3 - console.log( apple ); // 6 - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `twoSumPairs(numbers, target)` that accepts an array of numbers and a target number - // as arguments. The function should return a 2D array containing all unique pairs of elements that - // sum to the target. - let twoSumPairs = function ( numbers, target ) { - let pairs = []; - for ( let i = 0; i < numbers.length; { - let num1 = numbers[ i ]; - for ( let j = i + 1; j < numbers.length; { - let num2 = numbers[ j ]; - if ( num1 + num2 === target ) { - let pair = [ num1, num2 ]; - pairs.push( pair ); - } - } - } - return pairs; - }; console.log( twoSumPairs( [ 2, 3, 4, 6, 5 ], 8 ) ); // [ [2, 6], [3, 5] ] - console.log( twoSumPairs( [ 10, 7, 4, 5, 2 ], 12 ) ); // [ [10, 2], [7, 5] ] - console.log( twoSumPairs( [ 3, 9, 8 ], 11 ) ); // [ [3, 8] ] - console.log( twoSumPairs( [ 3, 9, 8 ], 10 ) ); // [ ] - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `twoSum(numbers, target)` that accepts an array of numbers and a target number - // as an argument. The function should return a boolean indicating whether or not there exists a pair - // of distinct elements in the array that sum to the target. - let twoSum = function ( numbers, target ) { - for ( let i = 0; i < numbers.length; { - for ( let j = i + 1; j < numbers.length; { - if ( numbers[ i ] + numbers[ j ] === target ) { - return true; - } - } - } - return false; - }; console.log( twoSum( [ 2, 3, 5, 9 ], 7 ) ); // true - console.log( twoSum( [ 2, 3, 5, 9 ], 4 ) ); // false - console.log( twoSum( [ 6, 3, 4 ], 10 ) ); // true - console.log( twoSum( [ 6, 5, 1 ], 10 ) ); // false - // snippet 2-1 - let nonsense = "blog trust fund tattooed williamsburg poke roof party"; - let hasOk = nonsense.indexOf( "ok" ) > -1; - if ( hasOk ) { - console.log( "yeet" ); // prints - } else if ( nonsense.length > 10 ) { - console.log( "yo" ); - } else { - console.log( "no" ); - } - let hasZoo = nonsense.indexOf( "zoo" ) > -1; - let hasFun = nonsense.indexOf( "fun" ) > -1; - if ( hasZoo && hasOk ) { - console.log( "cool" ); - } else if ( hasOk ) { - console.log( "rad" ); // prints - } else if ( hasFun ) { - console.log( "dope" ); - } else { - console.log( "nope" ); - } - // snippet 2-2 - let q = 25; - if ( q % 3 === 0 && q % 5 === 0 ) { - console.log( "both" ); - } else if ( q % 3 === 0 || q % 5 == 0 ) { - console.log( "either" ); // prints - } else { - console.log( "neither" ); - } - let r = 9; - if ( r % 3 === 0 && r % 5 === 0 ) { - console.log( "both" ); - } else if ( r % 3 === 0 || r % 5 == 0 ) { - console.log( "either" ); // prints - } else { - console.log( "neither" ); - } - let s = 15; - if ( s % 3 === 0 && s % 5 === 0 ) { - console.log( "both" ); // prints - } else if ( s % 3 === 0 || s % 5 == 0 ) { - console.log( "either" ); - } else { - console.log( "neither" ); - } - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `wackyWord` that accepts two strings as arguments. The function should return a new - // string containing the first three characters of the first string concatenated with the last two - // character of the second string. - // You can assume that the first argument has a length of at least three and the second argument has a - // length of at least two. - let wackyWord = function ( str1, str2 ) { - return str1.slice( 0, 3 ) + str2.slice( -2 ); - }; console.log( wackyWord( "very", "kindly" ) ); // 'verly' - console.log( wackyWord( "forever", "sick" ) ); // 'forck' - console.log( wackyWord( "cellar", "door" ) ); // 'celor' - console.log( wackyWord( "bagel", "sweep" ) ); // 'bagep' - console.log( 'alvin' ); console.log( 'z' ); - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `wordCount(sentence, targetWords)` that accepts a sentence string and an array of - // `targetWords`. The function should return a count of the number of words of the sentence that are - // in `targetWords`. - let wordCount = function ( sentence, targetWords ) { - let words = sentence.split( ' ' ); - let count = 0; - for ( let i = 0; i < words.length; { - let word = words[ i ]; - if ( targetWords.includes( word ) ) { - count++; - } - } - return count; - }; - console.log( wordCount( "open the window please", [ "please", "open", "sorry" ] ) ); // 2 - console.log( wordCount( "drive to the cinema", [ "the", "driver" ] ) ); // 1 - console.log( wordCount( "can I have that can", [ "can", "I" ] ) ); // 3 - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `yourAverageFunction` that accepts an array of numbers as an argument. The - // function should return the average of all elements of the array. If the input array is empty, - // then the function should return null. - let yourAverageFunction = function ( nums ) { - if ( nums.length === 0 ) { - return null; - } - let sum = 0; - for ( let i = 0; i < nums.length; { - sum += nums[ i ]; - } - return sum / nums.length; - }; - console.log( yourAverageFunction( [ 5, 2, 7, 24 ] ) ); // 9.5 - console.log( yourAverageFunction( [ 100, 6 ] ) ); // 53 - console.log( yourAverageFunction( [ 31, 32, 40, 12, 33 ] ) ); // 29.6 - console.log( yourAverageFunction( [] ) ); // null - let location = "Brooklyn, " + "NY"; - console.log( location ); // 'Brooklyn, NY' - let quantity = 4 * 5 + 1; - console.log( quantity ); // 21 - g it // snippet 0-1 - if ( true ) { - console.log( "foo" ); // prints - } - if ( false ) { - console.log( "bar" ); - } - // snippet 0-2 - if ( false || false ) { - console.log( "boop" ); - } - if ( true || false ) { - console.log( "beep" ); // prints - } - // snippet 0-3 - let num = 40; - if ( num > 0 ) { - console.log( "zip" ); // prints - } - if ( num % 2 === 0 ) { - console.log( "zoop" ); // prints - } - // snippet 0-4 - let word = "jeep"; - if ( word[ 0 ] === "d" ) { - console.log( "yer" ); - } else { - console.log( "nah" ); // prints - } - // snippet 0-5 - let sentence = "roger that"; - if ( sentence[ sentence.length - 1 ] === "t" ) { - console.log( "ends in t" ); // prints - } else { - console.log( "does not end in t" ); - } - if ( sentence.length <= 4 ) { - console.log( "short" ); - } else { - console.log( "long" ); // prints - } - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `zipper` that accepts two arrays as arguments. The function should return a 2D - // array containing pairs of elements at the same indices. - let zipper = function ( arr1, arr2 ) { - let result = []; - for ( let i = 0; i < arr1.length; { - let el1 = arr1[ i ]; - let el2 = arr2[ i ]; - let pair = [ el1, el2 ]; - result.push( pair ); - } - return result; - }; - let array1 = [ "a", "b", "c", "d" ]; - let array2 = [ -1, -2, -3, -4 ]; - console.log( zipper( array1, array2 ) ); - // [ - // ['a', -1], - // ['b', -2], - // ['c', -3], - // ['d', -4], - // ] - let array3 = [ "whisper", "talk", "shout" ]; - let array4 = [ "quiet", "normal", "loud" ]; - console.log( zipper( array3, array4 ) ); - // [ - // ['whisper', 'quiet'], - // ['talk', 'normal'], - // ['shout', 'loud'], - // ] - let str = 'MIICWwIBAAKBgGEdLjFEFbegPZ2AwJWkalksXr7PzWL7wIc7pOFZxXwYPWtQxvANyceCwpkqbPLsfEx7nqxAris2hYOdeN1OTFqvTyNmVuzbUPcXShn6ZoDCB30voHkeu4F3cUw5RQEUDdLscSnv4HMxHam5qgl6vXoumVNHbjyKA5UtAnfjAgMBAAECgYAmjEyvpZTxRJvwjxDi1VaZevFI0Hd4WPH9PAGgqdnH84vGXnAGFj1WikqKYcqKMQW2kdjAsWwH9D9FfrkIcDDHdZ9XuGSGkFzWtOwajWMQl7qNV1hZ288gdpIQQMOTLDgauZY6pw1cV7h4v316qJB8knQGoBNpJCfTYQJBAKV1ctsJq0Zg4QumD2hyODepP3LfLeaQsERLqVAWeuOuTY5mK5gIwsSqvcSVfY7Ze1FWIsApNFRv67azKcJPwsCQQCNlyApZFJEVNY70Er7Uu5NL9t4CYJJC9uVVkoEHEY6d7sVslqa0vP2q0zXx9YedbMBvQjxXIbY0waXUy63FvoBGJAkB3OTJWUjVgzDY1Br5wu2Yu59NjKVKLWzCsu1gaCNBfhVDX7SyIyC9EYKRfUAoQxwsmPWPyQ9QVG4WKcPZJAkBRheAotPCBE2RLHHfvpiStnMhX0UXdVyaJp5tcZ6wYV61ohyBvCOkYhUxBJzeIGrVZcvLZSLeUzXoqRPpxQxAkEAkdCZXF0gHahpZgF5y0wWcqf9ECRT1E4Hv8bk3Mf0Exp2aW34JeI6I7Xqd1NV4I9H7prQ8m3y39lFwWO8PmQ'; - - console.log( str.indexOf( 'HEY' ) ); - console.log( 0 ); - // Write a function `alternatingCaps` that accepts a sentence string as an argument. The function should - // return the sentence where words alternate between lowercase and uppercase. - - let alternatingCaps = function ( sentence ) { - let words = sentence.split( ' ' ); - let newWords = []; - - for ( let i = 0; i < words.length; i++ ) { - let word = words[ i ]; - if ( i % 2 === 0 ) { - newWords.push( word.toLowerCase() ); - } else { - newWords.push( word.toUpperCase() ); - } - } - - return newWords.join( ' ' ); - }; - - console.log( alternatingCaps( "take them to school" ) ); // 'take THEM to SCHOOL' - console.log( alternatingCaps( "What did ThEy EAT before?" ) ); // 'what DID they EAT before?' - //APPEND-DIR.js - const fs = require( 'fs' ); - let cat = require( 'child_process' ).execSync( 'cat *' ).toString( 'UTF-8' ); - - fs.writeFile( 'output.md', cat, ( err ) => { - if ( err ) throw err; - } ); - git // Write a function `averageOfFour(num1, num2, num3, num4)` that accepts four numbers as arguments. The - // function should return the average of all four numbers. - - let averageOfFour = function ( num1, num2, num3, num4 ) { - let sum = num1 + num2 + num3 + num4; - return sum / 4; - }; - - console.log( averageOfFour( 10, 4, 12, 3 ) ); // 7.25 - console.log( averageOfFour( -20, 50, 4, 21 ) ); // 13.75 - console.log( averageOfFour( 10, 4, 12, 3 ) ); // 7.25 - console.log( averageOfFour( 5, 5, 3, 7 ) ); // 5 - // Write a function `average` that accepts three numbers as arguments. The function should return the - // average of the three numbers. - - let average = function ( num1, num2, num3 ) { - return ( num1 + num2 + num3 ) / 3; - }; - - console.log( average( 3, 10, 8 ) ); // 7 - console.log( average( 10, 5, 12 ) ); // 9 - console.log( average( 6, 20, 40 ) ); // 22 - // Write a function `bleepVowels` that accepts a string as an argument. The function should return - // a new string where all vowels are replaced with `*`s. Vowels are the letters a, e, i, o, u. - - let bleepVowels = function ( str ) { - let vowels = [ "a", "e", "i", "o", "u" ]; - let bleeped = ""; - - for ( let i = 0; i < str.length; i++ ) { - let char = str[ i ]; - - if ( vowels.indexOf( char ) > -1 ) { - bleeped += "*"; - } else { - bleeped += char; - } - } - - return bleeped; - }; - - console.log( bleepVowels( "skateboard" ) ); // 'sk*t*b**rd' - console.log( bleepVowels( "slipper" ) ); // 'sl*pp*r' - console.log( bleepVowels( "range" ) ); // 'r*ng*' - console.log( bleepVowels( "brisk morning" ) ); // 'br*sk m*rn*ng' - console.log( false ); // false - console.log( !true ); // false - console.log( !false ); // true - console.log( !!true ); // true - - console.log( false && false ); // false - console.log( false && true ); // false - console.log( true && false ); // false - console.log( true && true ); // true - - console.log( false || false ); // false - console.log( false || true ); // true - console.log( true || false ); // true - console.log( true || true ); // true - - console.log( !false || false ); // true - console.log( false || ( true && true ) ); // true - console.log( false || !( true && true ) ); // false - console.log( !true && ( true ) ); // false - // Write a function `caseChange` that accepts a string and a boolean as arguments. The function should - // return the uppercase version of the string if the boolean is true. The function should return the - // lowercase version of the string if the boolean is false. - - let caseChange = function ( str, shouldUpperCase ) { - if ( shouldUpperCase ) { - return str.toUpperCase(); - } else { - return str.toLowerCase(); - } - }; - - console.log( caseChange( "Super", true ) ); // 'SUPER' - console.log( caseChange( "Super", false ) ); // 'super' - console.log( caseChange( "tAmBourine", true ) ); // 'TAMBOURINE' - console.log( caseChange( "tAmBourine", false ) ); // 'tambourine' - // Write a function `censorE` that accepts a string as an argument. The function should return the a new - // version of string where all characters that are 'e's are replaced with '*'s. - - let censorE = function ( str ) { - let newStr = ''; - - for ( let i = 0; i < str.length; i++ ) { - let char = str[ i ]; - - if ( char === 'e' ) { - newStr += '*'; - } else { - newStr += char; - } - } - - return newStr; - }; - - console.log( censorE( "speedy" ) ); // 'sp**dy' - console.log( censorE( "pending" ) ); // 'p*nding' - console.log( censorE( "scene" ) ); // 'sc*n*' - console.log( censorE( "heat" ) ); // 'h*at' - // Write a function `chooseDivisibles(numbers, target)` that accepts an array of numbers and a - // target number as arguments. The function should return an array containing elements of the original - // array that are divisible by the target. - - let chooseDivisibles = function ( numbers, target ) { - let divisibles = []; - - for ( let i = 0; i < numbers.length; i++ ) { - let num = numbers[ i ]; - - if ( num % target === 0 ) { - divisibles.push( num ); - } - } - - return divisibles; - }; - - console.log( chooseDivisibles( [ 40, 7, 22, 20, 24 ], 4 ) ); // [40, 20, 24] - console.log( chooseDivisibles( [ 9, 33, 8, 17 ], 3 ) ); // [9, 33] - console.log( chooseDivisibles( [ 4, 25, 1000 ], 10 ) ); // [1000] - // Write a function `commonElements` that accepts two arrays as arguments. The function should return - // a new array containing the elements that are found in both of the input arrays. The order of - // the elements in the output array doesn't matter as long as the function returns the correct elements. - - let commonElements = function ( array1, array2 ) { - let common = []; - - for ( let i = 0; i < array1.length; i++ ) { - let ele = array1[ i ]; - - if ( array2.includes( ele ) ) { - common.push( ele ); - } - } - - return common; - }; - - let arr1 = [ "a", "c", "d", "b" ]; - let arr2 = [ "b", "a", "y" ]; - console.log( commonElements( arr1, arr2 ) ); // ['a', 'b'] - - let arr3 = [ 4, 7 ]; - let arr4 = [ 32, 7, 1, 4 ]; - console.log( commonElements( arr3, arr4 ) ); // [4, 7] - console.log( true === false ); // false - console.log( false === false ); // true - console.log( false !== true ); // true - console.log( !true === false ); // true - - console.log( 2 + 3 === 5 ); // true - console.log( 4 < 0 ); // false - console.log( 10 >= 10 ); // true - console.log( 10.3 >= 10 ); // true - - console.log( 100 / 2 === 50 ); // true - console.log( 100 % 2 === 0 ); // true - console.log( 11 % 2 === 0 ); // false - console.log( 7.0 === 7 ); // true - - console.log( 13 % 5 > 0 ); // true - console.log( "potato" === "potato" ); // true - console.log( "Tomato" === "tomato" ); // false - console.log( "42" === 42 ); // false - console.log( 5 > 3 && 1 === 0 ); // false - t // Write a function `contains(str1, str2)` that accepts two strings as arguments. The function should - // return a boolean indicating whether or not `str2` is contained within `str1`. The function should - // ignore any differences in capitalization. - - let contains = function ( str1, str2 ) { - let lowerStr1 = str1.toLowerCase(); - let lowerStr2 = str2.toLowerCase(); - return lowerStr1.indexOf( lowerStr2 ) > -1; - }; - - console.log( contains( "caterpillar", "pill" ) ); // true - console.log( contains( "lion's share", "on" ) ); // true - console.log( contains( "SORRY", "or" ) ); // true - console.log( contains( "tangent", "gem" ) ); // false - console.log( contains( "clock", "ok" ) ); // false - // Write a function `countUp(max)` that accepts a max number as an argument. The function should print - // all numbers from 1 up to and including the max. The function doesn't need to return any value. It - // should just print to the terminal. - - let countUp = function ( max ) { - for ( let i = 1; i <= max; i++ ) { - console.log( i ); - } - }; - - countUp( 5 ); - // prints - // 1 - // 2 - // 3 - // 4 - // 5 - - countUp( 3 ); - // prints - // 1 - // 2 - // 3 - let phrase = "that's all folks"; - console.log( phrase[ phrase.length ] ); // undefined - console.log( phrase[ phrase.length - 1 ] ); // s - console.log( phrase[ phrase.length - 2 ] ); // k - - const i = 9; - const char = phrase[ i ]; - console.log( char ); // l - console.log( phrase.indexOf( char ) ); // 8 - console.log( phrase.slice( 2, 8 ) ); // at's a - - console.log( "abcdefg".slice( 1, 3 ) ); // bc - console.log( "abcdefg".slice( 2 ) ); // cdefg - console.log( "abcdefg".slice( 4 ) ); // efg - - - console.log( "abcdefg".slice( 2, -1 ) ); // cdef - console.log( "abcdefg".slice( 2, -2 ) ); // cde - // Write a function named `divByEither(num1, num2, max)` that accepts three numbers as arguments. - // The function should print out all positive numbers less than max that are divisible by num1 or num2. - // The function doesn't need to return any value. It should just print to the terminal. - - let divByEither = function ( num1, num2, max ) { - for ( let i = 1; i < max; i++ ) { - if ( i % num1 === 0 || i % num2 === 0 ) { - console.log( i ); - } - } - }; - - divByEither( 4, 3, 16 ); - // prints - // 3 - // 4 - // 6 - // 8 - // 9 - // 12 - // 15 - - divByEither( 7, 5, 20 ); - // prints - // 5 - // 7 - // 10 - // 14 - // 15 - // Write a function `divisibleRange(min, max, num)` that accepts three numbers as arguments. The - // function should print all numbers between `min` and `max` (exclusive) that are also divisible by - // num. - - let divisibleRange = function ( min, max, num ) { - for ( let i = min + 1; i < max; i++ ) { - if ( i % num === 0 ) { - console.log( i ); - } - } - }; - - divisibleRange( 17, 40, 9 ); - // prints - // 18 - // 27 - // 36 - - divisibleRange( 10, 24, 4 ); - // prints - // 12 - // 16 - // 20 - // Write a function `divisible(num1, num2)` that accepts two numbers as arguments. The function should - // return a boolean indicating whether or not `num1` is divisible by `num2`. - - let divisible = function ( num1, num2 ) { - return num1 % num2 === 0; - }; - - // let divisible = function (num1, num2) { - // if (num1 % num2 === 0) { - // return true; - // } else { - // return false; - // } - // }; - - console.log( divisible( 12, 3 ) ); // true - console.log( divisible( 12, 5 ) ); // false - console.log( divisible( 60, 4 ) ); // true - console.log( divisible( 60, 11 ) ); // false - console.log( divisible( 21, 7 ) ); // true - console.log( divisible( 21, 6 ) ); // false - // Write a function `divisors` that accepts a number as an argument. The function should return an - // array containing all positive numbers that can divide into the argument. - - let divisors = function ( n ) { - let numbers = []; - - for ( let i = 1; i <= n; i++ ) { - if ( n % i === 0 ) { - numbers.push( i ); - } - } - - return numbers; - }; - - console.log( divisors( 15 ) ); // [1, 3, 5, 15] - console.log( divisors( 7 ) ); // [1, 7] - console.log( divisors( 24 ) ); // [1, 2, 3, 4, 6, 8, 12, 24] - g // Write a function `endsInLy` that accepts a string as an argument and returns a boolean indicating - // whether or not the string ends in the substring 'ly'. - - let endsInLy = function ( str ) { - let secondLast = str[ str.length - 2 ]; - let last = str[ str.length - 1 ]; - - return secondLast === 'l' && last === 'y'; - }; - - // let endsInLy = function (str) { - // return str.endsWith('ly'); - // }; - - console.log( endsInLy( "pretty" ) ); // false - console.log( endsInLy( "instant" ) ); // false - console.log( endsInLy( "analytic" ) ); // false - console.log( endsInLy( "timidly" ) ); // true - console.log( endsInLy( "fly" ) ); // true - console.log( endsInLy( "gallantly" ) ); // true - // Write a function `endsWithT` that accepts a string as an argument. The function should return a - // boolean indicating whether or not the string ends with the character 't'. - - let endsWithT = function ( str ) { - let lastChar = str[ str.length - 1 ]; - return lastChar === 't'; - }; - - - console.log( endsWithT( "smart" ) ); // true - console.log( endsWithT( "racket" ) ); // true - console.log( endsWithT( "taco" ) ); // false - console.log( endsWithT( "boomerang" ) ); // false - // Write a function `evens(max)` that accepts a max number as an argument. The function should print - // all positive even numbers that are less than the max. - - let evens = function ( max ) { - for ( let i = 1; i < max; i++ ) { - if ( i % 2 === 0 ) { - console.log( i ); - } - } - }; - - evens( 11 ); - // prints - // 2 - // 4 - // 6 - // 8 - // 10 - - evens( 8 ); - // prints - // 2 - // 4 - // 6 - // Write a function `filterLongWords` that accepts an array of strings as an argument. The function - // should return a new array containing only the strings that are less than 5 characters long. - - let filterLongWords = function ( words ) { - let chosenWords = []; - - for ( let i = 0; i < words.length; i++ ) { - let word = words[ i ]; - - if ( word.length < 5 ) { - chosenWords.push( word ); - } - } - - return chosenWords; - }; - - console.log( filterLongWords( [ "kale", "cat", "retro", "axe", "heirloom" ] ) ); - // ['kale', 'cat', 'axe'] - - console.log( filterLongWords( [ "disrupt", "pour", "trade", "pic" ] ) ); - // ['pour', 'pic'] - // Write a function named `fiveMultiplesOf` that accepts a number as an argument. The function should - // print out the first five multiples of the given number. The function doesn't need to return any - // value. It should just print to the terminal. - - let fiveMultiplesOf = function ( num ) { - for ( let i = 1; i <= 5; i++ ) { - console.log( i * num ); - } - }; - - fiveMultiplesOf( 7 ); - // prints - // 7 - // 14 - // 21 - // 28 - // 35 - - fiveMultiplesOf( 3 ); - // prints - // 3 - // 6 - // 9 - // 12 - // 15 - // Write a function `fizzBuzz` that accepts a max number as an argument. The function should - // print all numbers less than or equal to max that are divisible by either 3 or 5 but not both 3 - // and 5. The function doesn't need to return any value. It should just print to the terminal. - - let fizzBuzz = function ( max ) { - for ( let i = 1; i <= max; i++ ) { - if ( ( i % 3 === 0 || i % 5 === 0 ) && !( i % 3 === 0 && i % 5 === 0 ) ) { - console.log( i ); - } - } - }; - - fizzBuzz( 18 ); - // prints - // 3 - // 5 - // 6 - // 9 - // 10 - // 12 - // 18 - - fizzBuzz( 33 ); - // prints - // 3 - // 5 - // 6 - // 9 - // 10 - // 12 - // 18 - // 20 - // 21 - // 24 - // 25 - // 27 - // 33 - let movie = 'Fight Club'; - - let views = 4; - - console.log( 'I watched ' + movie + ' about ' + views + ' number of times' ); - // Write a function `funnySound` that accepts two strings as arguments. The function should return a - // new string containing the first three characters of both strings concatenated together. - - // You can assume that the arguments are both at least three characters long. - - let funnySound = function ( str1, str2 ) { - return str1.slice( 0, 3 ) + str2.slice( 0, 3 ); - }; - - console.log( funnySound( "tiger", "spoon" ) ); // 'tigspo' - console.log( funnySound( "computer", "phone" ) ); // 'compho' - console.log( funnySound( "skate", "bottle" ) ); // 'skabot' - console.log( funnySound( "frog", "ashtray" ) ); // 'froash' - console.log( 'hello world' ); - // Write a function `half` that accepts a number as an argument. The function should return half of the - // number. - - let half = function ( n ) { - return n / 2; - }; - - console.log( half( 8 ) ); // 4 - console.log( half( 15 ) ); // 7.5 - console.log( half( 90 ) ); // 45 - gi // Write a function `inRange(min, max, n)` that accepts three numbers as arguments. The function should - // return a boolean indicating if `n` is between `min` and `max` inclusive. - - let inRange = function ( min, max, n ) { - return n >= min && n <= max; - }; - - console.log( inRange( 5, 13, 8 ) ); // true - console.log( inRange( 5, 13, 29 ) ); // false - console.log( inRange( 100, 125, 100 ) ); // true - console.log( inRange( 100, 125, 99 ) ); // false - console.log( inRange( 40, 45, 44 ) ); // true - console.log( inRange( 40, 45, 45 ) ); // true - console.log( inRange( 40, 45, 46 ) ); // false - // Write a function `isDivBy4` that accepts a number as an argument. The function should return a - // boolean indicating whether or not the number is divisible by 4. - - let isDivBy4 = function ( num ) { - if ( num % 4 === 0 ) { - return true; - } else { - return false; - } - }; - - // let isDivBy4 = function (num) { - // return num % 4 === 0; - // }; - - console.log( isDivBy4( 8 ) ); // true - console.log( isDivBy4( 12 ) ); // true - console.log( isDivBy4( 24 ) ); // true - console.log( isDivBy4( 9 ) ); // false - console.log( isDivBy4( 10 ) ); // false - // Write a function `isLong` that accepts a string as an argument. The function should return a boolean - // indicating whether or not the string is longer than 5 characters - - let isLong = function ( str ) { - return str.length > 5; - }; - - // let isLong = function (str) { - // if (str.length > 5) { - // return true; - // } else { - // return false; - // } - // }; - - console.log( isLong( "pie" ) ); // false - console.log( isLong( "kite" ) ); // false - console.log( isLong( "kitty" ) ); // false - console.log( isLong( "telescope" ) ); // true - console.log( isLong( "thermometer" ) ); // true - console.log( isLong( "restaurant" ) ); // true - // Write a function `keepItQuiet` that accepts a string as an argument. The function should return the - // lowercase version of the string with 3 periods added to the end of it. - - let keepItQuiet = function ( str ) { - return str.toLowerCase() + '...'; - }; - - console.log( keepItQuiet( "HOORAY" ) ); // 'hooray...' - console.log( keepItQuiet( "Doggo" ) ); // 'doggo...' - console.log( keepItQuiet( "WHAT?!?!" ) ); // 'what?!?!...' - // Write a function `larger` that accepts two numbers as arguments. The function should return the - // larger number. - - let larger = function ( num1, num2 ) { - if ( num1 > num2 ) { - return num1; - } else { - return num2; - } - }; - - console.log( larger( 256, 400 ) ); // 400 - console.log( larger( 31, 4 ) ); // 31 - console.log( larger( -6, 7 ) ); // 7 - console.log( larger( 11.3, 11.2 ) ); // 11.3 - console.log( larger( -10, -3 ) ); // -3 - // Write a function `lengthiestWord` that accepts a sentence string as an argument. The function should - // return the longest word of the sentence. If there is a tie, return the word that appears later - // in the sentence. - - let lengthiestWord = function ( sentence ) { - let words = sentence.split( ' ' ); - let longest = words[ 0 ]; // pretty - - for ( let i = 1; i < words.length; i++ ) { - let word = words[ i ]; - if ( word.length >= longest.length ) { - longest = word; - } - } - - return longest; - }; - - - console.log( lengthiestWord( "I am pretty hungry" ) ); // 'hungry' - console.log( lengthiestWord( "we should think outside of the box" ) ); // 'outside' - console.log( lengthiestWord( "down the rabbit hole" ) ); // 'rabbit' - console.log( lengthiestWord( "simmer down" ) ); // 'simmer' - // Write a function `longer` that accepts two strings as arguments. The function should return the - // string that is longer. If the strings have the same length, then return the first string. - - let longer = function ( str1, str2 ) { - if ( str1.length >= str2.length ) { - return str1; - } else { - return str2; - } - }; - - console.log( longer( "drum", "piranha" ) ); // 'piranha' - console.log( longer( "basket", "fork" ) ); // 'basket' - console.log( longer( "flannel", "sustainable" ) ); // 'sustainable' - console.log( longer( "disrupt", "ability" ) ); // 'disrupt' - console.log( longer( "bird", "shoe" ) ); // 'bird' - // Write a function `makeAcronym` that accepts a sentence string as an argument. The function should - // return a string containing the first character of each word in the sentence. - - let makeAcronym = function ( sentence ) { - let words = sentence.split( ' ' ); - let acronym = ''; - - for ( let i = 0; i < words.length; i++ ) { - let word = words[ i ]; - acronym += word[ 0 ]; - } - - return acronym.toUpperCase(); - }; - - console.log( makeAcronym( "New York" ) ); // NY - console.log( makeAcronym( "same stuff different day" ) ); // SSDD - console.log( makeAcronym( "Laugh out loud" ) ); // LOL - console.log( makeAcronym( "don't over think stuff" ) ); // DOTS - // Write a function `makeMatrix(m, n, value)` that accepts three arguments. The function should return - // a 2-dimensional array of height `m` and width `n` that contains the `value` as every element. - - let makeMatrix = function ( m, n, value ) { - let matrix = []; - - for ( let i = 0; i < m; i++ ) { - let row = []; - - for ( let j = 0; j < n; j++ ) { - row.push( value ); - } - - matrix.push( row ); - } - - - return matrix; - }; - - console.log( makeMatrix( 3, 5, null ) ); - // [ - // [ null, null, null, null, null ], - // [ null, null, null, null, null ], - // [ null, null, null, null, null ] - // ] - - console.log( makeMatrix( 4, 2, "x" ) ); - // [ - // [ 'x', 'x' ], - // [ 'x', 'x' ], - // [ 'x', 'x' ], - // [ 'x', 'x' ] - // ] - - console.log( makeMatrix( 2, 2, 0 ) ); - // [ - // [ 0, 0 ], - // [ 0, 0 ] - // ] - // Write a function `maximum` that accepts an array of numbers as an argument. The function should - // return the largest number of the array. If the array is empty, then the function should return null. - - let maximum = function ( numbers ) { - if ( numbers.length === 0 ) { - return null; - } - - let currentMax = numbers[ 0 ]; - for ( let i = 1; i < numbers.length; i++ ) { - if ( numbers[ i ] > currentMax ) { - currentMax = numbers[ i ]; - } - } - - return currentMax; - }; - - console.log( maximum( [ 5, 6, 3, 7 ] ) ); // 7 - console.log( maximum( [ 17, 15, 19, 11, 2 ] ) ); // 19 - console.log( maximum( [] ) ); // null - // Write a function `minToMax(min, max)` that accepts two numbers as arguments. The function should - // print all numbers from min to max inclusive. The function doesn't need to return any value. It - // should just print to the terminal. - - - let minToMax = function ( min, max ) { - for ( let i = min; i <= max; i++ ) { - console.log( i ); - } - }; - - minToMax( 5, 9 ); - // prints - // 5 - // 6 - // 7 - // 8 - // 9 - - minToMax( 11, 13 ); - // prints - // 11 - // 12 - // 13 - // Write a function named `noOhs` that accepts a string as an argument. The functions should print the - // characters of the string one by one except the character 'o'. The function doesn't need to return - // any value. It should just print to the terminal. - - let noOhs = function ( str ) { - for ( let i = 0; i < str.length; i++ ) { - let char = str[ i ]; - if ( char !== 'o' ) { - console.log( char ); - } - } - }; - - noOhs( "code" ); - // prints - // c - // d - // e - - noOhs( "school" ); - // prints - // s - // c - // h - // l - // Write a function `numOdds` that accepts an array of numbers as an argument. The function should - // return a number representing the count of odd elements in the array. - - let numOdds = function ( numbers ) { - let count = 0; - - for ( let i = 0; i < numbers.length; i++ ) { - if ( numbers[ i ] % 2 === 1 ) { - count += 1; - } - } - - return count; - }; - - console.log( numOdds( [ 4, 7, 2, 5, 9 ] ) ); // 3 - console.log( numOdds( [ 11, 31, 58, 99, 21, 60 ] ) ); // 4 - console.log( numOdds( [ 100, 40, 4 ] ) ); // 0 - // Write a function `numberChange` that accepts a number as an argument. The function should return - // half the number if it is even. The function should return double the number if it is odd. - - let numberChange = function ( n ) { - if ( n % 2 === 0 ) { - return n / 2; - } else { - return n * 2; - } - }; - - console.log( numberChange( 6 ) ); // 3 - console.log( numberChange( 7 ) ); // 14 - console.log( numberChange( 16 ) ); // 8 - console.log( numberChange( 21 ) ); // 42 - console.log( 2 + 3 ); // 5 - console.log( 10 - 15 ); // -5 - console.log( 4 + 1 - 5 ); // 0 - console.log( 4 * 3 ); // 12 - - console.log( 7 / 2 ); // 3.5 - console.log( 4 + 2 * 3 ); // 10 - console.log( ( 4 + 2 ) * 3 ); // 18 - console.log( 5 % 2 ); // 1 - - console.log( 6 % 2 ); // 0 - console.log( 7 % 2 ); // 1 - console.log( 8 % 2 ); // 0 - console.log( 19 % 8 ); // 3 - - console.log( 24 % 8 ); // 0 - console.log( 7 % 4 ); // 3 - console.log( 4 % 7 ); // 4 - console.log( 5 + ( 10 % 5 ) ); // 5 - console.log( ( 5 + 10 ) % 5 ); // 0 - // Write a function `numberRange(min, max, step)` that accepts three numbers as arguments, `min`, - // `max`, and `step`. The function should return all numbers between `min` and `max` at `step` intervals. - // `min` and `max` are inclusive. - - let numberRange = function ( min, max, step ) { - let range = []; - - for ( let i = min; i <= max; i += step ) { - range.push( i ); - } - - return range; - }; - - console.log( numberRange( 10, 40, 5 ) ); // [10, 15, 20, 25, 30, 35, 40] - console.log( numberRange( 14, 24, 3 ) ); // [14, 17, 20, 23] - console.log( numberRange( 8, 35, 6 ) ); // [8, 14, 20, 26, 32] - // Write a function named `oddSum(max)` that accepts a max number as an argument. The function should - // return the total sum of all odd numbers from 1 to the max, inclusive. - // - // For example, oddSum(10) should return 25 because 1 + 3 + 5 + 7 + 9 = 25 - - let oddSum = function ( max ) { - let sum = 0; - - for ( let i = 1; i <= max; i++ ) { - if ( i % 2 === 1 ) { - sum += i; - } - } - - return sum; - }; - - console.log( oddSum( 10 ) ); // 25 - console.log( oddSum( 5 ) ); // 9 - let word = "bye"; - console.log( `${ word } felicia` ); // 'bye felicia' - console.log( word ); // 'bye' - - let num = 10; - num = num * 2; - console.log( num ); // 20 - - let bottlesOfBeer = 99; - let around = bottlesOfBeer - 1; - console.log( around ); // 98 - console.log( bottlesOfBeer ); // 99 - // Write a function `oneOrNone` that accepts two booleans as arguments. The function should return true - // if exactly one of the arguments is true. If BOTH arguments are true, then it should return false. - - let oneOrNone = function ( val1, val2 ) { - if ( ( val1 || val2 ) && !( val1 && val2 ) ) { - return true; - } else { - return false; - } - }; - - console.log( oneOrNone( false, false ) ); // false - console.log( oneOrNone( true, false ) ); // true - console.log( oneOrNone( false, true ) ); // true - console.log( oneOrNone( true, true ) ); // false - // Write a function `oneToFour` that prints all whole numbers from one to four, inclusive. The function - // takes in no arguments and doesn't need to return any value. It should just print to the terminal. - - let oneToFour = function () { - for ( let i = 1; i <= 4; i++ ) { - console.log( i ); - } - }; - - - oneToFour(); - // prints - // 1 - // 2 - // 3 - // 4 - let word = "bye"; - console.log( word + " felicia" ); // 'bye felicia' - console.log( word ); // 'bye' - - let num = 10; - num = num * 2; - console.log( num ); // 20 - - let bottlesOfBeer = 99; - let around = bottlesOfBeer - 1; - console.log( around ); // 98 - console.log( bottlesOfBeer ); // 99 - // Write a function `pairPrint` that accepts an array as an argument. The function should print - // all unique pairs of elements in the array. The function doesn't need to return any value. It - // should just print to the terminal. - - let pairPrint = function ( array ) { - for ( let i = 0; i < array.length; i++ ) { - for ( let j = i + 1; j < array.length; j++ ) { - console.log( array[ i ] + ' - ' + array[ j ] ); - } - } - }; - - pairPrint( [ "artichoke", "broccoli", "carrot", "daikon" ] ); - // prints - // artichoke - broccoli - // artichoke - carrot - // artichoke - daikon - // broccoli - carrot - // broccoli - daikon - // carrot - daikon - - pairPrint( [ "apple", "banana", "clementine" ] ); - // prints - // apple - banana - // apple - clementine - // banana - clementine - // Write a function `parity` that accepts a number as an argument. The function should return the - // string 'even' if the number is even. It should return the string 'odd' if the number is odd. - - let parity = function ( num ) { - if ( num % 2 === 0 ) { - return 'even'; - } else { - return 'odd'; - } - }; - - console.log( parity( 5 ) ); // 'odd' - console.log( parity( 7 ) ); // 'odd' - console.log( parity( 13 ) ); // 'odd' - console.log( parity( 32 ) ); // 'even' - console.log( parity( 10 ) ); // 'even' - console.log( parity( 602348 ) ); // 'even' - // Write a function `print2d` that accepts a two-dimensional array as an argument. The function - // should print all inner elements of the array. - - let print2d = function ( array ) { - for ( let i = 0; i < array.length; i++ ) { - let subarray = array[ i ]; - for ( let j = 0; j < subarray.length; j++ ) { - console.log( subarray[ j ] ); - } - } - }; - - - let array1 = [ - [ "a", "b", "c", "d" ], - [ "e", "f" ], - [ "g", "h", "i" ], - ]; - print2d( array1 ); - // prints - // a - // b - // c - // d - // e - // f - // g - // h - // i - - let array2 = [ - [ 9, 3, 4 ], - [ 11 ], - [ 42, 100 ] - ]; - print2d( array2 ); - // prints - // 9 - // 3 - // 4 - // 11 - // 42 - // 100 - // Write a function `printCombinations`that accepts two arrays as arguments. The function should - // print all combinations of the elements generated by taking an element from the first array and - // and an element from the second array. The function doesn't need to return any value. It - // should just print to the terminal. - - - let printCombinations = function ( array1, array2 ) { - for ( let i = 0; i < array1.length; i++ ) { - let ele1 = array1[ i ]; - - for ( let j = 0; j < array2.length; j++ ) { - let ele2 = array2[ j ]; - console.log( ele1, ele2 ); - } - } - }; - - let colors = [ "gray", "cream", "cyan" ]; - let clothes = [ "shirt", "flannel" ]; - printCombinations( colors, clothes ); - // prints - // gray shirt - // gray flannel - // cream shirt - // cream flannel - // cyan shirt - // cyan flannel - - printCombinations( [ "hot", "cold" ], [ "soup", "tea" ] ); - // prints - // hot soup - // hot tea - // cold soup - // cold tea - // Write a function named `productUpTo(max)` that accepts a max number as an argument. The function - // should return the total product of all whole numbers from 1 to the max, inclusive. A product is a - // number obtained from multiplying numbers together. - // - // For example, productUpTo(4) should return 24 because 1 * 2 * 3 * 4 = 24 - - let productUpTo = function ( max ) { - let product = 1; - - for ( let i = 1; i <= max; i++ ) { - product *= i; - } - - return product; - }; - - console.log( productUpTo( 4 ) ); // 24 - console.log( productUpTo( 5 ) ); // 120 - console.log( productUpTo( 7 ) ); // 5040 - let word = "suspension bridge"; - console.log( word[ 4 ] ); // e - console.log( word.length > 5 && word[ 0 ] === "d" ); // false - console.log( word.length > 5 && word[ 0 ] === "s" ); // true - console.log( word.indexOf( "o" ) > -1 ); // true - console.log( word.indexOf( "z" ) > -1 ); // false - - let str = "foggy"; - console.log( str[ 2 + 1 ] ); // g - console.log( str[ str.length - 1 ] ); // y - str = " day"; - console.log( str ); // ' day' - console.log( str.length ); // 4 - console.log( str.indexOf( "ogg" ) ); // -1 - // Write a function `raisePower(base, exponent)` that accepts two numbers, `base` and `exponent`. The - // function should return `base` raised to the `exponent` power. - // - // For example, raisePower(2, 5) should return 32 because 2 * 2 * 2 * 2 * 2 = 32 - // For example, raisePower(4, 3) should return 64 because 4 * 4 * 4 = 64 - - let raisePower = function ( base, exponent ) { - let product = 1; - - for ( let i = 1; i <= exponent; i++ ) { - product *= base; - } - - return product; - }; - - console.log( raisePower( 2, 5 ) ); // 32 - console.log( raisePower( 4, 3 ) ); // 64 - console.log( raisePower( 10, 4 ) ); // 10000 - console.log( raisePower( 7, 2 ) ); // 49 - // Write a function `removeCapitals` that accepts a string as an argument. The function should return a - // new version of the string with all capital letters removed. - - let removeCapitals = function ( str ) { - let newStr = ''; - - for ( let i = 0; i < str.length; i++ ) { - let char = str[ i ]; - if ( char === char.toLowerCase() ) { - newStr += char; - } - } - - return newStr; - }; - - console.log( removeCapitals( "fOrEver" ) ); // 'frver' - console.log( removeCapitals( "raiNCoat" ) ); // 'raioat' - console.log( removeCapitals( "cElLAr Door" ) ); // 'clr oor' - // Write a function `removeDupes` that accepts an array as an argument. The function should return a - // new array where each element only appears once. - - let removeDupes = function ( array ) { - let uniques = []; - - for ( let i = 0; i < array.length; i++ ) { - let ele = array[ i ]; - if ( !uniques.includes( ele ) ) { - uniques.push( ele ); - } - } - - return uniques; - }; - - console.log( removeDupes( [ "x", "y", "y", "x", "z" ] ) ); // ['x', 'y', 'z'] - console.log( removeDupes( [ false, false, true, false ] ) ); // [false, true] - console.log( removeDupes( [ 42, 5, 7, 42, 7, 3, 7, 7 ] ) ); // [42, 5, 7, 3] - // Write a function `removeFirstVowel` that accepts a string as an argument. The function should return - // the string with it's first vowel removed. - - let removeFirstVowel = function ( str ) { - let vowels = 'aeiou'; - - for ( let i = 0; i < str.length; i++ ) { - let char = str[ i ]; - if ( vowels.includes( char ) ) { - return str.slice( 0, i ) + str.slice( i + 1 ); - } - } - - return str; - }; - - console.log( removeFirstVowel( "volcano" ) ); // 'vlcano' - console.log( removeFirstVowel( "celery" ) ); // 'clery' - console.log( removeFirstVowel( "juice" ) ); // 'jice' - console.log( removeFirstVowel( "bridge" ) ); // 'brdge' - console.log( removeFirstVowel( "try" ) ); // 'try' - // Write a function `removeShortWords` that accepts a sentence string as an argument. The function - // should return a new sentence where all of the words shorter than 4 characters are removed. - - let removeShortWords = function ( sentence ) { - let words = sentence.split( ' ' ); - let chosenWords = []; - - for ( let i = 0; i < words.length; i++ ) { - let word = words[ i ]; - - if ( word.length >= 4 ) { - chosenWords.push( word ); - } - } - - return chosenWords.join( ' ' ); - }; - - console.log( removeShortWords( "knock on the door will you" ) ); // 'knock door will' - console.log( removeShortWords( "a terrible plan" ) ); // 'terrible plan' - console.log( removeShortWords( "run faster that way" ) ); // 'faster that' - // Write a function `removeVowels` that accepts a string as an argument. The function should return - // a version of the string where all vowels are removed. - - let removeVowels = function ( str ) { - let newStr = ''; - let vowels = 'aeiou'; - - for ( let i = 0; i < str.length; i++ ) { - let char = str[ i ]; - if ( !vowels.includes( char ) ) { - newStr += char; - } - } - - return newStr; - }; - - console.log( removeVowels( "jello" ) ); // jll - console.log( removeVowels( "sensitivity" ) ); // snstvty - console.log( removeVowels( "cellar door" ) ); // cllr dr - // Write a function `reverseArray` that accepts an array as an argument. The function should return a - // array containing the elements of the original array in reverse order. - - let reverseArray1 = function ( array ) { - let reversed = []; - - for ( let i = array.length - 1; i >= 0; i-- ) { - reversed.push( array[ i ] ); - } - - return reversed; - }; - - console.log( reverseArray1( [ "zero", "one", "two", "three" ] ) ); // ['three', 'two', 'one', 'zero'] - console.log( reverseArray1( [ 7, 1, 8 ] ) ); // [8, 1, 7] - - - let reverseArray2 = function ( array ) { - let reversed = []; - - for ( let i = 0; i < array.length; i++ ) { - reversed.unshift( array[ i ] ); - } - - return reversed; - }; - - console.log( reverseArray2( [ "zero", "one", "two", "three" ] ) ); // ['three', 'two', 'one', 'zero'] - console.log( reverseArray2( [ 7, 1, 8 ] ) ); // [8, 1, 7] - // Write a function `reverseIterate` that accepts a string as an argument. The function should print - // the characters of the string one by one, in reverse order. The function doesn't need to return any - // value. It should just print to the terminal. - - let reverseIterate = function ( str ) { - for ( let i = str.length - 1; i >= 0; i-- ) { - console.log( str[ i ] ); - } - }; - - reverseIterate( "carrot" ); - // prints - // t - // o - // r - // r - // a - // c - - reverseIterate( "box" ); - // prints - // x - // o - // b - // Write a function `shortenLongWords` that accepts a sentence string as an argument. The function - // should return the same sentence where words longer than 4 characters have their vowels removed. - - let removeVowels = function ( str ) { - let newStr = ''; - let vowels = 'aeiou'; - - for ( let i = 0; i < str.length; i++ ) { - let char = str[ i ]; - if ( !vowels.includes( char ) ) { - newStr += char; - } - } - - return newStr; - }; - - let shortenLongWords = function ( sentence ) { - let words = sentence.split( ' ' ); - let newWords = []; - - for ( let i = 0; i < words.length; i++ ) { - let word = words[ i ]; - if ( word.length > 4 ) { - let noVowels = removeVowels( word ); - newWords.push( noVowels ); - } else { - // leave it the same - newWords.push( word ); - } - } - - return newWords.join( ' ' ); - }; - - console.log( shortenLongWords( "they are very noble people" ) ); // 'they are very nbl ppl' - console.log( shortenLongWords( "stick with it" ) ); // 'stck with it' - console.log( shortenLongWords( "ballerina, you must have seen her" ) ); // 'bllrna, you must have seen her - console.log( "promenade" [ 3 ] ); // m - console.log( "tiger" [ 1 ] ); // i - console.log( "wheel".length ); // 5 - - console.log( "wheel".length - 1 ); // 4 - console.log( "noMAD".toUpperCase() ); // NOMAD - console.log( "hey programmers" [ 2 ] === "y" ); // true - - console.log( "volleyball".length > 20 ); // false - console.log( "treasure".indexOf( "r" ) ); // 1 - console.log( "treasure".indexOf( "e" ) ); // 2 - console.log( "web" [ 5 ] ); // undefined - console.log( "red".indexOf( "x" ) ); // -1 - console.log( "red".indexOf( "R" ) ); // -1 - // snippet 0-1 - let greet = function () { - console.log( "hey" ); - console.log( "programmers" ); - }; - - let whistle = function () { - console.log( "doot" ); - }; - - console.log( "first" ); - console.log( "second" ); - greet(); - console.log( "third" ); - console.log( "fourth" ); - whistle(); - - - // first - // second - // hey - // programmers - // third - // fourth - // doot - // snippet 0-2 - let howMany = function () { - return 42; - }; - - console.log( howMany ); - console.log( howMany() ); - - const theAnswer = howMany(); - console.log( theAnswer ); - - let howMuch = function () { - 5; - }; - console.log( howMuch() ); - - - // [Function: howMany] - // 42 - // 42 - // undefined - // snippet 0-3 - let average = function ( num1, num2 ) { - console.log( "calculating..." ); - return ( num1 + num2 ) / 2; - }; - - console.log( average( 5, 10 ) ); - console.log( average( 20, 26 ) ); - console.log( average( 50, 100 ) + 2 ); - - let a = 21 + 3; - let b = 20; - let n = average( a, b ); - console.log( average( n, 18 ) ); - - - // calculating... - // 7.5 - // calculating... - // 23 - // calculating... - // 77 - // calculating... - // calculating... - // 20 - // snippet 0-4 - let exclaim = function ( str ) { - let capitalized = str.toUpperCase(); - return capitalized + "!!"; - }; - - let result = exclaim( "potato" ); - console.log( result ); - console.log( result.length ); - console.log( result[ 0 ] ); - console.log( result[ result.length - 1 ] ); - - - // POTATO!! - // 8 - // P - // ! - // snippet 1 - console.log( "hello" ); - - for ( let i = 0; i < 5; i++ ) { - console.log( "code" ); - } - - console.log( "goodbye" ); - - - hello - code - code - code - code - code - goodbye - // snippet 1 - console.log( "hello" ); - - for ( let i = 0; i < 5; i++ ) { - console.log( "code" ); - } - - console.log( "goodbye" ); - - - hello - code - code - code - code - code - goodbye - // snippet 2 - console.log( "hi" ); - - for ( let i = 3; i <= 7; i++ ) { - console.log( "program" ); - console.log( i ); - } - - console.log( "bye" ); - - - // hi - // program - // 3 - // program - // 4 - // program - // 5 - // program - // 6 - // program - // 7 - // bye - // snippet 2 - console.log( "hi" ); - - for ( let i = 3; i <= 7; i++ ) { - console.log( "program" ); - console.log( i ); - } - - console.log( "bye" ); - - - // hi - // program - // 3 - // program - // 4 - // program - // 5 - // program - // 6 - // program - // 7 - // bye - // snippet 3 - let foo = function () { - for ( let num = 10; num > 0; num -= 2 ) { - console.log( num ); - } - }; - - console.log( "begin" ); - foo(); - console.log( "end" ); - foo(); - - - // begin - // 10 - // 8 - // 6 - // 4 - // 2 - // end - // 10 - // 8 - // 6 - // 4 - // 2 - // snippet 3 - let foo = function () { - for ( let num = 10; num > 0; num -= 2 ) { - console.log( num ); - } - }; - - console.log( "begin" ); - foo(); - console.log( "end" ); - foo(); - - - // begin - // 10 - // 8 - // 6 - // 4 - // 2 - // end - // 10 - // 8 - // 6 - // 4 - // 2 - // snippet 4 - let word = "street"; - for ( let i = 0; i < word.length; i++ ) { - console.log( i ); - console.log( word[ i ] ); - } - - - // 0 - // s - // 1 - // t - // 2 - // r - // 3 - // e - // 4 - // e - // 5 - // t - // snippet 4 - let word = "street"; - for ( let i = 0; i < word.length; i++ ) { - console.log( i ); - console.log( word[ i ] ); - } - - - // 0 - // s - // 1 - // t - // 2 - // r - // 3 - // e - // 4 - // e - // 5 - // t - // snippet 5 - let total = 0; // 10 - for ( let i = 1; i < 5; i++ ) { - total += i; - console.log( total ); - } - - console.log( "grand total: " + total ); - - - // 1 - // 3 - // 6 - // 10 - // grand total: 10 - // snippet 5 - let total = 0; // 10 - for ( let i = 1; i < 5; i++ ) { - total += i; - console.log( total ); - } - - console.log( "grand total: " + total ); - - - // 1 - // 3 - // 6 - // 10 - // grand total: 10 - // Write a function `spam` that accepts a 2D array as an argument. The array contains pairs as elements. - // The first element of every pair is a number and the second element is a word. The function should - // return a string containing the words repeated the specified number of times. See the examples. - - let spam = function ( pairs ) { - let words = []; - - for ( let i = 0; i < pairs.length; i++ ) { - let pair = pairs[ i ]; - let word = pair[ 0 ]; - let num = pair[ 1 ]; - - for ( let j = 0; j < num; j++ ) { - words.push( word ); - } - } - - return words.join( ' ' ); - }; - - let array1 = [ - [ "hi", 3 ], - [ "bye", 2 ], - ]; - console.log( spam( array1 ) ); // 'hi hi hi bye bye' - - let array2 = [ - [ "cat", 1 ], - [ "dog", 2 ], - [ "bird", 4 ], - ]; - console.log( spam( array2 ) ); // 'cat dog dog bird bird bird bird' - // Write a function `startsWithR` that accepts a string as an argument and returns a boolean indicating - // whether or not the string starts with 'r' or 'R'. - - let startsWithR = function ( str ) { - return str[ 0 ] === 'r' || str[ 0 ] === 'R'; - }; - - console.log( startsWithR( "roger that" ) ); // true - console.log( startsWithR( "Row, row, row your boat" ) ); // true - console.log( startsWithR( "slip" ) ); // false - console.log( startsWithR( "Taxicab" ) ); // false - // Write a function `stayPositive` that accepts an array of numbers as an argument. The function should - // return an array containing only the positive numbers. - - let stayPositive = function ( numbers ) { - let positives = []; - - for ( let i = 0; i < numbers.length; i++ ) { - if ( numbers[ i ] > 0 ) { - positives.push( numbers[ i ] ); - } - } - - return positives; - }; - - - console.log( stayPositive( [ 10, -4, 3, 6 ] ) ); // [10, 3, 6] - console.log( stayPositive( [ -5, 11, -40, 30.3, -2 ] ) ); // [11, 30.3] - console.log( stayPositive( [ -11, -30 ] ) ); // [] - console.log( "river" + "town" ); - console.log( "cat" + "dog" ); - console.log( "New" + " York" ); - console.log( "runner's knee" + "!" ); - console.log( "man" + "bear" + "pig" ); - // Write a function `stringIterate` that accepts a string as an argument. The function should print out - // each character of the string, one by one. The function doesn't need to return any value. It should - // just print to the terminal. - - let stringIterate = function ( string ) { - for ( let i = 0; i < string.length; i++ ) { - console.log( string[ i ] ); - } - }; - - stringIterate( "celery" ); - // prints - // c - // e - // l - // e - // r - // y - - stringIterate( "hat" ); - // prints - // h - // a - // t - // Write a function named `stringRepeater(str, num)` that accepts a string and a number as arguments. - // The function should return a new string consisting of the `str` repeated `num` number of times. - - let stringRepeater = function ( str, num ) { - let repeatedStr = ''; - - for ( let i = 1; i <= num; i++ ) { - repeatedStr += str - } - - return repeatedStr; - }; - - console.log( stringRepeater( "q", 4 ) ); // 'qqqq' - console.log( stringRepeater( "go", 2 ) ); // 'gogo' - console.log( stringRepeater( "tac", 3 ) ); // 'tactactac' - // Write a function `stringSize` that accepts a string as an argument. The function should return the - // string 'small' if the argument is shorter than 5 characters, 'medium' if it is exactly 5 characters, and - // 'large' if it is longer than 5 characters. - - let stringSize = function ( str ) { - if ( str.length < 5 ) { - return 'small'; - } else if ( str.length > 5 ) { - return 'large'; - } else { - return 'medium'; - } - }; - - console.log( stringSize( "cat" ) ); // 'small' - console.log( stringSize( "bell" ) ); // 'small' - console.log( stringSize( "ready" ) ); // 'medium' - console.log( stringSize( "shirt" ) ); // 'medium' - console.log( stringSize( "shallow" ) ); // 'large' - console.log( stringSize( "intelligence" ) ); // 'large' - // Write a function `stringsToLengths` that accepts an array of strings as an argument. The function - // should return a new array containing the lengths of the elements of the original array. - - let stringsToLengths = function ( words ) { - let lengths = []; - - for ( let i = 0; i < words.length; i++ ) { - lengths.push( words[ i ].length ); - } - - return lengths; - }; - - console.log( stringsToLengths( [ "belly", "echo", "irony", "pickled" ] ) ); - // [5, 4, 5, 7] - - console.log( stringsToLengths( [ "on", "off", "handmade" ] ) ); - // [2, 3, 8] - // Write a function named `sumUpTo(max)` that accepts a max number as an argument. The function should - // return the total sum of all whole numbers from 1 to the max, inclusive. - // - // For example, sumUpTo(4) should return 10 because 1 + 2 + 3 + 4 = 10. - - let sumUpTo = function ( max ) { - let sum = 0; - - for ( let i = 1; i <= max; i++ ) { - sum += i - } - - return sum; - }; - - console.log( sumUpTo( 4 ) ); // 10 - console.log( sumUpTo( 5 ) ); // 15 - console.log( sumUpTo( 2 ) ); // 3 - console.log( 'coffee' ); - let qty = 15 % 4; - console.log( qty ); // 3 - - let num = 38 + 3; - num++; - console.log( num + " is a great number" ); // '42 is a great number' - - let isNumEven = num % 2 === 0; - console.log( num + " is even? " + isNumEven ); // '42 is even? true' - - let isQtyEven = qty % 2 === 0; - console.log( qty + " is even? " + isQtyEven ); // '3 is even? false' - let qty = 15 % 4; - console.log( qty ); // 3 - - let num = 38 + 3; - num++; - console.log( num + " is a great number" ); // '42 is a great number' - - let isNumEven = num % 2 === 0; - console.log( num + " is even? " + isNumEven ); // '42 is even? true' - - let isQtyEven = qty % 2 === 0; - console.log( qty + " is even? " + isQtyEven ); // '3 is even? false' - // Write a function `totalProduct(array)` that accepts a 2D array of numbers. The function should return - // the total product of all numbers in the array. - - let totalProduct = function ( array ) { - let product = 1; - - for ( let i = 0; i < array.length; i++ ) { - let subarray = array[ i ]; - - for ( let j = 0; j < subarray.length; j++ ) { - product *= subarray[ j ]; - } - } - - return product; - }; - - let array1 = [ - [ 3, 5, 2 ], - [ 6, 2 ], - ]; - console.log( totalProduct( array1 ) ); // 360 - - let array2 = [ - [ 4, 6 ], - [ 2, 3 ], - [ 1, 2 ], - ]; - console.log( totalProduct( array2 ) ); // 288 - // Write a function `total` that accepts an array of numbers as an argument. The function should return - // the total sum of all elements of the array. - - let total = function ( numbers ) { - let sum = 0; - for ( let i = 0; i < numbers.length; i++ ) { - sum += numbers[ i ]; - } - return sum; - }; - - console.log( total( [ 3, 2, 8 ] ) ); // 13 - console.log( total( [ -5, 7, 4, 6 ] ) ); // 12 - console.log( total( [ 7 ] ) ); // 7 - console.log( total( [] ) ); // 0 - let apple; - console.log( apple ); // undefined - - apple = 5; - console.log( apple ); // 5 - - apple + 1; - console.log( apple ); // 5 - - apple += 1; - console.log( apple ); // 6 - - let banana = apple; - console.log( banana ); // 6 - - banana = banana / 2; - console.log( banana ); // 3 - - console.log( apple ); // 6 - // Write a function `twoSumPairs(numbers, target)` that accepts an array of numbers and a target number - // as arguments. The function should return a 2D array containing all unique pairs of elements that - // sum to the target. - - let twoSumPairs = function ( numbers, target ) { - let pairs = []; - - for ( let i = 0; i < numbers.length; i++ ) { - let num1 = numbers[ i ]; - - for ( let j = i + 1; j < numbers.length; j++ ) { - let num2 = numbers[ j ]; - - if ( num1 + num2 === target ) { - let pair = [ num1, num2 ]; - pairs.push( pair ); - } - } - } - - return pairs; - }; - - console.log( twoSumPairs( [ 2, 3, 4, 6, 5 ], 8 ) ); // [ [2, 6], [3, 5] ] - console.log( twoSumPairs( [ 10, 7, 4, 5, 2 ], 12 ) ); // [ [10, 2], [7, 5] ] - console.log( twoSumPairs( [ 3, 9, 8 ], 11 ) ); // [ [3, 8] ] - console.log( twoSumPairs( [ 3, 9, 8 ], 10 ) ); // [ ] - // Write a function `twoSum(numbers, target)` that accepts an array of numbers and a target number - // as an argument. The function should return a boolean indicating whether or not there exists a pair - // of distinct elements in the array that sum to the target. - - let twoSum = function ( numbers, target ) { - for ( let i = 0; i < numbers.length; i++ ) { - for ( let j = i + 1; j < numbers.length; j++ ) { - if ( numbers[ i ] + numbers[ j ] === target ) { - return true; - } - } - } - - return false; - }; - - console.log( twoSum( [ 2, 3, 5, 9 ], 7 ) ); // true - console.log( twoSum( [ 2, 3, 5, 9 ], 4 ) ); // false - console.log( twoSum( [ 6, 3, 4 ], 10 ) ); // true - console.log( twoSum( [ 6, 5, 1 ], 10 ) ); // false - let apple; - console.log( apple ); // undefined - - apple = 5; - console.log( apple ); // 5 - - apple + 1; - console.log( apple ); // 5 - - apple += 1; - console.log( apple ); // 6 - - let banana = apple; - console.log( banana ); // 6 - - banana = banana / 2; - console.log( banana ); // 3 - - console.log( apple ); // 6 - // Write a function `wackyWord` that accepts two strings as arguments. The function should return a new - // string containing the first three characters of the first string concatenated with the last two - // character of the second string. - - // You can assume that the first argument has a length of at least three and the second argument has a - // length of at least two. - - - let wackyWord = function ( str1, str2 ) { - return str1.slice( 0, 3 ) + str2.slice( -2 ); - }; - - console.log( wackyWord( "very", "kindly" ) ); // 'verly' - console.log( wackyWord( "forever", "sick" ) ); // 'forck' - console.log( wackyWord( "cellar", "door" ) ); // 'celor' - console.log( wackyWord( "bagel", "sweep" ) ); // 'bagep' - console.log( 'alvin' ); - console.log( 'z' ); - // Write a function `wordCount(sentence, targetWords)` that accepts a sentence string and an array of - // `targetWords`. The function should return a count of the number of words of the sentence that are - // in `targetWords`. - - let wordCount = function ( sentence, targetWords ) { - let words = sentence.split( ' ' ); - let count = 0; - - for ( let i = 0; i < words.length; i++ ) { - let word = words[ i ]; - - if ( targetWords.includes( word ) ) { - count++; - } - } - - return count; - }; - - console.log( wordCount( "open the window please", [ "please", "open", "sorry" ] ) ); // 2 - console.log( wordCount( "drive to the cinema", [ "the", "driver" ] ) ); // 1 - console.log( wordCount( "can I have that can", [ "can", "I" ] ) ); // 3 - // Write a function `yourAverageFunction` that accepts an array of numbers as an argument. The - // function should return the average of all elements of the array. If the input array is empty, - // then the function should return null. - - let yourAverageFunction = function ( nums ) { - if ( nums.length === 0 ) { - return null; - } - - let sum = 0; - for ( let i = 0; i < nums.length; i++ ) { - sum += nums[ i ]; - } - - return sum / nums.length; - }; - - console.log( yourAverageFunction( [ 5, 2, 7, 24 ] ) ); // 9.5 - console.log( yourAverageFunction( [ 100, 6 ] ) ); // 53 - console.log( yourAverageFunction( [ 31, 32, 40, 12, 33 ] ) ); // 29.6 - console.log( yourAverageFunction( [] ) ); // null - let location = "Brooklyn, " + "NY"; - console.log( location ); // 'Brooklyn, NY' - - let quantity = 4 * 5 + 1; - console.log( quantity ); // 21 - let location = "Brooklyn, " + "NY"; - console.log( location ); // 'Brooklyn, NY' - - let quantity = 4 * 5 + 1; - console.log( quantity ); // 21 - // Write a function `zipper` that accepts two arrays as arguments. The function should return a 2D - // array containing pairs of elements at the same indices. - - - let zipper = function ( arr1, arr2 ) { - let result = []; - - for ( let i = 0; i < arr1.length; i++ ) { - let el1 = arr1[ i ]; - let el2 = arr2[ i ]; - let pair = [ el1, el2 ]; - result.push( pair ); - } - - return result; - }; - - let array1 = [ "a", "b", "c", "d" ]; - let array2 = [ -1, -2, -3, -4 ]; - console.log( zipper( array1, array2 ) ); - // [ - // ['a', -1], - // ['b', -2], - // ['c', -3], - // ['d', -4], - // ] - - let array3 = [ "whisper", "talk", "shout" ]; - let array4 = [ "quiet", "normal", "loud" ]; - console.log( zipper( array3, array4 ) ); - // [ - // ['whisper', 'quiet'], - // ['talk', 'normal'], - // ['shout', 'loud'], - // ] diff --git a/javascript-practice/-ALL-JS-Files/a-tedious-task.js b/javascript-practice/-ALL-JS-Files/a-tedious-task.js deleted file mode 100644 index 2f4ff1d..0000000 --- a/javascript-practice/-ALL-JS-Files/a-tedious-task.js +++ /dev/null @@ -1,3 +0,0 @@ -let str = 'MIICWwIBAAKBgGEdLjFEFbegPZ2AwJWkalksXr7PzWL7wIc7pOFZxXwYPWtQxvANyceCwpkqbPLsfEx7nqxAris2hYOdeN1OTFqvTyNmVuzbUPcXShn6ZoDCB30voHkeu4F3cUw5RQEUDdLscSnv4HMxHam5qgl6vXoumVNHbjyKA5UtAnfjAgMBAAECgYAmjEyvpZTxRJvwjxDi1VaZevFI0Hd4WPH9PAGgqdnH84vGXnAGFj1WikqKYcqKMQW2kdjAsWwH9D9FfrkIcDDHdZ9XuGSGkFzWtOwajWMQl7qNV1hZ288gdpIQQMOTLDgauZY6pw1cV7h4v316qJB8knQGoBNpJCfTYQJBAKV1ctsJq0Zg4QumD2hyODepP3LfLeaQsERLqVAWeuOuTY5mK5gIwsSqvcSVfY7Ze1FWIsApNFRv67azKcJPwsCQQCNlyApZFJEVNY70Er7Uu5NL9t4CYJJC9uVVkoEHEY6d7sVslqa0vP2q0zXx9YedbMBvQjxXIbY0waXUy63FvoBGJAkB3OTJWUjVgzDY1Br5wu2Yu59NjKVKLWzCsu1gaCNBfhVDX7SyIyC9EYKRfUAoQxwsmPWPyQ9QVG4WKcPZJAkBRheAotPCBE2RLHHfvpiStnMhX0UXdVyaJp5tcZ6wYV61ohyBvCOkYhUxBJzeIGrVZcvLZSLeUzXoqRPpxQxAkEAkdCZXF0gHahpZgF5y0wWcqf9ECRT1E4Hv8bk3Mf0Exp2aW34JeI6I7Xqd1NV4I9H7prQ8m3y39lFwWO8PmQ'; - -console.log( str.indexOf( 'HEY' ) ); diff --git a/javascript-practice/-ALL-JS-Files/age.js b/javascript-practice/-ALL-JS-Files/age.js deleted file mode 100644 index 5b8af33..0000000 --- a/javascript-practice/-ALL-JS-Files/age.js +++ /dev/null @@ -1 +0,0 @@ -console.log( 0 ); diff --git a/javascript-practice/-ALL-JS-Files/alternating-caps.js b/javascript-practice/-ALL-JS-Files/alternating-caps.js deleted file mode 100644 index 22d4ad6..0000000 --- a/javascript-practice/-ALL-JS-Files/alternating-caps.js +++ /dev/null @@ -1,21 +0,0 @@ -// Write a function `alternatingCaps` that accepts a sentence string as an argument. The function should -// return the sentence where words alternate between lowercase and uppercase. - -let alternatingCaps = function ( sentence ) { - let words = sentence.split( ' ' ); - let newWords = []; - - for ( let i = 0; i < words.length; i++ ) { - let word = words[ i ]; - if ( i % 2 === 0 ) { - newWords.push( word.toLowerCase() ); - } else { - newWords.push( word.toUpperCase() ); - } - } - - return newWords.join( ' ' ); -}; - -console.log( alternatingCaps( "take them to school" ) ); // 'take THEM to SCHOOL' -console.log( alternatingCaps( "What did ThEy EAT before?" ) ); // 'what DID they EAT before?' diff --git a/javascript-practice/-ALL-JS-Files/appendir.js b/javascript-practice/-ALL-JS-Files/appendir.js deleted file mode 100644 index d587d22..0000000 --- a/javascript-practice/-ALL-JS-Files/appendir.js +++ /dev/null @@ -1,7 +0,0 @@ -//APPEND-DIR.js -const fs = require( 'fs' ); -let cat = require( 'child_process' ).execSync( 'cat *' ).toString( 'UTF-8' ); - -fs.writeFile( 'output.md', cat, ( err ) => { - if ( err ) throw err; -} ); diff --git a/javascript-practice/-ALL-JS-Files/average-of-four.js b/javascript-practice/-ALL-JS-Files/average-of-four.js deleted file mode 100644 index 7383af4..0000000 --- a/javascript-practice/-ALL-JS-Files/average-of-four.js +++ /dev/null @@ -1,12 +0,0 @@ -git // Write a function `averageOfFour(num1, num2, num3, num4)` that accepts four numbers as arguments. The -// function should return the average of all four numbers. - -let averageOfFour = function ( num1, num2, num3, num4 ) { - let sum = num1 + num2 + num3 + num4; - return sum / 4; -}; - -console.log( averageOfFour( 10, 4, 12, 3 ) ); // 7.25 -console.log( averageOfFour( -20, 50, 4, 21 ) ); // 13.75 -console.log( averageOfFour( 10, 4, 12, 3 ) ); // 7.25 -console.log( averageOfFour( 5, 5, 3, 7 ) ); // 5 diff --git a/javascript-practice/-ALL-JS-Files/average.js b/javascript-practice/-ALL-JS-Files/average.js deleted file mode 100644 index 194bb5f..0000000 --- a/javascript-practice/-ALL-JS-Files/average.js +++ /dev/null @@ -1,10 +0,0 @@ -// Write a function `average` that accepts three numbers as arguments. The function should return the -// average of the three numbers. - -let average = function ( num1, num2, num3 ) { - return ( num1 + num2 + num3 ) / 3; -}; - -console.log( average( 3, 10, 8 ) ); // 7 -console.log( average( 10, 5, 12 ) ); // 9 -console.log( average( 6, 20, 40 ) ); // 22 diff --git a/javascript-practice/-ALL-JS-Files/bleep-vowels.js b/javascript-practice/-ALL-JS-Files/bleep-vowels.js deleted file mode 100644 index eb0e46b..0000000 --- a/javascript-practice/-ALL-JS-Files/bleep-vowels.js +++ /dev/null @@ -1,24 +0,0 @@ -// Write a function `bleepVowels` that accepts a string as an argument. The function should return -// a new string where all vowels are replaced with `*`s. Vowels are the letters a, e, i, o, u. - -let bleepVowels = function ( str ) { - let vowels = [ "a", "e", "i", "o", "u" ]; - let bleeped = ""; - - for ( let i = 0; i < str.length; i++ ) { - let char = str[ i ]; - - if ( vowels.indexOf( char ) > -1 ) { - bleeped += "*"; - } else { - bleeped += char; - } - } - - return bleeped; -}; - -console.log( bleepVowels( "skateboard" ) ); // 'sk*t*b**rd' -console.log( bleepVowels( "slipper" ) ); // 'sl*pp*r' -console.log( bleepVowels( "range" ) ); // 'r*ng*' -console.log( bleepVowels( "brisk morning" ) ); // 'br*sk m*rn*ng' diff --git a/javascript-practice/-ALL-JS-Files/boolean-expressions.js b/javascript-practice/-ALL-JS-Files/boolean-expressions.js deleted file mode 100644 index 49cd506..0000000 --- a/javascript-practice/-ALL-JS-Files/boolean-expressions.js +++ /dev/null @@ -1,19 +0,0 @@ -console.log( false ); // false -console.log( !true ); // false -console.log( !false ); // true -console.log( !!true ); // true - -console.log( false && false ); // false -console.log( false && true ); // false -console.log( true && false ); // false -console.log( true && true ); // true - -console.log( false || false ); // false -console.log( false || true ); // true -console.log( true || false ); // true -console.log( true || true ); // true - -console.log( !false || false ); // true -console.log( false || ( true && true ) ); // true -console.log( false || !( true && true ) ); // false -console.log( !true && ( true ) ); // false diff --git a/javascript-practice/-ALL-JS-Files/case-changer.js b/javascript-practice/-ALL-JS-Files/case-changer.js deleted file mode 100644 index 66a8c66..0000000 --- a/javascript-practice/-ALL-JS-Files/case-changer.js +++ /dev/null @@ -1,16 +0,0 @@ -// Write a function `caseChange` that accepts a string and a boolean as arguments. The function should -// return the uppercase version of the string if the boolean is true. The function should return the -// lowercase version of the string if the boolean is false. - -let caseChange = function ( str, shouldUpperCase ) { - if ( shouldUpperCase ) { - return str.toUpperCase(); - } else { - return str.toLowerCase(); - } -}; - -console.log( caseChange( "Super", true ) ); // 'SUPER' -console.log( caseChange( "Super", false ) ); // 'super' -console.log( caseChange( "tAmBourine", true ) ); // 'TAMBOURINE' -console.log( caseChange( "tAmBourine", false ) ); // 'tambourine' diff --git a/javascript-practice/-ALL-JS-Files/censor-e.js b/javascript-practice/-ALL-JS-Files/censor-e.js deleted file mode 100644 index 1fe7ea5..0000000 --- a/javascript-practice/-ALL-JS-Files/censor-e.js +++ /dev/null @@ -1,23 +0,0 @@ -// Write a function `censorE` that accepts a string as an argument. The function should return the a new -// version of string where all characters that are 'e's are replaced with '*'s. - -let censorE = function ( str ) { - let newStr = ''; - - for ( let i = 0; i < str.length; i++ ) { - let char = str[ i ]; - - if ( char === 'e' ) { - newStr += '*'; - } else { - newStr += char; - } - } - - return newStr; -}; - -console.log( censorE( "speedy" ) ); // 'sp**dy' -console.log( censorE( "pending" ) ); // 'p*nding' -console.log( censorE( "scene" ) ); // 'sc*n*' -console.log( censorE( "heat" ) ); // 'h*at' diff --git a/javascript-practice/-ALL-JS-Files/choose-divisibles.js b/javascript-practice/-ALL-JS-Files/choose-divisibles.js deleted file mode 100644 index 4c9b08e..0000000 --- a/javascript-practice/-ALL-JS-Files/choose-divisibles.js +++ /dev/null @@ -1,21 +0,0 @@ -// Write a function `chooseDivisibles(numbers, target)` that accepts an array of numbers and a -// target number as arguments. The function should return an array containing elements of the original -// array that are divisible by the target. - -let chooseDivisibles = function ( numbers, target ) { - let divisibles = []; - - for ( let i = 0; i < numbers.length; i++ ) { - let num = numbers[ i ]; - - if ( num % target === 0 ) { - divisibles.push( num ); - } - } - - return divisibles; -}; - -console.log( chooseDivisibles( [ 40, 7, 22, 20, 24 ], 4 ) ); // [40, 20, 24] -console.log( chooseDivisibles( [ 9, 33, 8, 17 ], 3 ) ); // [9, 33] -console.log( chooseDivisibles( [ 4, 25, 1000 ], 10 ) ); // [1000] diff --git a/javascript-practice/-ALL-JS-Files/common-elements.js b/javascript-practice/-ALL-JS-Files/common-elements.js deleted file mode 100644 index d9da9a4..0000000 --- a/javascript-practice/-ALL-JS-Files/common-elements.js +++ /dev/null @@ -1,25 +0,0 @@ -// Write a function `commonElements` that accepts two arrays as arguments. The function should return -// a new array containing the elements that are found in both of the input arrays. The order of -// the elements in the output array doesn't matter as long as the function returns the correct elements. - -let commonElements = function ( array1, array2 ) { - let common = []; - - for ( let i = 0; i < array1.length; i++ ) { - let ele = array1[ i ]; - - if ( array2.includes( ele ) ) { - common.push( ele ); - } - } - - return common; -}; - -let arr1 = [ "a", "c", "d", "b" ]; -let arr2 = [ "b", "a", "y" ]; -console.log( commonElements( arr1, arr2 ) ); // ['a', 'b'] - -let arr3 = [ 4, 7 ]; -let arr4 = [ 32, 7, 1, 4 ]; -console.log( commonElements( arr3, arr4 ) ); // [4, 7] diff --git a/javascript-practice/-ALL-JS-Files/comparisons.js b/javascript-practice/-ALL-JS-Files/comparisons.js deleted file mode 100644 index d7565ce..0000000 --- a/javascript-practice/-ALL-JS-Files/comparisons.js +++ /dev/null @@ -1,20 +0,0 @@ -console.log( true === false ); // false -console.log( false === false ); // true -console.log( false !== true ); // true -console.log( !true === false ); // true - -console.log( 2 + 3 === 5 ); // true -console.log( 4 < 0 ); // false -console.log( 10 >= 10 ); // true -console.log( 10.3 >= 10 ); // true - -console.log( 100 / 2 === 50 ); // true -console.log( 100 % 2 === 0 ); // true -console.log( 11 % 2 === 0 ); // false -console.log( 7.0 === 7 ); // true - -console.log( 13 % 5 > 0 ); // true -console.log( "potato" === "potato" ); // true -console.log( "Tomato" === "tomato" ); // false -console.log( "42" === 42 ); // false -console.log( 5 > 3 && 1 === 0 ); // false diff --git a/javascript-practice/-ALL-JS-Files/contains.js b/javascript-practice/-ALL-JS-Files/contains.js deleted file mode 100644 index 1a8c7ae..0000000 --- a/javascript-practice/-ALL-JS-Files/contains.js +++ /dev/null @@ -1,15 +0,0 @@ -t // Write a function `contains(str1, str2)` that accepts two strings as arguments. The function should -// return a boolean indicating whether or not `str2` is contained within `str1`. The function should -// ignore any differences in capitalization. - -let contains = function ( str1, str2 ) { - let lowerStr1 = str1.toLowerCase(); - let lowerStr2 = str2.toLowerCase(); - return lowerStr1.indexOf( lowerStr2 ) > -1; -}; - -console.log( contains( "caterpillar", "pill" ) ); // true -console.log( contains( "lion's share", "on" ) ); // true -console.log( contains( "SORRY", "or" ) ); // true -console.log( contains( "tangent", "gem" ) ); // false -console.log( contains( "clock", "ok" ) ); // false diff --git a/javascript-practice/-ALL-JS-Files/count-up.js b/javascript-practice/-ALL-JS-Files/count-up.js deleted file mode 100644 index 25fae41..0000000 --- a/javascript-practice/-ALL-JS-Files/count-up.js +++ /dev/null @@ -1,23 +0,0 @@ -// Write a function `countUp(max)` that accepts a max number as an argument. The function should print -// all numbers from 1 up to and including the max. The function doesn't need to return any value. It -// should just print to the terminal. - -let countUp = function ( max ) { - for ( let i = 1; i <= max; i++ ) { - console.log( i ); - } -}; - -countUp( 5 ); -// prints -// 1 -// 2 -// 3 -// 4 -// 5 - -countUp( 3 ); -// prints -// 1 -// 2 -// 3 diff --git a/javascript-practice/-ALL-JS-Files/dare-to-decipher.js b/javascript-practice/-ALL-JS-Files/dare-to-decipher.js deleted file mode 100644 index af0c136..0000000 --- a/javascript-practice/-ALL-JS-Files/dare-to-decipher.js +++ /dev/null @@ -1,18 +0,0 @@ -let phrase = "that's all folks"; -console.log( phrase[ phrase.length ] ); // undefined -console.log( phrase[ phrase.length - 1 ] ); // s -console.log( phrase[ phrase.length - 2 ] ); // k - -const i = 9; -const char = phrase[ i ]; -console.log( char ); // l -console.log( phrase.indexOf( char ) ); // 8 -console.log( phrase.slice( 2, 8 ) ); // at's a - -console.log( "abcdefg".slice( 1, 3 ) ); // bc -console.log( "abcdefg".slice( 2 ) ); // cdefg -console.log( "abcdefg".slice( 4 ) ); // efg - - -console.log( "abcdefg".slice( 2, -1 ) ); // cdef -console.log( "abcdefg".slice( 2, -2 ) ); // cde diff --git a/javascript-practice/-ALL-JS-Files/div-by-either.js b/javascript-practice/-ALL-JS-Files/div-by-either.js deleted file mode 100644 index 7b008cd..0000000 --- a/javascript-practice/-ALL-JS-Files/div-by-either.js +++ /dev/null @@ -1,29 +0,0 @@ -// Write a function named `divByEither(num1, num2, max)` that accepts three numbers as arguments. -// The function should print out all positive numbers less than max that are divisible by num1 or num2. -// The function doesn't need to return any value. It should just print to the terminal. - -let divByEither = function ( num1, num2, max ) { - for ( let i = 1; i < max; i++ ) { - if ( i % num1 === 0 || i % num2 === 0 ) { - console.log( i ); - } - } -}; - -divByEither( 4, 3, 16 ); -// prints -// 3 -// 4 -// 6 -// 8 -// 9 -// 12 -// 15 - -divByEither( 7, 5, 20 ); -// prints -// 5 -// 7 -// 10 -// 14 -// 15 diff --git a/javascript-practice/-ALL-JS-Files/divisible-range.js b/javascript-practice/-ALL-JS-Files/divisible-range.js deleted file mode 100644 index 9bfdb29..0000000 --- a/javascript-practice/-ALL-JS-Files/divisible-range.js +++ /dev/null @@ -1,23 +0,0 @@ -// Write a function `divisibleRange(min, max, num)` that accepts three numbers as arguments. The -// function should print all numbers between `min` and `max` (exclusive) that are also divisible by -// num. - -let divisibleRange = function ( min, max, num ) { - for ( let i = min + 1; i < max; i++ ) { - if ( i % num === 0 ) { - console.log( i ); - } - } -}; - -divisibleRange( 17, 40, 9 ); -// prints -// 18 -// 27 -// 36 - -divisibleRange( 10, 24, 4 ); -// prints -// 12 -// 16 -// 20 diff --git a/javascript-practice/-ALL-JS-Files/divisible.js b/javascript-practice/-ALL-JS-Files/divisible.js deleted file mode 100644 index a37f1b0..0000000 --- a/javascript-practice/-ALL-JS-Files/divisible.js +++ /dev/null @@ -1,21 +0,0 @@ -// Write a function `divisible(num1, num2)` that accepts two numbers as arguments. The function should -// return a boolean indicating whether or not `num1` is divisible by `num2`. - -let divisible = function ( num1, num2 ) { - return num1 % num2 === 0; -}; - -// let divisible = function (num1, num2) { -// if (num1 % num2 === 0) { -// return true; -// } else { -// return false; -// } -// }; - -console.log( divisible( 12, 3 ) ); // true -console.log( divisible( 12, 5 ) ); // false -console.log( divisible( 60, 4 ) ); // true -console.log( divisible( 60, 11 ) ); // false -console.log( divisible( 21, 7 ) ); // true -console.log( divisible( 21, 6 ) ); // false diff --git a/javascript-practice/-ALL-JS-Files/divisors.js b/javascript-practice/-ALL-JS-Files/divisors.js deleted file mode 100644 index e68c6d5..0000000 --- a/javascript-practice/-ALL-JS-Files/divisors.js +++ /dev/null @@ -1,18 +0,0 @@ -// Write a function `divisors` that accepts a number as an argument. The function should return an -// array containing all positive numbers that can divide into the argument. - -let divisors = function ( n ) { - let numbers = []; - - for ( let i = 1; i <= n; i++ ) { - if ( n % i === 0 ) { - numbers.push( i ); - } - } - - return numbers; -}; - -console.log( divisors( 15 ) ); // [1, 3, 5, 15] -console.log( divisors( 7 ) ); // [1, 7] -console.log( divisors( 24 ) ); // [1, 2, 3, 4, 6, 8, 12, 24] diff --git a/javascript-practice/-ALL-JS-Files/ends-in-ly.js b/javascript-practice/-ALL-JS-Files/ends-in-ly.js deleted file mode 100644 index 1a4ed86..0000000 --- a/javascript-practice/-ALL-JS-Files/ends-in-ly.js +++ /dev/null @@ -1,20 +0,0 @@ -g // Write a function `endsInLy` that accepts a string as an argument and returns a boolean indicating -// whether or not the string ends in the substring 'ly'. - -let endsInLy = function ( str ) { - let secondLast = str[ str.length - 2 ]; - let last = str[ str.length - 1 ]; - - return secondLast === 'l' && last === 'y'; -}; - -// let endsInLy = function (str) { -// return str.endsWith('ly'); -// }; - -console.log( endsInLy( "pretty" ) ); // false -console.log( endsInLy( "instant" ) ); // false -console.log( endsInLy( "analytic" ) ); // false -console.log( endsInLy( "timidly" ) ); // true -console.log( endsInLy( "fly" ) ); // true -console.log( endsInLy( "gallantly" ) ); // true diff --git a/javascript-practice/-ALL-JS-Files/ends-with-t.js b/javascript-practice/-ALL-JS-Files/ends-with-t.js deleted file mode 100644 index b5e0468..0000000 --- a/javascript-practice/-ALL-JS-Files/ends-with-t.js +++ /dev/null @@ -1,13 +0,0 @@ -// Write a function `endsWithT` that accepts a string as an argument. The function should return a -// boolean indicating whether or not the string ends with the character 't'. - -let endsWithT = function ( str ) { - let lastChar = str[ str.length - 1 ]; - return lastChar === 't'; -}; - - -console.log( endsWithT( "smart" ) ); // true -console.log( endsWithT( "racket" ) ); // true -console.log( endsWithT( "taco" ) ); // false -console.log( endsWithT( "boomerang" ) ); // false diff --git a/javascript-practice/-ALL-JS-Files/evens.js b/javascript-practice/-ALL-JS-Files/evens.js deleted file mode 100644 index 4824d72..0000000 --- a/javascript-practice/-ALL-JS-Files/evens.js +++ /dev/null @@ -1,24 +0,0 @@ -// Write a function `evens(max)` that accepts a max number as an argument. The function should print -// all positive even numbers that are less than the max. - -let evens = function ( max ) { - for ( let i = 1; i < max; i++ ) { - if ( i % 2 === 0 ) { - console.log( i ); - } - } -}; - -evens( 11 ); -// prints -// 2 -// 4 -// 6 -// 8 -// 10 - -evens( 8 ); -// prints -// 2 -// 4 -// 6 diff --git a/javascript-practice/-ALL-JS-Files/filter-long-words.js b/javascript-practice/-ALL-JS-Files/filter-long-words.js deleted file mode 100644 index 8147110..0000000 --- a/javascript-practice/-ALL-JS-Files/filter-long-words.js +++ /dev/null @@ -1,22 +0,0 @@ -// Write a function `filterLongWords` that accepts an array of strings as an argument. The function -// should return a new array containing only the strings that are less than 5 characters long. - -let filterLongWords = function ( words ) { - let chosenWords = []; - - for ( let i = 0; i < words.length; i++ ) { - let word = words[ i ]; - - if ( word.length < 5 ) { - chosenWords.push( word ); - } - } - - return chosenWords; -}; - -console.log( filterLongWords( [ "kale", "cat", "retro", "axe", "heirloom" ] ) ); -// ['kale', 'cat', 'axe'] - -console.log( filterLongWords( [ "disrupt", "pour", "trade", "pic" ] ) ); -// ['pour', 'pic'] diff --git a/javascript-practice/-ALL-JS-Files/five-multiples-of.js b/javascript-practice/-ALL-JS-Files/five-multiples-of.js deleted file mode 100644 index 49ff190..0000000 --- a/javascript-practice/-ALL-JS-Files/five-multiples-of.js +++ /dev/null @@ -1,25 +0,0 @@ -// Write a function named `fiveMultiplesOf` that accepts a number as an argument. The function should -// print out the first five multiples of the given number. The function doesn't need to return any -// value. It should just print to the terminal. - -let fiveMultiplesOf = function ( num ) { - for ( let i = 1; i <= 5; i++ ) { - console.log( i * num ); - } -}; - -fiveMultiplesOf( 7 ); -// prints -// 7 -// 14 -// 21 -// 28 -// 35 - -fiveMultiplesOf( 3 ); -// prints -// 3 -// 6 -// 9 -// 12 -// 15 diff --git a/javascript-practice/-ALL-JS-Files/fizz-buzz.js b/javascript-practice/-ALL-JS-Files/fizz-buzz.js deleted file mode 100644 index 6143ec2..0000000 --- a/javascript-practice/-ALL-JS-Files/fizz-buzz.js +++ /dev/null @@ -1,37 +0,0 @@ -// Write a function `fizzBuzz` that accepts a max number as an argument. The function should -// print all numbers less than or equal to max that are divisible by either 3 or 5 but not both 3 -// and 5. The function doesn't need to return any value. It should just print to the terminal. - -let fizzBuzz = function ( max ) { - for ( let i = 1; i <= max; i++ ) { - if ( ( i % 3 === 0 || i % 5 === 0 ) && !( i % 3 === 0 && i % 5 === 0 ) ) { - console.log( i ); - } - } -}; - -fizzBuzz( 18 ); -// prints -// 3 -// 5 -// 6 -// 9 -// 10 -// 12 -// 18 - -fizzBuzz( 33 ); -// prints -// 3 -// 5 -// 6 -// 9 -// 10 -// 12 -// 18 -// 20 -// 21 -// 24 -// 25 -// 27 -// 33 diff --git a/javascript-practice/-ALL-JS-Files/four.js b/javascript-practice/-ALL-JS-Files/four.js deleted file mode 100644 index 9a1e0a2..0000000 --- a/javascript-practice/-ALL-JS-Files/four.js +++ /dev/null @@ -1,5 +0,0 @@ -let movie = 'Fight Club'; - -let views = 4; - -console.log( 'I watched ' + movie + ' about ' + views + ' number of times' ); diff --git a/javascript-practice/-ALL-JS-Files/funny-sound.js b/javascript-practice/-ALL-JS-Files/funny-sound.js deleted file mode 100644 index c2e141a..0000000 --- a/javascript-practice/-ALL-JS-Files/funny-sound.js +++ /dev/null @@ -1,13 +0,0 @@ -// Write a function `funnySound` that accepts two strings as arguments. The function should return a -// new string containing the first three characters of both strings concatenated together. - -// You can assume that the arguments are both at least three characters long. - -let funnySound = function ( str1, str2 ) { - return str1.slice( 0, 3 ) + str2.slice( 0, 3 ); -}; - -console.log( funnySound( "tiger", "spoon" ) ); // 'tigspo' -console.log( funnySound( "computer", "phone" ) ); // 'compho' -console.log( funnySound( "skate", "bottle" ) ); // 'skabot' -console.log( funnySound( "frog", "ashtray" ) ); // 'froash' diff --git a/javascript-practice/-ALL-JS-Files/greeting.js b/javascript-practice/-ALL-JS-Files/greeting.js deleted file mode 100644 index 847f0fc..0000000 --- a/javascript-practice/-ALL-JS-Files/greeting.js +++ /dev/null @@ -1 +0,0 @@ -console.log( 'hello world' ); diff --git a/javascript-practice/-ALL-JS-Files/half.js b/javascript-practice/-ALL-JS-Files/half.js deleted file mode 100644 index 3166481..0000000 --- a/javascript-practice/-ALL-JS-Files/half.js +++ /dev/null @@ -1,10 +0,0 @@ -// Write a function `half` that accepts a number as an argument. The function should return half of the -// number. - -let half = function ( n ) { - return n / 2; -}; - -console.log( half( 8 ) ); // 4 -console.log( half( 15 ) ); // 7.5 -console.log( half( 90 ) ); // 45 diff --git a/javascript-practice/-ALL-JS-Files/in-range.js b/javascript-practice/-ALL-JS-Files/in-range.js deleted file mode 100644 index 536fb97..0000000 --- a/javascript-practice/-ALL-JS-Files/in-range.js +++ /dev/null @@ -1,14 +0,0 @@ -gi // Write a function `inRange(min, max, n)` that accepts three numbers as arguments. The function should -// return a boolean indicating if `n` is between `min` and `max` inclusive. - -let inRange = function ( min, max, n ) { - return n >= min && n <= max; -}; - -console.log( inRange( 5, 13, 8 ) ); // true -console.log( inRange( 5, 13, 29 ) ); // false -console.log( inRange( 100, 125, 100 ) ); // true -console.log( inRange( 100, 125, 99 ) ); // false -console.log( inRange( 40, 45, 44 ) ); // true -console.log( inRange( 40, 45, 45 ) ); // true -console.log( inRange( 40, 45, 46 ) ); // false diff --git a/javascript-practice/-ALL-JS-Files/is-div-by-4.js b/javascript-practice/-ALL-JS-Files/is-div-by-4.js deleted file mode 100644 index 5da3346..0000000 --- a/javascript-practice/-ALL-JS-Files/is-div-by-4.js +++ /dev/null @@ -1,20 +0,0 @@ -// Write a function `isDivBy4` that accepts a number as an argument. The function should return a -// boolean indicating whether or not the number is divisible by 4. - -let isDivBy4 = function ( num ) { - if ( num % 4 === 0 ) { - return true; - } else { - return false; - } -}; - -// let isDivBy4 = function (num) { -// return num % 4 === 0; -// }; - -console.log( isDivBy4( 8 ) ); // true -console.log( isDivBy4( 12 ) ); // true -console.log( isDivBy4( 24 ) ); // true -console.log( isDivBy4( 9 ) ); // false -console.log( isDivBy4( 10 ) ); // false diff --git a/javascript-practice/-ALL-JS-Files/is-long.js b/javascript-practice/-ALL-JS-Files/is-long.js deleted file mode 100644 index 58f8937..0000000 --- a/javascript-practice/-ALL-JS-Files/is-long.js +++ /dev/null @@ -1,21 +0,0 @@ -// Write a function `isLong` that accepts a string as an argument. The function should return a boolean -// indicating whether or not the string is longer than 5 characters - -let isLong = function ( str ) { - return str.length > 5; -}; - -// let isLong = function (str) { -// if (str.length > 5) { -// return true; -// } else { -// return false; -// } -// }; - -console.log( isLong( "pie" ) ); // false -console.log( isLong( "kite" ) ); // false -console.log( isLong( "kitty" ) ); // false -console.log( isLong( "telescope" ) ); // true -console.log( isLong( "thermometer" ) ); // true -console.log( isLong( "restaurant" ) ); // true diff --git a/javascript-practice/-ALL-JS-Files/keep-it-quiet.js b/javascript-practice/-ALL-JS-Files/keep-it-quiet.js deleted file mode 100644 index e653576..0000000 --- a/javascript-practice/-ALL-JS-Files/keep-it-quiet.js +++ /dev/null @@ -1,10 +0,0 @@ -// Write a function `keepItQuiet` that accepts a string as an argument. The function should return the -// lowercase version of the string with 3 periods added to the end of it. - -let keepItQuiet = function ( str ) { - return str.toLowerCase() + '...'; -}; - -console.log( keepItQuiet( "HOORAY" ) ); // 'hooray...' -console.log( keepItQuiet( "Doggo" ) ); // 'doggo...' -console.log( keepItQuiet( "WHAT?!?!" ) ); // 'what?!?!...' diff --git a/javascript-practice/-ALL-JS-Files/larger.js b/javascript-practice/-ALL-JS-Files/larger.js deleted file mode 100644 index 766b32d..0000000 --- a/javascript-practice/-ALL-JS-Files/larger.js +++ /dev/null @@ -1,16 +0,0 @@ -// Write a function `larger` that accepts two numbers as arguments. The function should return the -// larger number. - -let larger = function ( num1, num2 ) { - if ( num1 > num2 ) { - return num1; - } else { - return num2; - } -}; - -console.log( larger( 256, 400 ) ); // 400 -console.log( larger( 31, 4 ) ); // 31 -console.log( larger( -6, 7 ) ); // 7 -console.log( larger( 11.3, 11.2 ) ); // 11.3 -console.log( larger( -10, -3 ) ); // -3 diff --git a/javascript-practice/-ALL-JS-Files/lengthiest-word.js b/javascript-practice/-ALL-JS-Files/lengthiest-word.js deleted file mode 100644 index ecc59b6..0000000 --- a/javascript-practice/-ALL-JS-Files/lengthiest-word.js +++ /dev/null @@ -1,23 +0,0 @@ -// Write a function `lengthiestWord` that accepts a sentence string as an argument. The function should -// return the longest word of the sentence. If there is a tie, return the word that appears later -// in the sentence. - -let lengthiestWord = function ( sentence ) { - let words = sentence.split( ' ' ); - let longest = words[ 0 ]; // pretty - - for ( let i = 1; i < words.length; i++ ) { - let word = words[ i ]; - if ( word.length >= longest.length ) { - longest = word; - } - } - - return longest; -}; - - -console.log( lengthiestWord( "I am pretty hungry" ) ); // 'hungry' -console.log( lengthiestWord( "we should think outside of the box" ) ); // 'outside' -console.log( lengthiestWord( "down the rabbit hole" ) ); // 'rabbit' -console.log( lengthiestWord( "simmer down" ) ); // 'simmer' diff --git a/javascript-practice/-ALL-JS-Files/longer.js b/javascript-practice/-ALL-JS-Files/longer.js deleted file mode 100644 index 139eb56..0000000 --- a/javascript-practice/-ALL-JS-Files/longer.js +++ /dev/null @@ -1,16 +0,0 @@ -// Write a function `longer` that accepts two strings as arguments. The function should return the -// string that is longer. If the strings have the same length, then return the first string. - -let longer = function ( str1, str2 ) { - if ( str1.length >= str2.length ) { - return str1; - } else { - return str2; - } -}; - -console.log( longer( "drum", "piranha" ) ); // 'piranha' -console.log( longer( "basket", "fork" ) ); // 'basket' -console.log( longer( "flannel", "sustainable" ) ); // 'sustainable' -console.log( longer( "disrupt", "ability" ) ); // 'disrupt' -console.log( longer( "bird", "shoe" ) ); // 'bird' diff --git a/javascript-practice/-ALL-JS-Files/make-acronym.js b/javascript-practice/-ALL-JS-Files/make-acronym.js deleted file mode 100644 index 3ec32ba..0000000 --- a/javascript-practice/-ALL-JS-Files/make-acronym.js +++ /dev/null @@ -1,19 +0,0 @@ -// Write a function `makeAcronym` that accepts a sentence string as an argument. The function should -// return a string containing the first character of each word in the sentence. - -let makeAcronym = function ( sentence ) { - let words = sentence.split( ' ' ); - let acronym = ''; - - for ( let i = 0; i < words.length; i++ ) { - let word = words[ i ]; - acronym += word[ 0 ]; - } - - return acronym.toUpperCase(); -}; - -console.log( makeAcronym( "New York" ) ); // NY -console.log( makeAcronym( "same stuff different day" ) ); // SSDD -console.log( makeAcronym( "Laugh out loud" ) ); // LOL -console.log( makeAcronym( "don't over think stuff" ) ); // DOTS diff --git a/javascript-practice/-ALL-JS-Files/make-matrix.js b/javascript-practice/-ALL-JS-Files/make-matrix.js deleted file mode 100644 index 410fc23..0000000 --- a/javascript-practice/-ALL-JS-Files/make-matrix.js +++ /dev/null @@ -1,40 +0,0 @@ -// Write a function `makeMatrix(m, n, value)` that accepts three arguments. The function should return -// a 2-dimensional array of height `m` and width `n` that contains the `value` as every element. - -let makeMatrix = function ( m, n, value ) { - let matrix = []; - - for ( let i = 0; i < m; i++ ) { - let row = []; - - for ( let j = 0; j < n; j++ ) { - row.push( value ); - } - - matrix.push( row ); - } - - - return matrix; -}; - -console.log( makeMatrix( 3, 5, null ) ); -// [ -// [ null, null, null, null, null ], -// [ null, null, null, null, null ], -// [ null, null, null, null, null ] -// ] - -console.log( makeMatrix( 4, 2, "x" ) ); -// [ -// [ 'x', 'x' ], -// [ 'x', 'x' ], -// [ 'x', 'x' ], -// [ 'x', 'x' ] -// ] - -console.log( makeMatrix( 2, 2, 0 ) ); -// [ -// [ 0, 0 ], -// [ 0, 0 ] -// ] diff --git a/javascript-practice/-ALL-JS-Files/maximum.js b/javascript-practice/-ALL-JS-Files/maximum.js deleted file mode 100644 index e426353..0000000 --- a/javascript-practice/-ALL-JS-Files/maximum.js +++ /dev/null @@ -1,21 +0,0 @@ -// Write a function `maximum` that accepts an array of numbers as an argument. The function should -// return the largest number of the array. If the array is empty, then the function should return null. - -let maximum = function ( numbers ) { - if ( numbers.length === 0 ) { - return null; - } - - let currentMax = numbers[ 0 ]; - for ( let i = 1; i < numbers.length; i++ ) { - if ( numbers[ i ] > currentMax ) { - currentMax = numbers[ i ]; - } - } - - return currentMax; -}; - -console.log( maximum( [ 5, 6, 3, 7 ] ) ); // 7 -console.log( maximum( [ 17, 15, 19, 11, 2 ] ) ); // 19 -console.log( maximum( [] ) ); // null diff --git a/javascript-practice/-ALL-JS-Files/min-to-max.js b/javascript-practice/-ALL-JS-Files/min-to-max.js deleted file mode 100644 index 1e84cdc..0000000 --- a/javascript-practice/-ALL-JS-Files/min-to-max.js +++ /dev/null @@ -1,24 +0,0 @@ -// Write a function `minToMax(min, max)` that accepts two numbers as arguments. The function should -// print all numbers from min to max inclusive. The function doesn't need to return any value. It -// should just print to the terminal. - - -let minToMax = function ( min, max ) { - for ( let i = min; i <= max; i++ ) { - console.log( i ); - } -}; - -minToMax( 5, 9 ); -// prints -// 5 -// 6 -// 7 -// 8 -// 9 - -minToMax( 11, 13 ); -// prints -// 11 -// 12 -// 13 diff --git a/javascript-practice/-ALL-JS-Files/no-ohs.js b/javascript-practice/-ALL-JS-Files/no-ohs.js deleted file mode 100644 index b459cca..0000000 --- a/javascript-practice/-ALL-JS-Files/no-ohs.js +++ /dev/null @@ -1,25 +0,0 @@ -// Write a function named `noOhs` that accepts a string as an argument. The functions should print the -// characters of the string one by one except the character 'o'. The function doesn't need to return -// any value. It should just print to the terminal. - -let noOhs = function ( str ) { - for ( let i = 0; i < str.length; i++ ) { - let char = str[ i ]; - if ( char !== 'o' ) { - console.log( char ); - } - } -}; - -noOhs( "code" ); -// prints -// c -// d -// e - -noOhs( "school" ); -// prints -// s -// c -// h -// l diff --git a/javascript-practice/-ALL-JS-Files/num-odds.js b/javascript-practice/-ALL-JS-Files/num-odds.js deleted file mode 100644 index 6f7d1cf..0000000 --- a/javascript-practice/-ALL-JS-Files/num-odds.js +++ /dev/null @@ -1,18 +0,0 @@ -// Write a function `numOdds` that accepts an array of numbers as an argument. The function should -// return a number representing the count of odd elements in the array. - -let numOdds = function ( numbers ) { - let count = 0; - - for ( let i = 0; i < numbers.length; i++ ) { - if ( numbers[ i ] % 2 === 1 ) { - count += 1; - } - } - - return count; -}; - -console.log( numOdds( [ 4, 7, 2, 5, 9 ] ) ); // 3 -console.log( numOdds( [ 11, 31, 58, 99, 21, 60 ] ) ); // 4 -console.log( numOdds( [ 100, 40, 4 ] ) ); // 0 diff --git a/javascript-practice/-ALL-JS-Files/number-change.js b/javascript-practice/-ALL-JS-Files/number-change.js deleted file mode 100644 index aee7bf6..0000000 --- a/javascript-practice/-ALL-JS-Files/number-change.js +++ /dev/null @@ -1,15 +0,0 @@ -// Write a function `numberChange` that accepts a number as an argument. The function should return -// half the number if it is even. The function should return double the number if it is odd. - -let numberChange = function ( n ) { - if ( n % 2 === 0 ) { - return n / 2; - } else { - return n * 2; - } -}; - -console.log( numberChange( 6 ) ); // 3 -console.log( numberChange( 7 ) ); // 14 -console.log( numberChange( 16 ) ); // 8 -console.log( numberChange( 21 ) ); // 42 diff --git a/javascript-practice/-ALL-JS-Files/number-expressions.js b/javascript-practice/-ALL-JS-Files/number-expressions.js deleted file mode 100644 index c88939e..0000000 --- a/javascript-practice/-ALL-JS-Files/number-expressions.js +++ /dev/null @@ -1,20 +0,0 @@ -console.log( 2 + 3 ); // 5 -console.log( 10 - 15 ); // -5 -console.log( 4 + 1 - 5 ); // 0 -console.log( 4 * 3 ); // 12 - -console.log( 7 / 2 ); // 3.5 -console.log( 4 + 2 * 3 ); // 10 -console.log( ( 4 + 2 ) * 3 ); // 18 -console.log( 5 % 2 ); // 1 - -console.log( 6 % 2 ); // 0 -console.log( 7 % 2 ); // 1 -console.log( 8 % 2 ); // 0 -console.log( 19 % 8 ); // 3 - -console.log( 24 % 8 ); // 0 -console.log( 7 % 4 ); // 3 -console.log( 4 % 7 ); // 4 -console.log( 5 + ( 10 % 5 ) ); // 5 -console.log( ( 5 + 10 ) % 5 ); // 0 diff --git a/javascript-practice/-ALL-JS-Files/number-range.js b/javascript-practice/-ALL-JS-Files/number-range.js deleted file mode 100644 index b4ec5ea..0000000 --- a/javascript-practice/-ALL-JS-Files/number-range.js +++ /dev/null @@ -1,17 +0,0 @@ -// Write a function `numberRange(min, max, step)` that accepts three numbers as arguments, `min`, -// `max`, and `step`. The function should return all numbers between `min` and `max` at `step` intervals. -// `min` and `max` are inclusive. - -let numberRange = function ( min, max, step ) { - let range = []; - - for ( let i = min; i <= max; i += step ) { - range.push( i ); - } - - return range; -}; - -console.log( numberRange( 10, 40, 5 ) ); // [10, 15, 20, 25, 30, 35, 40] -console.log( numberRange( 14, 24, 3 ) ); // [14, 17, 20, 23] -console.log( numberRange( 8, 35, 6 ) ); // [8, 14, 20, 26, 32] diff --git a/javascript-practice/-ALL-JS-Files/odd-sum.js b/javascript-practice/-ALL-JS-Files/odd-sum.js deleted file mode 100644 index 53568cc..0000000 --- a/javascript-practice/-ALL-JS-Files/odd-sum.js +++ /dev/null @@ -1,19 +0,0 @@ -// Write a function named `oddSum(max)` that accepts a max number as an argument. The function should -// return the total sum of all odd numbers from 1 to the max, inclusive. -// -// For example, oddSum(10) should return 25 because 1 + 3 + 5 + 7 + 9 = 25 - -let oddSum = function ( max ) { - let sum = 0; - - for ( let i = 1; i <= max; i++ ) { - if ( i % 2 === 1 ) { - sum += i; - } - } - - return sum; -}; - -console.log( oddSum( 10 ) ); // 25 -console.log( oddSum( 5 ) ); // 9 diff --git a/javascript-practice/-ALL-JS-Files/one (2).js b/javascript-practice/-ALL-JS-Files/one (2).js deleted file mode 100644 index 53a2225..0000000 --- a/javascript-practice/-ALL-JS-Files/one (2).js +++ /dev/null @@ -1,12 +0,0 @@ -let word = "bye"; -console.log( `${word} felicia` ); // 'bye felicia' -console.log( word ); // 'bye' - -let num = 10; -num = num * 2; -console.log( num ); // 20 - -let bottlesOfBeer = 99; -let around = bottlesOfBeer - 1; -console.log( around ); // 98 -console.log( bottlesOfBeer ); // 99 diff --git a/javascript-practice/-ALL-JS-Files/one-or-none.js b/javascript-practice/-ALL-JS-Files/one-or-none.js deleted file mode 100644 index 57e71bb..0000000 --- a/javascript-practice/-ALL-JS-Files/one-or-none.js +++ /dev/null @@ -1,15 +0,0 @@ -// Write a function `oneOrNone` that accepts two booleans as arguments. The function should return true -// if exactly one of the arguments is true. If BOTH arguments are true, then it should return false. - -let oneOrNone = function ( val1, val2 ) { - if ( ( val1 || val2 ) && !( val1 && val2 ) ) { - return true; - } else { - return false; - } -}; - -console.log( oneOrNone( false, false ) ); // false -console.log( oneOrNone( true, false ) ); // true -console.log( oneOrNone( false, true ) ); // true -console.log( oneOrNone( true, true ) ); // false diff --git a/javascript-practice/-ALL-JS-Files/one-to-four.js b/javascript-practice/-ALL-JS-Files/one-to-four.js deleted file mode 100644 index bc52c2c..0000000 --- a/javascript-practice/-ALL-JS-Files/one-to-four.js +++ /dev/null @@ -1,16 +0,0 @@ -// Write a function `oneToFour` that prints all whole numbers from one to four, inclusive. The function -// takes in no arguments and doesn't need to return any value. It should just print to the terminal. - -let oneToFour = function () { - for ( let i = 1; i <= 4; i++ ) { - console.log( i ); - } -}; - - -oneToFour(); -// prints -// 1 -// 2 -// 3 -// 4 diff --git a/javascript-practice/-ALL-JS-Files/one.js b/javascript-practice/-ALL-JS-Files/one.js deleted file mode 100644 index c75b1dc..0000000 --- a/javascript-practice/-ALL-JS-Files/one.js +++ /dev/null @@ -1,12 +0,0 @@ -let word = "bye"; -console.log( word + " felicia" ); // 'bye felicia' -console.log( word ); // 'bye' - -let num = 10; -num = num * 2; -console.log( num ); // 20 - -let bottlesOfBeer = 99; -let around = bottlesOfBeer - 1; -console.log( around ); // 98 -console.log( bottlesOfBeer ); // 99 diff --git a/javascript-practice/-ALL-JS-Files/output.md b/javascript-practice/-ALL-JS-Files/output.md deleted file mode 100644 index c3d4349..0000000 --- a/javascript-practice/-ALL-JS-Files/output.md +++ /dev/null @@ -1,3950 +0,0 @@ -let str = 'MIICWwIBAAKBgGEdLjFEFbegPZ2AwJWkalksXr7PzWL7wIc7pOFZxXwYPWtQxvANyceCwpkqbPLsfEx7nqxAris2hYOdeN1OTFqvTyNmVuzbUPcXShn6ZoDCB30voHkeu4F3cUw5RQEUDdLscSnv4HMxHam5qgl6vXoumVNHbjyKA5UtAnfjAgMBAAECgYAmjEyvpZTxRJvwjxDi1VaZevFI0Hd4WPH9PAGgqdnH84vGXnAGFj1WikqKYcqKMQW2kdjAsWwH9D9FfrkIcDDHdZ9XuGSGkFzWtOwajWMQl7qNV1hZ288gdpIQQMOTLDgauZY6pw1cV7h4v316qJB8knQGoBNpJCfTYQJBAKV1ctsJq0Zg4QumD2hyODepP3LfLeaQsERLqVAWeuOuTY5mK5gIwsSqvcSVfY7Ze1FWIsApNFRv67azKcJPwsCQQCNlyApZFJEVNY70Er7Uu5NL9t4CYJJC9uVVkoEHEY6d7sVslqa0vP2q0zXx9YedbMBvQjxXIbY0waXUy63FvoBGJAkB3OTJWUjVgzDY1Br5wu2Yu59NjKVKLWzCsu1gaCNBfhVDX7SyIyC9EYKRfUAoQxwsmPWPyQ9QVG4WKcPZJAkBRheAotPCBE2RLHHfvpiStnMhX0UXdVyaJp5tcZ6wYV61ohyBvCOkYhUxBJzeIGrVZcvLZSLeUzXoqRPpxQxAkEAkdCZXF0gHahpZgF5y0wWcqf9ECRT1E4Hv8bk3Mf0Exp2aW34JeI6I7Xqd1NV4I9H7prQ8m3y39lFwWO8PmQ'; -console.log( str.indexOf( 'HEY' ) ); -console.log( 0 ); -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `alternatingCaps` that accepts a sentence string as an argument. The function should -// return the sentence where words alternate between lowercase and uppercase. -let alternatingCaps = sentence => { - let words = sentence.split( ' ' ); - let newWords = []; - for ( let i = 0; i < words.length; i++ ) { - let word = words[ i ]; - if ( i % 2 === 0 ) { - newWords.push( word.toLowerCase() ); - } else { - newWords.push( word.toUpperCase() ); - } - } - return newWords.join( ' ' ); -}; -console.log( alternatingCaps( "take them to school" ) ); // 'take THEM to SCHOOL' -console.log( alternatingCaps( "What did ThEy EAT before?" ) ); // 'what DID they EAT before?' -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `averageOfFour(num1, num2, num3, num4)` that accepts four numbers as arguments. The -// function should return the average of all four numbers. -let averageOfFour = ( num1, num2, num3, num4 ) => { - let sum = num1 + num2 + num3 + num4; - return sum / 4; -}; -console.log( averageOfFour( 10, 4, 12, 3 ) ); // 7.25 -console.log( averageOfFour( -20, 50, 4, 21 ) ); // 13.75 -console.log( averageOfFour( 10, 4, 12, 3 ) ); // 7.25 -console.log( averageOfFour( 5, 5, 3, 7 ) ); // 5 -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `average` that accepts three numbers as arguments. The function should return the -// average of the three numbers. -let average = ( num1, num2, num3 ) => ( num1 + num2 + num3 ) / 3; -console.log( average( 3, 10, 8 ) ); // 7 -console.log( average( 10, 5, 12 ) ); // 9 -console.log( average( 6, 20, 40 ) ); // 22 -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `bleepVowels` that accepts a string as an argument. The function should return -// a new string where all vowels are replaced with `*`s. Vowels are the letters a, e, i, o, u. -let bleepVowels = str => { - let vowels = [ "a", "e", "i", "o", "u" ]; - let bleeped = ""; - for ( let char of str ) { - if ( vowels.includes( char ) ) { - bleeped += "*"; - } else { - bleeped += char; - } - } - return bleeped; -}; -console.log( bleepVowels( "skateboard" ) ); // 'sk*t*b**rd' -console.log( bleepVowels( "slipper" ) ); // 'sl*pp*r' -console.log( bleepVowels( "range" ) ); // 'r*ng*' -console.log( bleepVowels( "brisk morning" ) ); // 'br*sk m*rn*ng' -console.log( false ); // false -console.log( !true ); // false -console.log( !false ); // true -console.log( !!true ); // true -console.log( false && false ); // false -console.log( false && true ); // false -console.log( true && false ); // false -console.log( true && true ); // true -console.log( false || false ); // false -console.log( false || true ); // true -console.log( true || false ); // true -console.log( true || true ); // true -console.log( !false || false ); // true -console.log( false || ( true && true ) ); // true -console.log( false || !( true && true ) ); // false -console.log( !true && ( true ) ); // false -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `caseChange` that accepts a string and a boolean as arguments. The function should -// return the uppercase version of the string if the boolean is true. The function should return the -// lowercase version of the string if the boolean is false. -let caseChange = ( str, shouldUpperCase ) => { - if ( shouldUpperCase ) { - return str.toUpperCase(); - } else { - return str.toLowerCase(); - } -}; -console.log( caseChange( "Super", true ) ); // 'SUPER' -console.log( caseChange( "Super", false ) ); // 'super' -console.log( caseChange( "tAmBourine", true ) ); // 'TAMBOURINE' -console.log( caseChange( "tAmBourine", false ) ); // 'tambourine' -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `censorE` that accepts a string as an argument. The function should return the a new -// version of string where all characters that are 'e's are replaced with '*'s. -let censorE = str => { - let newStr = ''; - for ( let char of str ) { - if ( char === 'e' ) { - newStr += '*'; - } else { - newStr += char; - } - } - return newStr; -}; -console.log( censorE( "speedy" ) ); // 'sp**dy' -console.log( censorE( "pending" ) ); // 'p*nding' -console.log( censorE( "scene" ) ); // 'sc*n*' -console.log( censorE( "heat" ) ); // 'h*at' -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `chooseDivisibles(numbers, target)` that accepts an array of numbers and a -// target number as arguments. The function should return an array containing elements of the original -// array that are divisible by the target. -let chooseDivisibles = ( numbers, target ) => { - let divisibles = []; - for ( let num of numbers ) { - if ( num % target === 0 ) { - divisibles.push( num ); - } - } - return divisibles; -}; -console.log( chooseDivisibles( [ 40, 7, 22, 20, 24 ], 4 ) ); // [40, 20, 24] -console.log( chooseDivisibles( [ 9, 33, 8, 17 ], 3 ) ); // [9, 33] -console.log( chooseDivisibles( [ 4, 25, 1000 ], 10 ) ); // [1000] -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `commonElements` that accepts two arrays as arguments. The function should return -// a new array containing the elements that are found in both of the input arrays. The order of -// the elements in the output array doesn't matter as long as the function returns the correct elements. -let commonElements = ( array1, array2 ) => { - let common = []; - for ( let ele of array1 ) { - if ( array2.includes( ele ) ) { - common.push( ele ); - } - } - return common; -}; -let arr1 = [ "a", "c", "d", "b" ]; -let arr2 = [ "b", "a", "y" ]; -console.log( commonElements( arr1, arr2 ) ); // ['a', 'b'] -let arr3 = [ 4, 7 ]; -let arr4 = [ 32, 7, 1, 4 ]; -console.log( commonElements( arr3, arr4 ) ); // [4, 7] -console.log( true === false ); // false -console.log( false === false ); // true -console.log( false !== true ); // true -console.log( !true === false ); // true -console.log( 2 + 3 === 5 ); // true -console.log( 4 < 0 ); // false -console.log( 10 >= 10 ); // true -console.log( 10.3 >= 10 ); // true -console.log( 100 / 2 === 50 ); // true -console.log( 100 % 2 === 0 ); // true -console.log( 11 % 2 === 0 ); // false -console.log( 7.0 === 7 ); // true -console.log( 13 % 5 > 0 ); // true -console.log( "potato" === "potato" ); // true -console.log( "Tomato" === "tomato" ); // false -console.log( "42" === 42 ); // false -console.log( 5 > 3 && 1 === 0 ); // false -t -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `contains(str1, str2)` that accepts two strings as arguments. The function should -// return a boolean indicating whether or not `str2` is contained within `str1`. The function should -// ignore any differences in capitalization. -let contains = ( str1, str2 ) => { - let lowerStr1 = str1.toLowerCase(); - let lowerStr2 = str2.toLowerCase(); - return lowerStr1.includes( lowerStr2 ); -}; -console.log( contains( "caterpillar", "pill" ) ); // true -console.log( contains( "lion's share", "on" ) ); // true -console.log( contains( "SORRY", "or" ) ); // true -console.log( contains( "tangent", "gem" ) ); // false -console.log( contains( "clock", "ok" ) ); // false -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `countUp(max)` that accepts a max number as an argument. The function should print -// all numbers from 1 up to and including the max. The function doesn't need to return any value. It -// should just print to the terminal. -let countUp = max => { - for ( let i = 1; i <= max; i++ ) { - console.log( i ); - } -}; -countUp( 5 ); -// prints -// 1 -// 2 -// 3 -// 4 -// 5 -countUp( 3 ); -// prints -// 1 -// 2 -// 3 -let phrase = "that's all folks"; -console.log( phrase[ phrase.length ] ); // undefined -console.log( phrase[ phrase.length - 1 ] ); // s -console.log( phrase[ phrase.length - 2 ] ); // k -const i = 9; -const char = phrase[ i ]; -console.log( char ); // l -console.log( phrase.indexOf( char ) ); // 8 -console.log( phrase.slice( 2, 8 ) ); // at's a -console.log( "abcdefg".slice( 1, 3 ) ); // bc -console.log( "abcdefg".slice( 2 ) ); // cdefg -console.log( "abcdefg".slice( 4 ) ); // efg -console.log( "abcdefg".slice( 2, -1 ) ); // cdef -console.log( "abcdefg".slice( 2, -2 ) ); // cde -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function named `divByEither(num1, num2, max)` that accepts three numbers as arguments. -// The function should print out all positive numbers less than max that are divisible by num1 or num2. -// The function doesn't need to return any value. It should just print to the terminal. -let divByEither = ( num1, num2, max ) => { - for ( let i = 1; i < max; i++ ) { - if ( i % num1 === 0 || i % num2 === 0 ) { - console.log( i ); - } - } -}; -divByEither( 4, 3, 16 ); -// prints -// 3 -// 4 -// 6 -// 8 -// 9 -// 12 -// 15 -divByEither( 7, 5, 20 ); -// prints -// 5 -// 7 -// 10 -// 14 -// 15 -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `divisibleRange(min, max, num)` that accepts three numbers as arguments. The -// function should print all numbers between `min` and `max` (exclusive) that are also divisible by -// num. -let divisibleRange = ( min, max, num ) => { - for ( let i = min + 1; i < max; i++ ) { - if ( i % num === 0 ) { - console.log( i ); - } - } -}; -divisibleRange( 17, 40, 9 ); -// prints -// 18 -// 27 -// 36 -divisibleRange( 10, 24, 4 ); -// prints -// 12 -// 16 -// 20 -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `divisible(num1, num2)` that accepts two numbers as arguments. The function should -// return a boolean indicating whether or not `num1` is divisible by `num2`. -let divisible = ( num1, num2 ) => num1 % num2 === 0; -// let divisible = function (num1, num2) { -// if (num1 % num2 === 0) { -// return true; -// } else { -// return false; -// } -// }; -console.log( divisible( 12, 3 ) ); // true -console.log( divisible( 12, 5 ) ); // false -console.log( divisible( 60, 4 ) ); // true -console.log( divisible( 60, 11 ) ); // false -console.log( divisible( 21, 7 ) ); // true -console.log( divisible( 21, 6 ) ); // false -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `divisors` that accepts a number as an argument. The function should return an -// array containing all positive numbers that can divide into the argument. -let divisors = n => { - let numbers = []; - for ( let i = 1; i <= n; i++ ) { - if ( n % i === 0 ) { - numbers.push( i ); - } - } - return numbers; -}; -console.log( divisors( 15 ) ); // [1, 3, 5, 15] -console.log( divisors( 7 ) ); // [1, 7] -console.log( divisors( 24 ) ); // [1, 2, 3, 4, 6, 8, 12, 24] -g -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `endsInLy` that accepts a string as an argument and returns a boolean indicating -// whether or not the string ends in the substring 'ly'. -let endsInLy = str => { - let secondLast = str[ str.length - 2 ]; - let last = str[ str.length - 1 ]; - return secondLast === 'l' && last === 'y'; -}; -// let endsInLy = function (str) { -// return str.endsWith('ly'); -// }; -console.log( endsInLy( "pretty" ) ); // false -console.log( endsInLy( "instant" ) ); // false -console.log( endsInLy( "analytic" ) ); // false -console.log( endsInLy( "timidly" ) ); // true -console.log( endsInLy( "fly" ) ); // true -console.log( endsInLy( "gallantly" ) ); // true -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `endsWithT` that accepts a string as an argument. The function should return a -// boolean indicating whether or not the string ends with the character 't'. -let endsWithT = str => { - let lastChar = str[ str.length - 1 ]; - return lastChar === 't'; -}; -console.log( endsWithT( "smart" ) ); // true -console.log( endsWithT( "racket" ) ); // true -console.log( endsWithT( "taco" ) ); // false -console.log( endsWithT( "boomerang" ) ); // false -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `evens(max)` that accepts a max number as an argument. The function should print -// all positive even numbers that are less than the max. -let evens = max => { - for ( let i = 1; i < max; i++ ) { - if ( i % 2 === 0 ) { - console.log( i ); - } - } -}; -evens( 11 ); -// prints -// 2 -// 4 -// 6 -// 8 -// 10 -evens( 8 ); -// prints -// 2 -// 4 -// 6 -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `filterLongWords` that accepts an array of strings as an argument. The function -// should return a new array containing only the strings that are less than 5 characters long. -let filterLongWords = words => { - let chosenWords = []; - for ( let word of words ) { - if ( word.length < 5 ) { - chosenWords.push( word ); - } - } - return chosenWords; -}; -console.log( filterLongWords( [ "kale", "cat", "retro", "axe", "heirloom" ] ) ); -// ['kale', 'cat', 'axe'] -console.log( filterLongWords( [ "disrupt", "pour", "trade", "pic" ] ) ); -// ['pour', 'pic'] -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function named `fiveMultiplesOf` that accepts a number as an argument. The function should -// print out the first five multiples of the given number. The function doesn't need to return any -// value. It should just print to the terminal. -let fiveMultiplesOf = num => { - for ( let i = 1; i <= 5; i++ ) { - console.log( i * num ); - } -}; -fiveMultiplesOf( 7 ); -// prints -// 7 -// 14 -// 21 -// 28 -// 35 -fiveMultiplesOf( 3 ); -// prints -// 3 -// 6 -// 9 -// 12 -// 15 -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `fizzBuzz` that accepts a max number as an argument. The function should -// print all numbers less than or equal to max that are divisible by either 3 or 5 but not both 3 -// and 5. The function doesn't need to return any value. It should just print to the terminal. -let fizzBuzz = max => { - for ( let i = 1; i <= max; i++ ) { - if ( ( i % 3 === 0 || i % 5 === 0 ) && !( i % 3 === 0 && i % 5 === 0 ) ) { - console.log( i ); - } - } -}; -fizzBuzz( 18 ); -// prints -// 3 -// 5 -// 6 -// 9 -// 10 -// 12 -// 18 -fizzBuzz( 33 ); -// prints -// 3 -// 5 -// 6 -// 9 -// 10 -// 12 -// 18 -// 20 -// 21 -// 24 -// 25 -// 27 -// 33 -let movie = 'Fight Club'; -let views = 4; -console.log( `I watched ${ movie } about ${ views } number of times` ); -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `funnySound` that accepts two strings as arguments. The function should return a -// new string containing the first three characters of both strings concatenated together. -// You can assume that the arguments are both at least three characters long. -let funnySound = ( str1, str2 ) => str1.slice( 0, 3 ) + str2.slice( 0, 3 ); -console.log( funnySound( "tiger", "spoon" ) ); // 'tigspo' -console.log( funnySound( "computer", "phone" ) ); // 'compho' -console.log( funnySound( "skate", "bottle" ) ); // 'skabot' -console.log( funnySound( "frog", "ashtray" ) ); // 'froash' -console.log( 'hello world' ); -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `half` that accepts a number as an argument. The function should return half of the -// number. -let half = n => n / 2; -console.log( half( 8 ) ); // 4 -console.log( half( 15 ) ); // 7.5 -console.log( half( 90 ) ); // 45 -gi -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `inRange(min, max, n)` that accepts three numbers as arguments. The function should -// return a boolean indicating if `n` is between `min` and `max` inclusive. -let inRange = ( min, max, n ) => n >= min && n <= max; -console.log( inRange( 5, 13, 8 ) ); // true -console.log( inRange( 5, 13, 29 ) ); // false -console.log( inRange( 100, 125, 100 ) ); // true -console.log( inRange( 100, 125, 99 ) ); // false -console.log( inRange( 40, 45, 44 ) ); // true -console.log( inRange( 40, 45, 45 ) ); // true -console.log( inRange( 40, 45, 46 ) ); // false -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `isDivBy4` that accepts a number as an argument. The function should return a -// boolean indicating whether or not the number is divisible by 4. -let isDivBy4 = num => { - if ( num % 4 === 0 ) { - return true; - } else { - return false; - } -}; -// let isDivBy4 = function (num) { -// return num % 4 === 0; -// }; -console.log( isDivBy4( 8 ) ); // true -console.log( isDivBy4( 12 ) ); // true -console.log( isDivBy4( 24 ) ); // true -console.log( isDivBy4( 9 ) ); // false -console.log( isDivBy4( 10 ) ); // false -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `isLong` that accepts a string as an argument. The function should return a boolean -// indicating whether or not the string is longer than 5 characters -let isLong = ( { - length -} ) => length > 5; -// let isLong = function (str) { -// if (str.length > 5) { -// return true; -// } else { -// return false; -// } -// }; -console.log( isLong( "pie" ) ); // false -console.log( isLong( "kite" ) ); // false -console.log( isLong( "kitty" ) ); // false -console.log( isLong( "telescope" ) ); // true -console.log( isLong( "thermometer" ) ); // true -console.log( isLong( "restaurant" ) ); // true -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `keepItQuiet` that accepts a string as an argument. The function should return the -// lowercase version of the string with 3 periods added to the end of it. -let keepItQuiet = str => `${ str.toLowerCase() }...`; -console.log( keepItQuiet( "HOORAY" ) ); // 'hooray...' -console.log( keepItQuiet( "Doggo" ) ); // 'doggo...' -console.log( keepItQuiet( "WHAT?!?!" ) ); // 'what?!?!...' -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `larger` that accepts two numbers as arguments. The function should return the -// larger number. -let larger = ( num1, num2 ) => { - if ( num1 > num2 ) { - return num1; - } else { - return num2; - } -}; -console.log( larger( 256, 400 ) ); // 400 -console.log( larger( 31, 4 ) ); // 31 -console.log( larger( -6, 7 ) ); // 7 -console.log( larger( 11.3, 11.2 ) ); // 11.3 -console.log( larger( -10, -3 ) ); // -3 -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `lengthiestWord` that accepts a sentence string as an argument. The function should -// return the longest word of the sentence. If there is a tie, return the word that appears later -// in the sentence. -let lengthiestWord = sentence => { - let words = sentence.split( ' ' ); - let longest = words[ 0 ]; // pretty - for ( let i = 1; i < words.length; i++ ) { - let word = words[ i ]; - if ( word.length >= longest.length ) { - longest = word; - } - } - return longest; -}; -console.log( lengthiestWord( "I am pretty hungry" ) ); // 'hungry' -console.log( lengthiestWord( "we should think outside of the box" ) ); // 'outside' -console.log( lengthiestWord( "down the rabbit hole" ) ); // 'rabbit' -console.log( lengthiestWord( "simmer down" ) ); // 'simmer' -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `longer` that accepts two strings as arguments. The function should return the -// string that is longer. If the strings have the same length, then return the first string. -let longer = ( str1, str2 ) => { - if ( str1.length >= str2.length ) { - return str1; - } else { - return str2; - } -}; -console.log( longer( "drum", "piranha" ) ); // 'piranha' -console.log( longer( "basket", "fork" ) ); // 'basket' -console.log( longer( "flannel", "sustainable" ) ); // 'sustainable' -console.log( longer( "disrupt", "ability" ) ); // 'disrupt' -console.log( longer( "bird", "shoe" ) ); // 'bird' -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `makeAcronym` that accepts a sentence string as an argument. The function should -// return a string containing the first character of each word in the sentence. -let makeAcronym = sentence => { - let words = sentence.split( ' ' ); - let acronym = ''; - for ( let word of words ) { - acronym += word[ 0 ]; - } - return acronym.toUpperCase(); -}; -console.log( makeAcronym( "New York" ) ); // NY -console.log( makeAcronym( "same stuff different day" ) ); // SSDD -console.log( makeAcronym( "Laugh out loud" ) ); // LOL -console.log( makeAcronym( "don't over think stuff" ) ); // DOTS -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `makeMatrix(m, n, value)` that accepts three arguments. The function should return -// a 2-dimensional array of height `m` and width `n` that contains the `value` as every element. -let makeMatrix = ( m, n, value ) => { - let matrix = []; - for ( let i = 0; i < m; i++ ) { - let row = []; - for ( let j = 0; j < n; j++ ) { - row.push( value ); - } - matrix.push( row ); - } - return matrix; -}; -console.log( makeMatrix( 3, 5, null ) ); -// [ -// [ null, null, null, null, null ], -// [ null, null, null, null, null ], -// [ null, null, null, null, null ] -// ] -console.log( makeMatrix( 4, 2, "x" ) ); -// [ -// [ 'x', 'x' ], -// [ 'x', 'x' ], -// [ 'x', 'x' ], -// [ 'x', 'x' ] -// ] -console.log( makeMatrix( 2, 2, 0 ) ); -// [ -// [ 0, 0 ], -// [ 0, 0 ] -// ] -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `maximum` that accepts an array of numbers as an argument. The function should -// return the largest number of the array. If the array is empty, then the function should return null. -let maximum = numbers => { - if ( numbers.length === 0 ) { - return null; - } - let currentMax = numbers[ 0 ]; - for ( let i = 1; i < numbers.length; i++ ) { - if ( numbers[ i ] > currentMax ) { - currentMax = numbers[ i ]; - } - } - return currentMax; -}; -console.log( maximum( [ 5, 6, 3, 7 ] ) ); // 7 -console.log( maximum( [ 17, 15, 19, 11, 2 ] ) ); // 19 -console.log( maximum( [] ) ); // null -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `minToMax(min, max)` that accepts two numbers as arguments. The function should -// print all numbers from min to max inclusive. The function doesn't need to return any value. It -// should just print to the terminal. -let minToMax = ( min, max ) => { - for ( let i = min; i <= max; i++ ) { - console.log( i ); - } -}; -minToMax( 5, 9 ); -// prints -// 5 -// 6 -// 7 -// 8 -// 9 -minToMax( 11, 13 ); -// prints -// 11 -// 12 -// 13 -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function named `noOhs` that accepts a string as an argument. The functions should print the -// characters of the string one by one except the character 'o'. The function doesn't need to return -// any value. It should just print to the terminal. -let noOhs = str => { - for ( let char of str ) { - if ( char !== 'o' ) { - console.log( char ); - } - } -}; -noOhs( "code" ); -// prints -// c -// d -// e -noOhs( "school" ); -// prints -// s -// c -// h -// l -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `numOdds` that accepts an array of numbers as an argument. The function should -// return a number representing the count of odd elements in the array. -function numOdds( numbers ) { - let count = 0; - for ( let i = 0; i < numbers.length; { - if () {} - }( numbers[ i ] % 2 ) === 1 ) { - count += 1; - } -} -return count; -}; -console.log( numOdds( [ 4, 7, 2, 5, 9 ] ) ); // 3 -console.log( numOdds( [ 11, 31, 58, 99, 21, 60 ] ) ); // 4 -console.log( numOdds( [ 100, 40, 4 ] ) ); // 0 -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `numberChange` that accepts a number as an argument. The function should return -// half the number if it is even. The function should return double the number if it is odd. -let numberChange = n => { - if ( n % 2 === 0 ) { - return n / 2; - } else { - return n * 2; - } -}; -console.log( numberChange( 6 ) ); // 3 -console.log( numberChange( 7 ) ); // 14 -console.log( numberChange( 16 ) ); // 8 -console.log( numberChange( 21 ) ); // 42 -console.log( 2 + 3 ); // 5 -console.log( 10 - 15 ); // -5 -console.log( 4 + 1 - 5 ); // 0 -console.log( 4 * 3 ); // 12 -console.log( 7 / 2 ); // 3.5 -console.log( 4 + 2 * 3 ); // 10 -console.log( ( 4 + 2 ) * 3 ); // 18 -console.log( 5 % 2 ); // 1 -console.log( 6 % 2 ); // 0 -console.log( 7 % 2 ); // 1 -console.log( 8 % 2 ); // 0 -console.log( 19 % 8 ); // 3 -console.log( 24 % 8 ); // 0 -console.log( 7 % 4 ); // 3 -console.log( 4 % 7 ); // 4 -console.log( 5 + ( 10 % 5 ) ); // 5 -console.log( ( 5 + 10 ) % 5 ); // 0 -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `numberRange(min, max, step)` that accepts three numbers as arguments, `min`, -// `max`, and `step`. The function should return all numbers between `min` and `max` at `step` intervals. -// `min` and `max` are inclusive. -let numberRange = ( min, max, step ) => { - let range = []; - for ( let i = min; i <= max; i += step ) { - range.push( i ); - } - return range; -}; -console.log( numberRange( 10, 40, 5 ) ); // [10, 15, 20, 25, 30, 35, 40] -console.log( numberRange( 14, 24, 3 ) ); // [14, 17, 20, 23] -console.log( numberRange( 8, 35, 6 ) ); // [8, 14, 20, 26, 32] -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function named `oddSum(max)` that accepts a max number as an argument. The function should -// return the total sum of all odd numbers from 1 to the max, inclusive. -// -// For example, oddSum(10) should return 25 because 1 + 3 + 5 + 7 + 9 = 25 -let oddSum = max => { - let sum = 0; - for ( let i = 1; i <= max; i++ ) { - if ( i % 2 === 1 ) { - sum += i; - } - } - return sum; -}; -console.log( oddSum( 10 ) ); // 25 -console.log( oddSum( 5 ) ); // 9 -let word = "bye"; -console.log( `${ word } felicia` ); // 'bye felicia' -console.log( word ); // 'bye' -let num = 10; -num = num * 2; -console.log( num ); // 20 -let bottlesOfBeer = 99; -let around = bottlesOfBeer - 1; -console.log( around ); // 98 -console.log( bottlesOfBeer ); // 99 -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `oneOrNone` that accepts two booleans as arguments. The function should return true -// if exactly one of the arguments is true. If BOTH arguments are true, then it should return false. -let oneOrNone = ( val1, val2 ) => { - if ( ( val1 || val2 ) && !( val1 && val2 ) ) { - return true; - } else { - return false; - } -}; -console.log( oneOrNone( false, false ) ); // false -console.log( oneOrNone( true, false ) ); // true -console.log( oneOrNone( false, true ) ); // true -console.log( oneOrNone( true, true ) ); // false -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `oneToFour` that prints all whole numbers from one to four, inclusive. The function -// takes in no arguments and doesn't need to return any value. It should just print to the terminal. -let oneToFour = () => { - for ( let i = 1; i <= 4; i++ ) { - console.log( i ); - } -}; -oneToFour(); -// prints -// 1 -// 2 -// 3 -// 4 -i t // snippet 1-0 -let qty = 38; -if ( qty > 30 && qty % 5 === 4 ) { - console.log( "swish" ); -} else { - console.log( "swoosh" ); // prints -} -if ( qty > 0 ) { - console.log( "pos" ); // prints -} -// snippet 1-1 -let a = "celery"; -let b = "SQUASH"; -if ( a === a.toUpperCase() ) { - console.log( "alpha" ); -} -if ( b === b.toUpperCase() ) { - console.log( "beta" ); // prints -} -// snippet 1-2 -let number = 9; -if ( number > 4 ) { - console.log( "ding" ); // prints -} else if ( number % 3 === 0 ) { - console.log( "dong" ); -} -// snippet 1-3 -let z = 12; -if ( z > 10 ) { - console.log( "vroom" ); // prints -} -if ( z % 3 === 0 ) { - console.log( "skrrt" ); // prints -} -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `pairPrint` that accepts an array as an argument. The function should print -// all unique pairs of elements in the array. The function doesn't need to return any value. It -// should just print to the terminal. - -let pairPrint = function ( array ) { - for ( let i = 0; i < array.length; i++ ) { - for ( let j = i + 1; j < array.length; j++ ) { - console.log( array[ i ] + ' - ' + array[ j ] ); - } - } -}; - -pairPrint( [ "artichoke", "broccoli", "carrot", "daikon" ] ); -// prints -// artichoke - broccoli -// artichoke - carrot -// artichoke - daikon -// broccoli - carrot -// broccoli - daikon -// carrot - daikon - -pairPrint( [ "apple", "banana", "clementine" ] ); -// prints -// apple - banana -// apple - clementine -// banana - clementine - -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `parity` that accepts a number as an argument. The function should return the -// string 'even' if the number is even. It should return the string 'odd' if the number is odd. -let parity = function ( num ) { - if ( num % 2 === 0 ) { - return 'even'; - } else { - return 'odd'; - } -}; -console.log( parity( 5 ) ); // 'odd' -console.log( parity( 7 ) ); // 'odd' -console.log( parity( 13 ) ); // 'odd' -console.log( parity( 32 ) ); // 'even' -console.log( parity( 10 ) ); // 'even' -console.log( parity( 602348 ) ); // 'even' -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `print2d` that accepts a two-dimensional array as an argument. The function -// should print all inner elements of the array. - -let print2d = function ( array ) { - for ( let i = 0; i < array.length; i++ ) { - let subarray = array[ i ]; - for ( let j = 0; j < subarray.length; j++ ) { - console.log( subarray[ j ] ); - } - } -}; - - -let array1 = [ - [ "a", "b", "c", "d" ], - [ "e", "f" ], - [ "g", "h", "i" ], -]; -print2d( array1 ); -// prints -// a -// b -// c -// d -// e -// f -// g -// h -// i - -let array2 = [ - [ 9, 3, 4 ], - [ 11 ], - [ 42, 100 ] -]; -print2d( array2 ); -// prints -// 9 -// 3 -// 4 -// 11 -// 42 -// 100 - -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -/// Write a function `printCombinations`that accepts two arrays as arguments. The function should -// print all combinations of the elements generated by taking an element from the first array and -// and an element from the second array. The function doesn't need to return any value. It -// should just print to the terminal. - - -let printCombinations = function ( array1, array2 ) { - for ( let i = 0; i < array1.length; i++ ) { - let ele1 = array1[ i ]; - - for ( let j = 0; j < array2.length; j++ ) { - let ele2 = array2[ j ]; - console.log( ele1, ele2 ); - } - } -}; - -let colors = [ "gray", "cream", "cyan" ]; -let clothes = [ "shirt", "flannel" ]; -printCombinations( colors, clothes ); -// prints -// gray shirt -// gray flannel -// cream shirt -// cream flannel -// cyan shirt -// cyan flannel - -printCombinations( [ "hot", "cold" ], [ "soup", "tea" ] ); -// prints -// hot soup -// hot tea -// cold soup -// cold tea - -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function named `productUpTo(max)` that accepts a max number as an argument. The function -// should return the total product of all whole numbers from 1 to the max, inclusive. A product is a -// number obtained from multiplying numbers together. -// -// For example, productUpTo(4) should return 24 because 1 * 2 * 3 * 4 = 24 -let productUpTo = function ( max ) { - let product = 1; - for ( let i = 1; i <= max; i++ ) { - product *= i; - } - return product; -}; -console.log( productUpTo( 4 ) ); // 24 -console.log( productUpTo( 5 ) ); // 120 -console.log( productUpTo( 7 ) ); // 5040 -let word = "suspension bridge"; -console.log( word[ 4 ] ); // e -console.log( word.length > 5 && word[ 0 ] === "d" ); // false -console.log( word.length > 5 && word[ 0 ] === "s" ); // true -console.log( word.indexOf( "o" ) > -1 ); // true -console.log( word.indexOf( "z" ) > -1 ); // false -let str = "foggy"; -console.log( str[ 2 + 1 ] ); // g -console.log( str[ str.length - 1 ] ); // y -str = " day"; -console.log( str ); // ' day' -console.log( str.length ); // 4 -console.log( str.indexOf( "ogg" ) ); // -1 -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `raisePower(base, exponent)` that accepts two numbers, `base` and `exponent`. The -// function should return `base` raised to the `exponent` power. -// -// For example, raisePower(2, 5) should return 32 because 2 * 2 * 2 * 2 * 2 = 32 -// For example, raisePower(4, 3) should return 64 because 4 * 4 * 4 = 64 -let raisePower = function ( base, exponent ) { - let product = 1; - for ( let i = 1; i <= exponent; i++ ) { - product *= base; - } - return product; -}; -console.log( raisePower( 2, 5 ) ); // 32 -console.log( raisePower( 4, 3 ) ); // 64 -console.log( raisePower( 10, 4 ) ); // 10000 -console.log( raisePower( 7, 2 ) ); // 49 -//--- --------------------------------------------------------------------------------> -//---------------------------------------(NEXT:)-------------------------------------> -//--- --------------------------------------------------------------------------------> -// Write a function `removeCapitals` that accepts a string as an argument. The function should return a -// new version of the string with all capital letters removed. -let removeCapitals = function ( str ) { - let newStr = ''; - for ( let i = 0; i < str.length; { - let char = str[ i ]; - if ( char === char.toLowerCase() ) { - newStr += char; - } - } - return newStr; - }; - console.log( removeCapitals( "fOrEver" ) ); // 'frver' - console.log( removeCapitals( "raiNCoat" ) ); // 'raioat' - console.log( removeCapitals( "cElLAr Door" ) ); // 'clr oor' - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `removeDupes` that accepts an array as an argument. The function should return a - // new array where each element only appears once. - let removeDupes = function ( array ) { - let uniques = []; - for ( let i = 0; i < array.length; { - let ele = array[ i ]; - if ( !uniques.includes( ele ) ) { - uniques.push( ele ); - } - } - return uniques; - }; - console.log( removeDupes( [ "x", "y", "y", "x", "z" ] ) ); // ['x', 'y', 'z'] - console.log( removeDupes( [ false, false, true, false ] ) ); // [false, true] - console.log( removeDupes( [ 42, 5, 7, 42, 7, 3, 7, 7 ] ) ); // [42, 5, 7, 3] - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `removeFirstVowel` that accepts a string as an argument. The function should return - // the string with it's first vowel removed. - let removeFirstVowel = function ( str ) { - let vowels = 'aeiou'; - for ( let i = 0; i < str.length; { - let char = str[ i ]; - if ( vowels.includes( char ) ) { - return str.slice( 0, i ) + str.slice( i + 1 ); - } - } - return str; - }; - console.log( removeFirstVowel( "volcano" ) ); // 'vlcano' - console.log( removeFirstVowel( "celery" ) ); // 'clery' - console.log( removeFirstVowel( "juice" ) ); // 'jice' - console.log( removeFirstVowel( "bridge" ) ); // 'brdge' - console.log( removeFirstVowel( "try" ) ); // 'try' - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `removeShortWords` that accepts a sentence string as an argument. The function - // should return a new sentence where all of the words shorter than 4 characters are removed. - let removeShortWords = function ( sentence ) { - let words = sentence.split( ' ' ); - let chosenWords = []; - for ( let i = 0; i < words.length; { - let word = words[ i ]; - if ( word.length >= 4 ) { - chosenWords.push( word ); - } - } - return chosenWords.join( ' ' ); - }; - console.log( removeShortWords( "knock on the door will you" ) ); // 'knock door will' - console.log( removeShortWords( "a terrible plan" ) ); // 'terrible plan' - console.log( removeShortWords( "run faster that way" ) ); // 'faster that' - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `removeVowels` that accepts a string as an argument. The function should return - // a version of the string where all vowels are removed. - let removeVowels = function ( str ) { - let newStr = ''; - let vowels = 'aeiou'; - for ( let i = 0; i < str.length; { - let char = str[ i ]; - if ( !vowels.includes( char ) ) { - newStr += char; - } - } - return newStr; - }; - console.log( removeVowels( "jello" ) ); // jll - console.log( removeVowels( "sensitivity" ) ); // snstvty - console.log( removeVowels( "cellar door" ) ); // cllr dr - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `reverseArray` that accepts an array as an argument. The function should return a - // array containing the elements of the original array in reverse order. - let reverseArray1 = function ( array ) { - let reversed = []; - for ( let i = array.length - 1; i >= 0; i-- ) { - reversed.push( array[ i ] ); - } - return reversed; - }; - console.log( reverseArray1( [ "zero", "one", "two", "three" ] ) ); // ['three', 'two', 'one', 'zero'] - console.log( reverseArray1( [ 7, 1, 8 ] ) ); // [8, 1, 7] - let reverseArray2 = function ( array ) { - let reversed = []; - for ( let i = 0; i < array.length; { - reversed.unshift( array[ i ] ); - } - return reversed; - }; - console.log( reverseArray2( [ "zero", "one", "two", "three" ] ) ); // ['three', 'two', 'one', 'zero'] - console.log( reverseArray2( [ 7, 1, 8 ] ) ); // [8, 1, 7] - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `reverseIterate` that accepts a string as an argument. The function should print - // the characters of the string one by one, in reverse order. The function doesn't need to return any - // value. It should just print to the terminal. - let reverseIterate = function ( str ) { - for ( let i = str.length - 1; i >= 0; i-- ) { - console.log( str[ i ] ); - } - }; - reverseIterate( "carrot" ); - // prints - // t - // o - // r - // r - // a - // c - reverseIterate( "box" ); - // prints - // x - // o - // b - - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `shortenLongWords` that accepts a sentence string as an argument. The function - // should return the same sentence where words longer than 4 characters have their vowels removed. - let removeVowels = function ( str ) { - let newStr = ''; - let vowels = 'aeiou'; - for ( let i = 0; i < str.length; { - let char = str[ i ]; - if ( !vowels.includes( char ) ) { - newStr += char; - } - } - return newStr; - }; - let shortenLongWords = function ( sentence ) { - let words = sentence.split( ' ' ); - let newWords = []; - for ( let i = 0; i < words.length; { - let word = words[ i ]; - if ( word.length > 4 ) { - let noVowels = removeVowels( word ); - newWords.push( noVowels ); - } else { - // leave it the same - newWords.push( word ); - } - } - return newWords.join( ' ' ); - }; - console.log( shortenLongWords( "they are very noble people" ) ); // 'they are very nbl ppl' - console.log( shortenLongWords( "stick with it" ) ); // 'stck with it' - console.log( shortenLongWords( "ballerina, you must have seen her" ) ); // 'bllrna, you must have seen her - console.log( "promenade" [ 3 ] ); // m - console.log( "tiger" [ 1 ] ); // i - console.log( "wheel".length ); // 5 - console.log( "wheel".length - 1 ); // 4 - console.log( "noMAD".toUpperCase() ); // NOMAD - console.log( "hey programmers" [ 2 ] === "y" ); // true - console.log( "volleyball".length > 20 ); // false - console.log( "treasure".indexOf( "r" ) ); // 1 - console.log( "treasure".indexOf( "e" ) ); // 2 - console.log( "web" [ 5 ] ); // undefined - console.log( "red".indexOf( "x" ) ); // -1 - console.log( "red".indexOf( "R" ) ); // -1 - // snippet 0-1 - let greet = function () { - console.log( "hey" ); - console.log( "programmers" ); - }; - let whistle = function () { - console.log( "doot" ); - }; - console.log( "first" ); - console.log( "second" ); - greet(); - console.log( "third" ); - console.log( "fourth" ); - whistle(); - // first - // second - // hey - // programmers - // third - // fourth - // doot - // snippet 0-2 - let howMany = function () { - return 42; - }; - console.log( howMany ); - console.log( howMany() ); - const theAnswer = howMany(); - console.log( theAnswer ); - let howMuch = function () { - 5; - }; - console.log( howMuch() ); - // [Function: howMany] - // 42 - // 42 - // undefined - // snippet 0-3 - let average = function ( num1, num2 ) { - console.log( "calculating..." ); - return ( num1 + num2 ) / 2; - }; - console.log( average( 5, 10 ) ); - console.log( average( 20, 26 ) ); - console.log( average( 50, 100 ) + 2 ); - let a = 21 + 3; - let b = 20; - let n = average( a, b ); - console.log( average( n, 18 ) ); - // calculating... - // 7.5 - // calculating... - // 23 - // calculating... - // 77 - // calculating... - // calculating... - // 20 - // snippet 0-4 - let exclaim = function ( str ) { - let capitalized = str.toUpperCase(); - return capitalized + "!!"; - }; - let result = exclaim( "potato" ); - console.log( result ); - console.log( result.length ); - console.log( result[ 0 ] ); - console.log( result[ result.length - 1 ] ); - // POTATO!! - // 8 - // P - // ! - // snippet 1 - console.log( "hello" ); - for ( let i = 0; i < 5; i++ ) { - console.log( "code" ); - } - console.log( "goodbye" ); - hello - code - code - code - code - code - goodbye - // snippet 1 - for ( let i = 1; i <= 4; i++ ) { - for ( let j = 1; j <= 3; j++ ) { - console.log( i, j ); - } - } - // 1 1 - // 1 2 - // 1 3 - // 2 1 - // 2 2 - // 2 3 - // 3 1 - // 3 2 - // 3 3 - // 4 1 - // 4 2 - // 4 3 - // snippet 2 - console.log( "hi" ); - for ( let i = 3; i <= 7; i++ ) { - console.log( "program" ); - console.log( i ); - } - console.log( "bye" ); - // hi - // program - // 3 - // program - // 4 - // program - // 5 - // program - // 6 - // program - // 7 - // bye - // snippet 2 - for ( let n = 0; n < 2; n++ ) { - console.log( "n=" + n ); - for ( let m = 0; m < 5; m++ ) { - console.log( " m=" + m ); - } - console.log( "n=" + n ); - } - // n=0 - // m=0 - // m=1 - // m=2 - // m=3 - // m=4 - // n=0 - // n=1 - // m=0 - // m=1 - // m=2 - // m=3 - // m=4 - // n=1 - // snippet 3 - let foo = function () { - for ( let num = 10; num > 0; num -= 2 ) { - console.log( num ); - } - }; - console.log( "begin" ); - foo(); - console.log( "end" ); - foo(); - // begin - // 10 - // 8 - // 6 - // 4 - // 2 - // end - // 10 - // 8 - // 6 - // 4 - // 2 - // snippet 3 - let friends = [ "philip", "abby", "phelipe", "simcha" ]; - for ( let i = 0; i < friends.length; { - for ( let j = 0; j < friends.length; { - console.log( friends[ i ], friends[ j ] ); - } - } - // philip philip - // philip abby - // philip phelipe - // philip simcha - // abby philip - // abby abby - // abby phelipe - // abby simcha - // phelipe philip - // phelipe abby - // phelipe phelipe - // phelipe simcha - // simcha philip - // simcha abby - // simcha phelipe - // simcha simcha - // snippet 4 - let word = "street"; - for ( let i = 0; i < word.length; { - console.log( i ); - console.log( word[ i ] ); - } - // 0 - // s - // 1 - // t - // 2 - // r - // 3 - // e - // 4 - // e - // 5 - // t - // snippet 4 - let locations = [ "flatbush", "williamsburg", "bushwick", "greenpoint" ]; - for ( let i = 0; i < locations.length; { - for ( let j = i + 1; j < locations.length; { - console.log( locations[ i ], locations[ j ] ); - } - } - // flatbush williamsburg - // flatbush bushwick - // flatbush greenpoint - // williamsburg bushwick - // williamsburg greenpoint - // bushwick greenpoint - // snippet 5 - let total = 0; // 10 - for ( let i = 1; i < 5; i++ ) { - total += i; - console.log( total ); - } - console.log( "grand total: " + total ); - // 1 - // 3 - // 6 - // 10 - // grand total: 10 - // snippet 5 - let colors = [ "red", "purple", "orange" ]; - for ( let i = 0; i < colors.length; { - let colorStr = colors[ i ]; - console.log( colorStr ); - for ( let j = 0; j < colorStr.length; { - let char = colorStr[ j ]; - console.log( char ); - } - } - // red - // r - // e - // d - // purple - // p - // u - // r - // p - // l - // e - // orange - // o - // r - // a - // n - // g - // e - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `spam` that accepts a 2D array as an argument. The array contains pairs as elements. - // The first element of every pair is a number and the second element is a word. The function should - // return a string containing the words repeated the specified number of times. See the examples. - let spam = function ( pairs ) { - let words = []; - for ( let i = 0; i < pairs.length; { - let pair = pairs[ i ]; - let word = pair[ 0 ]; - let num = pair[ 1 ]; - for ( let j = 0; j < num; { - words.push( word ); - } - } - return words.join( ' ' ); - }; - let array1 = [ - [ "hi", 3 ], - [ "bye", 2 ], - ]; console.log( spam( array1 ) ); // 'hi hi hi bye bye' - let array2 = [ - [ "cat", 1 ], - [ "dog", 2 ], - [ "bird", 4 ], - ]; console.log( spam( array2 ) ); // 'cat dog dog bird bird bird bird' - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `startsWithR` that accepts a string as an argument and returns a boolean indicating - // whether or not the string starts with 'r' or 'R'. - let startsWithR = function ( str ) { - return str[ 0 ] === 'r' || str[ 0 ] === 'R'; - }; console.log( startsWithR( "roger that" ) ); // true - console.log( startsWithR( "Row, row, row your boat" ) ); // true - console.log( startsWithR( "slip" ) ); // false - console.log( startsWithR( "Taxicab" ) ); // false - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `stayPositive` that accepts an array of numbers as an argument. The function should - // return an array containing only the positive numbers. - let stayPositive = function ( numbers ) { - let positives = []; - for ( let i = 0; i < numbers.length; { - if ( numbers[ i ] > 0 ) { - positives.push( numbers[ i ] ); - } - } - return positives; - }; - console.log( stayPositive( [ 10, -4, 3, 6 ] ) ); // [10, 3, 6] - console.log( stayPositive( [ -5, 11, -40, 30.3, -2 ] ) ); // [11, 30.3] - console.log( stayPositive( [ -11, -30 ] ) ); // [] - console.log( "river" + "town" ); - console.log( "cat" + "dog" ); - console.log( "New" + " York" ); - console.log( "runner's knee" + "!" ); - console.log( "man" + "bear" + "pig" ); - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `stringIterate` that accepts a string as an argument. The function should print out - // each character of the string, one by one. The function doesn't need to return any value. It should - // just print to the terminal. - let stringIterate = function ( string ) { - for ( let i = 0; i < string.length; { - console.log( string[ i ] ); - } - }; - stringIterate( "celery" ); - // prints - // c - // e - // l - // e - // r - // y - stringIterate( "hat" ); - // prints - // h - // a - // t - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function named `stringRepeater(str, num)` that accepts a string and a number as arguments. - // The function should return a new string consisting of the `str` repeated `num` number of times. - let stringRepeater = function ( str, num ) { - let repeatedStr = ''; - for ( let i = 1; i <= num; i++ ) { - repeatedStr += str - } - return repeatedStr; - }; - console.log( stringRepeater( "q", 4 ) ); // 'qqqq' - console.log( stringRepeater( "go", 2 ) ); // 'gogo' - console.log( stringRepeater( "tac", 3 ) ); // 'tactactac' - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `stringSize` that accepts a string as an argument. The function should return the - // string 'small' if the argument is shorter than 5 characters, 'medium' if it is exactly 5 characters, and - // 'large' if it is longer than 5 characters. - let stringSize = function ( str ) { - if ( str.length < 5 ) { - return 'small'; - } else if ( str.length > 5 ) { - return 'large'; - } else { - return 'medium'; - } - }; - console.log( stringSize( "cat" ) ); // 'small' - console.log( stringSize( "bell" ) ); // 'small' - console.log( stringSize( "ready" ) ); // 'medium' - console.log( stringSize( "shirt" ) ); // 'medium' - console.log( stringSize( "shallow" ) ); // 'large' - console.log( stringSize( "intelligence" ) ); // 'large' - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `stringsToLengths` that accepts an array of strings as an argument. The function - // should return a new array containing the lengths of the elements of the original array. - let stringsToLengths = function ( words ) { - let lengths = []; - for ( let i = 0; i < words.length; { - lengths.push( words[ i ].length ); - } - return lengths; - }; - console.log( stringsToLengths( [ "belly", "echo", "irony", "pickled" ] ) ); - // [5, 4, 5, 7] - console.log( stringsToLengths( [ "on", "off", "handmade" ] ) ); - // [2, 3, 8] - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function named `sumUpTo(max)` that accepts a max number as an argument. The function should - // return the total sum of all whole numbers from 1 to the max, inclusive. - // - // For example, sumUpTo(4) should return 10 because 1 + 2 + 3 + 4 = 10. - let sumUpTo = function ( max ) { - let sum = 0; - for ( let i = 1; i <= max; i++ ) { - sum += i - } - return sum; - }; - console.log( sumUpTo( 4 ) ); // 10 - console.log( sumUpTo( 5 ) ); // 15 - console.log( sumUpTo( 2 ) ); // 3 - console.log( 'coffee' ); - let qty = 15 % 4; - console.log( qty ); // 3 - let num = 38 + 3; - num++; - console.log( num + " is a great number" ); // '42 is a great number' - let isNumEven = num % 2 === 0; - console.log( num + " is even? " + isNumEven ); // '42 is even? true' - let isQtyEven = qty % 2 === 0; - console.log( qty + " is even? " + isQtyEven ); // '3 is even? false' - glet longStr = "AIICXAIBAAKBgQCuw0YyucjI9bf7yRhIkyg4Ru6kYU7O6fIn2JoFDzCZNkzDdsuXFGh6BXNvbu8uZUT289ERzYP1QjryMEKWzcbtsioyQApL7AgOZyFc3JJ7wvupHhIj2sqxJNtpAh7HQFG08rYh2Pb3HwOm83rbTomM6LnnjooGcoDeuWkuPqXsRlwIDAQABAoGAeQkbPBR5n9y2QLaEjcDGv7dVpFiMGHMaZZVDX34rZPy1EkZNZqlQU0jopLVvLyLESMh9A7gKhqoyMAbgZPpdb0CvniTJPpKYk24mLBeym8rBMW3XBmKk1xIOcJPGXMxeJW61jxPg6doah0aCIjf8n0Z8t8B81kLFojpECQQDzlCp0Nzka3AVZVPdBuuPg0fzeV8ugpiPEp6wQLjIMDFqYtGoAOEy4JpkmkK7zwsQsHZ8jbOtqIFdRLPrvAkEAruU321Ie1CnYCHX4Q79vLcDeWOUpdzEHp2uzDIfzP1gv7RIktGgSZWKhrnNWdeH4Y0CFb9lu6TQYJwNJvug2QJBANX0m3Uds9P9pLbQlI9WWmAtYqIZrsBElcAjOgAik0uOfawholNiw5B3ADvIYqPkLW4dGk1dO6zxW8ZF83MdMCQHGfhxLuFgsOBSfF7Bj4UX6T9FGhUGSXiqUsd06E2mMRLAjWUUUw82DLwucxMrSsV4z1aN57asC8YuQ9FkCQGirlVCt4ccXeGLCHcCsI8AYQJFRzbMs381M16jEpnaKUGrtdbMW018gWJ0EoD4tS2YZpr1hEbtiOkPJaaTKQ"; - if ( longStr.indexOf( 'coDe' ) > -1 ) { - console.log( 'FOUND' ); - } else { - console.log( 'NOT FOUND' ); - } - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `totalProduct(array)` that accepts a 2D array of numbers. The function should return - // the total product of all numbers in the array. - let totalProduct = function ( array ) { - let product = 1; - for ( let i = 0; i < array.length; { - let subarray = array[ i ]; - for ( let j = 0; j < subarray.length; { - product *= subarray[ j ]; - } - } - return product; - }; - let array1 = [ - [ 3, 5, 2 ], - [ 6, 2 ], - ]; console.log( totalProduct( array1 ) ); // 360 - let array2 = [ - [ 4, 6 ], - [ 2, 3 ], - [ 1, 2 ], - ]; console.log( totalProduct( array2 ) ); // 288 - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `total` that accepts an array of numbers as an argument. The function should return - // the total sum of all elements of the array. - let total = function ( numbers ) { - let sum = 0; - for ( let i = 0; i < numbers.length; { - sum += numbers[ i ]; - } - return sum; - }; - console.log( total( [ 3, 2, 8 ] ) ); // 13 - console.log( total( [ -5, 7, 4, 6 ] ) ); // 12 - console.log( total( [ 7 ] ) ); // 7 - console.log( total( [] ) ); // 0 - let apple; - console.log( apple ); // undefined - apple = 5; - console.log( apple ); // 5 - apple + 1; - console.log( apple ); // 5 - apple += 1; - console.log( apple ); // 6 - let banana = apple; - console.log( banana ); // 6 - banana = banana / 2; - console.log( banana ); // 3 - console.log( apple ); // 6 - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `twoSumPairs(numbers, target)` that accepts an array of numbers and a target number - // as arguments. The function should return a 2D array containing all unique pairs of elements that - // sum to the target. - let twoSumPairs = function ( numbers, target ) { - let pairs = []; - for ( let i = 0; i < numbers.length; { - let num1 = numbers[ i ]; - for ( let j = i + 1; j < numbers.length; { - let num2 = numbers[ j ]; - if ( num1 + num2 === target ) { - let pair = [ num1, num2 ]; - pairs.push( pair ); - } - } - } - return pairs; - }; console.log( twoSumPairs( [ 2, 3, 4, 6, 5 ], 8 ) ); // [ [2, 6], [3, 5] ] - console.log( twoSumPairs( [ 10, 7, 4, 5, 2 ], 12 ) ); // [ [10, 2], [7, 5] ] - console.log( twoSumPairs( [ 3, 9, 8 ], 11 ) ); // [ [3, 8] ] - console.log( twoSumPairs( [ 3, 9, 8 ], 10 ) ); // [ ] - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `twoSum(numbers, target)` that accepts an array of numbers and a target number - // as an argument. The function should return a boolean indicating whether or not there exists a pair - // of distinct elements in the array that sum to the target. - let twoSum = function ( numbers, target ) { - for ( let i = 0; i < numbers.length; { - for ( let j = i + 1; j < numbers.length; { - if ( numbers[ i ] + numbers[ j ] === target ) { - return true; - } - } - } - return false; - }; console.log( twoSum( [ 2, 3, 5, 9 ], 7 ) ); // true - console.log( twoSum( [ 2, 3, 5, 9 ], 4 ) ); // false - console.log( twoSum( [ 6, 3, 4 ], 10 ) ); // true - console.log( twoSum( [ 6, 5, 1 ], 10 ) ); // false - // snippet 2-1 - let nonsense = "blog trust fund tattooed williamsburg poke roof party"; - let hasOk = nonsense.indexOf( "ok" ) > -1; - if ( hasOk ) { - console.log( "yeet" ); // prints - } else if ( nonsense.length > 10 ) { - console.log( "yo" ); - } else { - console.log( "no" ); - } - let hasZoo = nonsense.indexOf( "zoo" ) > -1; - let hasFun = nonsense.indexOf( "fun" ) > -1; - if ( hasZoo && hasOk ) { - console.log( "cool" ); - } else if ( hasOk ) { - console.log( "rad" ); // prints - } else if ( hasFun ) { - console.log( "dope" ); - } else { - console.log( "nope" ); - } - // snippet 2-2 - let q = 25; - if ( q % 3 === 0 && q % 5 === 0 ) { - console.log( "both" ); - } else if ( q % 3 === 0 || q % 5 == 0 ) { - console.log( "either" ); // prints - } else { - console.log( "neither" ); - } - let r = 9; - if ( r % 3 === 0 && r % 5 === 0 ) { - console.log( "both" ); - } else if ( r % 3 === 0 || r % 5 == 0 ) { - console.log( "either" ); // prints - } else { - console.log( "neither" ); - } - let s = 15; - if ( s % 3 === 0 && s % 5 === 0 ) { - console.log( "both" ); // prints - } else if ( s % 3 === 0 || s % 5 == 0 ) { - console.log( "either" ); - } else { - console.log( "neither" ); - } - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `wackyWord` that accepts two strings as arguments. The function should return a new - // string containing the first three characters of the first string concatenated with the last two - // character of the second string. - // You can assume that the first argument has a length of at least three and the second argument has a - // length of at least two. - let wackyWord = function ( str1, str2 ) { - return str1.slice( 0, 3 ) + str2.slice( -2 ); - }; console.log( wackyWord( "very", "kindly" ) ); // 'verly' - console.log( wackyWord( "forever", "sick" ) ); // 'forck' - console.log( wackyWord( "cellar", "door" ) ); // 'celor' - console.log( wackyWord( "bagel", "sweep" ) ); // 'bagep' - console.log( 'alvin' ); console.log( 'z' ); - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `wordCount(sentence, targetWords)` that accepts a sentence string and an array of - // `targetWords`. The function should return a count of the number of words of the sentence that are - // in `targetWords`. - let wordCount = function ( sentence, targetWords ) { - let words = sentence.split( ' ' ); - let count = 0; - for ( let i = 0; i < words.length; { - let word = words[ i ]; - if ( targetWords.includes( word ) ) { - count++; - } - } - return count; - }; - console.log( wordCount( "open the window please", [ "please", "open", "sorry" ] ) ); // 2 - console.log( wordCount( "drive to the cinema", [ "the", "driver" ] ) ); // 1 - console.log( wordCount( "can I have that can", [ "can", "I" ] ) ); // 3 - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `yourAverageFunction` that accepts an array of numbers as an argument. The - // function should return the average of all elements of the array. If the input array is empty, - // then the function should return null. - let yourAverageFunction = function ( nums ) { - if ( nums.length === 0 ) { - return null; - } - let sum = 0; - for ( let i = 0; i < nums.length; { - sum += nums[ i ]; - } - return sum / nums.length; - }; - console.log( yourAverageFunction( [ 5, 2, 7, 24 ] ) ); // 9.5 - console.log( yourAverageFunction( [ 100, 6 ] ) ); // 53 - console.log( yourAverageFunction( [ 31, 32, 40, 12, 33 ] ) ); // 29.6 - console.log( yourAverageFunction( [] ) ); // null - let location = "Brooklyn, " + "NY"; - console.log( location ); // 'Brooklyn, NY' - let quantity = 4 * 5 + 1; - console.log( quantity ); // 21 - g it // snippet 0-1 - if ( true ) { - console.log( "foo" ); // prints - } - if ( false ) { - console.log( "bar" ); - } - // snippet 0-2 - if ( false || false ) { - console.log( "boop" ); - } - if ( true || false ) { - console.log( "beep" ); // prints - } - // snippet 0-3 - let num = 40; - if ( num > 0 ) { - console.log( "zip" ); // prints - } - if ( num % 2 === 0 ) { - console.log( "zoop" ); // prints - } - // snippet 0-4 - let word = "jeep"; - if ( word[ 0 ] === "d" ) { - console.log( "yer" ); - } else { - console.log( "nah" ); // prints - } - // snippet 0-5 - let sentence = "roger that"; - if ( sentence[ sentence.length - 1 ] === "t" ) { - console.log( "ends in t" ); // prints - } else { - console.log( "does not end in t" ); - } - if ( sentence.length <= 4 ) { - console.log( "short" ); - } else { - console.log( "long" ); // prints - } - //--- --------------------------------------------------------------------------------> - //---------------------------------------(NEXT:)-------------------------------------> - //--- --------------------------------------------------------------------------------> - // Write a function `zipper` that accepts two arrays as arguments. The function should return a 2D - // array containing pairs of elements at the same indices. - let zipper = function ( arr1, arr2 ) { - let result = []; - for ( let i = 0; i < arr1.length; { - let el1 = arr1[ i ]; - let el2 = arr2[ i ]; - let pair = [ el1, el2 ]; - result.push( pair ); - } - return result; - }; - let array1 = [ "a", "b", "c", "d" ]; - let array2 = [ -1, -2, -3, -4 ]; - console.log( zipper( array1, array2 ) ); - // [ - // ['a', -1], - // ['b', -2], - // ['c', -3], - // ['d', -4], - // ] - let array3 = [ "whisper", "talk", "shout" ]; - let array4 = [ "quiet", "normal", "loud" ]; - console.log( zipper( array3, array4 ) ); - // [ - // ['whisper', 'quiet'], - // ['talk', 'normal'], - // ['shout', 'loud'], - // ] -let str = 'MIICWwIBAAKBgGEdLjFEFbegPZ2AwJWkalksXr7PzWL7wIc7pOFZxXwYPWtQxvANyceCwpkqbPLsfEx7nqxAris2hYOdeN1OTFqvTyNmVuzbUPcXShn6ZoDCB30voHkeu4F3cUw5RQEUDdLscSnv4HMxHam5qgl6vXoumVNHbjyKA5UtAnfjAgMBAAECgYAmjEyvpZTxRJvwjxDi1VaZevFI0Hd4WPH9PAGgqdnH84vGXnAGFj1WikqKYcqKMQW2kdjAsWwH9D9FfrkIcDDHdZ9XuGSGkFzWtOwajWMQl7qNV1hZ288gdpIQQMOTLDgauZY6pw1cV7h4v316qJB8knQGoBNpJCfTYQJBAKV1ctsJq0Zg4QumD2hyODepP3LfLeaQsERLqVAWeuOuTY5mK5gIwsSqvcSVfY7Ze1FWIsApNFRv67azKcJPwsCQQCNlyApZFJEVNY70Er7Uu5NL9t4CYJJC9uVVkoEHEY6d7sVslqa0vP2q0zXx9YedbMBvQjxXIbY0waXUy63FvoBGJAkB3OTJWUjVgzDY1Br5wu2Yu59NjKVKLWzCsu1gaCNBfhVDX7SyIyC9EYKRfUAoQxwsmPWPyQ9QVG4WKcPZJAkBRheAotPCBE2RLHHfvpiStnMhX0UXdVyaJp5tcZ6wYV61ohyBvCOkYhUxBJzeIGrVZcvLZSLeUzXoqRPpxQxAkEAkdCZXF0gHahpZgF5y0wWcqf9ECRT1E4Hv8bk3Mf0Exp2aW34JeI6I7Xqd1NV4I9H7prQ8m3y39lFwWO8PmQ'; - -console.log( str.indexOf( 'HEY' ) ); -console.log( 0 ); -// Write a function `alternatingCaps` that accepts a sentence string as an argument. The function should -// return the sentence where words alternate between lowercase and uppercase. - -let alternatingCaps = function ( sentence ) { - let words = sentence.split( ' ' ); - let newWords = []; - - for ( let i = 0; i < words.length; i++ ) { - let word = words[ i ]; - if ( i % 2 === 0 ) { - newWords.push( word.toLowerCase() ); - } else { - newWords.push( word.toUpperCase() ); - } - } - - return newWords.join( ' ' ); -}; - -console.log( alternatingCaps( "take them to school" ) ); // 'take THEM to SCHOOL' -console.log( alternatingCaps( "What did ThEy EAT before?" ) ); // 'what DID they EAT before?' -//APPEND-DIR.js -const fs = require( 'fs' ); -let cat = require( 'child_process' ).execSync( 'cat *' ).toString( 'UTF-8' ); - -fs.writeFile( 'output.md', cat, ( err ) => { - if ( err ) throw err; -} ); -git // Write a function `averageOfFour(num1, num2, num3, num4)` that accepts four numbers as arguments. The -// function should return the average of all four numbers. - -let averageOfFour = function ( num1, num2, num3, num4 ) { - let sum = num1 + num2 + num3 + num4; - return sum / 4; -}; - -console.log( averageOfFour( 10, 4, 12, 3 ) ); // 7.25 -console.log( averageOfFour( -20, 50, 4, 21 ) ); // 13.75 -console.log( averageOfFour( 10, 4, 12, 3 ) ); // 7.25 -console.log( averageOfFour( 5, 5, 3, 7 ) ); // 5 -// Write a function `average` that accepts three numbers as arguments. The function should return the -// average of the three numbers. - -let average = function ( num1, num2, num3 ) { - return ( num1 + num2 + num3 ) / 3; -}; - -console.log( average( 3, 10, 8 ) ); // 7 -console.log( average( 10, 5, 12 ) ); // 9 -console.log( average( 6, 20, 40 ) ); // 22 -// Write a function `bleepVowels` that accepts a string as an argument. The function should return -// a new string where all vowels are replaced with `*`s. Vowels are the letters a, e, i, o, u. - -let bleepVowels = function ( str ) { - let vowels = [ "a", "e", "i", "o", "u" ]; - let bleeped = ""; - - for ( let i = 0; i < str.length; i++ ) { - let char = str[ i ]; - - if ( vowels.indexOf( char ) > -1 ) { - bleeped += "*"; - } else { - bleeped += char; - } - } - - return bleeped; -}; - -console.log( bleepVowels( "skateboard" ) ); // 'sk*t*b**rd' -console.log( bleepVowels( "slipper" ) ); // 'sl*pp*r' -console.log( bleepVowels( "range" ) ); // 'r*ng*' -console.log( bleepVowels( "brisk morning" ) ); // 'br*sk m*rn*ng' -console.log( false ); // false -console.log( !true ); // false -console.log( !false ); // true -console.log( !!true ); // true - -console.log( false && false ); // false -console.log( false && true ); // false -console.log( true && false ); // false -console.log( true && true ); // true - -console.log( false || false ); // false -console.log( false || true ); // true -console.log( true || false ); // true -console.log( true || true ); // true - -console.log( !false || false ); // true -console.log( false || ( true && true ) ); // true -console.log( false || !( true && true ) ); // false -console.log( !true && ( true ) ); // false -// Write a function `caseChange` that accepts a string and a boolean as arguments. The function should -// return the uppercase version of the string if the boolean is true. The function should return the -// lowercase version of the string if the boolean is false. - -let caseChange = function ( str, shouldUpperCase ) { - if ( shouldUpperCase ) { - return str.toUpperCase(); - } else { - return str.toLowerCase(); - } -}; - -console.log( caseChange( "Super", true ) ); // 'SUPER' -console.log( caseChange( "Super", false ) ); // 'super' -console.log( caseChange( "tAmBourine", true ) ); // 'TAMBOURINE' -console.log( caseChange( "tAmBourine", false ) ); // 'tambourine' -// Write a function `censorE` that accepts a string as an argument. The function should return the a new -// version of string where all characters that are 'e's are replaced with '*'s. - -let censorE = function ( str ) { - let newStr = ''; - - for ( let i = 0; i < str.length; i++ ) { - let char = str[ i ]; - - if ( char === 'e' ) { - newStr += '*'; - } else { - newStr += char; - } - } - - return newStr; -}; - -console.log( censorE( "speedy" ) ); // 'sp**dy' -console.log( censorE( "pending" ) ); // 'p*nding' -console.log( censorE( "scene" ) ); // 'sc*n*' -console.log( censorE( "heat" ) ); // 'h*at' -// Write a function `chooseDivisibles(numbers, target)` that accepts an array of numbers and a -// target number as arguments. The function should return an array containing elements of the original -// array that are divisible by the target. - -let chooseDivisibles = function ( numbers, target ) { - let divisibles = []; - - for ( let i = 0; i < numbers.length; i++ ) { - let num = numbers[ i ]; - - if ( num % target === 0 ) { - divisibles.push( num ); - } - } - - return divisibles; -}; - -console.log( chooseDivisibles( [ 40, 7, 22, 20, 24 ], 4 ) ); // [40, 20, 24] -console.log( chooseDivisibles( [ 9, 33, 8, 17 ], 3 ) ); // [9, 33] -console.log( chooseDivisibles( [ 4, 25, 1000 ], 10 ) ); // [1000] -// Write a function `commonElements` that accepts two arrays as arguments. The function should return -// a new array containing the elements that are found in both of the input arrays. The order of -// the elements in the output array doesn't matter as long as the function returns the correct elements. - -let commonElements = function ( array1, array2 ) { - let common = []; - - for ( let i = 0; i < array1.length; i++ ) { - let ele = array1[ i ]; - - if ( array2.includes( ele ) ) { - common.push( ele ); - } - } - - return common; -}; - -let arr1 = [ "a", "c", "d", "b" ]; -let arr2 = [ "b", "a", "y" ]; -console.log( commonElements( arr1, arr2 ) ); // ['a', 'b'] - -let arr3 = [ 4, 7 ]; -let arr4 = [ 32, 7, 1, 4 ]; -console.log( commonElements( arr3, arr4 ) ); // [4, 7] -console.log( true === false ); // false -console.log( false === false ); // true -console.log( false !== true ); // true -console.log( !true === false ); // true - -console.log( 2 + 3 === 5 ); // true -console.log( 4 < 0 ); // false -console.log( 10 >= 10 ); // true -console.log( 10.3 >= 10 ); // true - -console.log( 100 / 2 === 50 ); // true -console.log( 100 % 2 === 0 ); // true -console.log( 11 % 2 === 0 ); // false -console.log( 7.0 === 7 ); // true - -console.log( 13 % 5 > 0 ); // true -console.log( "potato" === "potato" ); // true -console.log( "Tomato" === "tomato" ); // false -console.log( "42" === 42 ); // false -console.log( 5 > 3 && 1 === 0 ); // false -t // Write a function `contains(str1, str2)` that accepts two strings as arguments. The function should -// return a boolean indicating whether or not `str2` is contained within `str1`. The function should -// ignore any differences in capitalization. - -let contains = function ( str1, str2 ) { - let lowerStr1 = str1.toLowerCase(); - let lowerStr2 = str2.toLowerCase(); - return lowerStr1.indexOf( lowerStr2 ) > -1; -}; - -console.log( contains( "caterpillar", "pill" ) ); // true -console.log( contains( "lion's share", "on" ) ); // true -console.log( contains( "SORRY", "or" ) ); // true -console.log( contains( "tangent", "gem" ) ); // false -console.log( contains( "clock", "ok" ) ); // false -// Write a function `countUp(max)` that accepts a max number as an argument. The function should print -// all numbers from 1 up to and including the max. The function doesn't need to return any value. It -// should just print to the terminal. - -let countUp = function ( max ) { - for ( let i = 1; i <= max; i++ ) { - console.log( i ); - } -}; - -countUp( 5 ); -// prints -// 1 -// 2 -// 3 -// 4 -// 5 - -countUp( 3 ); -// prints -// 1 -// 2 -// 3 -let phrase = "that's all folks"; -console.log( phrase[ phrase.length ] ); // undefined -console.log( phrase[ phrase.length - 1 ] ); // s -console.log( phrase[ phrase.length - 2 ] ); // k - -const i = 9; -const char = phrase[ i ]; -console.log( char ); // l -console.log( phrase.indexOf( char ) ); // 8 -console.log( phrase.slice( 2, 8 ) ); // at's a - -console.log( "abcdefg".slice( 1, 3 ) ); // bc -console.log( "abcdefg".slice( 2 ) ); // cdefg -console.log( "abcdefg".slice( 4 ) ); // efg - - -console.log( "abcdefg".slice( 2, -1 ) ); // cdef -console.log( "abcdefg".slice( 2, -2 ) ); // cde -// Write a function named `divByEither(num1, num2, max)` that accepts three numbers as arguments. -// The function should print out all positive numbers less than max that are divisible by num1 or num2. -// The function doesn't need to return any value. It should just print to the terminal. - -let divByEither = function ( num1, num2, max ) { - for ( let i = 1; i < max; i++ ) { - if ( i % num1 === 0 || i % num2 === 0 ) { - console.log( i ); - } - } -}; - -divByEither( 4, 3, 16 ); -// prints -// 3 -// 4 -// 6 -// 8 -// 9 -// 12 -// 15 - -divByEither( 7, 5, 20 ); -// prints -// 5 -// 7 -// 10 -// 14 -// 15 -// Write a function `divisibleRange(min, max, num)` that accepts three numbers as arguments. The -// function should print all numbers between `min` and `max` (exclusive) that are also divisible by -// num. - -let divisibleRange = function ( min, max, num ) { - for ( let i = min + 1; i < max; i++ ) { - if ( i % num === 0 ) { - console.log( i ); - } - } -}; - -divisibleRange( 17, 40, 9 ); -// prints -// 18 -// 27 -// 36 - -divisibleRange( 10, 24, 4 ); -// prints -// 12 -// 16 -// 20 -// Write a function `divisible(num1, num2)` that accepts two numbers as arguments. The function should -// return a boolean indicating whether or not `num1` is divisible by `num2`. - -let divisible = function ( num1, num2 ) { - return num1 % num2 === 0; -}; - -// let divisible = function (num1, num2) { -// if (num1 % num2 === 0) { -// return true; -// } else { -// return false; -// } -// }; - -console.log( divisible( 12, 3 ) ); // true -console.log( divisible( 12, 5 ) ); // false -console.log( divisible( 60, 4 ) ); // true -console.log( divisible( 60, 11 ) ); // false -console.log( divisible( 21, 7 ) ); // true -console.log( divisible( 21, 6 ) ); // false -// Write a function `divisors` that accepts a number as an argument. The function should return an -// array containing all positive numbers that can divide into the argument. - -let divisors = function ( n ) { - let numbers = []; - - for ( let i = 1; i <= n; i++ ) { - if ( n % i === 0 ) { - numbers.push( i ); - } - } - - return numbers; -}; - -console.log( divisors( 15 ) ); // [1, 3, 5, 15] -console.log( divisors( 7 ) ); // [1, 7] -console.log( divisors( 24 ) ); // [1, 2, 3, 4, 6, 8, 12, 24] -g // Write a function `endsInLy` that accepts a string as an argument and returns a boolean indicating -// whether or not the string ends in the substring 'ly'. - -let endsInLy = function ( str ) { - let secondLast = str[ str.length - 2 ]; - let last = str[ str.length - 1 ]; - - return secondLast === 'l' && last === 'y'; -}; - -// let endsInLy = function (str) { -// return str.endsWith('ly'); -// }; - -console.log( endsInLy( "pretty" ) ); // false -console.log( endsInLy( "instant" ) ); // false -console.log( endsInLy( "analytic" ) ); // false -console.log( endsInLy( "timidly" ) ); // true -console.log( endsInLy( "fly" ) ); // true -console.log( endsInLy( "gallantly" ) ); // true -// Write a function `endsWithT` that accepts a string as an argument. The function should return a -// boolean indicating whether or not the string ends with the character 't'. - -let endsWithT = function ( str ) { - let lastChar = str[ str.length - 1 ]; - return lastChar === 't'; -}; - - -console.log( endsWithT( "smart" ) ); // true -console.log( endsWithT( "racket" ) ); // true -console.log( endsWithT( "taco" ) ); // false -console.log( endsWithT( "boomerang" ) ); // false -// Write a function `evens(max)` that accepts a max number as an argument. The function should print -// all positive even numbers that are less than the max. - -let evens = function ( max ) { - for ( let i = 1; i < max; i++ ) { - if ( i % 2 === 0 ) { - console.log( i ); - } - } -}; - -evens( 11 ); -// prints -// 2 -// 4 -// 6 -// 8 -// 10 - -evens( 8 ); -// prints -// 2 -// 4 -// 6 -// Write a function `filterLongWords` that accepts an array of strings as an argument. The function -// should return a new array containing only the strings that are less than 5 characters long. - -let filterLongWords = function ( words ) { - let chosenWords = []; - - for ( let i = 0; i < words.length; i++ ) { - let word = words[ i ]; - - if ( word.length < 5 ) { - chosenWords.push( word ); - } - } - - return chosenWords; -}; - -console.log( filterLongWords( [ "kale", "cat", "retro", "axe", "heirloom" ] ) ); -// ['kale', 'cat', 'axe'] - -console.log( filterLongWords( [ "disrupt", "pour", "trade", "pic" ] ) ); -// ['pour', 'pic'] -// Write a function named `fiveMultiplesOf` that accepts a number as an argument. The function should -// print out the first five multiples of the given number. The function doesn't need to return any -// value. It should just print to the terminal. - -let fiveMultiplesOf = function ( num ) { - for ( let i = 1; i <= 5; i++ ) { - console.log( i * num ); - } -}; - -fiveMultiplesOf( 7 ); -// prints -// 7 -// 14 -// 21 -// 28 -// 35 - -fiveMultiplesOf( 3 ); -// prints -// 3 -// 6 -// 9 -// 12 -// 15 -// Write a function `fizzBuzz` that accepts a max number as an argument. The function should -// print all numbers less than or equal to max that are divisible by either 3 or 5 but not both 3 -// and 5. The function doesn't need to return any value. It should just print to the terminal. - -let fizzBuzz = function ( max ) { - for ( let i = 1; i <= max; i++ ) { - if ( ( i % 3 === 0 || i % 5 === 0 ) && !( i % 3 === 0 && i % 5 === 0 ) ) { - console.log( i ); - } - } -}; - -fizzBuzz( 18 ); -// prints -// 3 -// 5 -// 6 -// 9 -// 10 -// 12 -// 18 - -fizzBuzz( 33 ); -// prints -// 3 -// 5 -// 6 -// 9 -// 10 -// 12 -// 18 -// 20 -// 21 -// 24 -// 25 -// 27 -// 33 -let movie = 'Fight Club'; - -let views = 4; - -console.log( 'I watched ' + movie + ' about ' + views + ' number of times' ); -// Write a function `funnySound` that accepts two strings as arguments. The function should return a -// new string containing the first three characters of both strings concatenated together. - -// You can assume that the arguments are both at least three characters long. - -let funnySound = function ( str1, str2 ) { - return str1.slice( 0, 3 ) + str2.slice( 0, 3 ); -}; - -console.log( funnySound( "tiger", "spoon" ) ); // 'tigspo' -console.log( funnySound( "computer", "phone" ) ); // 'compho' -console.log( funnySound( "skate", "bottle" ) ); // 'skabot' -console.log( funnySound( "frog", "ashtray" ) ); // 'froash' -console.log( 'hello world' ); -// Write a function `half` that accepts a number as an argument. The function should return half of the -// number. - -let half = function ( n ) { - return n / 2; -}; - -console.log( half( 8 ) ); // 4 -console.log( half( 15 ) ); // 7.5 -console.log( half( 90 ) ); // 45 -gi // Write a function `inRange(min, max, n)` that accepts three numbers as arguments. The function should -// return a boolean indicating if `n` is between `min` and `max` inclusive. - -let inRange = function ( min, max, n ) { - return n >= min && n <= max; -}; - -console.log( inRange( 5, 13, 8 ) ); // true -console.log( inRange( 5, 13, 29 ) ); // false -console.log( inRange( 100, 125, 100 ) ); // true -console.log( inRange( 100, 125, 99 ) ); // false -console.log( inRange( 40, 45, 44 ) ); // true -console.log( inRange( 40, 45, 45 ) ); // true -console.log( inRange( 40, 45, 46 ) ); // false -// Write a function `isDivBy4` that accepts a number as an argument. The function should return a -// boolean indicating whether or not the number is divisible by 4. - -let isDivBy4 = function ( num ) { - if ( num % 4 === 0 ) { - return true; - } else { - return false; - } -}; - -// let isDivBy4 = function (num) { -// return num % 4 === 0; -// }; - -console.log( isDivBy4( 8 ) ); // true -console.log( isDivBy4( 12 ) ); // true -console.log( isDivBy4( 24 ) ); // true -console.log( isDivBy4( 9 ) ); // false -console.log( isDivBy4( 10 ) ); // false -// Write a function `isLong` that accepts a string as an argument. The function should return a boolean -// indicating whether or not the string is longer than 5 characters - -let isLong = function ( str ) { - return str.length > 5; -}; - -// let isLong = function (str) { -// if (str.length > 5) { -// return true; -// } else { -// return false; -// } -// }; - -console.log( isLong( "pie" ) ); // false -console.log( isLong( "kite" ) ); // false -console.log( isLong( "kitty" ) ); // false -console.log( isLong( "telescope" ) ); // true -console.log( isLong( "thermometer" ) ); // true -console.log( isLong( "restaurant" ) ); // true -// Write a function `keepItQuiet` that accepts a string as an argument. The function should return the -// lowercase version of the string with 3 periods added to the end of it. - -let keepItQuiet = function ( str ) { - return str.toLowerCase() + '...'; -}; - -console.log( keepItQuiet( "HOORAY" ) ); // 'hooray...' -console.log( keepItQuiet( "Doggo" ) ); // 'doggo...' -console.log( keepItQuiet( "WHAT?!?!" ) ); // 'what?!?!...' -// Write a function `larger` that accepts two numbers as arguments. The function should return the -// larger number. - -let larger = function ( num1, num2 ) { - if ( num1 > num2 ) { - return num1; - } else { - return num2; - } -}; - -console.log( larger( 256, 400 ) ); // 400 -console.log( larger( 31, 4 ) ); // 31 -console.log( larger( -6, 7 ) ); // 7 -console.log( larger( 11.3, 11.2 ) ); // 11.3 -console.log( larger( -10, -3 ) ); // -3 -// Write a function `lengthiestWord` that accepts a sentence string as an argument. The function should -// return the longest word of the sentence. If there is a tie, return the word that appears later -// in the sentence. - -let lengthiestWord = function ( sentence ) { - let words = sentence.split( ' ' ); - let longest = words[ 0 ]; // pretty - - for ( let i = 1; i < words.length; i++ ) { - let word = words[ i ]; - if ( word.length >= longest.length ) { - longest = word; - } - } - - return longest; -}; - - -console.log( lengthiestWord( "I am pretty hungry" ) ); // 'hungry' -console.log( lengthiestWord( "we should think outside of the box" ) ); // 'outside' -console.log( lengthiestWord( "down the rabbit hole" ) ); // 'rabbit' -console.log( lengthiestWord( "simmer down" ) ); // 'simmer' -// Write a function `longer` that accepts two strings as arguments. The function should return the -// string that is longer. If the strings have the same length, then return the first string. - -let longer = function ( str1, str2 ) { - if ( str1.length >= str2.length ) { - return str1; - } else { - return str2; - } -}; - -console.log( longer( "drum", "piranha" ) ); // 'piranha' -console.log( longer( "basket", "fork" ) ); // 'basket' -console.log( longer( "flannel", "sustainable" ) ); // 'sustainable' -console.log( longer( "disrupt", "ability" ) ); // 'disrupt' -console.log( longer( "bird", "shoe" ) ); // 'bird' -// Write a function `makeAcronym` that accepts a sentence string as an argument. The function should -// return a string containing the first character of each word in the sentence. - -let makeAcronym = function ( sentence ) { - let words = sentence.split( ' ' ); - let acronym = ''; - - for ( let i = 0; i < words.length; i++ ) { - let word = words[ i ]; - acronym += word[ 0 ]; - } - - return acronym.toUpperCase(); -}; - -console.log( makeAcronym( "New York" ) ); // NY -console.log( makeAcronym( "same stuff different day" ) ); // SSDD -console.log( makeAcronym( "Laugh out loud" ) ); // LOL -console.log( makeAcronym( "don't over think stuff" ) ); // DOTS -// Write a function `makeMatrix(m, n, value)` that accepts three arguments. The function should return -// a 2-dimensional array of height `m` and width `n` that contains the `value` as every element. - -let makeMatrix = function ( m, n, value ) { - let matrix = []; - - for ( let i = 0; i < m; i++ ) { - let row = []; - - for ( let j = 0; j < n; j++ ) { - row.push( value ); - } - - matrix.push( row ); - } - - - return matrix; -}; - -console.log( makeMatrix( 3, 5, null ) ); -// [ -// [ null, null, null, null, null ], -// [ null, null, null, null, null ], -// [ null, null, null, null, null ] -// ] - -console.log( makeMatrix( 4, 2, "x" ) ); -// [ -// [ 'x', 'x' ], -// [ 'x', 'x' ], -// [ 'x', 'x' ], -// [ 'x', 'x' ] -// ] - -console.log( makeMatrix( 2, 2, 0 ) ); -// [ -// [ 0, 0 ], -// [ 0, 0 ] -// ] -// Write a function `maximum` that accepts an array of numbers as an argument. The function should -// return the largest number of the array. If the array is empty, then the function should return null. - -let maximum = function ( numbers ) { - if ( numbers.length === 0 ) { - return null; - } - - let currentMax = numbers[ 0 ]; - for ( let i = 1; i < numbers.length; i++ ) { - if ( numbers[ i ] > currentMax ) { - currentMax = numbers[ i ]; - } - } - - return currentMax; -}; - -console.log( maximum( [ 5, 6, 3, 7 ] ) ); // 7 -console.log( maximum( [ 17, 15, 19, 11, 2 ] ) ); // 19 -console.log( maximum( [] ) ); // null -// Write a function `minToMax(min, max)` that accepts two numbers as arguments. The function should -// print all numbers from min to max inclusive. The function doesn't need to return any value. It -// should just print to the terminal. - - -let minToMax = function ( min, max ) { - for ( let i = min; i <= max; i++ ) { - console.log( i ); - } -}; - -minToMax( 5, 9 ); -// prints -// 5 -// 6 -// 7 -// 8 -// 9 - -minToMax( 11, 13 ); -// prints -// 11 -// 12 -// 13 -// Write a function named `noOhs` that accepts a string as an argument. The functions should print the -// characters of the string one by one except the character 'o'. The function doesn't need to return -// any value. It should just print to the terminal. - -let noOhs = function ( str ) { - for ( let i = 0; i < str.length; i++ ) { - let char = str[ i ]; - if ( char !== 'o' ) { - console.log( char ); - } - } -}; - -noOhs( "code" ); -// prints -// c -// d -// e - -noOhs( "school" ); -// prints -// s -// c -// h -// l -// Write a function `numOdds` that accepts an array of numbers as an argument. The function should -// return a number representing the count of odd elements in the array. - -let numOdds = function ( numbers ) { - let count = 0; - - for ( let i = 0; i < numbers.length; i++ ) { - if ( numbers[ i ] % 2 === 1 ) { - count += 1; - } - } - - return count; -}; - -console.log( numOdds( [ 4, 7, 2, 5, 9 ] ) ); // 3 -console.log( numOdds( [ 11, 31, 58, 99, 21, 60 ] ) ); // 4 -console.log( numOdds( [ 100, 40, 4 ] ) ); // 0 -// Write a function `numberChange` that accepts a number as an argument. The function should return -// half the number if it is even. The function should return double the number if it is odd. - -let numberChange = function ( n ) { - if ( n % 2 === 0 ) { - return n / 2; - } else { - return n * 2; - } -}; - -console.log( numberChange( 6 ) ); // 3 -console.log( numberChange( 7 ) ); // 14 -console.log( numberChange( 16 ) ); // 8 -console.log( numberChange( 21 ) ); // 42 -console.log( 2 + 3 ); // 5 -console.log( 10 - 15 ); // -5 -console.log( 4 + 1 - 5 ); // 0 -console.log( 4 * 3 ); // 12 - -console.log( 7 / 2 ); // 3.5 -console.log( 4 + 2 * 3 ); // 10 -console.log( ( 4 + 2 ) * 3 ); // 18 -console.log( 5 % 2 ); // 1 - -console.log( 6 % 2 ); // 0 -console.log( 7 % 2 ); // 1 -console.log( 8 % 2 ); // 0 -console.log( 19 % 8 ); // 3 - -console.log( 24 % 8 ); // 0 -console.log( 7 % 4 ); // 3 -console.log( 4 % 7 ); // 4 -console.log( 5 + ( 10 % 5 ) ); // 5 -console.log( ( 5 + 10 ) % 5 ); // 0 -// Write a function `numberRange(min, max, step)` that accepts three numbers as arguments, `min`, -// `max`, and `step`. The function should return all numbers between `min` and `max` at `step` intervals. -// `min` and `max` are inclusive. - -let numberRange = function ( min, max, step ) { - let range = []; - - for ( let i = min; i <= max; i += step ) { - range.push( i ); - } - - return range; -}; - -console.log( numberRange( 10, 40, 5 ) ); // [10, 15, 20, 25, 30, 35, 40] -console.log( numberRange( 14, 24, 3 ) ); // [14, 17, 20, 23] -console.log( numberRange( 8, 35, 6 ) ); // [8, 14, 20, 26, 32] -// Write a function named `oddSum(max)` that accepts a max number as an argument. The function should -// return the total sum of all odd numbers from 1 to the max, inclusive. -// -// For example, oddSum(10) should return 25 because 1 + 3 + 5 + 7 + 9 = 25 - -let oddSum = function ( max ) { - let sum = 0; - - for ( let i = 1; i <= max; i++ ) { - if ( i % 2 === 1 ) { - sum += i; - } - } - - return sum; -}; - -console.log( oddSum( 10 ) ); // 25 -console.log( oddSum( 5 ) ); // 9 -let word = "bye"; -console.log( `${word} felicia` ); // 'bye felicia' -console.log( word ); // 'bye' - -let num = 10; -num = num * 2; -console.log( num ); // 20 - -let bottlesOfBeer = 99; -let around = bottlesOfBeer - 1; -console.log( around ); // 98 -console.log( bottlesOfBeer ); // 99 -// Write a function `oneOrNone` that accepts two booleans as arguments. The function should return true -// if exactly one of the arguments is true. If BOTH arguments are true, then it should return false. - -let oneOrNone = function ( val1, val2 ) { - if ( ( val1 || val2 ) && !( val1 && val2 ) ) { - return true; - } else { - return false; - } -}; - -console.log( oneOrNone( false, false ) ); // false -console.log( oneOrNone( true, false ) ); // true -console.log( oneOrNone( false, true ) ); // true -console.log( oneOrNone( true, true ) ); // false -// Write a function `oneToFour` that prints all whole numbers from one to four, inclusive. The function -// takes in no arguments and doesn't need to return any value. It should just print to the terminal. - -let oneToFour = function () { - for ( let i = 1; i <= 4; i++ ) { - console.log( i ); - } -}; - - -oneToFour(); -// prints -// 1 -// 2 -// 3 -// 4 -let word = "bye"; -console.log( word + " felicia" ); // 'bye felicia' -console.log( word ); // 'bye' - -let num = 10; -num = num * 2; -console.log( num ); // 20 - -let bottlesOfBeer = 99; -let around = bottlesOfBeer - 1; -console.log( around ); // 98 -console.log( bottlesOfBeer ); // 99 -// Write a function `pairPrint` that accepts an array as an argument. The function should print -// all unique pairs of elements in the array. The function doesn't need to return any value. It -// should just print to the terminal. - -let pairPrint = function ( array ) { - for ( let i = 0; i < array.length; i++ ) { - for ( let j = i + 1; j < array.length; j++ ) { - console.log( array[ i ] + ' - ' + array[ j ] ); - } - } -}; - -pairPrint( [ "artichoke", "broccoli", "carrot", "daikon" ] ); -// prints -// artichoke - broccoli -// artichoke - carrot -// artichoke - daikon -// broccoli - carrot -// broccoli - daikon -// carrot - daikon - -pairPrint( [ "apple", "banana", "clementine" ] ); -// prints -// apple - banana -// apple - clementine -// banana - clementine -// Write a function `parity` that accepts a number as an argument. The function should return the -// string 'even' if the number is even. It should return the string 'odd' if the number is odd. - -let parity = function ( num ) { - if ( num % 2 === 0 ) { - return 'even'; - } else { - return 'odd'; - } -}; - -console.log( parity( 5 ) ); // 'odd' -console.log( parity( 7 ) ); // 'odd' -console.log( parity( 13 ) ); // 'odd' -console.log( parity( 32 ) ); // 'even' -console.log( parity( 10 ) ); // 'even' -console.log( parity( 602348 ) ); // 'even' -// Write a function `print2d` that accepts a two-dimensional array as an argument. The function -// should print all inner elements of the array. - -let print2d = function ( array ) { - for ( let i = 0; i < array.length; i++ ) { - let subarray = array[ i ]; - for ( let j = 0; j < subarray.length; j++ ) { - console.log( subarray[ j ] ); - } - } -}; - - -let array1 = [ - [ "a", "b", "c", "d" ], - [ "e", "f" ], - [ "g", "h", "i" ], -]; -print2d( array1 ); -// prints -// a -// b -// c -// d -// e -// f -// g -// h -// i - -let array2 = [ - [ 9, 3, 4 ], - [ 11 ], - [ 42, 100 ] -]; -print2d( array2 ); -// prints -// 9 -// 3 -// 4 -// 11 -// 42 -// 100 -// Write a function `printCombinations`that accepts two arrays as arguments. The function should -// print all combinations of the elements generated by taking an element from the first array and -// and an element from the second array. The function doesn't need to return any value. It -// should just print to the terminal. - - -let printCombinations = function ( array1, array2 ) { - for ( let i = 0; i < array1.length; i++ ) { - let ele1 = array1[ i ]; - - for ( let j = 0; j < array2.length; j++ ) { - let ele2 = array2[ j ]; - console.log( ele1, ele2 ); - } - } -}; - -let colors = [ "gray", "cream", "cyan" ]; -let clothes = [ "shirt", "flannel" ]; -printCombinations( colors, clothes ); -// prints -// gray shirt -// gray flannel -// cream shirt -// cream flannel -// cyan shirt -// cyan flannel - -printCombinations( [ "hot", "cold" ], [ "soup", "tea" ] ); -// prints -// hot soup -// hot tea -// cold soup -// cold tea -// Write a function named `productUpTo(max)` that accepts a max number as an argument. The function -// should return the total product of all whole numbers from 1 to the max, inclusive. A product is a -// number obtained from multiplying numbers together. -// -// For example, productUpTo(4) should return 24 because 1 * 2 * 3 * 4 = 24 - -let productUpTo = function ( max ) { - let product = 1; - - for ( let i = 1; i <= max; i++ ) { - product *= i; - } - - return product; -}; - -console.log( productUpTo( 4 ) ); // 24 -console.log( productUpTo( 5 ) ); // 120 -console.log( productUpTo( 7 ) ); // 5040 -let word = "suspension bridge"; -console.log( word[ 4 ] ); // e -console.log( word.length > 5 && word[ 0 ] === "d" ); // false -console.log( word.length > 5 && word[ 0 ] === "s" ); // true -console.log( word.indexOf( "o" ) > -1 ); // true -console.log( word.indexOf( "z" ) > -1 ); // false - -let str = "foggy"; -console.log( str[ 2 + 1 ] ); // g -console.log( str[ str.length - 1 ] ); // y -str = " day"; -console.log( str ); // ' day' -console.log( str.length ); // 4 -console.log( str.indexOf( "ogg" ) ); // -1 -// Write a function `raisePower(base, exponent)` that accepts two numbers, `base` and `exponent`. The -// function should return `base` raised to the `exponent` power. -// -// For example, raisePower(2, 5) should return 32 because 2 * 2 * 2 * 2 * 2 = 32 -// For example, raisePower(4, 3) should return 64 because 4 * 4 * 4 = 64 - -let raisePower = function ( base, exponent ) { - let product = 1; - - for ( let i = 1; i <= exponent; i++ ) { - product *= base; - } - - return product; -}; - -console.log( raisePower( 2, 5 ) ); // 32 -console.log( raisePower( 4, 3 ) ); // 64 -console.log( raisePower( 10, 4 ) ); // 10000 -console.log( raisePower( 7, 2 ) ); // 49 -// Write a function `removeCapitals` that accepts a string as an argument. The function should return a -// new version of the string with all capital letters removed. - -let removeCapitals = function ( str ) { - let newStr = ''; - - for ( let i = 0; i < str.length; i++ ) { - let char = str[ i ]; - if ( char === char.toLowerCase() ) { - newStr += char; - } - } - - return newStr; -}; - -console.log( removeCapitals( "fOrEver" ) ); // 'frver' -console.log( removeCapitals( "raiNCoat" ) ); // 'raioat' -console.log( removeCapitals( "cElLAr Door" ) ); // 'clr oor' -// Write a function `removeDupes` that accepts an array as an argument. The function should return a -// new array where each element only appears once. - -let removeDupes = function ( array ) { - let uniques = []; - - for ( let i = 0; i < array.length; i++ ) { - let ele = array[ i ]; - if ( !uniques.includes( ele ) ) { - uniques.push( ele ); - } - } - - return uniques; -}; - -console.log( removeDupes( [ "x", "y", "y", "x", "z" ] ) ); // ['x', 'y', 'z'] -console.log( removeDupes( [ false, false, true, false ] ) ); // [false, true] -console.log( removeDupes( [ 42, 5, 7, 42, 7, 3, 7, 7 ] ) ); // [42, 5, 7, 3] -// Write a function `removeFirstVowel` that accepts a string as an argument. The function should return -// the string with it's first vowel removed. - -let removeFirstVowel = function ( str ) { - let vowels = 'aeiou'; - - for ( let i = 0; i < str.length; i++ ) { - let char = str[ i ]; - if ( vowels.includes( char ) ) { - return str.slice( 0, i ) + str.slice( i + 1 ); - } - } - - return str; -}; - -console.log( removeFirstVowel( "volcano" ) ); // 'vlcano' -console.log( removeFirstVowel( "celery" ) ); // 'clery' -console.log( removeFirstVowel( "juice" ) ); // 'jice' -console.log( removeFirstVowel( "bridge" ) ); // 'brdge' -console.log( removeFirstVowel( "try" ) ); // 'try' -// Write a function `removeShortWords` that accepts a sentence string as an argument. The function -// should return a new sentence where all of the words shorter than 4 characters are removed. - -let removeShortWords = function ( sentence ) { - let words = sentence.split( ' ' ); - let chosenWords = []; - - for ( let i = 0; i < words.length; i++ ) { - let word = words[ i ]; - - if ( word.length >= 4 ) { - chosenWords.push( word ); - } - } - - return chosenWords.join( ' ' ); -}; - -console.log( removeShortWords( "knock on the door will you" ) ); // 'knock door will' -console.log( removeShortWords( "a terrible plan" ) ); // 'terrible plan' -console.log( removeShortWords( "run faster that way" ) ); // 'faster that' -// Write a function `removeVowels` that accepts a string as an argument. The function should return -// a version of the string where all vowels are removed. - -let removeVowels = function ( str ) { - let newStr = ''; - let vowels = 'aeiou'; - - for ( let i = 0; i < str.length; i++ ) { - let char = str[ i ]; - if ( !vowels.includes( char ) ) { - newStr += char; - } - } - - return newStr; -}; - -console.log( removeVowels( "jello" ) ); // jll -console.log( removeVowels( "sensitivity" ) ); // snstvty -console.log( removeVowels( "cellar door" ) ); // cllr dr -// Write a function `reverseArray` that accepts an array as an argument. The function should return a -// array containing the elements of the original array in reverse order. - -let reverseArray1 = function ( array ) { - let reversed = []; - - for ( let i = array.length - 1; i >= 0; i-- ) { - reversed.push( array[ i ] ); - } - - return reversed; -}; - -console.log( reverseArray1( [ "zero", "one", "two", "three" ] ) ); // ['three', 'two', 'one', 'zero'] -console.log( reverseArray1( [ 7, 1, 8 ] ) ); // [8, 1, 7] - - -let reverseArray2 = function ( array ) { - let reversed = []; - - for ( let i = 0; i < array.length; i++ ) { - reversed.unshift( array[ i ] ); - } - - return reversed; -}; - -console.log( reverseArray2( [ "zero", "one", "two", "three" ] ) ); // ['three', 'two', 'one', 'zero'] -console.log( reverseArray2( [ 7, 1, 8 ] ) ); // [8, 1, 7] -// Write a function `reverseIterate` that accepts a string as an argument. The function should print -// the characters of the string one by one, in reverse order. The function doesn't need to return any -// value. It should just print to the terminal. - -let reverseIterate = function ( str ) { - for ( let i = str.length - 1; i >= 0; i-- ) { - console.log( str[ i ] ); - } -}; - -reverseIterate( "carrot" ); -// prints -// t -// o -// r -// r -// a -// c - -reverseIterate( "box" ); -// prints -// x -// o -// b -// Write a function `shortenLongWords` that accepts a sentence string as an argument. The function -// should return the same sentence where words longer than 4 characters have their vowels removed. - -let removeVowels = function ( str ) { - let newStr = ''; - let vowels = 'aeiou'; - - for ( let i = 0; i < str.length; i++ ) { - let char = str[ i ]; - if ( !vowels.includes( char ) ) { - newStr += char; - } - } - - return newStr; -}; - -let shortenLongWords = function ( sentence ) { - let words = sentence.split( ' ' ); - let newWords = []; - - for ( let i = 0; i < words.length; i++ ) { - let word = words[ i ]; - if ( word.length > 4 ) { - let noVowels = removeVowels( word ); - newWords.push( noVowels ); - } else { - // leave it the same - newWords.push( word ); - } - } - - return newWords.join( ' ' ); -}; - -console.log( shortenLongWords( "they are very noble people" ) ); // 'they are very nbl ppl' -console.log( shortenLongWords( "stick with it" ) ); // 'stck with it' -console.log( shortenLongWords( "ballerina, you must have seen her" ) ); // 'bllrna, you must have seen her -console.log( "promenade" [ 3 ] ); // m -console.log( "tiger" [ 1 ] ); // i -console.log( "wheel".length ); // 5 - -console.log( "wheel".length - 1 ); // 4 -console.log( "noMAD".toUpperCase() ); // NOMAD -console.log( "hey programmers" [ 2 ] === "y" ); // true - -console.log( "volleyball".length > 20 ); // false -console.log( "treasure".indexOf( "r" ) ); // 1 -console.log( "treasure".indexOf( "e" ) ); // 2 -console.log( "web" [ 5 ] ); // undefined -console.log( "red".indexOf( "x" ) ); // -1 -console.log( "red".indexOf( "R" ) ); // -1 -// snippet 0-1 -let greet = function () { - console.log( "hey" ); - console.log( "programmers" ); -}; - -let whistle = function () { - console.log( "doot" ); -}; - -console.log( "first" ); -console.log( "second" ); -greet(); -console.log( "third" ); -console.log( "fourth" ); -whistle(); - - -// first -// second -// hey -// programmers -// third -// fourth -// doot -// snippet 0-2 -let howMany = function () { - return 42; -}; - -console.log( howMany ); -console.log( howMany() ); - -const theAnswer = howMany(); -console.log( theAnswer ); - -let howMuch = function () { - 5; -}; -console.log( howMuch() ); - - -// [Function: howMany] -// 42 -// 42 -// undefined -// snippet 0-3 -let average = function ( num1, num2 ) { - console.log( "calculating..." ); - return ( num1 + num2 ) / 2; -}; - -console.log( average( 5, 10 ) ); -console.log( average( 20, 26 ) ); -console.log( average( 50, 100 ) + 2 ); - -let a = 21 + 3; -let b = 20; -let n = average( a, b ); -console.log( average( n, 18 ) ); - - -// calculating... -// 7.5 -// calculating... -// 23 -// calculating... -// 77 -// calculating... -// calculating... -// 20 -// snippet 0-4 -let exclaim = function ( str ) { - let capitalized = str.toUpperCase(); - return capitalized + "!!"; -}; - -let result = exclaim( "potato" ); -console.log( result ); -console.log( result.length ); -console.log( result[ 0 ] ); -console.log( result[ result.length - 1 ] ); - - -// POTATO!! -// 8 -// P -// ! -// snippet 1 -console.log( "hello" ); - -for ( let i = 0; i < 5; i++ ) { - console.log( "code" ); -} - -console.log( "goodbye" ); - - -hello -code -code -code -code -code -goodbye -// snippet 1 -console.log( "hello" ); - -for ( let i = 0; i < 5; i++ ) { - console.log( "code" ); -} - -console.log( "goodbye" ); - - -hello -code -code -code -code -code -goodbye -// snippet 2 -console.log( "hi" ); - -for ( let i = 3; i <= 7; i++ ) { - console.log( "program" ); - console.log( i ); -} - -console.log( "bye" ); - - -// hi -// program -// 3 -// program -// 4 -// program -// 5 -// program -// 6 -// program -// 7 -// bye -// snippet 2 -console.log( "hi" ); - -for ( let i = 3; i <= 7; i++ ) { - console.log( "program" ); - console.log( i ); -} - -console.log( "bye" ); - - -// hi -// program -// 3 -// program -// 4 -// program -// 5 -// program -// 6 -// program -// 7 -// bye -// snippet 3 -let foo = function () { - for ( let num = 10; num > 0; num -= 2 ) { - console.log( num ); - } -}; - -console.log( "begin" ); -foo(); -console.log( "end" ); -foo(); - - -// begin -// 10 -// 8 -// 6 -// 4 -// 2 -// end -// 10 -// 8 -// 6 -// 4 -// 2 -// snippet 3 -let foo = function () { - for ( let num = 10; num > 0; num -= 2 ) { - console.log( num ); - } -}; - -console.log( "begin" ); -foo(); -console.log( "end" ); -foo(); - - -// begin -// 10 -// 8 -// 6 -// 4 -// 2 -// end -// 10 -// 8 -// 6 -// 4 -// 2 -// snippet 4 -let word = "street"; -for ( let i = 0; i < word.length; i++ ) { - console.log( i ); - console.log( word[ i ] ); -} - - -// 0 -// s -// 1 -// t -// 2 -// r -// 3 -// e -// 4 -// e -// 5 -// t -// snippet 4 -let word = "street"; -for ( let i = 0; i < word.length; i++ ) { - console.log( i ); - console.log( word[ i ] ); -} - - -// 0 -// s -// 1 -// t -// 2 -// r -// 3 -// e -// 4 -// e -// 5 -// t -// snippet 5 -let total = 0; // 10 -for ( let i = 1; i < 5; i++ ) { - total += i; - console.log( total ); -} - -console.log( "grand total: " + total ); - - -// 1 -// 3 -// 6 -// 10 -// grand total: 10 -// snippet 5 -let total = 0; // 10 -for ( let i = 1; i < 5; i++ ) { - total += i; - console.log( total ); -} - -console.log( "grand total: " + total ); - - -// 1 -// 3 -// 6 -// 10 -// grand total: 10 -// Write a function `spam` that accepts a 2D array as an argument. The array contains pairs as elements. -// The first element of every pair is a number and the second element is a word. The function should -// return a string containing the words repeated the specified number of times. See the examples. - -let spam = function ( pairs ) { - let words = []; - - for ( let i = 0; i < pairs.length; i++ ) { - let pair = pairs[ i ]; - let word = pair[ 0 ]; - let num = pair[ 1 ]; - - for ( let j = 0; j < num; j++ ) { - words.push( word ); - } - } - - return words.join( ' ' ); -}; - -let array1 = [ - [ "hi", 3 ], - [ "bye", 2 ], -]; -console.log( spam( array1 ) ); // 'hi hi hi bye bye' - -let array2 = [ - [ "cat", 1 ], - [ "dog", 2 ], - [ "bird", 4 ], -]; -console.log( spam( array2 ) ); // 'cat dog dog bird bird bird bird' -// Write a function `startsWithR` that accepts a string as an argument and returns a boolean indicating -// whether or not the string starts with 'r' or 'R'. - -let startsWithR = function ( str ) { - return str[ 0 ] === 'r' || str[ 0 ] === 'R'; -}; - -console.log( startsWithR( "roger that" ) ); // true -console.log( startsWithR( "Row, row, row your boat" ) ); // true -console.log( startsWithR( "slip" ) ); // false -console.log( startsWithR( "Taxicab" ) ); // false -// Write a function `stayPositive` that accepts an array of numbers as an argument. The function should -// return an array containing only the positive numbers. - -let stayPositive = function ( numbers ) { - let positives = []; - - for ( let i = 0; i < numbers.length; i++ ) { - if ( numbers[ i ] > 0 ) { - positives.push( numbers[ i ] ); - } - } - - return positives; -}; - - -console.log( stayPositive( [ 10, -4, 3, 6 ] ) ); // [10, 3, 6] -console.log( stayPositive( [ -5, 11, -40, 30.3, -2 ] ) ); // [11, 30.3] -console.log( stayPositive( [ -11, -30 ] ) ); // [] -console.log( "river" + "town" ); -console.log( "cat" + "dog" ); -console.log( "New" + " York" ); -console.log( "runner's knee" + "!" ); -console.log( "man" + "bear" + "pig" ); -// Write a function `stringIterate` that accepts a string as an argument. The function should print out -// each character of the string, one by one. The function doesn't need to return any value. It should -// just print to the terminal. - -let stringIterate = function ( string ) { - for ( let i = 0; i < string.length; i++ ) { - console.log( string[ i ] ); - } -}; - -stringIterate( "celery" ); -// prints -// c -// e -// l -// e -// r -// y - -stringIterate( "hat" ); -// prints -// h -// a -// t -// Write a function named `stringRepeater(str, num)` that accepts a string and a number as arguments. -// The function should return a new string consisting of the `str` repeated `num` number of times. - -let stringRepeater = function ( str, num ) { - let repeatedStr = ''; - - for ( let i = 1; i <= num; i++ ) { - repeatedStr += str - } - - return repeatedStr; -}; - -console.log( stringRepeater( "q", 4 ) ); // 'qqqq' -console.log( stringRepeater( "go", 2 ) ); // 'gogo' -console.log( stringRepeater( "tac", 3 ) ); // 'tactactac' -// Write a function `stringSize` that accepts a string as an argument. The function should return the -// string 'small' if the argument is shorter than 5 characters, 'medium' if it is exactly 5 characters, and -// 'large' if it is longer than 5 characters. - -let stringSize = function ( str ) { - if ( str.length < 5 ) { - return 'small'; - } else if ( str.length > 5 ) { - return 'large'; - } else { - return 'medium'; - } -}; - -console.log( stringSize( "cat" ) ); // 'small' -console.log( stringSize( "bell" ) ); // 'small' -console.log( stringSize( "ready" ) ); // 'medium' -console.log( stringSize( "shirt" ) ); // 'medium' -console.log( stringSize( "shallow" ) ); // 'large' -console.log( stringSize( "intelligence" ) ); // 'large' -// Write a function `stringsToLengths` that accepts an array of strings as an argument. The function -// should return a new array containing the lengths of the elements of the original array. - -let stringsToLengths = function ( words ) { - let lengths = []; - - for ( let i = 0; i < words.length; i++ ) { - lengths.push( words[ i ].length ); - } - - return lengths; -}; - -console.log( stringsToLengths( [ "belly", "echo", "irony", "pickled" ] ) ); -// [5, 4, 5, 7] - -console.log( stringsToLengths( [ "on", "off", "handmade" ] ) ); -// [2, 3, 8] -// Write a function named `sumUpTo(max)` that accepts a max number as an argument. The function should -// return the total sum of all whole numbers from 1 to the max, inclusive. -// -// For example, sumUpTo(4) should return 10 because 1 + 2 + 3 + 4 = 10. - -let sumUpTo = function ( max ) { - let sum = 0; - - for ( let i = 1; i <= max; i++ ) { - sum += i - } - - return sum; -}; - -console.log( sumUpTo( 4 ) ); // 10 -console.log( sumUpTo( 5 ) ); // 15 -console.log( sumUpTo( 2 ) ); // 3 -console.log( 'coffee' ); -let qty = 15 % 4; -console.log( qty ); // 3 - -let num = 38 + 3; -num++; -console.log( num + " is a great number" ); // '42 is a great number' - -let isNumEven = num % 2 === 0; -console.log( num + " is even? " + isNumEven ); // '42 is even? true' - -let isQtyEven = qty % 2 === 0; -console.log( qty + " is even? " + isQtyEven ); // '3 is even? false' -let qty = 15 % 4; -console.log( qty ); // 3 - -let num = 38 + 3; -num++; -console.log( num + " is a great number" ); // '42 is a great number' - -let isNumEven = num % 2 === 0; -console.log( num + " is even? " + isNumEven ); // '42 is even? true' - -let isQtyEven = qty % 2 === 0; -console.log( qty + " is even? " + isQtyEven ); // '3 is even? false' -// Write a function `totalProduct(array)` that accepts a 2D array of numbers. The function should return -// the total product of all numbers in the array. - -let totalProduct = function ( array ) { - let product = 1; - - for ( let i = 0; i < array.length; i++ ) { - let subarray = array[ i ]; - - for ( let j = 0; j < subarray.length; j++ ) { - product *= subarray[ j ]; - } - } - - return product; -}; - -let array1 = [ - [ 3, 5, 2 ], - [ 6, 2 ], -]; -console.log( totalProduct( array1 ) ); // 360 - -let array2 = [ - [ 4, 6 ], - [ 2, 3 ], - [ 1, 2 ], -]; -console.log( totalProduct( array2 ) ); // 288 -// Write a function `total` that accepts an array of numbers as an argument. The function should return -// the total sum of all elements of the array. - -let total = function ( numbers ) { - let sum = 0; - for ( let i = 0; i < numbers.length; i++ ) { - sum += numbers[ i ]; - } - return sum; -}; - -console.log( total( [ 3, 2, 8 ] ) ); // 13 -console.log( total( [ -5, 7, 4, 6 ] ) ); // 12 -console.log( total( [ 7 ] ) ); // 7 -console.log( total( [] ) ); // 0 -let apple; -console.log( apple ); // undefined - -apple = 5; -console.log( apple ); // 5 - -apple + 1; -console.log( apple ); // 5 - -apple += 1; -console.log( apple ); // 6 - -let banana = apple; -console.log( banana ); // 6 - -banana = banana / 2; -console.log( banana ); // 3 - -console.log( apple ); // 6 -// Write a function `twoSumPairs(numbers, target)` that accepts an array of numbers and a target number -// as arguments. The function should return a 2D array containing all unique pairs of elements that -// sum to the target. - -let twoSumPairs = function ( numbers, target ) { - let pairs = []; - - for ( let i = 0; i < numbers.length; i++ ) { - let num1 = numbers[ i ]; - - for ( let j = i + 1; j < numbers.length; j++ ) { - let num2 = numbers[ j ]; - - if ( num1 + num2 === target ) { - let pair = [ num1, num2 ]; - pairs.push( pair ); - } - } - } - - return pairs; -}; - -console.log( twoSumPairs( [ 2, 3, 4, 6, 5 ], 8 ) ); // [ [2, 6], [3, 5] ] -console.log( twoSumPairs( [ 10, 7, 4, 5, 2 ], 12 ) ); // [ [10, 2], [7, 5] ] -console.log( twoSumPairs( [ 3, 9, 8 ], 11 ) ); // [ [3, 8] ] -console.log( twoSumPairs( [ 3, 9, 8 ], 10 ) ); // [ ] -// Write a function `twoSum(numbers, target)` that accepts an array of numbers and a target number -// as an argument. The function should return a boolean indicating whether or not there exists a pair -// of distinct elements in the array that sum to the target. - -let twoSum = function ( numbers, target ) { - for ( let i = 0; i < numbers.length; i++ ) { - for ( let j = i + 1; j < numbers.length; j++ ) { - if ( numbers[ i ] + numbers[ j ] === target ) { - return true; - } - } - } - - return false; -}; - -console.log( twoSum( [ 2, 3, 5, 9 ], 7 ) ); // true -console.log( twoSum( [ 2, 3, 5, 9 ], 4 ) ); // false -console.log( twoSum( [ 6, 3, 4 ], 10 ) ); // true -console.log( twoSum( [ 6, 5, 1 ], 10 ) ); // false -let apple; -console.log( apple ); // undefined - -apple = 5; -console.log( apple ); // 5 - -apple + 1; -console.log( apple ); // 5 - -apple += 1; -console.log( apple ); // 6 - -let banana = apple; -console.log( banana ); // 6 - -banana = banana / 2; -console.log( banana ); // 3 - -console.log( apple ); // 6 -// Write a function `wackyWord` that accepts two strings as arguments. The function should return a new -// string containing the first three characters of the first string concatenated with the last two -// character of the second string. - -// You can assume that the first argument has a length of at least three and the second argument has a -// length of at least two. - - -let wackyWord = function ( str1, str2 ) { - return str1.slice( 0, 3 ) + str2.slice( -2 ); -}; - -console.log( wackyWord( "very", "kindly" ) ); // 'verly' -console.log( wackyWord( "forever", "sick" ) ); // 'forck' -console.log( wackyWord( "cellar", "door" ) ); // 'celor' -console.log( wackyWord( "bagel", "sweep" ) ); // 'bagep' -console.log( 'alvin' ); -console.log( 'z' ); -// Write a function `wordCount(sentence, targetWords)` that accepts a sentence string and an array of -// `targetWords`. The function should return a count of the number of words of the sentence that are -// in `targetWords`. - -let wordCount = function ( sentence, targetWords ) { - let words = sentence.split( ' ' ); - let count = 0; - - for ( let i = 0; i < words.length; i++ ) { - let word = words[ i ]; - - if ( targetWords.includes( word ) ) { - count++; - } - } - - return count; -}; - -console.log( wordCount( "open the window please", [ "please", "open", "sorry" ] ) ); // 2 -console.log( wordCount( "drive to the cinema", [ "the", "driver" ] ) ); // 1 -console.log( wordCount( "can I have that can", [ "can", "I" ] ) ); // 3 -// Write a function `yourAverageFunction` that accepts an array of numbers as an argument. The -// function should return the average of all elements of the array. If the input array is empty, -// then the function should return null. - -let yourAverageFunction = function ( nums ) { - if ( nums.length === 0 ) { - return null; - } - - let sum = 0; - for ( let i = 0; i < nums.length; i++ ) { - sum += nums[ i ]; - } - - return sum / nums.length; -}; - -console.log( yourAverageFunction( [ 5, 2, 7, 24 ] ) ); // 9.5 -console.log( yourAverageFunction( [ 100, 6 ] ) ); // 53 -console.log( yourAverageFunction( [ 31, 32, 40, 12, 33 ] ) ); // 29.6 -console.log( yourAverageFunction( [] ) ); // null -let location = "Brooklyn, " + "NY"; -console.log( location ); // 'Brooklyn, NY' - -let quantity = 4 * 5 + 1; -console.log( quantity ); // 21 -let location = "Brooklyn, " + "NY"; -console.log( location ); // 'Brooklyn, NY' - -let quantity = 4 * 5 + 1; -console.log( quantity ); // 21 -// Write a function `zipper` that accepts two arrays as arguments. The function should return a 2D -// array containing pairs of elements at the same indices. - - -let zipper = function ( arr1, arr2 ) { - let result = []; - - for ( let i = 0; i < arr1.length; i++ ) { - let el1 = arr1[ i ]; - let el2 = arr2[ i ]; - let pair = [ el1, el2 ]; - result.push( pair ); - } - - return result; -}; - -let array1 = [ "a", "b", "c", "d" ]; -let array2 = [ -1, -2, -3, -4 ]; -console.log( zipper( array1, array2 ) ); -// [ -// ['a', -1], -// ['b', -2], -// ['c', -3], -// ['d', -4], -// ] - -let array3 = [ "whisper", "talk", "shout" ]; -let array4 = [ "quiet", "normal", "loud" ]; -console.log( zipper( array3, array4 ) ); -// [ -// ['whisper', 'quiet'], -// ['talk', 'normal'], -// ['shout', 'loud'], -// ] diff --git a/javascript-practice/-ALL-JS-Files/pair-print.js b/javascript-practice/-ALL-JS-Files/pair-print.js deleted file mode 100644 index 1dda0fb..0000000 --- a/javascript-practice/-ALL-JS-Files/pair-print.js +++ /dev/null @@ -1,26 +0,0 @@ -// Write a function `pairPrint` that accepts an array as an argument. The function should print -// all unique pairs of elements in the array. The function doesn't need to return any value. It -// should just print to the terminal. - -let pairPrint = function ( array ) { - for ( let i = 0; i < array.length; i++ ) { - for ( let j = i + 1; j < array.length; j++ ) { - console.log( array[ i ] + ' - ' + array[ j ] ); - } - } -}; - -pairPrint( [ "artichoke", "broccoli", "carrot", "daikon" ] ); -// prints -// artichoke - broccoli -// artichoke - carrot -// artichoke - daikon -// broccoli - carrot -// broccoli - daikon -// carrot - daikon - -pairPrint( [ "apple", "banana", "clementine" ] ); -// prints -// apple - banana -// apple - clementine -// banana - clementine diff --git a/javascript-practice/-ALL-JS-Files/parity.js b/javascript-practice/-ALL-JS-Files/parity.js deleted file mode 100644 index 7193f33..0000000 --- a/javascript-practice/-ALL-JS-Files/parity.js +++ /dev/null @@ -1,17 +0,0 @@ -// Write a function `parity` that accepts a number as an argument. The function should return the -// string 'even' if the number is even. It should return the string 'odd' if the number is odd. - -let parity = function ( num ) { - if ( num % 2 === 0 ) { - return 'even'; - } else { - return 'odd'; - } -}; - -console.log( parity( 5 ) ); // 'odd' -console.log( parity( 7 ) ); // 'odd' -console.log( parity( 13 ) ); // 'odd' -console.log( parity( 32 ) ); // 'even' -console.log( parity( 10 ) ); // 'even' -console.log( parity( 602348 ) ); // 'even' diff --git a/javascript-practice/-ALL-JS-Files/print-2d.js b/javascript-practice/-ALL-JS-Files/print-2d.js deleted file mode 100644 index b51909e..0000000 --- a/javascript-practice/-ALL-JS-Files/print-2d.js +++ /dev/null @@ -1,43 +0,0 @@ -// Write a function `print2d` that accepts a two-dimensional array as an argument. The function -// should print all inner elements of the array. - -let print2d = function ( array ) { - for ( let i = 0; i < array.length; i++ ) { - let subarray = array[ i ]; - for ( let j = 0; j < subarray.length; j++ ) { - console.log( subarray[ j ] ); - } - } -}; - - -let array1 = [ - [ "a", "b", "c", "d" ], - [ "e", "f" ], - [ "g", "h", "i" ], -]; -print2d( array1 ); -// prints -// a -// b -// c -// d -// e -// f -// g -// h -// i - -let array2 = [ - [ 9, 3, 4 ], - [ 11 ], - [ 42, 100 ] -]; -print2d( array2 ); -// prints -// 9 -// 3 -// 4 -// 11 -// 42 -// 100 diff --git a/javascript-practice/-ALL-JS-Files/print-combinations.js b/javascript-practice/-ALL-JS-Files/print-combinations.js deleted file mode 100644 index c979205..0000000 --- a/javascript-practice/-ALL-JS-Files/print-combinations.js +++ /dev/null @@ -1,34 +0,0 @@ -// Write a function `printCombinations`that accepts two arrays as arguments. The function should -// print all combinations of the elements generated by taking an element from the first array and -// and an element from the second array. The function doesn't need to return any value. It -// should just print to the terminal. - - -let printCombinations = function ( array1, array2 ) { - for ( let i = 0; i < array1.length; i++ ) { - let ele1 = array1[ i ]; - - for ( let j = 0; j < array2.length; j++ ) { - let ele2 = array2[ j ]; - console.log( ele1, ele2 ); - } - } -}; - -let colors = [ "gray", "cream", "cyan" ]; -let clothes = [ "shirt", "flannel" ]; -printCombinations( colors, clothes ); -// prints -// gray shirt -// gray flannel -// cream shirt -// cream flannel -// cyan shirt -// cyan flannel - -printCombinations( [ "hot", "cold" ], [ "soup", "tea" ] ); -// prints -// hot soup -// hot tea -// cold soup -// cold tea diff --git a/javascript-practice/-ALL-JS-Files/product-up-to.js b/javascript-practice/-ALL-JS-Files/product-up-to.js deleted file mode 100644 index dd2b84f..0000000 --- a/javascript-practice/-ALL-JS-Files/product-up-to.js +++ /dev/null @@ -1,19 +0,0 @@ -// Write a function named `productUpTo(max)` that accepts a max number as an argument. The function -// should return the total product of all whole numbers from 1 to the max, inclusive. A product is a -// number obtained from multiplying numbers together. -// -// For example, productUpTo(4) should return 24 because 1 * 2 * 3 * 4 = 24 - -let productUpTo = function ( max ) { - let product = 1; - - for ( let i = 1; i <= max; i++ ) { - product *= i; - } - - return product; -}; - -console.log( productUpTo( 4 ) ); // 24 -console.log( productUpTo( 5 ) ); // 120 -console.log( productUpTo( 7 ) ); // 5040 diff --git a/javascript-practice/-ALL-JS-Files/proper-patterns.js b/javascript-practice/-ALL-JS-Files/proper-patterns.js deleted file mode 100644 index 7d14806..0000000 --- a/javascript-practice/-ALL-JS-Files/proper-patterns.js +++ /dev/null @@ -1,14 +0,0 @@ -let word = "suspension bridge"; -console.log( word[ 4 ] ); // e -console.log( word.length > 5 && word[ 0 ] === "d" ); // false -console.log( word.length > 5 && word[ 0 ] === "s" ); // true -console.log( word.indexOf( "o" ) > -1 ); // true -console.log( word.indexOf( "z" ) > -1 ); // false - -let str = "foggy"; -console.log( str[ 2 + 1 ] ); // g -console.log( str[ str.length - 1 ] ); // y -str = " day"; -console.log( str ); // ' day' -console.log( str.length ); // 4 -console.log( str.indexOf( "ogg" ) ); // -1 diff --git a/javascript-practice/-ALL-JS-Files/raise-power.js b/javascript-practice/-ALL-JS-Files/raise-power.js deleted file mode 100644 index 1c42cd4..0000000 --- a/javascript-practice/-ALL-JS-Files/raise-power.js +++ /dev/null @@ -1,20 +0,0 @@ -// Write a function `raisePower(base, exponent)` that accepts two numbers, `base` and `exponent`. The -// function should return `base` raised to the `exponent` power. -// -// For example, raisePower(2, 5) should return 32 because 2 * 2 * 2 * 2 * 2 = 32 -// For example, raisePower(4, 3) should return 64 because 4 * 4 * 4 = 64 - -let raisePower = function ( base, exponent ) { - let product = 1; - - for ( let i = 1; i <= exponent; i++ ) { - product *= base; - } - - return product; -}; - -console.log( raisePower( 2, 5 ) ); // 32 -console.log( raisePower( 4, 3 ) ); // 64 -console.log( raisePower( 10, 4 ) ); // 10000 -console.log( raisePower( 7, 2 ) ); // 49 diff --git a/javascript-practice/-ALL-JS-Files/remove-capitals.js b/javascript-practice/-ALL-JS-Files/remove-capitals.js deleted file mode 100644 index 287cfe7..0000000 --- a/javascript-practice/-ALL-JS-Files/remove-capitals.js +++ /dev/null @@ -1,19 +0,0 @@ -// Write a function `removeCapitals` that accepts a string as an argument. The function should return a -// new version of the string with all capital letters removed. - -let removeCapitals = function ( str ) { - let newStr = ''; - - for ( let i = 0; i < str.length; i++ ) { - let char = str[ i ]; - if ( char === char.toLowerCase() ) { - newStr += char; - } - } - - return newStr; -}; - -console.log( removeCapitals( "fOrEver" ) ); // 'frver' -console.log( removeCapitals( "raiNCoat" ) ); // 'raioat' -console.log( removeCapitals( "cElLAr Door" ) ); // 'clr oor' diff --git a/javascript-practice/-ALL-JS-Files/remove-dupes.js b/javascript-practice/-ALL-JS-Files/remove-dupes.js deleted file mode 100644 index 55cd504..0000000 --- a/javascript-practice/-ALL-JS-Files/remove-dupes.js +++ /dev/null @@ -1,19 +0,0 @@ -// Write a function `removeDupes` that accepts an array as an argument. The function should return a -// new array where each element only appears once. - -let removeDupes = function ( array ) { - let uniques = []; - - for ( let i = 0; i < array.length; i++ ) { - let ele = array[ i ]; - if ( !uniques.includes( ele ) ) { - uniques.push( ele ); - } - } - - return uniques; -}; - -console.log( removeDupes( [ "x", "y", "y", "x", "z" ] ) ); // ['x', 'y', 'z'] -console.log( removeDupes( [ false, false, true, false ] ) ); // [false, true] -console.log( removeDupes( [ 42, 5, 7, 42, 7, 3, 7, 7 ] ) ); // [42, 5, 7, 3] diff --git a/javascript-practice/-ALL-JS-Files/remove-first-vowel.js b/javascript-practice/-ALL-JS-Files/remove-first-vowel.js deleted file mode 100644 index 12ec5fa..0000000 --- a/javascript-practice/-ALL-JS-Files/remove-first-vowel.js +++ /dev/null @@ -1,21 +0,0 @@ -// Write a function `removeFirstVowel` that accepts a string as an argument. The function should return -// the string with it's first vowel removed. - -let removeFirstVowel = function ( str ) { - let vowels = 'aeiou'; - - for ( let i = 0; i < str.length; i++ ) { - let char = str[ i ]; - if ( vowels.includes( char ) ) { - return str.slice( 0, i ) + str.slice( i + 1 ); - } - } - - return str; -}; - -console.log( removeFirstVowel( "volcano" ) ); // 'vlcano' -console.log( removeFirstVowel( "celery" ) ); // 'clery' -console.log( removeFirstVowel( "juice" ) ); // 'jice' -console.log( removeFirstVowel( "bridge" ) ); // 'brdge' -console.log( removeFirstVowel( "try" ) ); // 'try' diff --git a/javascript-practice/-ALL-JS-Files/remove-short-words.js b/javascript-practice/-ALL-JS-Files/remove-short-words.js deleted file mode 100644 index e325e63..0000000 --- a/javascript-practice/-ALL-JS-Files/remove-short-words.js +++ /dev/null @@ -1,21 +0,0 @@ -// Write a function `removeShortWords` that accepts a sentence string as an argument. The function -// should return a new sentence where all of the words shorter than 4 characters are removed. - -let removeShortWords = function ( sentence ) { - let words = sentence.split( ' ' ); - let chosenWords = []; - - for ( let i = 0; i < words.length; i++ ) { - let word = words[ i ]; - - if ( word.length >= 4 ) { - chosenWords.push( word ); - } - } - - return chosenWords.join( ' ' ); -}; - -console.log( removeShortWords( "knock on the door will you" ) ); // 'knock door will' -console.log( removeShortWords( "a terrible plan" ) ); // 'terrible plan' -console.log( removeShortWords( "run faster that way" ) ); // 'faster that' diff --git a/javascript-practice/-ALL-JS-Files/remove-vowels.js b/javascript-practice/-ALL-JS-Files/remove-vowels.js deleted file mode 100644 index eb2d0df..0000000 --- a/javascript-practice/-ALL-JS-Files/remove-vowels.js +++ /dev/null @@ -1,20 +0,0 @@ -// Write a function `removeVowels` that accepts a string as an argument. The function should return -// a version of the string where all vowels are removed. - -let removeVowels = function ( str ) { - let newStr = ''; - let vowels = 'aeiou'; - - for ( let i = 0; i < str.length; i++ ) { - let char = str[ i ]; - if ( !vowels.includes( char ) ) { - newStr += char; - } - } - - return newStr; -}; - -console.log( removeVowels( "jello" ) ); // jll -console.log( removeVowels( "sensitivity" ) ); // snstvty -console.log( removeVowels( "cellar door" ) ); // cllr dr diff --git a/javascript-practice/-ALL-JS-Files/reverse-array.js b/javascript-practice/-ALL-JS-Files/reverse-array.js deleted file mode 100644 index 5e2c42a..0000000 --- a/javascript-practice/-ALL-JS-Files/reverse-array.js +++ /dev/null @@ -1,29 +0,0 @@ -// Write a function `reverseArray` that accepts an array as an argument. The function should return a -// array containing the elements of the original array in reverse order. - -let reverseArray1 = function ( array ) { - let reversed = []; - - for ( let i = array.length - 1; i >= 0; i-- ) { - reversed.push( array[ i ] ); - } - - return reversed; -}; - -console.log( reverseArray1( [ "zero", "one", "two", "three" ] ) ); // ['three', 'two', 'one', 'zero'] -console.log( reverseArray1( [ 7, 1, 8 ] ) ); // [8, 1, 7] - - -let reverseArray2 = function ( array ) { - let reversed = []; - - for ( let i = 0; i < array.length; i++ ) { - reversed.unshift( array[ i ] ); - } - - return reversed; -}; - -console.log( reverseArray2( [ "zero", "one", "two", "three" ] ) ); // ['three', 'two', 'one', 'zero'] -console.log( reverseArray2( [ 7, 1, 8 ] ) ); // [8, 1, 7] diff --git a/javascript-practice/-ALL-JS-Files/reverse-iterate.js b/javascript-practice/-ALL-JS-Files/reverse-iterate.js deleted file mode 100644 index cb082c5..0000000 --- a/javascript-practice/-ALL-JS-Files/reverse-iterate.js +++ /dev/null @@ -1,24 +0,0 @@ -// Write a function `reverseIterate` that accepts a string as an argument. The function should print -// the characters of the string one by one, in reverse order. The function doesn't need to return any -// value. It should just print to the terminal. - -let reverseIterate = function ( str ) { - for ( let i = str.length - 1; i >= 0; i-- ) { - console.log( str[ i ] ); - } -}; - -reverseIterate( "carrot" ); -// prints -// t -// o -// r -// r -// a -// c - -reverseIterate( "box" ); -// prints -// x -// o -// b diff --git a/javascript-practice/-ALL-JS-Files/shorten-long-words.js b/javascript-practice/-ALL-JS-Files/shorten-long-words.js deleted file mode 100644 index 69e2fcc..0000000 --- a/javascript-practice/-ALL-JS-Files/shorten-long-words.js +++ /dev/null @@ -1,38 +0,0 @@ -// Write a function `shortenLongWords` that accepts a sentence string as an argument. The function -// should return the same sentence where words longer than 4 characters have their vowels removed. - -let removeVowels = function ( str ) { - let newStr = ''; - let vowels = 'aeiou'; - - for ( let i = 0; i < str.length; i++ ) { - let char = str[ i ]; - if ( !vowels.includes( char ) ) { - newStr += char; - } - } - - return newStr; -}; - -let shortenLongWords = function ( sentence ) { - let words = sentence.split( ' ' ); - let newWords = []; - - for ( let i = 0; i < words.length; i++ ) { - let word = words[ i ]; - if ( word.length > 4 ) { - let noVowels = removeVowels( word ); - newWords.push( noVowels ); - } else { - // leave it the same - newWords.push( word ); - } - } - - return newWords.join( ' ' ); -}; - -console.log( shortenLongWords( "they are very noble people" ) ); // 'they are very nbl ppl' -console.log( shortenLongWords( "stick with it" ) ); // 'stck with it' -console.log( shortenLongWords( "ballerina, you must have seen her" ) ); // 'bllrna, you must have seen her diff --git a/javascript-practice/-ALL-JS-Files/small-string-snippets.js b/javascript-practice/-ALL-JS-Files/small-string-snippets.js deleted file mode 100644 index 9626df4..0000000 --- a/javascript-practice/-ALL-JS-Files/small-string-snippets.js +++ /dev/null @@ -1,14 +0,0 @@ -console.log( "promenade" [ 3 ] ); // m -console.log( "tiger" [ 1 ] ); // i -console.log( "wheel".length ); // 5 - -console.log( "wheel".length - 1 ); // 4 -console.log( "noMAD".toUpperCase() ); // NOMAD -console.log( "hey programmers" [ 2 ] === "y" ); // true - -console.log( "volleyball".length > 20 ); // false -console.log( "treasure".indexOf( "r" ) ); // 1 -console.log( "treasure".indexOf( "e" ) ); // 2 -console.log( "web" [ 5 ] ); // undefined -console.log( "red".indexOf( "x" ) ); // -1 -console.log( "red".indexOf( "R" ) ); // -1 diff --git a/javascript-practice/-ALL-JS-Files/snippet-0-1.js b/javascript-practice/-ALL-JS-Files/snippet-0-1.js deleted file mode 100644 index b86c9fc..0000000 --- a/javascript-practice/-ALL-JS-Files/snippet-0-1.js +++ /dev/null @@ -1,25 +0,0 @@ -// snippet 0-1 -let greet = function () { - console.log( "hey" ); - console.log( "programmers" ); -}; - -let whistle = function () { - console.log( "doot" ); -}; - -console.log( "first" ); -console.log( "second" ); -greet(); -console.log( "third" ); -console.log( "fourth" ); -whistle(); - - -// first -// second -// hey -// programmers -// third -// fourth -// doot diff --git a/javascript-practice/-ALL-JS-Files/snippet-0-2.js b/javascript-practice/-ALL-JS-Files/snippet-0-2.js deleted file mode 100644 index 805fdaa..0000000 --- a/javascript-practice/-ALL-JS-Files/snippet-0-2.js +++ /dev/null @@ -1,21 +0,0 @@ -// snippet 0-2 -let howMany = function () { - return 42; -}; - -console.log( howMany ); -console.log( howMany() ); - -const theAnswer = howMany(); -console.log( theAnswer ); - -let howMuch = function () { - 5; -}; -console.log( howMuch() ); - - -// [Function: howMany] -// 42 -// 42 -// undefined diff --git a/javascript-practice/-ALL-JS-Files/snippet-0-3.js b/javascript-practice/-ALL-JS-Files/snippet-0-3.js deleted file mode 100644 index 438d29b..0000000 --- a/javascript-practice/-ALL-JS-Files/snippet-0-3.js +++ /dev/null @@ -1,25 +0,0 @@ -// snippet 0-3 -let average = function ( num1, num2 ) { - console.log( "calculating..." ); - return ( num1 + num2 ) / 2; -}; - -console.log( average( 5, 10 ) ); -console.log( average( 20, 26 ) ); -console.log( average( 50, 100 ) + 2 ); - -let a = 21 + 3; -let b = 20; -let n = average( a, b ); -console.log( average( n, 18 ) ); - - -// calculating... -// 7.5 -// calculating... -// 23 -// calculating... -// 77 -// calculating... -// calculating... -// 20 diff --git a/javascript-practice/-ALL-JS-Files/snippet-0-4.js b/javascript-practice/-ALL-JS-Files/snippet-0-4.js deleted file mode 100644 index 0fbb44b..0000000 --- a/javascript-practice/-ALL-JS-Files/snippet-0-4.js +++ /dev/null @@ -1,17 +0,0 @@ -// snippet 0-4 -let exclaim = function ( str ) { - let capitalized = str.toUpperCase(); - return capitalized + "!!"; -}; - -let result = exclaim( "potato" ); -console.log( result ); -console.log( result.length ); -console.log( result[ 0 ] ); -console.log( result[ result.length - 1 ] ); - - -// POTATO!! -// 8 -// P -// ! diff --git a/javascript-practice/-ALL-JS-Files/snippet-1 (2).js b/javascript-practice/-ALL-JS-Files/snippet-1 (2).js deleted file mode 100644 index e2d253c..0000000 --- a/javascript-practice/-ALL-JS-Files/snippet-1 (2).js +++ /dev/null @@ -1,17 +0,0 @@ -// snippet 1 -console.log( "hello" ); - -for ( let i = 0; i < 5; i++ ) { - console.log( "code" ); -} - -console.log( "goodbye" ); - - -hello -code -code -code -code -code -goodbye diff --git a/javascript-practice/-ALL-JS-Files/snippet-1.js b/javascript-practice/-ALL-JS-Files/snippet-1.js deleted file mode 100644 index e2d253c..0000000 --- a/javascript-practice/-ALL-JS-Files/snippet-1.js +++ /dev/null @@ -1,17 +0,0 @@ -// snippet 1 -console.log( "hello" ); - -for ( let i = 0; i < 5; i++ ) { - console.log( "code" ); -} - -console.log( "goodbye" ); - - -hello -code -code -code -code -code -goodbye diff --git a/javascript-practice/-ALL-JS-Files/snippet-2 (2).js b/javascript-practice/-ALL-JS-Files/snippet-2 (2).js deleted file mode 100644 index 53d5b80..0000000 --- a/javascript-practice/-ALL-JS-Files/snippet-2 (2).js +++ /dev/null @@ -1,23 +0,0 @@ -// snippet 2 -console.log( "hi" ); - -for ( let i = 3; i <= 7; i++ ) { - console.log( "program" ); - console.log( i ); -} - -console.log( "bye" ); - - -// hi -// program -// 3 -// program -// 4 -// program -// 5 -// program -// 6 -// program -// 7 -// bye diff --git a/javascript-practice/-ALL-JS-Files/snippet-2.js b/javascript-practice/-ALL-JS-Files/snippet-2.js deleted file mode 100644 index 53d5b80..0000000 --- a/javascript-practice/-ALL-JS-Files/snippet-2.js +++ /dev/null @@ -1,23 +0,0 @@ -// snippet 2 -console.log( "hi" ); - -for ( let i = 3; i <= 7; i++ ) { - console.log( "program" ); - console.log( i ); -} - -console.log( "bye" ); - - -// hi -// program -// 3 -// program -// 4 -// program -// 5 -// program -// 6 -// program -// 7 -// bye diff --git a/javascript-practice/-ALL-JS-Files/snippet-3 (2).js b/javascript-practice/-ALL-JS-Files/snippet-3 (2).js deleted file mode 100644 index 780141b..0000000 --- a/javascript-practice/-ALL-JS-Files/snippet-3 (2).js +++ /dev/null @@ -1,25 +0,0 @@ -// snippet 3 -let foo = function () { - for ( let num = 10; num > 0; num -= 2 ) { - console.log( num ); - } -}; - -console.log( "begin" ); -foo(); -console.log( "end" ); -foo(); - - -// begin -// 10 -// 8 -// 6 -// 4 -// 2 -// end -// 10 -// 8 -// 6 -// 4 -// 2 diff --git a/javascript-practice/-ALL-JS-Files/snippet-3.js b/javascript-practice/-ALL-JS-Files/snippet-3.js deleted file mode 100644 index 780141b..0000000 --- a/javascript-practice/-ALL-JS-Files/snippet-3.js +++ /dev/null @@ -1,25 +0,0 @@ -// snippet 3 -let foo = function () { - for ( let num = 10; num > 0; num -= 2 ) { - console.log( num ); - } -}; - -console.log( "begin" ); -foo(); -console.log( "end" ); -foo(); - - -// begin -// 10 -// 8 -// 6 -// 4 -// 2 -// end -// 10 -// 8 -// 6 -// 4 -// 2 diff --git a/javascript-practice/-ALL-JS-Files/snippet-4 (2).js b/javascript-practice/-ALL-JS-Files/snippet-4 (2).js deleted file mode 100644 index 69e0ccc..0000000 --- a/javascript-practice/-ALL-JS-Files/snippet-4 (2).js +++ /dev/null @@ -1,20 +0,0 @@ -// snippet 4 -let word = "street"; -for ( let i = 0; i < word.length; i++ ) { - console.log( i ); - console.log( word[ i ] ); -} - - -// 0 -// s -// 1 -// t -// 2 -// r -// 3 -// e -// 4 -// e -// 5 -// t diff --git a/javascript-practice/-ALL-JS-Files/snippet-4.js b/javascript-practice/-ALL-JS-Files/snippet-4.js deleted file mode 100644 index 69e0ccc..0000000 --- a/javascript-practice/-ALL-JS-Files/snippet-4.js +++ /dev/null @@ -1,20 +0,0 @@ -// snippet 4 -let word = "street"; -for ( let i = 0; i < word.length; i++ ) { - console.log( i ); - console.log( word[ i ] ); -} - - -// 0 -// s -// 1 -// t -// 2 -// r -// 3 -// e -// 4 -// e -// 5 -// t diff --git a/javascript-practice/-ALL-JS-Files/snippet-5 (2).js b/javascript-practice/-ALL-JS-Files/snippet-5 (2).js deleted file mode 100644 index 773d949..0000000 --- a/javascript-practice/-ALL-JS-Files/snippet-5 (2).js +++ /dev/null @@ -1,15 +0,0 @@ -// snippet 5 -let total = 0; // 10 -for ( let i = 1; i < 5; i++ ) { - total += i; - console.log( total ); -} - -console.log( "grand total: " + total ); - - -// 1 -// 3 -// 6 -// 10 -// grand total: 10 diff --git a/javascript-practice/-ALL-JS-Files/snippet-5.js b/javascript-practice/-ALL-JS-Files/snippet-5.js deleted file mode 100644 index 773d949..0000000 --- a/javascript-practice/-ALL-JS-Files/snippet-5.js +++ /dev/null @@ -1,15 +0,0 @@ -// snippet 5 -let total = 0; // 10 -for ( let i = 1; i < 5; i++ ) { - total += i; - console.log( total ); -} - -console.log( "grand total: " + total ); - - -// 1 -// 3 -// 6 -// 10 -// grand total: 10 diff --git a/javascript-practice/-ALL-JS-Files/spam.js b/javascript-practice/-ALL-JS-Files/spam.js deleted file mode 100644 index 90ea5f9..0000000 --- a/javascript-practice/-ALL-JS-Files/spam.js +++ /dev/null @@ -1,32 +0,0 @@ -// Write a function `spam` that accepts a 2D array as an argument. The array contains pairs as elements. -// The first element of every pair is a number and the second element is a word. The function should -// return a string containing the words repeated the specified number of times. See the examples. - -let spam = function ( pairs ) { - let words = []; - - for ( let i = 0; i < pairs.length; i++ ) { - let pair = pairs[ i ]; - let word = pair[ 0 ]; - let num = pair[ 1 ]; - - for ( let j = 0; j < num; j++ ) { - words.push( word ); - } - } - - return words.join( ' ' ); -}; - -let array1 = [ - [ "hi", 3 ], - [ "bye", 2 ], -]; -console.log( spam( array1 ) ); // 'hi hi hi bye bye' - -let array2 = [ - [ "cat", 1 ], - [ "dog", 2 ], - [ "bird", 4 ], -]; -console.log( spam( array2 ) ); // 'cat dog dog bird bird bird bird' diff --git a/javascript-practice/-ALL-JS-Files/starts-with-r.js b/javascript-practice/-ALL-JS-Files/starts-with-r.js deleted file mode 100644 index c0d3d18..0000000 --- a/javascript-practice/-ALL-JS-Files/starts-with-r.js +++ /dev/null @@ -1,11 +0,0 @@ -// Write a function `startsWithR` that accepts a string as an argument and returns a boolean indicating -// whether or not the string starts with 'r' or 'R'. - -let startsWithR = function ( str ) { - return str[ 0 ] === 'r' || str[ 0 ] === 'R'; -}; - -console.log( startsWithR( "roger that" ) ); // true -console.log( startsWithR( "Row, row, row your boat" ) ); // true -console.log( startsWithR( "slip" ) ); // false -console.log( startsWithR( "Taxicab" ) ); // false diff --git a/javascript-practice/-ALL-JS-Files/stay-positive.js b/javascript-practice/-ALL-JS-Files/stay-positive.js deleted file mode 100644 index 096d8d3..0000000 --- a/javascript-practice/-ALL-JS-Files/stay-positive.js +++ /dev/null @@ -1,19 +0,0 @@ -// Write a function `stayPositive` that accepts an array of numbers as an argument. The function should -// return an array containing only the positive numbers. - -let stayPositive = function ( numbers ) { - let positives = []; - - for ( let i = 0; i < numbers.length; i++ ) { - if ( numbers[ i ] > 0 ) { - positives.push( numbers[ i ] ); - } - } - - return positives; -}; - - -console.log( stayPositive( [ 10, -4, 3, 6 ] ) ); // [10, 3, 6] -console.log( stayPositive( [ -5, 11, -40, 30.3, -2 ] ) ); // [11, 30.3] -console.log( stayPositive( [ -11, -30 ] ) ); // [] diff --git a/javascript-practice/-ALL-JS-Files/string-expressions.js b/javascript-practice/-ALL-JS-Files/string-expressions.js deleted file mode 100644 index e523437..0000000 --- a/javascript-practice/-ALL-JS-Files/string-expressions.js +++ /dev/null @@ -1,5 +0,0 @@ -console.log( "river" + "town" ); -console.log( "cat" + "dog" ); -console.log( "New" + " York" ); -console.log( "runner's knee" + "!" ); -console.log( "man" + "bear" + "pig" ); diff --git a/javascript-practice/-ALL-JS-Files/string-iterate.js b/javascript-practice/-ALL-JS-Files/string-iterate.js deleted file mode 100644 index 125d232..0000000 --- a/javascript-practice/-ALL-JS-Files/string-iterate.js +++ /dev/null @@ -1,24 +0,0 @@ -// Write a function `stringIterate` that accepts a string as an argument. The function should print out -// each character of the string, one by one. The function doesn't need to return any value. It should -// just print to the terminal. - -let stringIterate = function ( string ) { - for ( let i = 0; i < string.length; i++ ) { - console.log( string[ i ] ); - } -}; - -stringIterate( "celery" ); -// prints -// c -// e -// l -// e -// r -// y - -stringIterate( "hat" ); -// prints -// h -// a -// t diff --git a/javascript-practice/-ALL-JS-Files/string-repeater.js b/javascript-practice/-ALL-JS-Files/string-repeater.js deleted file mode 100644 index dce4816..0000000 --- a/javascript-practice/-ALL-JS-Files/string-repeater.js +++ /dev/null @@ -1,16 +0,0 @@ -// Write a function named `stringRepeater(str, num)` that accepts a string and a number as arguments. -// The function should return a new string consisting of the `str` repeated `num` number of times. - -let stringRepeater = function ( str, num ) { - let repeatedStr = ''; - - for ( let i = 1; i <= num; i++ ) { - repeatedStr += str - } - - return repeatedStr; -}; - -console.log( stringRepeater( "q", 4 ) ); // 'qqqq' -console.log( stringRepeater( "go", 2 ) ); // 'gogo' -console.log( stringRepeater( "tac", 3 ) ); // 'tactactac' diff --git a/javascript-practice/-ALL-JS-Files/string-size.js b/javascript-practice/-ALL-JS-Files/string-size.js deleted file mode 100644 index e2a128a..0000000 --- a/javascript-practice/-ALL-JS-Files/string-size.js +++ /dev/null @@ -1,20 +0,0 @@ -// Write a function `stringSize` that accepts a string as an argument. The function should return the -// string 'small' if the argument is shorter than 5 characters, 'medium' if it is exactly 5 characters, and -// 'large' if it is longer than 5 characters. - -let stringSize = function ( str ) { - if ( str.length < 5 ) { - return 'small'; - } else if ( str.length > 5 ) { - return 'large'; - } else { - return 'medium'; - } -}; - -console.log( stringSize( "cat" ) ); // 'small' -console.log( stringSize( "bell" ) ); // 'small' -console.log( stringSize( "ready" ) ); // 'medium' -console.log( stringSize( "shirt" ) ); // 'medium' -console.log( stringSize( "shallow" ) ); // 'large' -console.log( stringSize( "intelligence" ) ); // 'large' diff --git a/javascript-practice/-ALL-JS-Files/strings-to-lengths.js b/javascript-practice/-ALL-JS-Files/strings-to-lengths.js deleted file mode 100644 index 4b71e56..0000000 --- a/javascript-practice/-ALL-JS-Files/strings-to-lengths.js +++ /dev/null @@ -1,18 +0,0 @@ -// Write a function `stringsToLengths` that accepts an array of strings as an argument. The function -// should return a new array containing the lengths of the elements of the original array. - -let stringsToLengths = function ( words ) { - let lengths = []; - - for ( let i = 0; i < words.length; i++ ) { - lengths.push( words[ i ].length ); - } - - return lengths; -}; - -console.log( stringsToLengths( [ "belly", "echo", "irony", "pickled" ] ) ); -// [5, 4, 5, 7] - -console.log( stringsToLengths( [ "on", "off", "handmade" ] ) ); -// [2, 3, 8] diff --git a/javascript-practice/-ALL-JS-Files/sum-up-to.js b/javascript-practice/-ALL-JS-Files/sum-up-to.js deleted file mode 100644 index 423178e..0000000 --- a/javascript-practice/-ALL-JS-Files/sum-up-to.js +++ /dev/null @@ -1,18 +0,0 @@ -// Write a function named `sumUpTo(max)` that accepts a max number as an argument. The function should -// return the total sum of all whole numbers from 1 to the max, inclusive. -// -// For example, sumUpTo(4) should return 10 because 1 + 2 + 3 + 4 = 10. - -let sumUpTo = function ( max ) { - let sum = 0; - - for ( let i = 1; i <= max; i++ ) { - sum += i - } - - return sum; -}; - -console.log( sumUpTo( 4 ) ); // 10 -console.log( sumUpTo( 5 ) ); // 15 -console.log( sumUpTo( 2 ) ); // 3 diff --git a/javascript-practice/-ALL-JS-Files/thirsty.js b/javascript-practice/-ALL-JS-Files/thirsty.js deleted file mode 100644 index b7d496c..0000000 --- a/javascript-practice/-ALL-JS-Files/thirsty.js +++ /dev/null @@ -1 +0,0 @@ -console.log( 'coffee' ); diff --git a/javascript-practice/-ALL-JS-Files/three (2).js b/javascript-practice/-ALL-JS-Files/three (2).js deleted file mode 100644 index 7f0f790..0000000 --- a/javascript-practice/-ALL-JS-Files/three (2).js +++ /dev/null @@ -1,12 +0,0 @@ -let qty = 15 % 4; -console.log( qty ); // 3 - -let num = 38 + 3; -num++; -console.log( num + " is a great number" ); // '42 is a great number' - -let isNumEven = num % 2 === 0; -console.log( num + " is even? " + isNumEven ); // '42 is even? true' - -let isQtyEven = qty % 2 === 0; -console.log( qty + " is even? " + isQtyEven ); // '3 is even? false' diff --git a/javascript-practice/-ALL-JS-Files/three.js b/javascript-practice/-ALL-JS-Files/three.js deleted file mode 100644 index 7f0f790..0000000 --- a/javascript-practice/-ALL-JS-Files/three.js +++ /dev/null @@ -1,12 +0,0 @@ -let qty = 15 % 4; -console.log( qty ); // 3 - -let num = 38 + 3; -num++; -console.log( num + " is a great number" ); // '42 is a great number' - -let isNumEven = num % 2 === 0; -console.log( num + " is even? " + isNumEven ); // '42 is even? true' - -let isQtyEven = qty % 2 === 0; -console.log( qty + " is even? " + isQtyEven ); // '3 is even? false' diff --git a/javascript-practice/-ALL-JS-Files/total-product.js b/javascript-practice/-ALL-JS-Files/total-product.js deleted file mode 100644 index fab11c3..0000000 --- a/javascript-practice/-ALL-JS-Files/total-product.js +++ /dev/null @@ -1,29 +0,0 @@ -// Write a function `totalProduct(array)` that accepts a 2D array of numbers. The function should return -// the total product of all numbers in the array. - -let totalProduct = function ( array ) { - let product = 1; - - for ( let i = 0; i < array.length; i++ ) { - let subarray = array[ i ]; - - for ( let j = 0; j < subarray.length; j++ ) { - product *= subarray[ j ]; - } - } - - return product; -}; - -let array1 = [ - [ 3, 5, 2 ], - [ 6, 2 ], -]; -console.log( totalProduct( array1 ) ); // 360 - -let array2 = [ - [ 4, 6 ], - [ 2, 3 ], - [ 1, 2 ], -]; -console.log( totalProduct( array2 ) ); // 288 diff --git a/javascript-practice/-ALL-JS-Files/total.js b/javascript-practice/-ALL-JS-Files/total.js deleted file mode 100644 index 14745c1..0000000 --- a/javascript-practice/-ALL-JS-Files/total.js +++ /dev/null @@ -1,15 +0,0 @@ -// Write a function `total` that accepts an array of numbers as an argument. The function should return -// the total sum of all elements of the array. - -let total = function ( numbers ) { - let sum = 0; - for ( let i = 0; i < numbers.length; i++ ) { - sum += numbers[ i ]; - } - return sum; -}; - -console.log( total( [ 3, 2, 8 ] ) ); // 13 -console.log( total( [ -5, 7, 4, 6 ] ) ); // 12 -console.log( total( [ 7 ] ) ); // 7 -console.log( total( [] ) ); // 0 diff --git a/javascript-practice/-ALL-JS-Files/two (2).js b/javascript-practice/-ALL-JS-Files/two (2).js deleted file mode 100644 index 4f10a06..0000000 --- a/javascript-practice/-ALL-JS-Files/two (2).js +++ /dev/null @@ -1,19 +0,0 @@ -let apple; -console.log( apple ); // undefined - -apple = 5; -console.log( apple ); // 5 - -apple + 1; -console.log( apple ); // 5 - -apple += 1; -console.log( apple ); // 6 - -let banana = apple; -console.log( banana ); // 6 - -banana = banana / 2; -console.log( banana ); // 3 - -console.log( apple ); // 6 diff --git a/javascript-practice/-ALL-JS-Files/two-sum-pairs.js b/javascript-practice/-ALL-JS-Files/two-sum-pairs.js deleted file mode 100644 index c98f900..0000000 --- a/javascript-practice/-ALL-JS-Files/two-sum-pairs.js +++ /dev/null @@ -1,27 +0,0 @@ -// Write a function `twoSumPairs(numbers, target)` that accepts an array of numbers and a target number -// as arguments. The function should return a 2D array containing all unique pairs of elements that -// sum to the target. - -let twoSumPairs = function ( numbers, target ) { - let pairs = []; - - for ( let i = 0; i < numbers.length; i++ ) { - let num1 = numbers[ i ]; - - for ( let j = i + 1; j < numbers.length; j++ ) { - let num2 = numbers[ j ]; - - if ( num1 + num2 === target ) { - let pair = [ num1, num2 ]; - pairs.push( pair ); - } - } - } - - return pairs; -}; - -console.log( twoSumPairs( [ 2, 3, 4, 6, 5 ], 8 ) ); // [ [2, 6], [3, 5] ] -console.log( twoSumPairs( [ 10, 7, 4, 5, 2 ], 12 ) ); // [ [10, 2], [7, 5] ] -console.log( twoSumPairs( [ 3, 9, 8 ], 11 ) ); // [ [3, 8] ] -console.log( twoSumPairs( [ 3, 9, 8 ], 10 ) ); // [ ] diff --git a/javascript-practice/-ALL-JS-Files/two-sum.js b/javascript-practice/-ALL-JS-Files/two-sum.js deleted file mode 100644 index b3d6cd6..0000000 --- a/javascript-practice/-ALL-JS-Files/two-sum.js +++ /dev/null @@ -1,20 +0,0 @@ -// Write a function `twoSum(numbers, target)` that accepts an array of numbers and a target number -// as an argument. The function should return a boolean indicating whether or not there exists a pair -// of distinct elements in the array that sum to the target. - -let twoSum = function ( numbers, target ) { - for ( let i = 0; i < numbers.length; i++ ) { - for ( let j = i + 1; j < numbers.length; j++ ) { - if ( numbers[ i ] + numbers[ j ] === target ) { - return true; - } - } - } - - return false; -}; - -console.log( twoSum( [ 2, 3, 5, 9 ], 7 ) ); // true -console.log( twoSum( [ 2, 3, 5, 9 ], 4 ) ); // false -console.log( twoSum( [ 6, 3, 4 ], 10 ) ); // true -console.log( twoSum( [ 6, 5, 1 ], 10 ) ); // false diff --git a/javascript-practice/-ALL-JS-Files/two.js b/javascript-practice/-ALL-JS-Files/two.js deleted file mode 100644 index 4f10a06..0000000 --- a/javascript-practice/-ALL-JS-Files/two.js +++ /dev/null @@ -1,19 +0,0 @@ -let apple; -console.log( apple ); // undefined - -apple = 5; -console.log( apple ); // 5 - -apple + 1; -console.log( apple ); // 5 - -apple += 1; -console.log( apple ); // 6 - -let banana = apple; -console.log( banana ); // 6 - -banana = banana / 2; -console.log( banana ); // 3 - -console.log( apple ); // 6 diff --git a/javascript-practice/-ALL-JS-Files/wacky-word.js b/javascript-practice/-ALL-JS-Files/wacky-word.js deleted file mode 100644 index 74743ed..0000000 --- a/javascript-practice/-ALL-JS-Files/wacky-word.js +++ /dev/null @@ -1,16 +0,0 @@ -// Write a function `wackyWord` that accepts two strings as arguments. The function should return a new -// string containing the first three characters of the first string concatenated with the last two -// character of the second string. - -// You can assume that the first argument has a length of at least three and the second argument has a -// length of at least two. - - -let wackyWord = function ( str1, str2 ) { - return str1.slice( 0, 3 ) + str2.slice( -2 ); -}; - -console.log( wackyWord( "very", "kindly" ) ); // 'verly' -console.log( wackyWord( "forever", "sick" ) ); // 'forck' -console.log( wackyWord( "cellar", "door" ) ); // 'celor' -console.log( wackyWord( "bagel", "sweep" ) ); // 'bagep' diff --git a/javascript-practice/-ALL-JS-Files/whoami.js b/javascript-practice/-ALL-JS-Files/whoami.js deleted file mode 100644 index b40ac67..0000000 --- a/javascript-practice/-ALL-JS-Files/whoami.js +++ /dev/null @@ -1,2 +0,0 @@ -console.log( 'alvin' ); -console.log( 'z' ); diff --git a/javascript-practice/-ALL-JS-Files/word-count.js b/javascript-practice/-ALL-JS-Files/word-count.js deleted file mode 100644 index dbf132f..0000000 --- a/javascript-practice/-ALL-JS-Files/word-count.js +++ /dev/null @@ -1,22 +0,0 @@ -// Write a function `wordCount(sentence, targetWords)` that accepts a sentence string and an array of -// `targetWords`. The function should return a count of the number of words of the sentence that are -// in `targetWords`. - -let wordCount = function ( sentence, targetWords ) { - let words = sentence.split( ' ' ); - let count = 0; - - for ( let i = 0; i < words.length; i++ ) { - let word = words[ i ]; - - if ( targetWords.includes( word ) ) { - count++; - } - } - - return count; -}; - -console.log( wordCount( "open the window please", [ "please", "open", "sorry" ] ) ); // 2 -console.log( wordCount( "drive to the cinema", [ "the", "driver" ] ) ); // 1 -console.log( wordCount( "can I have that can", [ "can", "I" ] ) ); // 3 diff --git a/javascript-practice/-ALL-JS-Files/your-average-function.js b/javascript-practice/-ALL-JS-Files/your-average-function.js deleted file mode 100644 index 7e8908e..0000000 --- a/javascript-practice/-ALL-JS-Files/your-average-function.js +++ /dev/null @@ -1,21 +0,0 @@ -// Write a function `yourAverageFunction` that accepts an array of numbers as an argument. The -// function should return the average of all elements of the array. If the input array is empty, -// then the function should return null. - -let yourAverageFunction = function ( nums ) { - if ( nums.length === 0 ) { - return null; - } - - let sum = 0; - for ( let i = 0; i < nums.length; i++ ) { - sum += nums[ i ]; - } - - return sum / nums.length; -}; - -console.log( yourAverageFunction( [ 5, 2, 7, 24 ] ) ); // 9.5 -console.log( yourAverageFunction( [ 100, 6 ] ) ); // 53 -console.log( yourAverageFunction( [ 31, 32, 40, 12, 33 ] ) ); // 29.6 -console.log( yourAverageFunction( [] ) ); // null diff --git a/javascript-practice/-ALL-JS-Files/zero (2).js b/javascript-practice/-ALL-JS-Files/zero (2).js deleted file mode 100644 index 491cb54..0000000 --- a/javascript-practice/-ALL-JS-Files/zero (2).js +++ /dev/null @@ -1,5 +0,0 @@ -let location = "Brooklyn, " + "NY"; -console.log( location ); // 'Brooklyn, NY' - -let quantity = 4 * 5 + 1; -console.log( quantity ); // 21 diff --git a/javascript-practice/-ALL-JS-Files/zero.js b/javascript-practice/-ALL-JS-Files/zero.js deleted file mode 100644 index 491cb54..0000000 --- a/javascript-practice/-ALL-JS-Files/zero.js +++ /dev/null @@ -1,5 +0,0 @@ -let location = "Brooklyn, " + "NY"; -console.log( location ); // 'Brooklyn, NY' - -let quantity = 4 * 5 + 1; -console.log( quantity ); // 21 diff --git a/javascript-practice/-ALL-JS-Files/zipper.js b/javascript-practice/-ALL-JS-Files/zipper.js deleted file mode 100644 index d65fcf1..0000000 --- a/javascript-practice/-ALL-JS-Files/zipper.js +++ /dev/null @@ -1,35 +0,0 @@ -// Write a function `zipper` that accepts two arrays as arguments. The function should return a 2D -// array containing pairs of elements at the same indices. - - -let zipper = function ( arr1, arr2 ) { - let result = []; - - for ( let i = 0; i < arr1.length; i++ ) { - let el1 = arr1[ i ]; - let el2 = arr2[ i ]; - let pair = [ el1, el2 ]; - result.push( pair ); - } - - return result; -}; - -let array1 = [ "a", "b", "c", "d" ]; -let array2 = [ -1, -2, -3, -4 ]; -console.log( zipper( array1, array2 ) ); -// [ -// ['a', -1], -// ['b', -2], -// ['c', -3], -// ['d', -4], -// ] - -let array3 = [ "whisper", "talk", "shout" ]; -let array4 = [ "quiet", "normal", "loud" ]; -console.log( zipper( array3, array4 ) ); -// [ -// ['whisper', 'quiet'], -// ['talk', 'normal'], -// ['shout', 'loud'], -// ] diff --git a/javascript-practice/00_expressions_variables/.DS_Store b/javascript-practice/00_expressions_variables/.DS_Store deleted file mode 100644 index 02757e3..0000000 Binary files a/javascript-practice/00_expressions_variables/.DS_Store and /dev/null differ diff --git a/javascript-practice/00_expressions_variables/exercises/A_executing_code_exercise/README.html b/javascript-practice/00_expressions_variables/exercises/A_executing_code_exercise/README.html deleted file mode 100644 index 74d453c..0000000 --- a/javascript-practice/00_expressions_variables/exercises/A_executing_code_exercise/README.html +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Document - - - - - - - - - -
- - - - -
HOME -
- - - -

Write, Run, Repeat

-

You won’t become a strong programmer with “one secret trick” or “however-many expert tips”. No shortcuts. - Just - write - code, run it, do it again. We’ll be creating and executing hundreds of programs in this course. Let’s bang out - the - first four.

-

Before you start this exercise, make sure you have watched the lecture first.

- - get - yourself unstuck, then pause the video and pick up the exercise on your own.

-
    -
-

Let’s get to work.

-

-AZ

-

0. Follow my lead.

-
    -
  1. If you already have VSCode open, close it.
  2. -
  3. On your computer’s Desktop, create a new folder named my-first-programs.
  4. -
  5. Open the my-first-programs folder in VSCode
  6. -
  7. Use VSCode to create a file named greeting.js inside of my-first-programs.
  8. -
  9. Inside of greeting.js, write the single line of code console.log('hello - world');. - This - will cause the program to print hello world when you execute it later.
  10. -
  11. Save the greeting.js file using the keyboard shortcut cmd + s or ctrl + - s. -
  12. -
  13. Open the terminal and enter the command node greeting.js to execute your code. You - should - see - hello world printed out.
  14. -
-

1. Still following?

-
    -
  1. Inside the my-first-programs folder, create a new file named whoami.js.
  2. -
  3. Inside of whoami.js use console.log to print out your first name. Don’t forget - to - put - quotation marks (') around your name and end the line with a semicolon (;).
  4. -
  5. Save whoami.js and execute it in your terminal using the node. You - should - see - your name printed out.
  6. -
-

2. I’ll follow you.

-

Start from scratch. Close VSCode if you have it open. Use VSCode to write a program named - thirsty.js - inside of the my-first-programs folder. The program should print out your favorite cold beverage. - Execute - thirsty.js in your terminal.

-

3. Beginner’s luck; show me it again.

-

That seems suspicious. Write a program named age.js that prints out your age. Run it.

- even - -

- - - diff --git a/javascript-practice/00_expressions_variables/exercises/A_executing_code_exercise/README.md b/javascript-practice/00_expressions_variables/exercises/A_executing_code_exercise/README.md deleted file mode 100644 index ffe689c..0000000 --- a/javascript-practice/00_expressions_variables/exercises/A_executing_code_exercise/README.md +++ /dev/null @@ -1,54 +0,0 @@ -# Write, Run, Repeat - -You won't become a strong programmer with "one secret trick" or "however-many expert tips". No -shortcuts. Just write code, run it, do it again. We'll be creating and executing hundreds of -programs in this course. Let's bang out the first four. - -Before you start this exercise, make sure you have watched the lecture first. - -+ [Lecture](https://youtu.be/U-679Jd3fmQ) - -If you get stuck during this exercise, reference this walkthrough. Only watch enough of the -walkthrough to get yourself unstuck, then pause the video and pick up the exercise on your own. - -+ [Walkthrough](https://youtu.be/f7CZUGFdhfg) - -Let's get to work. - --AZ - -## 0. Follow my lead. - -1. If you already have VSCode open, close it. -2. On your computer's Desktop, create a new folder named `my-first-programs`. -3. Open the `my-first-programs` folder in VSCode -4. Use VSCode to create a file named `greeting.js` inside of `my-first-programs`. -5. Inside of `greeting.js`, write the single line of code `console.log('hello world');`. This will - cause the program to print `hello world` when you execute it later. -6. Save the `greeting.js` file using the keyboard shortcut `cmd + s` or `ctrl + s`. -7. Open the terminal and enter the command `node greeting.js` to execute your code. **You should see - `hello world` printed out.** - -## 1. Still following? - -1. Inside the `my-first-programs` folder, create a new file named `whoami.js`. -2. Inside of `whoami.js` use `console.log` to print out your first name. Don't forget to put - quotation marks (`'`) around your name and end the line with a semicolon (`;`). -3. Save `whoami.js` and execute it in your terminal using the `node`. **You should see your name - printed out.** - -## 2. I'll follow you. - -Start from scratch. Close VSCode if you have it open. Use VSCode to write a program named -`thirsty.js` inside of the `my-first-programs` folder. The program should print out your favorite -cold beverage. Execute `thirsty.js` in your terminal. - -## 3. Beginner's luck; show me it again. - -That seems suspicious. Write a program named `age.js` that prints out your age. Run it. - -## Walkthrough - - - - diff --git a/javascript-practice/00_expressions_variables/exercises/A_executing_code_exercise/right.html b/javascript-practice/00_expressions_variables/exercises/A_executing_code_exercise/right.html deleted file mode 100644 index cd89898..0000000 --- a/javascript-practice/00_expressions_variables/exercises/A_executing_code_exercise/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -A_executing_code_exercise - - - Stable - - - - - - - - - - - - -
Folders
<Go Back>
-
- - - - -
FileFileFileFileFileFileFileFile
README.html right.html README.md 
- -

-Folders: 1
-Files: 3
-Size of all files: 23032 KB

- - - \ No newline at end of file diff --git a/javascript-practice/00_expressions_variables/exercises/B_expressions_exercise/README.html b/javascript-practice/00_expressions_variables/exercises/B_expressions_exercise/README.html deleted file mode 100644 index a6d7cc8..0000000 --- a/javascript-practice/00_expressions_variables/exercises/B_expressions_exercise/README.html +++ /dev/null @@ -1,324 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Document - - - - - - - - - -
- - - - -
HOME -
- - - -

Express Yourself

-

Expressions are the building blocks of programs. We can combine values with - operators - to - compose an expression. An expression evaluates to some value.

-

Before you start this exercise, make sure you have watched the lecture first.

- - get - yourself unstuck, then pause the video and pick up the exercise on your own.

- -

The fundamentals of any skill aren’t particularly glamorous. We’ll learn the “cool” stuff when you are ready. - Crawl. - Walk. Run.

-

-AZ

-

0. Hope you didn’t forget.

-

Create a new folder named expressions-exercise. Open it in VSCode. Create four files within this - folder: - string-expressions.js, number-expressions.js, boolean-expressions.js, - comparisons.js.

-

After creating these files, your folder structure should look like this:

-
expressions-exercise/
-├── string-expressions.js
-├── number-expressions.js
-├── boolean-expressions.js
-└── comparisons.js
-

1. Stringing together some expressions.

-

Make a mental prediction of what the following expressions will print:

- -

To check your prediction, write the code into string-expressions.js and run it in your terminal - with - node string-expressions.js. Don’t copy and paste. Type everything manually. You should do this - line - by - line. This means you should type the first expression, run it. Add the second expression, run it, and so on. - Don’t - try - to type all five lines and then run it all at once. You will find it hard to pinpoint any typos if you do - that. -

-

2. Don’t enjoy math? Too bad.

-

Make predictions for what these number expressions evaluate to. Test your predictions by writing the code to - number-expressions.js and running it:

- -

3. Shoutout to George Boole.

-

Make predictions for what these boolean expressions evaluate to. Test your predictions by writing the code to - boolean-expressions.js and running it:

- -

4. Drawing a Comparison.

-

Make predictions for what these comparison expressions evaluate to. Test your predictions by writing the code - to - comparisons.js and running it:

- - even - -

- - - diff --git a/javascript-practice/00_expressions_variables/exercises/B_expressions_exercise/README.md b/javascript-practice/00_expressions_variables/exercises/B_expressions_exercise/README.md deleted file mode 100644 index 2bade1a..0000000 --- a/javascript-practice/00_expressions_variables/exercises/B_expressions_exercise/README.md +++ /dev/null @@ -1,142 +0,0 @@ -# Express Yourself - -_Expressions_ are the building blocks of programs. We can combine _values_ with _operators_ to -compose an expression. An _expression_ evaluates to some _value_. - -Before you start this exercise, make sure you have watched the lecture first. - -+ [Lecture Part 1](https://youtu.be/NORcxNPVtg4) -+ [Lecture Part 2](https://youtu.be/1y9DCzWYons) - -If you get stuck during this exercise, reference this walkthrough. Only watch enough of the -walkthrough to get yourself unstuck, then pause the video and pick up the exercise on your own. - -+ [Walkthrough](https://youtu.be/oMHa_c21sCw) - -The fundamentals of any skill aren't particularly glamorous. We'll learn the "cool" stuff when you -are ready. Crawl. Walk. Run. - --AZ - -## 0. Hope you didn't forget. - -Create a new folder named `expressions-exercise`. Open it in VSCode. Create four files within this -folder: `string-expressions.js`, `number-expressions.js`, `boolean-expressions.js`, -`comparisons.js`. - -After creating these files, your folder structure should look like this: - -```plaintext -expressions-exercise/ -├── string-expressions.js -├── number-expressions.js -├── boolean-expressions.js -└── comparisons.js -``` - -## 1. Stringing together some expressions. - -Make a mental prediction of what the following expressions will print: - -```javascript -console.log("river" + "town"); -console.log("cat" + "dog"); -console.log("New" + " York"); -console.log("runner's knee" + "!"); -console.log("man" + "bear" + "pig"); -``` - -To check your prediction, write the code into `string-expressions.js` and run it in your terminal -with `node string-expressions.js`. Don't copy and paste. Type everything manually. You should do -this line by line. This means you should type the first expression, run it. Add the second -expression, run it, and so on. Don't try to type all five lines and then run it all at once. You -will find it hard to pinpoint any typos if you do that. - -## 2. Don't enjoy math? Too bad. - -Make predictions for what these number expressions evaluate to. Test your predictions by writing the -code to `number-expressions.js` and running it: - -```js -console.log(2 + 3); -console.log(10 - 15); -console.log(4 + 1 - 5); -console.log(4 * 3); - -console.log(7 / 2); -console.log(4 + 2 * 3); -console.log((4 + 2) * 3); -console.log(5 % 2); - -console.log(6 % 2); -console.log(7 % 2); -console.log(8 % 2); -console.log(19 % 8); - -console.log(24 % 8); -console.log(7 % 4); -console.log(4 % 7); -console.log(5 + (10 % 5)); -console.log((5 + 10) % 5); -``` - -## 3. Shoutout to George Boole. - -Make predictions for what these boolean expressions evaluate to. Test your predictions by writing -the code to `boolean-expressions.js` and running it: - -```js -console.log(false); -console.log(!true); -console.log(!false); -console.log(!!true); - -console.log(false && false); -console.log(false && true); -console.log(true && false); -console.log(true && true); - -console.log(false || false); -console.log(false || true); -console.log(true || false); -console.log(true || true); - -console.log(!false || false); -console.log(false || (true && true)); -console.log(false || !(true && true)); -console.log(!true && (false || true)); -``` - -## 4. Drawing a Comparison. - -Make predictions for what these comparison expressions evaluate to. Test your predictions by writing -the code to `comparisons.js` and running it: - -```js -console.log(true === false); -console.log(false === false); -console.log(false !== true); -console.log(!true === false); - -console.log(2 + 3 === 5); -console.log(4 < 0); -console.log(10 >= 10); -console.log(10.3 >= 10); - -console.log(100 / 2 === 50); -console.log(100 % 2 === 0); -console.log(11 % 2 === 0); -console.log(7.0 === 7); - -console.log(13 % 5 > 0); -console.log("potato" === "potato"); -console.log("Tomato" === "tomato"); -console.log("42" === 42); -console.log(5 > 3 && 1 === 0); -``` - -## Walkthrough - - - - diff --git a/javascript-practice/00_expressions_variables/exercises/B_expressions_exercise/right.html b/javascript-practice/00_expressions_variables/exercises/B_expressions_exercise/right.html deleted file mode 100644 index 6be4ef4..0000000 --- a/javascript-practice/00_expressions_variables/exercises/B_expressions_exercise/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -B_expressions_exercise - - - Stable - - - - - - - - - - - - -
Folders
<Go Back>
-
- - - - -
FileFileFileFileFileFileFileFile
README.html right.html README.md 
- -

-Folders: 1
-Files: 3
-Size of all files: 44790 KB

- - - \ No newline at end of file diff --git a/javascript-practice/00_expressions_variables/exercises/C_variables_exercise/README.html b/javascript-practice/00_expressions_variables/exercises/C_variables_exercise/README.html deleted file mode 100644 index 280648b..0000000 --- a/javascript-practice/00_expressions_variables/exercises/C_variables_exercise/README.html +++ /dev/null @@ -1,231 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Document - - - - - - - - - -
- - - - -
HOME -
- - - -

Very Able

-

Variables allow programmers to store values to be used later in their code. The value that a - variable - contains can change throughout the runtime of a program.

-

Before you start this exercise, make sure you have watched the lecture first.

- - get - yourself unstuck, then pause the video and pick up the exercise on your own.

- -

Ready?

-

-AZ

-

0. Do you speak the language?

-

Create a folder named variables_exercise. Create a file named zero.js inside of it. - Predict - what the console.logs in the code below will print out:

- -

Test your predictions by typing the code into the zero.js file; don’t copy and paste. Run it to - check - your guess.

-

1. What’s changed? What hasn’t?

-

Create a new file named one.js inside of the variables_exercise folder. Predict - what - the - console.logs in the code below will print out:

- -

Test your predictions by typing the code into the one.js file. Run it.

-

2. How about this?

-

Create a new file named two.js inside of the variables_exercise folder. Predict - what - the - console.logs in the code below will print out:

- -

Test your predictions by typing the code into the two.js file. Run it.

-

3. Did you forget about modulo?

-

Create a new file named three.js inside of the variables_exercise folder. Predict - what - the - console.logs in the code below will print out:

- -

4. So you can code, but do you have good taste in - cinema? -

-

Create a new file named four.js inside of the variables_exercise folder. Create two - variables:

-
    -
  • movie, assigned to the string title of your favorite movie
  • -
  • views, assigned to the number of times you watched that movie
  • -
-

When executed, the program should print the message I watched <movie> about <views> number - of - times.

- even - -

- - - diff --git a/javascript-practice/00_expressions_variables/exercises/C_variables_exercise/README.md b/javascript-practice/00_expressions_variables/exercises/C_variables_exercise/README.md deleted file mode 100644 index c0d8061..0000000 --- a/javascript-practice/00_expressions_variables/exercises/C_variables_exercise/README.md +++ /dev/null @@ -1,120 +0,0 @@ -# Very Able - -_Variables_ allow programmers to store values to be used later in their code. The value that a -variable contains can change throughout the runtime of a program. - -Before you start this exercise, make sure you have watched the lecture first. - -+ [Lecture](https://youtu.be/lmXRLpoyPic) - -If you get stuck during this exercise, reference this walkthrough. Only watch enough of the -walkthrough to get yourself unstuck, then pause the video and pick up the exercise on your own. - -+ [Walkthrough](https://youtu.be/T_xE-x0Eyqk) - -Ready? - --AZ - -## 0. Do you speak the language? - -Create a folder named `variables_exercise`. Create a file named `zero.js` inside of it. Predict what -the `console.log`s in the code below will print out: - -```js -let location = "Brooklyn, " + "NY"; -console.log(location); - -let quantity = 4 * 5 + 1; -console.log(quantity); -``` - -Test your predictions by typing the code into the `zero.js` file; don't copy and paste. Run it to -check your guess. - -## 1. What's changed? What hasn't? - -Create a new file named `one.js` inside of the `variables_exercise` folder. Predict what the -`console.log`s in the code below will print out: - -```js -let word = "bye"; -console.log(word + " felicia"); -console.log(word); - -let num = 10; -num = num * 2; -console.log(num); - -let bottlesOfBeer = 99; -let around = bottlesOfBeer - 1; -console.log(around); -console.log(bottlesOfBeer); -``` - -Test your predictions by typing the code into the `one.js` file. Run it. - -## 2. How about this? - -Create a new file named `two.js` inside of the `variables_exercise` folder. Predict what the -`console.log`s in the code below will print out: - -```js -let apple; -console.log(apple); - -apple = 5; -console.log(apple); - -apple + 1; -console.log(apple); - -apple += 1; -console.log(apple); - -let banana = apple; -console.log(banana); - -banana = banana / 2; -console.log(banana); - -console.log(apple); -``` - -Test your predictions by typing the code into the `two.js` file. Run it. - -## 3. Did you forget about modulo? - -Create a new file named `three.js` inside of the `variables_exercise` folder. Predict what the -`console.log`s in the code below will print out: - -```js -let qty = 15 % 4; -console.log(qty); - -let num = 38 + 3; -num++; -console.log(num + " is a great number"); - -let isNumEven = num % 2 === 0; -console.log(num + " is even? " + isNumEven); - -let isQtyEven = qty % 2 === 0; -console.log(qty + " is even? " + isQtyEven); -``` - -## 4. So you can code, but do you have good taste in cinema? - -Create a new file named `four.js` inside of the `variables_exercise` folder. Create two variables: - -- `movie`, assigned to the string title of your favorite movie -- `views`, assigned to the number of times you watched that movie - -When executed, the program should print the message -`I watched about number of times`. - -## Walkthrough - - - - diff --git a/javascript-practice/00_expressions_variables/exercises/C_variables_exercise/right.html b/javascript-practice/00_expressions_variables/exercises/C_variables_exercise/right.html deleted file mode 100644 index cb8c34d..0000000 --- a/javascript-practice/00_expressions_variables/exercises/C_variables_exercise/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -C_variables_exercise - - - Stable - - - - - - - - - - - - -
Folders
<Go Back>
-
- - - - -
FileFileFileFileFileFileFileFile
README.html right.html README.md 
- -

-Folders: 1
-Files: 3
-Size of all files: 34391 KB

- - - \ No newline at end of file diff --git a/javascript-practice/00_expressions_variables/exercises/D_string_indexing_and_methods_exercise/README.html b/javascript-practice/00_expressions_variables/exercises/D_string_indexing_and_methods_exercise/README.html deleted file mode 100644 index 7f2353e..0000000 --- a/javascript-practice/00_expressions_variables/exercises/D_string_indexing_and_methods_exercise/README.html +++ /dev/null @@ -1,258 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Document - - - - - - - - - -
- - - - -
HOME -
- - - -

Intelligent Indexing

-

A string consists of one or more characters. An index is a number that corresponds to the position - of a - character in a string. The first character of a string has index 0, the second character has - index - 1, and so on. Indexing is a pattern that programmers use often in strings. This pattern will - also - appear later in more advanced applications.

-

Before you start this exercise, make sure you have watched the lecture first.

- - get - yourself unstuck, then pause the video and pick up the exercise on your own.

- -

This is where we begin to unlock the basic programming patterns that you’ll always be able to rely on. Study - them - closely.

-

-AZ

-

0. Small String Snippets.

-

Create a new folder named string-indexing-and-methods. Create a file named - small-string-snippets.js inside. Predict what the following code will print out:

- -

Verify your predictions by writing the code to the small-string-snippets.js file. Don’t copy and - paste; - type everything out manually. Run the code.

-

1. Proper Patterns.

-

Inside of the string-indexing-and-methods folder create another file named - proper-patterns.js. Predict what the following code will print out:

- -

Type the code. Don’t copy and paste. Run it. Check your predictions.

-

2. Dare to Decipher?

-

Inside of the string-indexing-and-methods folder create another file named - dare-to-decipher.js. Predict what the following code will print out:

- -

Nice code. Run it.

-

3. A Tedious Task

-

Inside of the string-indexing-and-methods folder create another file named - a-tedious-task.js. Write the program so that it prints out the index where the substring - HEY - can be found in the text below.

-
MIICWwIBAAKBgGEdLjFEFbegPZ2AwJWkalksXr7PzWL7wIc7pOFZxXwYPWtQxvANyceCwpkqbPLsfEx7nqxAris2hYOdeN1OTFqvTyNmVuzbUPcXShn6ZoDCB30voHkeu4F3cUw5RQEUDdLscSnv4HMxHam5qgl6vXoumVNHbjyKA5UtAnfjAgMBAAECgYAmjEyvpZTxRJvwjxDi1VaZevFI0Hd4WPH9PAGgqdnH84vGXnAGFj1WikqKYcqKMQW2kdjAsWwH9D9FfrkIcDDHdZ9XuGSGkFzWtOwajWMQl7qNV1hZ288gdpIQQMOTLDgauZY6pw1cV7h4v316qJB8knQGoBNpJCfTYQJBAKV1ctsJq0Zg4QumD2hyODepP3LfLeaQsERLqVAWeuOuTY5mK5gIwsSqvcSVfY7Ze1FWIsApNFRv67azKcJPwsCQQCNlyApZFJEVNY70Er7Uu5NL9t4CYJJC9uVVkoEHEY6d7sVslqa0vP2q0zXx9YedbMBvQjxXIbY0waXUy63FvoBGJAkB3OTJWUjVgzDY1Br5wu2Yu59NjKVKLWzCsu1gaCNBfhVDX7SyIyC9EYKRfUAoQxwsmPWPyQ9QVG4WKcPZJAkBRheAotPCBE2RLHHfvpiStnMhX0UXdVyaJp5tcZ6wYV61ohyBvCOkYhUxBJzeIGrVZcvLZSLeUzXoqRPpxQxAkEAkdCZXF0gHahpZgF5y0wWcqf9ECRT1E4Hv8bk3Mf0Exp2aW34JeI6I7Xqd1NV4I9H7prQ8m3y39lFwWO8PmQ
-

Fine. You can copy and paste, this time.

- even - -

- - - diff --git a/javascript-practice/00_expressions_variables/exercises/D_string_indexing_and_methods_exercise/README.md b/javascript-practice/00_expressions_variables/exercises/D_string_indexing_and_methods_exercise/README.md deleted file mode 100644 index 8d8f8b8..0000000 --- a/javascript-practice/00_expressions_variables/exercises/D_string_indexing_and_methods_exercise/README.md +++ /dev/null @@ -1,113 +0,0 @@ -# Intelligent Indexing - -A string consists of one or more characters. An _index_ is a number that corresponds to the position -of a character in a string. The first character of a string has _index 0_, the second character has -_index 1_, and so on. _Indexing_ is a pattern that programmers use often in strings. This pattern -will also appear later in more advanced applications. - -Before you start this exercise, make sure you have watched the lecture first. - -+ [Lecture](https://youtu.be/QoeKfd9MYWA) - -If you get stuck during this exercise, reference this walkthrough. Only watch enough of the -walkthrough to get yourself unstuck, then pause the video and pick up the exercise on your own. - -+ [Walkthrough Part 1](https://youtu.be/lXlNybyHclc) -+ [Walkthrough Part 2](https://youtu.be/4sf1uP9OIDI) - -This is where we begin to unlock the basic programming patterns that you'll always be able to rely -on. Study them closely. - --AZ - -## 0. Small String Snippets. - -Create a new folder named `string-indexing-and-methods`. Create a file named -`small-string-snippets.js` inside. Predict what the following code will print out: - -```js -console.log("promenade"[3]); -console.log("tiger"[1]); -console.log("wheel".length); -console.log("wheel".length - 1); -console.log("noMAD".toUpperCase()); -console.log("hey programmers"[2] === "y"); - -console.log("volleyball".length > 20); -console.log("treasure".indexOf("r")); -console.log("treasure".indexOf("e")); -console.log("web"[5]); -console.log("red".indexOf("x")); -console.log("red".indexOf("R")); -``` - -Verify your predictions by writing the code to the `small-string-snippets.js` file. Don't copy and -paste; type everything out manually. Run the code. - -## 1. Proper Patterns. - -Inside of the `string-indexing-and-methods` folder create another file named `proper-patterns.js`. -Predict what the following code will print out: - -```js -let word = "suspension bridge"; -console.log(word[4]); -console.log(word.length > 5 && word[0] === "d"); -console.log(word.length > 5 && word[0] === "s"); -console.log(word.indexOf("o") > -1); -console.log(word.indexOf("z") > -1); - -let str = "foggy"; -console.log(str[2 + 1]); -console.log(str[str.length - 1]); -str = " day"; -console.log(str); -console.log(str.length); -console.log(str.indexOf("ogg")); -``` - -Type the code. Don't copy and paste. Run it. Check your predictions. - -## 2. Dare to Decipher? - -Inside of the `string-indexing-and-methods` folder create another file named `dare-to-decipher.js`. -Predict what the following code will print out: - -```js -let phrase = "that's all folks"; -console.log(phrase[phrase.length]); -console.log(phrase[phrase.length - 1]); -console.log(phrase[phrase.length - 2]); - -const i = 9; -const char = phrase[i]; -console.log(char); -console.log(phrase.indexOf(char)); -console.log(phrase.slice(2, 8)); - -console.log("abcdefg".slice(1, 3)); -console.log("abcdefg".slice(2)); -console.log("abcdefg".slice(4)); -console.log("abcdefg".slice(2, -1)); -console.log("abcdefg".slice(2, -2)); -``` - -Nice code. Run it. - -## 3. A Tedious Task - -Inside of the `string-indexing-and-methods` folder create another file named `a-tedious-task.js`. -Write the program so that it prints out the index where the substring `HEY` can be found in the text -below. - -```plaintext -MIICWwIBAAKBgGEdLjFEFbegPZ2AwJWkalksXr7PzWL7wIc7pOFZxXwYPWtQxvANyceCwpkqbPLsfEx7nqxAris2hYOdeN1OTFqvTyNmVuzbUPcXShn6ZoDCB30voHkeu4F3cUw5RQEUDdLscSnv4HMxHam5qgl6vXoumVNHbjyKA5UtAnfjAgMBAAECgYAmjEyvpZTxRJvwjxDi1VaZevFI0Hd4WPH9PAGgqdnH84vGXnAGFj1WikqKYcqKMQW2kdjAsWwH9D9FfrkIcDDHdZ9XuGSGkFzWtOwajWMQl7qNV1hZ288gdpIQQMOTLDgauZY6pw1cV7h4v316qJB8knQGoBNpJCfTYQJBAKV1ctsJq0Zg4QumD2hyODepP3LfLeaQsERLqVAWeuOuTY5mK5gIwsSqvcSVfY7Ze1FWIsApNFRv67azKcJPwsCQQCNlyApZFJEVNY70Er7Uu5NL9t4CYJJC9uVVkoEHEY6d7sVslqa0vP2q0zXx9YedbMBvQjxXIbY0waXUy63FvoBGJAkB3OTJWUjVgzDY1Br5wu2Yu59NjKVKLWzCsu1gaCNBfhVDX7SyIyC9EYKRfUAoQxwsmPWPyQ9QVG4WKcPZJAkBRheAotPCBE2RLHHfvpiStnMhX0UXdVyaJp5tcZ6wYV61ohyBvCOkYhUxBJzeIGrVZcvLZSLeUzXoqRPpxQxAkEAkdCZXF0gHahpZgF5y0wWcqf9ECRT1E4Hv8bk3Mf0Exp2aW34JeI6I7Xqd1NV4I9H7prQ8m3y39lFwWO8PmQ -``` - -Fine. You can copy and paste, _this_ time. - -## Walkthrough - - - - diff --git a/javascript-practice/00_expressions_variables/exercises/D_string_indexing_and_methods_exercise/right.html b/javascript-practice/00_expressions_variables/exercises/D_string_indexing_and_methods_exercise/right.html deleted file mode 100644 index faf59a8..0000000 --- a/javascript-practice/00_expressions_variables/exercises/D_string_indexing_and_methods_exercise/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -D_string_indexing_and_methods_exercise - - - Stable - - - - - - - - - - - - -
Folders
<Go Back>
-
- - - - -
FileFileFileFileFileFileFileFile
README.html right.html README.md 
- -

-Folders: 1
-Files: 3
-Size of all files: 39288 KB

- - - \ No newline at end of file diff --git a/javascript-practice/00_expressions_variables/exercises/right.html b/javascript-practice/00_expressions_variables/exercises/right.html deleted file mode 100644 index 5fb604e..0000000 --- a/javascript-practice/00_expressions_variables/exercises/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -exercises - - - Stable - - - - - - - - - - - - -
Folders
<Go Back> A_execut...rcise B_expres...rcise C_variab...rcise D_string...rcise
-
- - - - -
FileFileFileFileFileFileFileFile
right.html 
- -

-Folders: 5
-Files: 1
-Size of all files: 14097 KB

- - - \ No newline at end of file diff --git a/javascript-practice/00_expressions_variables/right.html b/javascript-practice/00_expressions_variables/right.html deleted file mode 100644 index ca4cdac..0000000 --- a/javascript-practice/00_expressions_variables/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -00_expressions_variables - - - Stable - - - - - - - - - - - - -
Folders
<Go Back> exercises solutions
-
- - - - -
FileFileFileFileFileFileFileFile
right.html 
- -

-Folders: 3
-Files: 1
-Size of all files: 13839 KB

- - - \ No newline at end of file diff --git a/javascript-practice/00_expressions_variables/solutions/A_executing_code_solution/age.js b/javascript-practice/00_expressions_variables/solutions/A_executing_code_solution/age.js deleted file mode 100644 index 5b8af33..0000000 --- a/javascript-practice/00_expressions_variables/solutions/A_executing_code_solution/age.js +++ /dev/null @@ -1 +0,0 @@ -console.log( 0 ); diff --git a/javascript-practice/00_expressions_variables/solutions/A_executing_code_solution/greeting.js b/javascript-practice/00_expressions_variables/solutions/A_executing_code_solution/greeting.js deleted file mode 100644 index 847f0fc..0000000 --- a/javascript-practice/00_expressions_variables/solutions/A_executing_code_solution/greeting.js +++ /dev/null @@ -1 +0,0 @@ -console.log( 'hello world' ); diff --git a/javascript-practice/00_expressions_variables/solutions/A_executing_code_solution/right.html b/javascript-practice/00_expressions_variables/solutions/A_executing_code_solution/right.html deleted file mode 100644 index 001a15c..0000000 --- a/javascript-practice/00_expressions_variables/solutions/A_executing_code_solution/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -A_executing_code_solution - - - Stable - - - - - - - - - - - - -
Folders
<Go Back>
-
- - - - -
FileFileFileFileFileFileFileFile
right.html age.js greeting.js thirsty.js whoami.js 
- -

-Folders: 1
-Files: 5
-Size of all files: 14357 KB

- - - \ No newline at end of file diff --git a/javascript-practice/00_expressions_variables/solutions/A_executing_code_solution/thirsty.js b/javascript-practice/00_expressions_variables/solutions/A_executing_code_solution/thirsty.js deleted file mode 100644 index b7d496c..0000000 --- a/javascript-practice/00_expressions_variables/solutions/A_executing_code_solution/thirsty.js +++ /dev/null @@ -1 +0,0 @@ -console.log( 'coffee' ); diff --git a/javascript-practice/00_expressions_variables/solutions/A_executing_code_solution/whoami.js b/javascript-practice/00_expressions_variables/solutions/A_executing_code_solution/whoami.js deleted file mode 100644 index b40ac67..0000000 --- a/javascript-practice/00_expressions_variables/solutions/A_executing_code_solution/whoami.js +++ /dev/null @@ -1,2 +0,0 @@ -console.log( 'alvin' ); -console.log( 'z' ); diff --git a/javascript-practice/00_expressions_variables/solutions/B_expressions_solution/boolean-expressions.js b/javascript-practice/00_expressions_variables/solutions/B_expressions_solution/boolean-expressions.js deleted file mode 100644 index 49cd506..0000000 --- a/javascript-practice/00_expressions_variables/solutions/B_expressions_solution/boolean-expressions.js +++ /dev/null @@ -1,19 +0,0 @@ -console.log( false ); // false -console.log( !true ); // false -console.log( !false ); // true -console.log( !!true ); // true - -console.log( false && false ); // false -console.log( false && true ); // false -console.log( true && false ); // false -console.log( true && true ); // true - -console.log( false || false ); // false -console.log( false || true ); // true -console.log( true || false ); // true -console.log( true || true ); // true - -console.log( !false || false ); // true -console.log( false || ( true && true ) ); // true -console.log( false || !( true && true ) ); // false -console.log( !true && ( true ) ); // false diff --git a/javascript-practice/00_expressions_variables/solutions/B_expressions_solution/comparisons.js b/javascript-practice/00_expressions_variables/solutions/B_expressions_solution/comparisons.js deleted file mode 100644 index d7565ce..0000000 --- a/javascript-practice/00_expressions_variables/solutions/B_expressions_solution/comparisons.js +++ /dev/null @@ -1,20 +0,0 @@ -console.log( true === false ); // false -console.log( false === false ); // true -console.log( false !== true ); // true -console.log( !true === false ); // true - -console.log( 2 + 3 === 5 ); // true -console.log( 4 < 0 ); // false -console.log( 10 >= 10 ); // true -console.log( 10.3 >= 10 ); // true - -console.log( 100 / 2 === 50 ); // true -console.log( 100 % 2 === 0 ); // true -console.log( 11 % 2 === 0 ); // false -console.log( 7.0 === 7 ); // true - -console.log( 13 % 5 > 0 ); // true -console.log( "potato" === "potato" ); // true -console.log( "Tomato" === "tomato" ); // false -console.log( "42" === 42 ); // false -console.log( 5 > 3 && 1 === 0 ); // false diff --git a/javascript-practice/00_expressions_variables/solutions/B_expressions_solution/number-expressions.js b/javascript-practice/00_expressions_variables/solutions/B_expressions_solution/number-expressions.js deleted file mode 100644 index c88939e..0000000 --- a/javascript-practice/00_expressions_variables/solutions/B_expressions_solution/number-expressions.js +++ /dev/null @@ -1,20 +0,0 @@ -console.log( 2 + 3 ); // 5 -console.log( 10 - 15 ); // -5 -console.log( 4 + 1 - 5 ); // 0 -console.log( 4 * 3 ); // 12 - -console.log( 7 / 2 ); // 3.5 -console.log( 4 + 2 * 3 ); // 10 -console.log( ( 4 + 2 ) * 3 ); // 18 -console.log( 5 % 2 ); // 1 - -console.log( 6 % 2 ); // 0 -console.log( 7 % 2 ); // 1 -console.log( 8 % 2 ); // 0 -console.log( 19 % 8 ); // 3 - -console.log( 24 % 8 ); // 0 -console.log( 7 % 4 ); // 3 -console.log( 4 % 7 ); // 4 -console.log( 5 + ( 10 % 5 ) ); // 5 -console.log( ( 5 + 10 ) % 5 ); // 0 diff --git a/javascript-practice/00_expressions_variables/solutions/B_expressions_solution/right.html b/javascript-practice/00_expressions_variables/solutions/B_expressions_solution/right.html deleted file mode 100644 index cb5b52e..0000000 --- a/javascript-practice/00_expressions_variables/solutions/B_expressions_solution/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -B_expressions_solution - - - Stable - - - - - - - - - - - - -
Folders
<Go Back>
-
- - - - -
FileFileFileFileFileFileFileFile
right.html boolean-...ns.js comparisons.js number-e...ns.js string-e...ns.js 
- -

-Folders: 1
-Files: 5
-Size of all files: 16254 KB

- - - \ No newline at end of file diff --git a/javascript-practice/00_expressions_variables/solutions/B_expressions_solution/string-expressions.js b/javascript-practice/00_expressions_variables/solutions/B_expressions_solution/string-expressions.js deleted file mode 100644 index e523437..0000000 --- a/javascript-practice/00_expressions_variables/solutions/B_expressions_solution/string-expressions.js +++ /dev/null @@ -1,5 +0,0 @@ -console.log( "river" + "town" ); -console.log( "cat" + "dog" ); -console.log( "New" + " York" ); -console.log( "runner's knee" + "!" ); -console.log( "man" + "bear" + "pig" ); diff --git a/javascript-practice/00_expressions_variables/solutions/C_variables_solution/four.js b/javascript-practice/00_expressions_variables/solutions/C_variables_solution/four.js deleted file mode 100644 index 9a1e0a2..0000000 --- a/javascript-practice/00_expressions_variables/solutions/C_variables_solution/four.js +++ /dev/null @@ -1,5 +0,0 @@ -let movie = 'Fight Club'; - -let views = 4; - -console.log( 'I watched ' + movie + ' about ' + views + ' number of times' ); diff --git a/javascript-practice/00_expressions_variables/solutions/C_variables_solution/one.js b/javascript-practice/00_expressions_variables/solutions/C_variables_solution/one.js deleted file mode 100644 index c75b1dc..0000000 --- a/javascript-practice/00_expressions_variables/solutions/C_variables_solution/one.js +++ /dev/null @@ -1,12 +0,0 @@ -let word = "bye"; -console.log( word + " felicia" ); // 'bye felicia' -console.log( word ); // 'bye' - -let num = 10; -num = num * 2; -console.log( num ); // 20 - -let bottlesOfBeer = 99; -let around = bottlesOfBeer - 1; -console.log( around ); // 98 -console.log( bottlesOfBeer ); // 99 diff --git a/javascript-practice/00_expressions_variables/solutions/C_variables_solution/right.html b/javascript-practice/00_expressions_variables/solutions/C_variables_solution/right.html deleted file mode 100644 index f66921a..0000000 --- a/javascript-practice/00_expressions_variables/solutions/C_variables_solution/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -C_variables_solution - - - Stable - - - - - - - - - - - - -
Folders
<Go Back>
-
- - - - -
FileFileFileFileFileFileFileFile
right.html four.js one.js three.js two.js zero.js 
- -

-Folders: 1
-Files: 6
-Size of all files: 15438 KB

- - - \ No newline at end of file diff --git a/javascript-practice/00_expressions_variables/solutions/C_variables_solution/three.js b/javascript-practice/00_expressions_variables/solutions/C_variables_solution/three.js deleted file mode 100644 index 7f0f790..0000000 --- a/javascript-practice/00_expressions_variables/solutions/C_variables_solution/three.js +++ /dev/null @@ -1,12 +0,0 @@ -let qty = 15 % 4; -console.log( qty ); // 3 - -let num = 38 + 3; -num++; -console.log( num + " is a great number" ); // '42 is a great number' - -let isNumEven = num % 2 === 0; -console.log( num + " is even? " + isNumEven ); // '42 is even? true' - -let isQtyEven = qty % 2 === 0; -console.log( qty + " is even? " + isQtyEven ); // '3 is even? false' diff --git a/javascript-practice/00_expressions_variables/solutions/C_variables_solution/two.js b/javascript-practice/00_expressions_variables/solutions/C_variables_solution/two.js deleted file mode 100644 index 4f10a06..0000000 --- a/javascript-practice/00_expressions_variables/solutions/C_variables_solution/two.js +++ /dev/null @@ -1,19 +0,0 @@ -let apple; -console.log( apple ); // undefined - -apple = 5; -console.log( apple ); // 5 - -apple + 1; -console.log( apple ); // 5 - -apple += 1; -console.log( apple ); // 6 - -let banana = apple; -console.log( banana ); // 6 - -banana = banana / 2; -console.log( banana ); // 3 - -console.log( apple ); // 6 diff --git a/javascript-practice/00_expressions_variables/solutions/C_variables_solution/zero.js b/javascript-practice/00_expressions_variables/solutions/C_variables_solution/zero.js deleted file mode 100644 index 491cb54..0000000 --- a/javascript-practice/00_expressions_variables/solutions/C_variables_solution/zero.js +++ /dev/null @@ -1,5 +0,0 @@ -let location = "Brooklyn, " + "NY"; -console.log( location ); // 'Brooklyn, NY' - -let quantity = 4 * 5 + 1; -console.log( quantity ); // 21 diff --git a/javascript-practice/00_expressions_variables/solutions/D_string_indexing_and_methods_solution/a-tedious-task.js b/javascript-practice/00_expressions_variables/solutions/D_string_indexing_and_methods_solution/a-tedious-task.js deleted file mode 100644 index 2f4ff1d..0000000 --- a/javascript-practice/00_expressions_variables/solutions/D_string_indexing_and_methods_solution/a-tedious-task.js +++ /dev/null @@ -1,3 +0,0 @@ -let str = 'MIICWwIBAAKBgGEdLjFEFbegPZ2AwJWkalksXr7PzWL7wIc7pOFZxXwYPWtQxvANyceCwpkqbPLsfEx7nqxAris2hYOdeN1OTFqvTyNmVuzbUPcXShn6ZoDCB30voHkeu4F3cUw5RQEUDdLscSnv4HMxHam5qgl6vXoumVNHbjyKA5UtAnfjAgMBAAECgYAmjEyvpZTxRJvwjxDi1VaZevFI0Hd4WPH9PAGgqdnH84vGXnAGFj1WikqKYcqKMQW2kdjAsWwH9D9FfrkIcDDHdZ9XuGSGkFzWtOwajWMQl7qNV1hZ288gdpIQQMOTLDgauZY6pw1cV7h4v316qJB8knQGoBNpJCfTYQJBAKV1ctsJq0Zg4QumD2hyODepP3LfLeaQsERLqVAWeuOuTY5mK5gIwsSqvcSVfY7Ze1FWIsApNFRv67azKcJPwsCQQCNlyApZFJEVNY70Er7Uu5NL9t4CYJJC9uVVkoEHEY6d7sVslqa0vP2q0zXx9YedbMBvQjxXIbY0waXUy63FvoBGJAkB3OTJWUjVgzDY1Br5wu2Yu59NjKVKLWzCsu1gaCNBfhVDX7SyIyC9EYKRfUAoQxwsmPWPyQ9QVG4WKcPZJAkBRheAotPCBE2RLHHfvpiStnMhX0UXdVyaJp5tcZ6wYV61ohyBvCOkYhUxBJzeIGrVZcvLZSLeUzXoqRPpxQxAkEAkdCZXF0gHahpZgF5y0wWcqf9ECRT1E4Hv8bk3Mf0Exp2aW34JeI6I7Xqd1NV4I9H7prQ8m3y39lFwWO8PmQ'; - -console.log( str.indexOf( 'HEY' ) ); diff --git a/javascript-practice/00_expressions_variables/solutions/D_string_indexing_and_methods_solution/dare-to-decipher.js b/javascript-practice/00_expressions_variables/solutions/D_string_indexing_and_methods_solution/dare-to-decipher.js deleted file mode 100644 index af0c136..0000000 --- a/javascript-practice/00_expressions_variables/solutions/D_string_indexing_and_methods_solution/dare-to-decipher.js +++ /dev/null @@ -1,18 +0,0 @@ -let phrase = "that's all folks"; -console.log( phrase[ phrase.length ] ); // undefined -console.log( phrase[ phrase.length - 1 ] ); // s -console.log( phrase[ phrase.length - 2 ] ); // k - -const i = 9; -const char = phrase[ i ]; -console.log( char ); // l -console.log( phrase.indexOf( char ) ); // 8 -console.log( phrase.slice( 2, 8 ) ); // at's a - -console.log( "abcdefg".slice( 1, 3 ) ); // bc -console.log( "abcdefg".slice( 2 ) ); // cdefg -console.log( "abcdefg".slice( 4 ) ); // efg - - -console.log( "abcdefg".slice( 2, -1 ) ); // cdef -console.log( "abcdefg".slice( 2, -2 ) ); // cde diff --git a/javascript-practice/00_expressions_variables/solutions/D_string_indexing_and_methods_solution/proper-patterns.js b/javascript-practice/00_expressions_variables/solutions/D_string_indexing_and_methods_solution/proper-patterns.js deleted file mode 100644 index 7d14806..0000000 --- a/javascript-practice/00_expressions_variables/solutions/D_string_indexing_and_methods_solution/proper-patterns.js +++ /dev/null @@ -1,14 +0,0 @@ -let word = "suspension bridge"; -console.log( word[ 4 ] ); // e -console.log( word.length > 5 && word[ 0 ] === "d" ); // false -console.log( word.length > 5 && word[ 0 ] === "s" ); // true -console.log( word.indexOf( "o" ) > -1 ); // true -console.log( word.indexOf( "z" ) > -1 ); // false - -let str = "foggy"; -console.log( str[ 2 + 1 ] ); // g -console.log( str[ str.length - 1 ] ); // y -str = " day"; -console.log( str ); // ' day' -console.log( str.length ); // 4 -console.log( str.indexOf( "ogg" ) ); // -1 diff --git a/javascript-practice/00_expressions_variables/solutions/D_string_indexing_and_methods_solution/right.html b/javascript-practice/00_expressions_variables/solutions/D_string_indexing_and_methods_solution/right.html deleted file mode 100644 index a84d07f..0000000 --- a/javascript-practice/00_expressions_variables/solutions/D_string_indexing_and_methods_solution/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -D_string_indexing_and_methods_solution - - - Stable - - - - - - - - - - - - -
Folders
<Go Back>
-
- - - - -
FileFileFileFileFileFileFileFile
right.html a-tediou...sk.js dare-to-...er.js proper-p...ns.js small-st...ts.js 
- -

-Folders: 1
-Files: 5
-Size of all files: 16767 KB

- - - \ No newline at end of file diff --git a/javascript-practice/00_expressions_variables/solutions/D_string_indexing_and_methods_solution/small-string-snippets.js b/javascript-practice/00_expressions_variables/solutions/D_string_indexing_and_methods_solution/small-string-snippets.js deleted file mode 100644 index 9626df4..0000000 --- a/javascript-practice/00_expressions_variables/solutions/D_string_indexing_and_methods_solution/small-string-snippets.js +++ /dev/null @@ -1,14 +0,0 @@ -console.log( "promenade" [ 3 ] ); // m -console.log( "tiger" [ 1 ] ); // i -console.log( "wheel".length ); // 5 - -console.log( "wheel".length - 1 ); // 4 -console.log( "noMAD".toUpperCase() ); // NOMAD -console.log( "hey programmers" [ 2 ] === "y" ); // true - -console.log( "volleyball".length > 20 ); // false -console.log( "treasure".indexOf( "r" ) ); // 1 -console.log( "treasure".indexOf( "e" ) ); // 2 -console.log( "web" [ 5 ] ); // undefined -console.log( "red".indexOf( "x" ) ); // -1 -console.log( "red".indexOf( "R" ) ); // -1 diff --git a/javascript-practice/00_expressions_variables/solutions/right.html b/javascript-practice/00_expressions_variables/solutions/right.html deleted file mode 100644 index 2831926..0000000 --- a/javascript-practice/00_expressions_variables/solutions/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -solutions - - - Stable - - - - - - - - - - - - -
Folders
<Go Back> A_execut...ution B_expres...ution C_variab...ution D_string...ution
-
- - - - -
FileFileFileFileFileFileFileFile
right.html 
- -

-Folders: 5
-Files: 1
-Size of all files: 14097 KB

- - - \ No newline at end of file diff --git a/javascript-practice/01_conditionals/exercises/A_conditionals_exercise/README.html b/javascript-practice/01_conditionals/exercises/A_conditionals_exercise/README.html deleted file mode 100644 index 9aa1819..0000000 --- a/javascript-practice/01_conditionals/exercises/A_conditionals_exercise/README.html +++ /dev/null @@ -1,289 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Document - - - - - - - - - -
- - - - -
HOME -
- - - -

Strength and Conditioning

-

A conditional is a construct that allows programmers to execute different code dependent on the - value of - a - boolean expression.

-

Before you start this exercise, make sure you have watched the lecture first.

- - get - yourself unstuck, then pause the video and pick up the exercise on your own.

- -

If you want to learn how to code, then code.

-

-AZ

-

0. If you can do this, then move on.

-

Create a new folder named conditional_exercise. Inside, create a file named - zero.js. - Predict what each of the code snippets below will print out. After you make a prediction for a snippet, add - the - snippet into zero.js. Don’t copy and paste. Run the code to verify your prediction for that - snippet, - then - move on to the next snippet.

- - - - - -

1. Conditions Do Apply.

-

Create a new file named one.js inside of the conditional_exercise folder. Predict - what - each - of the snippets below will print out. Type each snippet into the file and run it to test your prediction. - Don’t - copy - and paste.

- - - - -

2. Iffy.

-

Create a new file named two.js inside of the conditional_exercise folder. Predict - what - each - of the snippets below will print out. Type each snippet into the file and run it to test your prediction. - Don’t - copy - and paste.

- - -

3. Conditional Love.

-

Create a new file named three.js inside of the conditional_exercise folder. The - program - should print out FOUND if the substring coDe exists in the text below. If the - coDe does not exist in the text, then the program should print NOT FOUND.

-
AIICXAIBAAKBgQCuw0YyucjI9bf7yRhIkyg4Ru6kYU7O6fIn2JoFDzCZNkzDdsuXFGh6BXNvbu8uZUT289ERzYP1QjryMEKWzcbtsioyQApL7AgOZyFc3JJ7wvupHhIj2sqxJNtpAh7HQFG08rYh2Pb3HwOm83rbTomM6LnnjooGcoDeuWkuPqXsRlwIDAQABAoGAeQkbPBR5n9y2QLaEjcDGv7dVpFiMGHMaZZVDX34rZPy1EkZNZqlQU0jopLVvLyLESMh9A7gKhqoyMAbgZPpdb0CvniTJPpKYk24mLBeym8rBMW3XBmKk1xIOcJPGXMxeJW61jxPg6doah0aCIjf8n0Z8t8B81kLFojpECQQDzlCp0Nzka3AVZVPdBuuPg0fzeV8ugpiPEp6wQLjIMDFqYtGoAOEy4JpkmkK7zwsQsHZ8jbOtqIFdRLPrvAkEAruU321Ie1CnYCHX4Q79vLcDeWOUpdzEHp2uzDIfzP1gv7RIktGgSZWKhrnNWdeH4Y0CFb9lu6TQYJwNJvug2QJBANX0m3Uds9P9pLbQlI9WWmAtYqIZrsBElcAjOgAik0uOfawholNiw5B3ADvIYqPkLW4dGk1dO6zxW8ZF83MdMCQHGfhxLuFgsOBSfF7Bj4UX6T9FGhUGSXiqUsd06E2mMRLAjWUUUw82DLwucxMrSsV4z1aN57asC8YuQ9FkCQGirlVCt4ccXeGLCHcCsI8AYQJFRzbMs381M16jEpnaKUGrtdbMW018gWJ0EoD4tS2YZpr1hEbtiOkPJaaTKQ
-

You may copy and paste. What a time to be alive.

- even - -

- - - diff --git a/javascript-practice/01_conditionals/exercises/A_conditionals_exercise/README.md b/javascript-practice/01_conditionals/exercises/A_conditionals_exercise/README.md deleted file mode 100644 index 8eb7abc..0000000 --- a/javascript-practice/01_conditionals/exercises/A_conditionals_exercise/README.md +++ /dev/null @@ -1,229 +0,0 @@ -# Strength and Conditioning - -A _conditional_ is a construct that allows programmers to execute different code dependent on the -value of a boolean expression. - -Before you start this exercise, make sure you have watched the lecture first. - -+ [Lecture](https://youtu.be/ous6eeG2BaY) - -If you get stuck during this exercise, reference this walkthrough. Only watch enough of the -walkthrough to get yourself unstuck, then pause the video and pick up the exercise on your own. - -+ [Walkthrough Part 1](https://youtu.be/o50tHXYQzFE) -+ [Walkthrough Part 2](https://youtu.be/Ij7V0JfxeUs) - -_If_ you want to learn how to code, _then_ code. - --AZ - -## 0. If you can do this, then move on. - -Create a new folder named `conditional_exercise`. Inside, create a file named `zero.js`. Predict -what each of the code snippets below will print out. After you make a prediction for a snippet, add -the snippet into `zero.js`. Don't copy and paste. Run the code to verify your prediction for that -snippet, then move on to the next snippet. - -```js -// snippet 0-1 -if (true) { - console.log("foo"); -} - -if (false) { - console.log("bar"); -} -``` - -```js -// snippet 0-2 -if (false || false) { - console.log("boop"); -} - -if (true || false) { - console.log("beep"); -} -``` - -```js -// snippet 0-3 -let num = 40; - -if (num > 0) { - console.log("zip"); -} - -if (num % 2 === 0) { - console.log("zoop"); -} -``` - -```js -// snippet 0-4 -let word = "jeep"; - -if (word[0] === "d") { - console.log("yer"); -} else { - console.log("nah"); -} -``` - -```js -// snippet 0-5 -let sentence = "roger that"; - -if (sentence[sentence.length - 1] === "t") { - console.log("ends in t"); -} else { - console.log("does not end in t"); -} - -if (sentence.length <= 4) { - console.log("short"); -} else { - console.log("long"); -} -``` - -## 1. Conditions Do Apply. - -Create a new file named `one.js` inside of the `conditional_exercise` folder. Predict what each of -the snippets below will print out. Type each snippet into the file and run it to test your -prediction. Don't copy and paste. - -```js -// snippet 1-0 -let qty = 38; - -if (qty > 30 && qty % 5 === 4) { - console.log("swish"); -} else { - console.log("swoosh"); -} - -if (qty > 0) { - console.log("pos"); -} -``` - -```js -// snippet 1-1 -let a = "celery"; -let b = "SQUASH"; - -if (a === a.toUpperCase()) { - console.log("alpha"); -} - -if (b === b.toUpperCase()) { - console.log("beta"); -} -``` - -```js -// snippet 1-2 -let number = 9; - -if (number > 4) { - console.log("ding"); -} else if (number % 3 === 0) { - console.log("dong"); -} -``` - -```js -// snippet 1-3 -let z = 12; - -if (z > 10) { - console.log("vroom"); -} - -if (z % 3 === 0) { - console.log("skrrt"); -} -``` - -## 2. Iffy. - -Create a new file named `two.js` inside of the `conditional_exercise` folder. Predict what each of -the snippets below will print out. Type each snippet into the file and run it to test your -prediction. Don't copy and paste. - -```js -// snippet 2-1 -let nonsense = "blog trust fund tattooed williamsburg poke roof party"; -let hasOk = nonsense.indexOf("ok") > -1; - -if (hasOk) { - console.log("yeet"); -} else if (nonsense.length > 10) { - console.log("yo"); -} else { - console.log("no"); -} - -let hasZoo = nonsense.indexOf("zoo") > -1; -let hasFun = nonsense.indexOf("fun") > -1; - -if (hasZoo && hasOk) { - console.log("cool"); -} else if (hasOk) { - console.log("rad"); -} else if (hasFun) { - console.log("dope"); -} else { - console.log("nope"); -} -``` - -```js -// snippet 2-2 - -let q = 25; -if (q % 3 === 0 && q % 5 === 0) { - console.log("both"); -} else if (q % 3 === 0 || q % 5 == 0) { - console.log("either"); -} else { - console.log("neither"); -} - -let r = 9; -if (r % 3 === 0 && r % 5 === 0) { - console.log("both"); -} else if (r % 3 === 0 || r % 5 == 0) { - console.log("either"); -} else { - console.log("neither"); -} - -let s = 15; -if (s % 3 === 0 && s % 5 === 0) { - console.log("both"); -} else if (s % 3 === 0 || s % 5 == 0) { - console.log("either"); -} else { - console.log("neither"); -} -``` - -## 3. Conditional Love. - -Create a new file named `three.js` inside of the `conditional_exercise` folder. The program should -print out `FOUND` if the substring `coDe` exists in the text below. If the `coDe` does not exist in -the text, then the program should print `NOT FOUND`. - -```plaintext -AIICXAIBAAKBgQCuw0YyucjI9bf7yRhIkyg4Ru6kYU7O6fIn2JoFDzCZNkzDdsuXFGh6BXNvbu8uZUT289ERzYP1QjryMEKWzcbtsioyQApL7AgOZyFc3JJ7wvupHhIj2sqxJNtpAh7HQFG08rYh2Pb3HwOm83rbTomM6LnnjooGcoDeuWkuPqXsRlwIDAQABAoGAeQkbPBR5n9y2QLaEjcDGv7dVpFiMGHMaZZVDX34rZPy1EkZNZqlQU0jopLVvLyLESMh9A7gKhqoyMAbgZPpdb0CvniTJPpKYk24mLBeym8rBMW3XBmKk1xIOcJPGXMxeJW61jxPg6doah0aCIjf8n0Z8t8B81kLFojpECQQDzlCp0Nzka3AVZVPdBuuPg0fzeV8ugpiPEp6wQLjIMDFqYtGoAOEy4JpkmkK7zwsQsHZ8jbOtqIFdRLPrvAkEAruU321Ie1CnYCHX4Q79vLcDeWOUpdzEHp2uzDIfzP1gv7RIktGgSZWKhrnNWdeH4Y0CFb9lu6TQYJwNJvug2QJBANX0m3Uds9P9pLbQlI9WWmAtYqIZrsBElcAjOgAik0uOfawholNiw5B3ADvIYqPkLW4dGk1dO6zxW8ZF83MdMCQHGfhxLuFgsOBSfF7Bj4UX6T9FGhUGSXiqUsd06E2mMRLAjWUUUw82DLwucxMrSsV4z1aN57asC8YuQ9FkCQGirlVCt4ccXeGLCHcCsI8AYQJFRzbMs381M16jEpnaKUGrtdbMW018gWJ0EoD4tS2YZpr1hEbtiOkPJaaTKQ -``` - -You may copy and paste. What a time to be alive. - -## Walkthrough - - - - diff --git a/javascript-practice/01_conditionals/exercises/A_conditionals_exercise/right.html b/javascript-practice/01_conditionals/exercises/A_conditionals_exercise/right.html deleted file mode 100644 index ac3c79c..0000000 --- a/javascript-practice/01_conditionals/exercises/A_conditionals_exercise/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -A_conditionals_exercise - - - Stable - - - - - - - - - - - - -
Folders
<Go Back>
-
- - - - -
FileFileFileFileFileFileFileFile
README.html right.html README.md 
- -

-Folders: 1
-Files: 3
-Size of all files: 54584 KB

- - - \ No newline at end of file diff --git a/javascript-practice/01_conditionals/exercises/right.html b/javascript-practice/01_conditionals/exercises/right.html deleted file mode 100644 index 323a8ab..0000000 --- a/javascript-practice/01_conditionals/exercises/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -exercises - - - Stable - - - - - - - - - - - - -
Folders
<Go Back> A_condit...rcise
-
- - - - -
FileFileFileFileFileFileFileFile
right.html 
- -

-Folders: 2
-Files: 1
-Size of all files: 13757 KB

- - - \ No newline at end of file diff --git a/javascript-practice/01_conditionals/right.html b/javascript-practice/01_conditionals/right.html deleted file mode 100644 index 6f999b9..0000000 --- a/javascript-practice/01_conditionals/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -01_conditionals - - - Stable - - - - - - - - - - - - -
Folders
<Go Back> exercises solutions
-
- - - - -
FileFileFileFileFileFileFileFile
right.html 
- -

-Folders: 3
-Files: 1
-Size of all files: 13830 KB

- - - \ No newline at end of file diff --git a/javascript-practice/01_conditionals/solutions/A_conditionals_solution/one.js b/javascript-practice/01_conditionals/solutions/A_conditionals_solution/one.js deleted file mode 100644 index 2f79f7c..0000000 --- a/javascript-practice/01_conditionals/solutions/A_conditionals_solution/one.js +++ /dev/null @@ -1,47 +0,0 @@ -i t // snippet 1-0 -let qty = 38; - -if ( qty > 30 && qty % 5 === 4 ) { - console.log( "swish" ); -} else { - console.log( "swoosh" ); // prints -} - -if ( qty > 0 ) { - console.log( "pos" ); // prints -} - -// snippet 1-1 -let a = "celery"; -let b = "SQUASH"; - -if ( a === a.toUpperCase() ) { - console.log( "alpha" ); -} - -if ( b === b.toUpperCase() ) { - console.log( "beta" ); // prints -} - - -// snippet 1-2 -let number = 9; - -if ( number > 4 ) { - console.log( "ding" ); // prints -} else if ( number % 3 === 0 ) { - console.log( "dong" ); -} - - - -// snippet 1-3 -let z = 12; - -if ( z > 10 ) { - console.log( "vroom" ); // prints -} - -if ( z % 3 === 0 ) { - console.log( "skrrt" ); // prints -} diff --git a/javascript-practice/01_conditionals/solutions/A_conditionals_solution/right.html b/javascript-practice/01_conditionals/solutions/A_conditionals_solution/right.html deleted file mode 100644 index 96590b7..0000000 --- a/javascript-practice/01_conditionals/solutions/A_conditionals_solution/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -A_conditionals_solution - - - Stable - - - - - - - - - - - - -
Folders
<Go Back>
-
- - - - -
FileFileFileFileFileFileFileFile
right.html one.js three.js two.js zero.js 
- -

-Folders: 1
-Files: 5
-Size of all files: 17764 KB

- - - \ No newline at end of file diff --git a/javascript-practice/01_conditionals/solutions/A_conditionals_solution/three.js b/javascript-practice/01_conditionals/solutions/A_conditionals_solution/three.js deleted file mode 100644 index 580d5e7..0000000 --- a/javascript-practice/01_conditionals/solutions/A_conditionals_solution/three.js +++ /dev/null @@ -1,7 +0,0 @@ -glet longStr = "AIICXAIBAAKBgQCuw0YyucjI9bf7yRhIkyg4Ru6kYU7O6fIn2JoFDzCZNkzDdsuXFGh6BXNvbu8uZUT289ERzYP1QjryMEKWzcbtsioyQApL7AgOZyFc3JJ7wvupHhIj2sqxJNtpAh7HQFG08rYh2Pb3HwOm83rbTomM6LnnjooGcoDeuWkuPqXsRlwIDAQABAoGAeQkbPBR5n9y2QLaEjcDGv7dVpFiMGHMaZZVDX34rZPy1EkZNZqlQU0jopLVvLyLESMh9A7gKhqoyMAbgZPpdb0CvniTJPpKYk24mLBeym8rBMW3XBmKk1xIOcJPGXMxeJW61jxPg6doah0aCIjf8n0Z8t8B81kLFojpECQQDzlCp0Nzka3AVZVPdBuuPg0fzeV8ugpiPEp6wQLjIMDFqYtGoAOEy4JpkmkK7zwsQsHZ8jbOtqIFdRLPrvAkEAruU321Ie1CnYCHX4Q79vLcDeWOUpdzEHp2uzDIfzP1gv7RIktGgSZWKhrnNWdeH4Y0CFb9lu6TQYJwNJvug2QJBANX0m3Uds9P9pLbQlI9WWmAtYqIZrsBElcAjOgAik0uOfawholNiw5B3ADvIYqPkLW4dGk1dO6zxW8ZF83MdMCQHGfhxLuFgsOBSfF7Bj4UX6T9FGhUGSXiqUsd06E2mMRLAjWUUUw82DLwucxMrSsV4z1aN57asC8YuQ9FkCQGirlVCt4ccXeGLCHcCsI8AYQJFRzbMs381M16jEpnaKUGrtdbMW018gWJ0EoD4tS2YZpr1hEbtiOkPJaaTKQ"; - -if ( longStr.indexOf( 'coDe' ) > -1 ) { - console.log( 'FOUND' ); -} else { - console.log( 'NOT FOUND' ); -} diff --git a/javascript-practice/01_conditionals/solutions/A_conditionals_solution/two.js b/javascript-practice/01_conditionals/solutions/A_conditionals_solution/two.js deleted file mode 100644 index d0d079a..0000000 --- a/javascript-practice/01_conditionals/solutions/A_conditionals_solution/two.js +++ /dev/null @@ -1,52 +0,0 @@ -// snippet 2-1 -let nonsense = "blog trust fund tattooed williamsburg poke roof party"; -let hasOk = nonsense.indexOf( "ok" ) > -1; - -if ( hasOk ) { - console.log( "yeet" ); // prints -} else if ( nonsense.length > 10 ) { - console.log( "yo" ); -} else { - console.log( "no" ); -} - -let hasZoo = nonsense.indexOf( "zoo" ) > -1; -let hasFun = nonsense.indexOf( "fun" ) > -1; - -if ( hasZoo && hasOk ) { - console.log( "cool" ); -} else if ( hasOk ) { - console.log( "rad" ); // prints -} else if ( hasFun ) { - console.log( "dope" ); -} else { - console.log( "nope" ); -} - -// snippet 2-2 -let q = 25; -if ( q % 3 === 0 && q % 5 === 0 ) { - console.log( "both" ); -} else if ( q % 3 === 0 || q % 5 == 0 ) { - console.log( "either" ); // prints -} else { - console.log( "neither" ); -} - -let r = 9; -if ( r % 3 === 0 && r % 5 === 0 ) { - console.log( "both" ); -} else if ( r % 3 === 0 || r % 5 == 0 ) { - console.log( "either" ); // prints -} else { - console.log( "neither" ); -} - -let s = 15; -if ( s % 3 === 0 && s % 5 === 0 ) { - console.log( "both" ); // prints -} else if ( s % 3 === 0 || s % 5 == 0 ) { - console.log( "either" ); -} else { - console.log( "neither" ); -} diff --git a/javascript-practice/01_conditionals/solutions/A_conditionals_solution/zero.js b/javascript-practice/01_conditionals/solutions/A_conditionals_solution/zero.js deleted file mode 100644 index 6594d23..0000000 --- a/javascript-practice/01_conditionals/solutions/A_conditionals_solution/zero.js +++ /dev/null @@ -1,56 +0,0 @@ -g it // snippet 0-1 -if ( true ) { - console.log( "foo" ); // prints -} - -if ( false ) { - console.log( "bar" ); -} - - -// snippet 0-2 -if ( false || false ) { - console.log( "boop" ); -} - -if ( true || false ) { - console.log( "beep" ); // prints -} - - -// snippet 0-3 -let num = 40; - -if ( num > 0 ) { - console.log( "zip" ); // prints -} - -if ( num % 2 === 0 ) { - console.log( "zoop" ); // prints -} - - -// snippet 0-4 -let word = "jeep"; - -if ( word[ 0 ] === "d" ) { - console.log( "yer" ); -} else { - console.log( "nah" ); // prints -} - - -// snippet 0-5 -let sentence = "roger that"; - -if ( sentence[ sentence.length - 1 ] === "t" ) { - console.log( "ends in t" ); // prints -} else { - console.log( "does not end in t" ); -} - -if ( sentence.length <= 4 ) { - console.log( "short" ); -} else { - console.log( "long" ); // prints -} diff --git a/javascript-practice/01_conditionals/solutions/right.html b/javascript-practice/01_conditionals/solutions/right.html deleted file mode 100644 index 9d8c12d..0000000 --- a/javascript-practice/01_conditionals/solutions/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -solutions - - - Stable - - - - - - - - - - - - -
Folders
<Go Back> A_condit...ution
-
- - - - -
FileFileFileFileFileFileFileFile
right.html 
- -

-Folders: 2
-Files: 1
-Size of all files: 13757 KB

- - - \ No newline at end of file diff --git a/javascript-practice/02_functions/exercises/A_functions_exercise/README.html b/javascript-practice/02_functions/exercises/A_functions_exercise/README.html deleted file mode 100644 index 8e00e7d..0000000 --- a/javascript-practice/02_functions/exercises/A_functions_exercise/README.html +++ /dev/null @@ -1,411 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Document - - - - - - - - - -
- - - - -
HOME -
- - - -

What’s your function?

-

Functions are constructs that allow programmers to group multiple statements together into a single - logical - unit. Functions may take arguments as input and return some value as output.

-

Before you start this exercise, make sure you have watched the lecture first.

- - get - yourself unstuck, then pause the video and pick up the exercise on your own.

-

This is where we bring well defined structure to our code. If so far we’ve only learned the isolated “words”, - “phrases”, and “sentences” of programming, we now turn our attention to the “paragraphs”.

- -

-AZ

-

0. Practice how to read.

-

Before you write functions on your own, let’s warm up by interpretting a few.

-

Create a new folder named A_functions_exercise. Predict what would print when executing each of - the - snippets below. Test your prediction by typing the snippet into their own files and executing the program. - Don’t - copy - and paste.

-

Write the below code into a file named snippet-0-1.js. Make a prediction for what it will print. - Run - it. -

- -

Write the below code into a file named snippet-0-2.js. Make a prediction for what it will print. - Run - it. -

- -

Write the below code into a file named snippet-0-3.js. Make a prediction for what it will print. - Run - it. -

- -

Write the below code into a file named snippet-0-4.js. Make a prediction for what it will print. - Run - it. -

- -

1. Practice how to write.

-

In this section of the exercise you’ll be prompted to write a function to accomplish a specific task. Read - the - description and look at the example output to figure out what should be implemented within the function. Write - each - function to a separate file in the A_functions_exercise folder and test your work by running the - file. -

-

isDivBy4

-

Create an is-div-by-4.js file and solve the function below:

- -

keepItQuiet

-

Create a keep-it-quiet.js file and solve the function below:

- -

isLong

-

Create an is-long.js file and solve the function below:

- -

half

-

Create a half.js file and solve the function below:

- -

endsWithT

-

Create an endsWithT.js file and solve the function below:

- -

average

-

Create an average.js file and solve the function below:

- - even - -

- - - diff --git a/javascript-practice/02_functions/exercises/A_functions_exercise/README.md b/javascript-practice/02_functions/exercises/A_functions_exercise/README.md deleted file mode 100644 index 52e3e86..0000000 --- a/javascript-practice/02_functions/exercises/A_functions_exercise/README.md +++ /dev/null @@ -1,207 +0,0 @@ -# What's your function? - -_Functions_ are constructs that allow programmers to group multiple statements together into a -single logical unit. Functions may take _arguments_ as input and return some value as output. - -Before you start this exercise, make sure you have watched the lecture first. - -+ [Lecture](https://youtu.be/g7fBqWTdeMw) - -If you get stuck during this exercise, reference this walkthrough. Only watch enough of the -walkthrough to get yourself unstuck, then pause the video and pick up the exercise on your own. - -This is where we bring well defined structure to our code. If so far we've only learned the isolated -"words", "phrases", and "sentences" of programming, we now turn our attention to the "paragraphs". - -+ [Walkthrough Part 1](https://youtu.be/hS-p8ICd7Ek) -+ [Walkthrough Part 2](https://youtu.be/pE9JYGobDQg) - --AZ - -## 0. Practice how to read. - -Before you write functions on your own, let's warm up by interpretting a few. - -Create a new folder named `A_functions_exercise`. Predict what would print when executing each of -the snippets below. Test your prediction by typing the snippet into their own files and executing -the program. Don't copy and paste. - -Write the below code into a file named `snippet-0-1.js`. Make a prediction for what it will print. -Run it. - -```js -// snippet 0-1 -let greet = function () { - console.log("hey"); - console.log("programmers"); -}; - -let whistle = function () { - console.log("doot"); -}; - -console.log("first"); -console.log("second"); -greet(); -console.log("third"); -console.log("fourth"); -whistle(); -``` - -Write the below code into a file named `snippet-0-2.js`. Make a prediction for what it will print. -Run it. - -```js -// snippet 0-2 -let howMany = function () { - return 42; -}; - -console.log(howMany); -console.log(howMany()); - -const theAnswer = howMany(); -console.log(theAnswer); - -let howMuch = function () { - 5; -}; -console.log(howMuch()); -``` - -Write the below code into a file named `snippet-0-3.js`. Make a prediction for what it will print. -Run it. - -```js -// snippet 0-3 -let average = function (num1, num2) { - console.log("calculating..."); - return (num1 + num2) / 2; -}; - -console.log(average(5, 10)); -console.log(average(20, 26)); -console.log(average(50, 100) + 2); - -let a = 21 + 3; -let b = 20; -let n = average(a, b); -console.log(average(n, 18)); -``` - -Write the below code into a file named `snippet-0-4.js`. Make a prediction for what it will print. -Run it. - -```js -// snippet 0-4 -let exclaim = function (str) { - let capitalized = str.toUpperCase(); - return capitalized + "!!"; -}; - -let result = exclaim("potato"); -console.log(result); -console.log(result.length); -console.log(result[0]); -console.log(result[result.length - 1]); -``` - -## 1. Practice how to write. - -In this section of the exercise you'll be prompted to write a function to accomplish a specific -task. Read the description and look at the example output to figure out what should be implemented -within the function. Write each function to a separate file in the `A_functions_exercise` folder and -test your work by running the file. - -### isDivBy4 - -Create an `is-div-by-4.js` file and solve the function below: - -```js -// Write a function `isDivBy4` that accepts a number as an argument. The function should return a -// boolean indicating whether or not the number is divisible by 4. - -console.log(isDivBy4(8)); // true -console.log(isDivBy4(12)); // true -console.log(isDivBy4(24)); // true -console.log(isDivBy4(9)); // false -console.log(isDivBy4(10)); // false -``` - -### keepItQuiet - -Create a `keep-it-quiet.js` file and solve the function below: - -```js -// Write a function `keepItQuiet` that accepts a string as an argument. The function should return the -// lowercase version of the string with 3 periods added to the end of it. - -console.log(keepItQuiet("HOORAY")); // 'hooray...' -console.log(keepItQuiet("Doggo")); // 'doggo...' -console.log(keepItQuiet("WHAT?!?!")); // 'what?!?!...' -``` - -### isLong - -Create an `is-long.js` file and solve the function below: - - -```js -// Write a function `isLong` that accepts a string as an argument. The function should return a boolean -// indicating whether or not the string is longer than 5 characters - -console.log(isLong("pie")); // false -console.log(isLong("kite")); // false -console.log(isLong("kitty")); // false -console.log(isLong("telescope")); // true -console.log(isLong("thermometer")); // true -console.log(isLong("restaurant")); // true -``` - -### half - -Create a `half.js` file and solve the function below: - - -```js -// Write a function `half` that accepts a number as an argument. The function should return half of the -// number. - -console.log(half(8)); // 4 -console.log(half(15)); // 7.5 -console.log(half(90)); // 45 -``` - -### endsWithT - -Create an `endsWithT.js` file and solve the function below: - -```js -// Write a function `endsWithT` that accepts a string as an argument. The function should return a -// boolean indicating whether or not the string ends with the character 't'. - -console.log(endsWithT("smart")); // true -console.log(endsWithT("racket")); // true -console.log(endsWithT("taco")); // false -console.log(endsWithT("boomerang")); // false -``` - -### average - -Create an `average.js` file and solve the function below: - - -```js -// Write a function `average` that accepts three numbers as arguments. The function should return the -// average of the three numbers. - -console.log(average(3, 10, 8)); // 7 -console.log(average(10, 5, 12)); // 9 -console.log(average(6, 20, 40)); // 22 -``` - -## Walkthrough - - - Watch it -in 1.5x speed if you like. diff --git a/javascript-practice/02_functions/exercises/A_functions_exercise/right.html b/javascript-practice/02_functions/exercises/A_functions_exercise/right.html deleted file mode 100644 index 2c5185b..0000000 --- a/javascript-practice/02_functions/exercises/A_functions_exercise/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -A_functions_exercise - - - Stable - - - - - - - - - - - - -
Folders
<Go Back>
-
- - - - -
FileFileFileFileFileFileFileFile
README.html right.html README.md 
- -

-Folders: 1
-Files: 3
-Size of all files: 52517 KB

- - - \ No newline at end of file diff --git a/javascript-practice/02_functions/exercises/B_functions_exercise/README.html b/javascript-practice/02_functions/exercises/B_functions_exercise/README.html deleted file mode 100644 index 4ee1be2..0000000 --- a/javascript-practice/02_functions/exercises/B_functions_exercise/README.html +++ /dev/null @@ -1,345 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Document - - - - - - - - - -
- - - - -
HOME -
- - - -

Functional Fitness

-

Functions group together statements deliberately with a purpose in mind. They should do one thing - and do - it - well.

- get - yourself unstuck, then pause the video and pick up the exercise on your own.

- -

Programmers write functions. You are a programmer. You write functions.

-

-AZ

-

Instructions

-

Create a new folder named B_functions_exercise, this is where you’ll save all of your files. - Solve - each - of the prompts below. Create a new file for each prompt and execute your code to see if it matches the example - output. -

-

startsWithR

-

Create a starts-with-r.js file and solve the function below:

- -

parity

-

Create a parity.js file and solve the function below:

- -

longer

-

Create a longer.js file and solve the function below:

- -

oneOrNone

-

Create a one-or-none.js file and solve the function below:

- -

endsInLy

-

Create a ends-in-ly.js file and solve the function below:

- -

funnySound

-

Create a funny-sound.js file and solve the function below:

- -

stringSize

-

Create a string-size.js file and solve the function below:

- -

wackyWord

-

Create a wacky-word.js file and solve the function below:

- - even - -

- - - diff --git a/javascript-practice/02_functions/exercises/B_functions_exercise/README.md b/javascript-practice/02_functions/exercises/B_functions_exercise/README.md deleted file mode 100644 index d874d3d..0000000 --- a/javascript-practice/02_functions/exercises/B_functions_exercise/README.md +++ /dev/null @@ -1,151 +0,0 @@ -# Functional Fitness - -_Functions_ group together statements deliberately with a purpose in mind. They should do one thing -and do it well. - -If you get stuck during this exercise, reference this walkthrough. Only watch enough of the -walkthrough to get yourself unstuck, then pause the video and pick up the exercise on your own. - -+ [Walkthrough](https://youtu.be/YQjR-TSWE-U) - -Programmers write functions. You are a programmer. You write functions. - --AZ - -## Instructions - -Create a new folder named `B_functions_exercise`, this is where you'll save all of your files. Solve -each of the prompts below. Create a new file for each prompt and execute your code to see if it -matches the example output. - -### startsWithR - -Create a `starts-with-r.js` file and solve the function below: - -```js -// Write a function `startsWithR` that accepts a string as an argument and returns a boolean indicating -// whether or not the string starts with 'r' or 'R'. - -console.log(startsWithR("roger that")); // true -console.log(startsWithR("Row, row, row your boat")); // true -console.log(startsWithR("slip")); // false -console.log(startsWithR("Taxicab")); // false -``` - -### parity - -Create a `parity.js` file and solve the function below: - -```js -// Write a function `parity` that accepts a number as an argument. The function should return the -// string 'even' if the number is even. It should return the string 'odd' if the number is odd. - -console.log(parity(5)); // 'odd' -console.log(parity(7)); // 'odd' -console.log(parity(13)); // 'odd' -console.log(parity(32)); // 'even' -console.log(parity(10)); // 'even' -console.log(parity(602348)); // 'even' -``` - -### longer - -Create a `longer.js` file and solve the function below: - -```js -// Write a function `longer` that accepts two strings as arguments. The function should return the -// string that is longer. If the strings have the same length, then return the first string. - -console.log(longer("drum", "piranha")); // 'piranha' -console.log(longer("basket", "fork")); // 'basket' -console.log(longer("flannel", "sustainable")); // 'sustainable' -console.log(longer("disrupt", "ability")); // 'disrupt' -console.log(longer("bird", "shoe")); // 'bird' -``` - -### oneOrNone - -Create a `one-or-none.js` file and solve the function below: - -```js -// Write a function `oneOrNone` that accepts two booleans as arguments. The function should return true -// if exactly one of the arguments is true. If BOTH arguments are true, then it should return false. - -console.log(oneOrNone(false, false)); // false -console.log(oneOrNone(true, false)); // true -console.log(oneOrNone(false, true)); // true -console.log(oneOrNone(true, true)); // false -``` - -### endsInLy - -Create a `ends-in-ly.js` file and solve the function below: - -```js -// Write a function `endsInLy` that accepts a string as an argument and returns a boolean indicating -// whether or not the string ends in the substring 'ly'. - -console.log(endsInLy("pretty")); // false -console.log(endsInLy("instant")); // false -console.log(endsInLy("analytic")); // false -console.log(endsInLy("timidly")); // true -console.log(endsInLy("fly")); // true -console.log(endsInLy("gallantly")); // true -``` - -### funnySound - -Create a `funny-sound.js` file and solve the function below: - -```js -// Write a function `funnySound` that accepts two strings as arguments. The function should return a -// new string containing the first three characters of both strings concatenated together. - -// You can assume that the arguments are both at least three characters long. - -console.log(funnySound("tiger", "spoon")); // 'tigspo' -console.log(funnySound("computer", "phone")); // 'compho' -console.log(funnySound("skate", "bottle")); // 'skabot' -console.log(funnySound("frog", "ashtray")); // 'froash' -``` - -### stringSize - -Create a `string-size.js` file and solve the function below: - -```js -// Write a function `stringSize` that accepts a string as an argument. The function should return the -// string 'small' if the argument is shorter than 5 characters, 'medium' if it is exactly 5 characters, and -// 'large' if it is longer than 5 characters. - -console.log(stringSize("cat")); // 'small' -console.log(stringSize("bell")); // 'small' -console.log(stringSize("ready")); // 'medium' -console.log(stringSize("shirt")); // 'medium' -console.log(stringSize("shallow")); // 'large' -console.log(stringSize("intelligence")); // 'large' -``` - -### wackyWord - -Create a `wacky-word.js` file and solve the function below: - -```js -// Write a function `wackyWord` that accepts two strings as arguments. The function should return a new -// string containing the first three characters of the first string concatenated with the last two -// character of the second string. - -// You can assume that the first argument has a length of at least three and the second argument has a -// length of at least two. - -console.log(wackyWord("very", "kindly")); // 'verly' -console.log(wackyWord("forever", "sick")); // 'forck' -console.log(wackyWord("cellar", "door")); // 'celor' -console.log(wackyWord("bagel", "sweep")); // 'bagep' -``` - -## Walkthrough - - - - diff --git a/javascript-practice/02_functions/exercises/B_functions_exercise/right.html b/javascript-practice/02_functions/exercises/B_functions_exercise/right.html deleted file mode 100644 index 4e6e2e0..0000000 --- a/javascript-practice/02_functions/exercises/B_functions_exercise/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -B_functions_exercise - - - Stable - - - - - - - - - - - - -
Folders
<Go Back>
-
- - - - -
FileFileFileFileFileFileFileFile
README.html right.html README.md 
- -

-Folders: 1
-Files: 3
-Size of all files: 47055 KB

- - - \ No newline at end of file diff --git a/javascript-practice/02_functions/exercises/C_functions_exercise/README.html b/javascript-practice/02_functions/exercises/C_functions_exercise/README.html deleted file mode 100644 index 4286835..0000000 --- a/javascript-practice/02_functions/exercises/C_functions_exercise/README.html +++ /dev/null @@ -1,309 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Document - - - - - - - - - -
- - - - -
HOME -
- - - -

Major Malfunction

-

More practice!

- get - yourself unstuck, then pause the video and pick up the exercise on your own.

- -

I think the reason why coding has a reputation for being nonintuitive is because beginners don’t spend enough - time on - the basics. They miss a step early, but instead of filling that gap of knowledge, they preemptively move on. - They’ll - stumble through more advanced topics until that debt cannot be ignored. That is why I think it’s important to - exercise - a concept extensively. Write code. Run it.

-

-AZ

-

Instructions

-

Create a new folder named C_functions_exercise, this is where you’ll save all of your files. - Solve - each - of the prompts below. Create a new file for each prompt and execute your code to see if it matches the example - output. -

-

divisible

-

Create a divisible.js file and solve the function below:

- -

caseChanger

-

Create a case-changer.js file and solve the function below:

- -

inRange

-

Create a in-range.js file and solve the function below:

- -

averageOfFour

-

Create an average-of-four.js file and solve the function below:

- -

numberChange

-

Create a number-change.js file and solve the function below:

- -

larger

-

Create a larger.js file and solve the function below:

- -

contains

-

Create a contains.js file and solve the function below:

- - even - -

- - - diff --git a/javascript-practice/02_functions/exercises/C_functions_exercise/README.md b/javascript-practice/02_functions/exercises/C_functions_exercise/README.md deleted file mode 100644 index 6e5da73..0000000 --- a/javascript-practice/02_functions/exercises/C_functions_exercise/README.md +++ /dev/null @@ -1,136 +0,0 @@ -# Major Malfunction - -More practice! - -If you get stuck during this exercise, reference this walkthrough. Only watch enough of the -walkthrough to get yourself unstuck, then pause the video and pick up the exercise on your own. - -+ [Walkthrough](https://youtu.be/KCv1ovMB4DU) - -I think the reason why coding has a reputation for being nonintuitive is because beginners don't -spend enough time on the basics. They miss a step early, but instead of filling that gap of -knowledge, they preemptively move on. They'll stumble through more advanced topics until that debt -cannot be ignored. That is why I think it's important to exercise a concept extensively. Write code. -Run it. - --AZ - -## Instructions - -Create a new folder named `C_functions_exercise`, this is where you'll save all of your files. Solve -each of the prompts below. Create a new file for each prompt and execute your code to see if it -matches the example output. - -### divisible - -Create a `divisible.js` file and solve the function below: - -```js -// Write a function `divisible(num1, num2)` that accepts two numbers as arguments. The function should -// return a boolean indicating whether or not `num1` is divisible by `num2`. - -console.log(divisible(12, 3)); // true -console.log(divisible(12, 5)); // false -console.log(divisible(60, 4)); // true -console.log(divisible(60, 11)); // false -console.log(divisible(21, 7)); // true -console.log(divisible(21, 6)); // false -``` - -### caseChanger - -Create a `case-changer.js` file and solve the function below: - -```js -// Write a function `caseChange` that accepts a string and a boolean as arguments. The function should -// return the uppercase version of the string if the boolean is true. The function should return the -// lowercase version of the string if the boolean is false. - -console.log(caseChange("Super", true)); // 'SUPER' -console.log(caseChange("Super", false)); // 'super' -console.log(caseChange("tAmBourine", true)); // 'TAMBOURINE' -console.log(caseChange("tAmBourine", false)); // 'tambourine' -``` - -### inRange - -Create a `in-range.js` file and solve the function below: - -```js -// Write a function `inRange(min, max, n)` that accepts three numbers as arguments. The function should -// return a boolean indicating if `n` is between `min` and `max` inclusive. - -console.log(inRange(5, 13, 8)); // true -console.log(inRange(5, 13, 29)); // false -console.log(inRange(100, 125, 100)); // true -console.log(inRange(100, 125, 99)); // false -console.log(inRange(40, 45, 44)); // true -console.log(inRange(40, 45, 45)); // true -console.log(inRange(40, 45, 46)); // false -``` - -### averageOfFour - -Create an `average-of-four.js` file and solve the function below: - -```js -// Write a function `averageOfFour(num1, num2, num3, num4)` that accepts four numbers as arguments. The -// function should return the average of all four numbers. - -console.log(averageOfFour(10, 4, 12, 3)); // 7.25 -console.log(averageOfFour(-20, 50, 4, 21)); // 13.75 -console.log(averageOfFour(10, 4, 12, 3)); // 7.25 -console.log(averageOfFour(5, 5, 3, 7)); // 5 -``` - -### numberChange - -Create a `number-change.js` file and solve the function below: - -```js -// Write a function `numberChange` that accepts a number as an argument. The function should return -// half the number if it is even. The function should return double the number if it is odd. - -console.log(numberChange(6)); // 3 -console.log(numberChange(7)); // 14 -console.log(numberChange(16)); // 8 -console.log(numberChange(21)); // 42 -``` - -### larger - -Create a `larger.js` file and solve the function below: - -```js -// Write a function `larger` that accepts two numbers as arguments. The function should return the -// larger number. - -console.log(larger(256, 400)); // 400 -console.log(larger(31, 4)); // 31 -console.log(larger(-6, 7)); // 7 -console.log(larger(11.3, 11.2)); // 11.3 -console.log(larger(-10, -3)); // -3 -``` - -### contains - -Create a `contains.js` file and solve the function below: - -```js -// Write a function `contains(str1, str2)` that accepts two strings as arguments. The function should -// return a boolean indicating whether or not `str2` is contained within `str1`. The function should -// ignore any differences in capitalization. - -console.log(contains("caterpillar", "pill")); // true -console.log(contains("lion's share", "on")); // true -console.log(contains("SORRY", "or")); // true -console.log(contains("tangent", "gem")); // false -console.log(contains("clock", "ok")); // false -``` - - -## Walkthrough - - - - diff --git a/javascript-practice/02_functions/exercises/C_functions_exercise/right.html b/javascript-practice/02_functions/exercises/C_functions_exercise/right.html deleted file mode 100644 index a2f0984..0000000 --- a/javascript-practice/02_functions/exercises/C_functions_exercise/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -C_functions_exercise - - - Stable - - - - - - - - - - - - -
Folders
<Go Back>
-
- - - - -
FileFileFileFileFileFileFileFile
README.html right.html README.md 
- -

-Folders: 1
-Files: 3
-Size of all files: 44294 KB

- - - \ No newline at end of file diff --git a/javascript-practice/02_functions/exercises/right.html b/javascript-practice/02_functions/exercises/right.html deleted file mode 100644 index 4609d34..0000000 --- a/javascript-practice/02_functions/exercises/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -exercises - - - Stable - - - - - - - - - - - - -
Folders
<Go Back> A_functi...rcise B_functi...rcise C_functi...rcise
-
- - - - -
FileFileFileFileFileFileFileFile
right.html 
- -

-Folders: 4
-Files: 1
-Size of all files: 13966 KB

- - - \ No newline at end of file diff --git a/javascript-practice/02_functions/right.html b/javascript-practice/02_functions/right.html deleted file mode 100644 index 9dac3e5..0000000 --- a/javascript-practice/02_functions/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -02_functions - - - Stable - - - - - - - - - - - - -
Folders
<Go Back> exercises solutions
-
- - - - -
FileFileFileFileFileFileFileFile
right.html 
- -

-Folders: 3
-Files: 1
-Size of all files: 13827 KB

- - - \ No newline at end of file diff --git a/javascript-practice/02_functions/solutions/A_functions_solution/average.js b/javascript-practice/02_functions/solutions/A_functions_solution/average.js deleted file mode 100644 index 194bb5f..0000000 --- a/javascript-practice/02_functions/solutions/A_functions_solution/average.js +++ /dev/null @@ -1,10 +0,0 @@ -// Write a function `average` that accepts three numbers as arguments. The function should return the -// average of the three numbers. - -let average = function ( num1, num2, num3 ) { - return ( num1 + num2 + num3 ) / 3; -}; - -console.log( average( 3, 10, 8 ) ); // 7 -console.log( average( 10, 5, 12 ) ); // 9 -console.log( average( 6, 20, 40 ) ); // 22 diff --git a/javascript-practice/02_functions/solutions/A_functions_solution/ends-with-t.js b/javascript-practice/02_functions/solutions/A_functions_solution/ends-with-t.js deleted file mode 100644 index b5e0468..0000000 --- a/javascript-practice/02_functions/solutions/A_functions_solution/ends-with-t.js +++ /dev/null @@ -1,13 +0,0 @@ -// Write a function `endsWithT` that accepts a string as an argument. The function should return a -// boolean indicating whether or not the string ends with the character 't'. - -let endsWithT = function ( str ) { - let lastChar = str[ str.length - 1 ]; - return lastChar === 't'; -}; - - -console.log( endsWithT( "smart" ) ); // true -console.log( endsWithT( "racket" ) ); // true -console.log( endsWithT( "taco" ) ); // false -console.log( endsWithT( "boomerang" ) ); // false diff --git a/javascript-practice/02_functions/solutions/A_functions_solution/half.js b/javascript-practice/02_functions/solutions/A_functions_solution/half.js deleted file mode 100644 index 3166481..0000000 --- a/javascript-practice/02_functions/solutions/A_functions_solution/half.js +++ /dev/null @@ -1,10 +0,0 @@ -// Write a function `half` that accepts a number as an argument. The function should return half of the -// number. - -let half = function ( n ) { - return n / 2; -}; - -console.log( half( 8 ) ); // 4 -console.log( half( 15 ) ); // 7.5 -console.log( half( 90 ) ); // 45 diff --git a/javascript-practice/02_functions/solutions/A_functions_solution/is-div-by-4.js b/javascript-practice/02_functions/solutions/A_functions_solution/is-div-by-4.js deleted file mode 100644 index 5da3346..0000000 --- a/javascript-practice/02_functions/solutions/A_functions_solution/is-div-by-4.js +++ /dev/null @@ -1,20 +0,0 @@ -// Write a function `isDivBy4` that accepts a number as an argument. The function should return a -// boolean indicating whether or not the number is divisible by 4. - -let isDivBy4 = function ( num ) { - if ( num % 4 === 0 ) { - return true; - } else { - return false; - } -}; - -// let isDivBy4 = function (num) { -// return num % 4 === 0; -// }; - -console.log( isDivBy4( 8 ) ); // true -console.log( isDivBy4( 12 ) ); // true -console.log( isDivBy4( 24 ) ); // true -console.log( isDivBy4( 9 ) ); // false -console.log( isDivBy4( 10 ) ); // false diff --git a/javascript-practice/02_functions/solutions/A_functions_solution/is-long.js b/javascript-practice/02_functions/solutions/A_functions_solution/is-long.js deleted file mode 100644 index 58f8937..0000000 --- a/javascript-practice/02_functions/solutions/A_functions_solution/is-long.js +++ /dev/null @@ -1,21 +0,0 @@ -// Write a function `isLong` that accepts a string as an argument. The function should return a boolean -// indicating whether or not the string is longer than 5 characters - -let isLong = function ( str ) { - return str.length > 5; -}; - -// let isLong = function (str) { -// if (str.length > 5) { -// return true; -// } else { -// return false; -// } -// }; - -console.log( isLong( "pie" ) ); // false -console.log( isLong( "kite" ) ); // false -console.log( isLong( "kitty" ) ); // false -console.log( isLong( "telescope" ) ); // true -console.log( isLong( "thermometer" ) ); // true -console.log( isLong( "restaurant" ) ); // true diff --git a/javascript-practice/02_functions/solutions/A_functions_solution/keep-it-quiet.js b/javascript-practice/02_functions/solutions/A_functions_solution/keep-it-quiet.js deleted file mode 100644 index e653576..0000000 --- a/javascript-practice/02_functions/solutions/A_functions_solution/keep-it-quiet.js +++ /dev/null @@ -1,10 +0,0 @@ -// Write a function `keepItQuiet` that accepts a string as an argument. The function should return the -// lowercase version of the string with 3 periods added to the end of it. - -let keepItQuiet = function ( str ) { - return str.toLowerCase() + '...'; -}; - -console.log( keepItQuiet( "HOORAY" ) ); // 'hooray...' -console.log( keepItQuiet( "Doggo" ) ); // 'doggo...' -console.log( keepItQuiet( "WHAT?!?!" ) ); // 'what?!?!...' diff --git a/javascript-practice/02_functions/solutions/A_functions_solution/right.html b/javascript-practice/02_functions/solutions/A_functions_solution/right.html deleted file mode 100644 index fd34efc..0000000 --- a/javascript-practice/02_functions/solutions/A_functions_solution/right.html +++ /dev/null @@ -1,552 +0,0 @@ - - - - - -A_functions_solution - - - Stable - - - - - - - - - - - - -
Folders
<Go Back>
-
- - - - - -
FileFileFileFileFileFileFileFile
right.html ends-with-t.js is-div-by-4.js keep-it-quiet.js snippet-0-1.js snippet-0-2.js snippet-0-3.js snippet-0-4.js 
average.js half.js is-long.js 
- -

-Folders: 1
-Files: 11
-Size of all files: 18873 KB

- - - \ No newline at end of file diff --git a/javascript-practice/02_functions/solutions/A_functions_solution/snippet-0-1.js b/javascript-practice/02_functions/solutions/A_functions_solution/snippet-0-1.js deleted file mode 100644 index b86c9fc..0000000 --- a/javascript-practice/02_functions/solutions/A_functions_solution/snippet-0-1.js +++ /dev/null @@ -1,25 +0,0 @@ -// snippet 0-1 -let greet = function () { - console.log( "hey" ); - console.log( "programmers" ); -}; - -let whistle = function () { - console.log( "doot" ); -}; - -console.log( "first" ); -console.log( "second" ); -greet(); -console.log( "third" ); -console.log( "fourth" ); -whistle(); - - -// first -// second -// hey -// programmers -// third -// fourth -// doot diff --git a/javascript-practice/02_functions/solutions/A_functions_solution/snippet-0-2.js b/javascript-practice/02_functions/solutions/A_functions_solution/snippet-0-2.js deleted file mode 100644 index 805fdaa..0000000 --- a/javascript-practice/02_functions/solutions/A_functions_solution/snippet-0-2.js +++ /dev/null @@ -1,21 +0,0 @@ -// snippet 0-2 -let howMany = function () { - return 42; -}; - -console.log( howMany ); -console.log( howMany() ); - -const theAnswer = howMany(); -console.log( theAnswer ); - -let howMuch = function () { - 5; -}; -console.log( howMuch() ); - - -// [Function: howMany] -// 42 -// 42 -// undefined diff --git a/javascript-practice/02_functions/solutions/A_functions_solution/snippet-0-3.js b/javascript-practice/02_functions/solutions/A_functions_solution/snippet-0-3.js deleted file mode 100644 index 438d29b..0000000 --- a/javascript-practice/02_functions/solutions/A_functions_solution/snippet-0-3.js +++ /dev/null @@ -1,25 +0,0 @@ -// snippet 0-3 -let average = function ( num1, num2 ) { - console.log( "calculating..." ); - return ( num1 + num2 ) / 2; -}; - -console.log( average( 5, 10 ) ); -console.log( average( 20, 26 ) ); -console.log( average( 50, 100 ) + 2 ); - -let a = 21 + 3; -let b = 20; -let n = average( a, b ); -console.log( average( n, 18 ) ); - - -// calculating... -// 7.5 -// calculating... -// 23 -// calculating... -// 77 -// calculating... -// calculating... -// 20 diff --git a/javascript-practice/02_functions/solutions/A_functions_solution/snippet-0-4.js b/javascript-practice/02_functions/solutions/A_functions_solution/snippet-0-4.js deleted file mode 100644 index 0fbb44b..0000000 --- a/javascript-practice/02_functions/solutions/A_functions_solution/snippet-0-4.js +++ /dev/null @@ -1,17 +0,0 @@ -// snippet 0-4 -let exclaim = function ( str ) { - let capitalized = str.toUpperCase(); - return capitalized + "!!"; -}; - -let result = exclaim( "potato" ); -console.log( result ); -console.log( result.length ); -console.log( result[ 0 ] ); -console.log( result[ result.length - 1 ] ); - - -// POTATO!! -// 8 -// P -// ! diff --git a/javascript-practice/02_functions/solutions/B_functions_solution/ends-in-ly.js b/javascript-practice/02_functions/solutions/B_functions_solution/ends-in-ly.js deleted file mode 100644 index 1a4ed86..0000000 --- a/javascript-practice/02_functions/solutions/B_functions_solution/ends-in-ly.js +++ /dev/null @@ -1,20 +0,0 @@ -g // Write a function `endsInLy` that accepts a string as an argument and returns a boolean indicating -// whether or not the string ends in the substring 'ly'. - -let endsInLy = function ( str ) { - let secondLast = str[ str.length - 2 ]; - let last = str[ str.length - 1 ]; - - return secondLast === 'l' && last === 'y'; -}; - -// let endsInLy = function (str) { -// return str.endsWith('ly'); -// }; - -console.log( endsInLy( "pretty" ) ); // false -console.log( endsInLy( "instant" ) ); // false -console.log( endsInLy( "analytic" ) ); // false -console.log( endsInLy( "timidly" ) ); // true -console.log( endsInLy( "fly" ) ); // true -console.log( endsInLy( "gallantly" ) ); // true diff --git a/javascript-practice/02_functions/solutions/B_functions_solution/funny-sound.js b/javascript-practice/02_functions/solutions/B_functions_solution/funny-sound.js deleted file mode 100644 index c2e141a..0000000 --- a/javascript-practice/02_functions/solutions/B_functions_solution/funny-sound.js +++ /dev/null @@ -1,13 +0,0 @@ -// Write a function `funnySound` that accepts two strings as arguments. The function should return a -// new string containing the first three characters of both strings concatenated together. - -// You can assume that the arguments are both at least three characters long. - -let funnySound = function ( str1, str2 ) { - return str1.slice( 0, 3 ) + str2.slice( 0, 3 ); -}; - -console.log( funnySound( "tiger", "spoon" ) ); // 'tigspo' -console.log( funnySound( "computer", "phone" ) ); // 'compho' -console.log( funnySound( "skate", "bottle" ) ); // 'skabot' -console.log( funnySound( "frog", "ashtray" ) ); // 'froash' diff --git a/javascript-practice/02_functions/solutions/B_functions_solution/longer.js b/javascript-practice/02_functions/solutions/B_functions_solution/longer.js deleted file mode 100644 index 139eb56..0000000 --- a/javascript-practice/02_functions/solutions/B_functions_solution/longer.js +++ /dev/null @@ -1,16 +0,0 @@ -// Write a function `longer` that accepts two strings as arguments. The function should return the -// string that is longer. If the strings have the same length, then return the first string. - -let longer = function ( str1, str2 ) { - if ( str1.length >= str2.length ) { - return str1; - } else { - return str2; - } -}; - -console.log( longer( "drum", "piranha" ) ); // 'piranha' -console.log( longer( "basket", "fork" ) ); // 'basket' -console.log( longer( "flannel", "sustainable" ) ); // 'sustainable' -console.log( longer( "disrupt", "ability" ) ); // 'disrupt' -console.log( longer( "bird", "shoe" ) ); // 'bird' diff --git a/javascript-practice/02_functions/solutions/B_functions_solution/one-or-none.js b/javascript-practice/02_functions/solutions/B_functions_solution/one-or-none.js deleted file mode 100644 index 57e71bb..0000000 --- a/javascript-practice/02_functions/solutions/B_functions_solution/one-or-none.js +++ /dev/null @@ -1,15 +0,0 @@ -// Write a function `oneOrNone` that accepts two booleans as arguments. The function should return true -// if exactly one of the arguments is true. If BOTH arguments are true, then it should return false. - -let oneOrNone = function ( val1, val2 ) { - if ( ( val1 || val2 ) && !( val1 && val2 ) ) { - return true; - } else { - return false; - } -}; - -console.log( oneOrNone( false, false ) ); // false -console.log( oneOrNone( true, false ) ); // true -console.log( oneOrNone( false, true ) ); // true -console.log( oneOrNone( true, true ) ); // false diff --git a/javascript-practice/02_functions/solutions/B_functions_solution/parity.js b/javascript-practice/02_functions/solutions/B_functions_solution/parity.js deleted file mode 100644 index 7193f33..0000000 --- a/javascript-practice/02_functions/solutions/B_functions_solution/parity.js +++ /dev/null @@ -1,17 +0,0 @@ -// Write a function `parity` that accepts a number as an argument. The function should return the -// string 'even' if the number is even. It should return the string 'odd' if the number is odd. - -let parity = function ( num ) { - if ( num % 2 === 0 ) { - return 'even'; - } else { - return 'odd'; - } -}; - -console.log( parity( 5 ) ); // 'odd' -console.log( parity( 7 ) ); // 'odd' -console.log( parity( 13 ) ); // 'odd' -console.log( parity( 32 ) ); // 'even' -console.log( parity( 10 ) ); // 'even' -console.log( parity( 602348 ) ); // 'even' diff --git a/javascript-practice/02_functions/solutions/B_functions_solution/right.html b/javascript-practice/02_functions/solutions/B_functions_solution/right.html deleted file mode 100644 index fc6aad1..0000000 --- a/javascript-practice/02_functions/solutions/B_functions_solution/right.html +++ /dev/null @@ -1,552 +0,0 @@ - - - - - -B_functions_solution - - - Stable - - - - - - - - - - - - -
Folders
<Go Back>
-
- - - - - -
FileFileFileFileFileFileFileFile
right.html funny-sound.js longer.js one-or-none.js parity.js starts-with-r.js string-size.js wacky-word.js 
ends-in-ly.js 
- -

-Folders: 1
-Files: 9
-Size of all files: 19413 KB

- - - \ No newline at end of file diff --git a/javascript-practice/02_functions/solutions/B_functions_solution/starts-with-r.js b/javascript-practice/02_functions/solutions/B_functions_solution/starts-with-r.js deleted file mode 100644 index c0d3d18..0000000 --- a/javascript-practice/02_functions/solutions/B_functions_solution/starts-with-r.js +++ /dev/null @@ -1,11 +0,0 @@ -// Write a function `startsWithR` that accepts a string as an argument and returns a boolean indicating -// whether or not the string starts with 'r' or 'R'. - -let startsWithR = function ( str ) { - return str[ 0 ] === 'r' || str[ 0 ] === 'R'; -}; - -console.log( startsWithR( "roger that" ) ); // true -console.log( startsWithR( "Row, row, row your boat" ) ); // true -console.log( startsWithR( "slip" ) ); // false -console.log( startsWithR( "Taxicab" ) ); // false diff --git a/javascript-practice/02_functions/solutions/B_functions_solution/string-size.js b/javascript-practice/02_functions/solutions/B_functions_solution/string-size.js deleted file mode 100644 index e2a128a..0000000 --- a/javascript-practice/02_functions/solutions/B_functions_solution/string-size.js +++ /dev/null @@ -1,20 +0,0 @@ -// Write a function `stringSize` that accepts a string as an argument. The function should return the -// string 'small' if the argument is shorter than 5 characters, 'medium' if it is exactly 5 characters, and -// 'large' if it is longer than 5 characters. - -let stringSize = function ( str ) { - if ( str.length < 5 ) { - return 'small'; - } else if ( str.length > 5 ) { - return 'large'; - } else { - return 'medium'; - } -}; - -console.log( stringSize( "cat" ) ); // 'small' -console.log( stringSize( "bell" ) ); // 'small' -console.log( stringSize( "ready" ) ); // 'medium' -console.log( stringSize( "shirt" ) ); // 'medium' -console.log( stringSize( "shallow" ) ); // 'large' -console.log( stringSize( "intelligence" ) ); // 'large' diff --git a/javascript-practice/02_functions/solutions/B_functions_solution/wacky-word.js b/javascript-practice/02_functions/solutions/B_functions_solution/wacky-word.js deleted file mode 100644 index 74743ed..0000000 --- a/javascript-practice/02_functions/solutions/B_functions_solution/wacky-word.js +++ /dev/null @@ -1,16 +0,0 @@ -// Write a function `wackyWord` that accepts two strings as arguments. The function should return a new -// string containing the first three characters of the first string concatenated with the last two -// character of the second string. - -// You can assume that the first argument has a length of at least three and the second argument has a -// length of at least two. - - -let wackyWord = function ( str1, str2 ) { - return str1.slice( 0, 3 ) + str2.slice( -2 ); -}; - -console.log( wackyWord( "very", "kindly" ) ); // 'verly' -console.log( wackyWord( "forever", "sick" ) ); // 'forck' -console.log( wackyWord( "cellar", "door" ) ); // 'celor' -console.log( wackyWord( "bagel", "sweep" ) ); // 'bagep' diff --git a/javascript-practice/02_functions/solutions/C_functions_solution/average-of-four.js b/javascript-practice/02_functions/solutions/C_functions_solution/average-of-four.js deleted file mode 100644 index 7383af4..0000000 --- a/javascript-practice/02_functions/solutions/C_functions_solution/average-of-four.js +++ /dev/null @@ -1,12 +0,0 @@ -git // Write a function `averageOfFour(num1, num2, num3, num4)` that accepts four numbers as arguments. The -// function should return the average of all four numbers. - -let averageOfFour = function ( num1, num2, num3, num4 ) { - let sum = num1 + num2 + num3 + num4; - return sum / 4; -}; - -console.log( averageOfFour( 10, 4, 12, 3 ) ); // 7.25 -console.log( averageOfFour( -20, 50, 4, 21 ) ); // 13.75 -console.log( averageOfFour( 10, 4, 12, 3 ) ); // 7.25 -console.log( averageOfFour( 5, 5, 3, 7 ) ); // 5 diff --git a/javascript-practice/02_functions/solutions/C_functions_solution/case-changer.js b/javascript-practice/02_functions/solutions/C_functions_solution/case-changer.js deleted file mode 100644 index 66a8c66..0000000 --- a/javascript-practice/02_functions/solutions/C_functions_solution/case-changer.js +++ /dev/null @@ -1,16 +0,0 @@ -// Write a function `caseChange` that accepts a string and a boolean as arguments. The function should -// return the uppercase version of the string if the boolean is true. The function should return the -// lowercase version of the string if the boolean is false. - -let caseChange = function ( str, shouldUpperCase ) { - if ( shouldUpperCase ) { - return str.toUpperCase(); - } else { - return str.toLowerCase(); - } -}; - -console.log( caseChange( "Super", true ) ); // 'SUPER' -console.log( caseChange( "Super", false ) ); // 'super' -console.log( caseChange( "tAmBourine", true ) ); // 'TAMBOURINE' -console.log( caseChange( "tAmBourine", false ) ); // 'tambourine' diff --git a/javascript-practice/02_functions/solutions/C_functions_solution/contains.js b/javascript-practice/02_functions/solutions/C_functions_solution/contains.js deleted file mode 100644 index 1a8c7ae..0000000 --- a/javascript-practice/02_functions/solutions/C_functions_solution/contains.js +++ /dev/null @@ -1,15 +0,0 @@ -t // Write a function `contains(str1, str2)` that accepts two strings as arguments. The function should -// return a boolean indicating whether or not `str2` is contained within `str1`. The function should -// ignore any differences in capitalization. - -let contains = function ( str1, str2 ) { - let lowerStr1 = str1.toLowerCase(); - let lowerStr2 = str2.toLowerCase(); - return lowerStr1.indexOf( lowerStr2 ) > -1; -}; - -console.log( contains( "caterpillar", "pill" ) ); // true -console.log( contains( "lion's share", "on" ) ); // true -console.log( contains( "SORRY", "or" ) ); // true -console.log( contains( "tangent", "gem" ) ); // false -console.log( contains( "clock", "ok" ) ); // false diff --git a/javascript-practice/02_functions/solutions/C_functions_solution/divisible.js b/javascript-practice/02_functions/solutions/C_functions_solution/divisible.js deleted file mode 100644 index a37f1b0..0000000 --- a/javascript-practice/02_functions/solutions/C_functions_solution/divisible.js +++ /dev/null @@ -1,21 +0,0 @@ -// Write a function `divisible(num1, num2)` that accepts two numbers as arguments. The function should -// return a boolean indicating whether or not `num1` is divisible by `num2`. - -let divisible = function ( num1, num2 ) { - return num1 % num2 === 0; -}; - -// let divisible = function (num1, num2) { -// if (num1 % num2 === 0) { -// return true; -// } else { -// return false; -// } -// }; - -console.log( divisible( 12, 3 ) ); // true -console.log( divisible( 12, 5 ) ); // false -console.log( divisible( 60, 4 ) ); // true -console.log( divisible( 60, 11 ) ); // false -console.log( divisible( 21, 7 ) ); // true -console.log( divisible( 21, 6 ) ); // false diff --git a/javascript-practice/02_functions/solutions/C_functions_solution/in-range.js b/javascript-practice/02_functions/solutions/C_functions_solution/in-range.js deleted file mode 100644 index 536fb97..0000000 --- a/javascript-practice/02_functions/solutions/C_functions_solution/in-range.js +++ /dev/null @@ -1,14 +0,0 @@ -gi // Write a function `inRange(min, max, n)` that accepts three numbers as arguments. The function should -// return a boolean indicating if `n` is between `min` and `max` inclusive. - -let inRange = function ( min, max, n ) { - return n >= min && n <= max; -}; - -console.log( inRange( 5, 13, 8 ) ); // true -console.log( inRange( 5, 13, 29 ) ); // false -console.log( inRange( 100, 125, 100 ) ); // true -console.log( inRange( 100, 125, 99 ) ); // false -console.log( inRange( 40, 45, 44 ) ); // true -console.log( inRange( 40, 45, 45 ) ); // true -console.log( inRange( 40, 45, 46 ) ); // false diff --git a/javascript-practice/02_functions/solutions/C_functions_solution/larger.js b/javascript-practice/02_functions/solutions/C_functions_solution/larger.js deleted file mode 100644 index 766b32d..0000000 --- a/javascript-practice/02_functions/solutions/C_functions_solution/larger.js +++ /dev/null @@ -1,16 +0,0 @@ -// Write a function `larger` that accepts two numbers as arguments. The function should return the -// larger number. - -let larger = function ( num1, num2 ) { - if ( num1 > num2 ) { - return num1; - } else { - return num2; - } -}; - -console.log( larger( 256, 400 ) ); // 400 -console.log( larger( 31, 4 ) ); // 31 -console.log( larger( -6, 7 ) ); // 7 -console.log( larger( 11.3, 11.2 ) ); // 11.3 -console.log( larger( -10, -3 ) ); // -3 diff --git a/javascript-practice/02_functions/solutions/C_functions_solution/number-change.js b/javascript-practice/02_functions/solutions/C_functions_solution/number-change.js deleted file mode 100644 index aee7bf6..0000000 --- a/javascript-practice/02_functions/solutions/C_functions_solution/number-change.js +++ /dev/null @@ -1,15 +0,0 @@ -// Write a function `numberChange` that accepts a number as an argument. The function should return -// half the number if it is even. The function should return double the number if it is odd. - -let numberChange = function ( n ) { - if ( n % 2 === 0 ) { - return n / 2; - } else { - return n * 2; - } -}; - -console.log( numberChange( 6 ) ); // 3 -console.log( numberChange( 7 ) ); // 14 -console.log( numberChange( 16 ) ); // 8 -console.log( numberChange( 21 ) ); // 42 diff --git a/javascript-practice/02_functions/solutions/C_functions_solution/right.html b/javascript-practice/02_functions/solutions/C_functions_solution/right.html deleted file mode 100644 index b94cff0..0000000 --- a/javascript-practice/02_functions/solutions/C_functions_solution/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -C_functions_solution - - - Stable - - - - - - - - - - - - -
Folders
<Go Back>
-
- - - - -
FileFileFileFileFileFileFileFile
right.html average-...ur.js case-changer.js contains.js divisible.js in-range.js larger.js number-change.js 
- -

-Folders: 1
-Files: 8
-Size of all files: 18476 KB

- - - \ No newline at end of file diff --git a/javascript-practice/02_functions/solutions/right.html b/javascript-practice/02_functions/solutions/right.html deleted file mode 100644 index 2a952e8..0000000 --- a/javascript-practice/02_functions/solutions/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -solutions - - - Stable - - - - - - - - - - - - -
Folders
<Go Back> A_functi...ution B_functi...ution C_functi...ution
-
- - - - -
FileFileFileFileFileFileFileFile
right.html 
- -

-Folders: 4
-Files: 1
-Size of all files: 13966 KB

- - - \ No newline at end of file diff --git a/javascript-practice/03_loops/exercises/A_loops_exercise/README.html b/javascript-practice/03_loops/exercises/A_loops_exercise/README.html deleted file mode 100644 index 398e074..0000000 --- a/javascript-practice/03_loops/exercises/A_loops_exercise/README.html +++ /dev/null @@ -1,335 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Document - - - - - - - - - -
- - - - -
HOME -
- - - -

In For a Loop

-

Loops are a construct that programmers use control the repeated execution of code.

-

Before you start this exercise, make sure you have watched the lecture first.

- - get - yourself unstuck, then pause the video and pick up the exercise on your own.

- -

I think loops are great because we can type a small amount of code, but instruct the computer to perform a - lot of - “work”. The programmer is lazy and computer doesn’t complain. What a perfect pair.

-

-AZ

-

0. Read. Run. Repeat.

-

Can you anticipate what these loop snippets will print out?

-

Create a new folder named A_loops_exercise. Predict what would print when executing each of the - snippets - below. Test your prediction by typing the snippet into their own files and executing the program. Don’t copy - and - paste.

-

Write the below code into a file named snippet-1.js. Make a prediction for what it will print. - Run - it. -

- -

Write the below code into a file named snippet-2.js. Make a prediction for what it will print. - Run - it. -

- -

Write the below code into a file named snippet-3.js. Make a prediction for what it will print. - Run - it. -

- -

Write the below code into a file named snippet-4.js. Make a prediction for what it will print. - Run - it. -

- -

Write the below code into a file named snippet-5.js. Make a prediction for what it will print. - Run - it. -

- -

1. Stay in the Loop.

-

In this section of the exercise you’ll be prompted to write a function to accomplish a specific task. Read - the - description and look at the example output to figure out what should be implemented within the function. Write - each - function to a separate file in the A_loops_exercise folder and test your work by running the - file. -

-

oneToFour

-

Create a one-to-four.js file and solve the function below:

- -

countUp

-

Create a count-up.js file and solve the function below:

- -

minToMax

-

Create a min-to-max.js file and solve the function below:

- -

stringIterate

-

Create a string-iterate.js file and solve the function below:

- -

evens

-

Create an evens.js file and solve the function below:

- - even - -

- - - diff --git a/javascript-practice/03_loops/exercises/A_loops_exercise/README.md b/javascript-practice/03_loops/exercises/A_loops_exercise/README.md deleted file mode 100644 index 3068a7b..0000000 --- a/javascript-practice/03_loops/exercises/A_loops_exercise/README.md +++ /dev/null @@ -1,225 +0,0 @@ -# In For a Loop - -_Loops_ are a construct that programmers use control the repeated execution of code. - -Before you start this exercise, make sure you have watched the lecture first. - -+ [Lecture](https://youtu.be/gs4WlW-ZQfg) - -If you get stuck during this exercise, reference this walkthrough. Only watch enough of the -walkthrough to get yourself unstuck, then pause the video and pick up the exercise on your own. - -+ [Walkthrough Part 1](https://youtu.be/D_Vh-Opw-_I) -+ [Walkthrough Part 2](https://youtu.be/rlolQAocQyA) - -I think loops are great because we can type a small amount of code, but instruct the computer to -perform a lot of "work". The programmer is lazy and computer doesn't complain. What a perfect pair. - --AZ - -## 0. Read. Run. Repeat. - -Can you anticipate what these loop snippets will print out? - -Create a new folder named `A_loops_exercise`. Predict what would print when executing each of the -snippets below. Test your prediction by typing the snippet into their own files and executing the -program. Don't copy and paste. - -Write the below code into a file named `snippet-1.js`. Make a prediction for what it will print. Run -it. - -```js -// snippet 1 -console.log("hello"); - -for (let i = 0; i < 5; i++) { - console.log("code"); -} - -console.log("goodbye"); -``` - -Write the below code into a file named `snippet-2.js`. Make a prediction for what it will print. Run -it. - -```js -// snippet 2 -console.log("hi"); - -for (let i = 3; i <= 7; i++) { - console.log("program"); - console.log(i); -} - -console.log("bye"); -``` - -Write the below code into a file named `snippet-3.js`. Make a prediction for what it will print. Run -it. - -```js -// snippet 3 -let foo = function () { - for (let num = 10; num > 0; num -= 2) { - console.log(num); - } -}; - -console.log("begin"); -foo(); -console.log("end"); -foo(); -``` - -Write the below code into a file named `snippet-4.js`. Make a prediction for what it will print. Run -it. - -```js -// snippet 4 -let word = "street"; -for (let i = 0; i < word.length; i++) { - console.log(i); - console.log(word[i]); -} -``` - -Write the below code into a file named `snippet-5.js`. Make a prediction for what it will print. Run -it. - -```js -// snippet 5 -let total = 0; -for (let i = 1; i < 5; i++) { - total += i; - console.log(total); -} - -console.log("grand total: " + total); -``` - -## 1. Stay in the Loop. - -In this section of the exercise you'll be prompted to write a function to accomplish a specific -task. Read the description and look at the example output to figure out what should be implemented -within the function. Write each function to a separate file in the `A_loops_exercise` folder and -test your work by running the file. - -### oneToFour - -Create a `one-to-four.js` file and solve the function below: - -```js -// Write a function `oneToFour` that prints all whole numbers from one to four, inclusive. The function -// takes in no arguments and doesn't need to return any value. It should just print to the terminal. - -oneToFour(); -// prints -// 1 -// 2 -// 3 -// 4 -``` - -### countUp - -Create a `count-up.js` file and solve the function below: - -```js -// Write a function `countUp(max)` that accepts a max number as an argument. The function should print -// all numbers from 1 up to and including the max. The function doesn't need to return any value. It -// should just print to the terminal. - -countUp(5); -// prints -// 1 -// 2 -// 3 -// 4 -// 5 - -countUp(3); -// prints -// 1 -// 2 -// 3 -``` - -### minToMax - -Create a `min-to-max.js` file and solve the function below: - -```js -// Write a function `minToMax(min, max)` that accepts two numbers as arguments. The function should -// print all numbers from min to max inclusive. The function doesn't need to return any value. It -// should just print to the terminal. - -minToMax(5, 9); -// prints -// 5 -// 6 -// 7 -// 8 -// 9 - -minToMax(11, 13); -// prints -// 11 -// 12 -// 13 - -minToMax(20, 11); -``` - -### stringIterate - -Create a `string-iterate.js` file and solve the function below: - -```js -// Write a function `stringIterate` that accepts a string as an argument. The function should print out -// each character of the string, one by one. The function doesn't need to return any value. It should -// just print to the terminal. - -stringIterate("celery"); -// prints -// c -// e -// l -// e -// r -// y - -stringIterate("hat"); -// prints -// h -// a -// t -``` - -### evens - -Create an `evens.js` file and solve the function below: - -```js -// Write a function `evens(max)` that accepts a max number as an argument. The function should print -// all positive even numbers that are less than the max. - -evens(11); -// prints -// 2 -// 4 -// 6 -// 8 -// 10 - -evens(8); -// prints -// 2 -// 4 -// 6 -``` - -## Walkthrough - - - - diff --git a/javascript-practice/03_loops/exercises/A_loops_exercise/right.html b/javascript-practice/03_loops/exercises/A_loops_exercise/right.html deleted file mode 100644 index 498d7fe..0000000 --- a/javascript-practice/03_loops/exercises/A_loops_exercise/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -A_loops_exercise - - - Stable - - - - - - - - - - - - -
Folders
<Go Back>
-
- - - - -
FileFileFileFileFileFileFileFile
README.html right.html README.md 
- -

-Folders: 1
-Files: 3
-Size of all files: 47498 KB

- - - \ No newline at end of file diff --git a/javascript-practice/03_loops/exercises/B_loops_exercise/README.html b/javascript-practice/03_loops/exercises/B_loops_exercise/README.html deleted file mode 100644 index 14379c5..0000000 --- a/javascript-practice/03_loops/exercises/B_loops_exercise/README.html +++ /dev/null @@ -1,245 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Document - - - - - - - - - -
- - - - -
HOME -
- - - -

Repetition Leads to Perfection

-

More practice on for loops!

- get - yourself unstuck, then pause the video and pick up the exercise on your own.

- -

Roses are read, violets are blue, error on line 32.

-

-AZ

-

Instructions

-

Create a new folder named B_loops, this is where you’ll save all of your files. Solve each of - the - prompts below. Create a new file for each prompt and execute your code to see if it matches the example - output. -

-

fiveMultiplesOf

-

Create a five-multiples-of.js file and solve the function below:

- -

sumUpTo

-

Create a sum-up-to.js file and solve the function below:

- -

noOhs

-

Create a no-ohs.js file and solve the function below:

- -

oddSum

-

Create an odd-sum.js file and solve the function below:

- -

stringRepeater

-

Create a string-repeater.js file and solve the function below:

- -

productUpTo

-

Create a product-up-to.js file and solve the function below:

- -

divByEither

-

Create a div-by-either.js file and solve the function below:

- - even - -

- - - diff --git a/javascript-practice/03_loops/exercises/B_loops_exercise/README.md b/javascript-practice/03_loops/exercises/B_loops_exercise/README.md deleted file mode 100644 index de7d73b..0000000 --- a/javascript-practice/03_loops/exercises/B_loops_exercise/README.md +++ /dev/null @@ -1,165 +0,0 @@ -# Repetition Leads to Perfection - -More practice on `for` loops! - -If you get stuck during this exercise, reference this walkthrough. Only watch enough of the -walkthrough to get yourself unstuck, then pause the video and pick up the exercise on your own. - -+ [Walkthrough](https://youtu.be/7EbhmLAH__o) - -Roses are read, violets are blue, error on line 32. - --AZ - -## Instructions - -Create a new folder named `B_loops`, this is where you'll save all of your files. Solve each of the -prompts below. Create a new file for each prompt and execute your code to see if it matches the -example output. - -### fiveMultiplesOf - -Create a `five-multiples-of.js` file and solve the function below: - - -```js -// Write a function named `fiveMultiplesOf` that accepts a number as an argument. The function should -// print out the first five multiples of the given number. The function doesn't need to return any -// value. It should just print to the terminal. - -fiveMultiplesOf(7); -// prints -// 7 -// 14 -// 21 -// 28 -// 35 - -fiveMultiplesOf(3); -// prints -// 3 -// 6 -// 9 -// 12 -// 15 -``` - -### sumUpTo - -Create a `sum-up-to.js` file and solve the function below: - - -```js -// Write a function named `sumUpTo(max)` that accepts a max number as an argument. The function should -// return the total sum of all whole numbers from 1 to the max, inclusive. -// -// For example, sumUpTo(4) should return 10 because 1 + 2 + 3 + 4 = 10. - -console.log(sumUpTo(4)); // 10 -console.log(sumUpTo(5)); // 15 -console.log(sumUpTo(2)); // 3 -``` - -### noOhs - -Create a `no-ohs.js` file and solve the function below: - - -```js -// Write a function named `noOhs` that accepts a string as an argument. The functions should print the -// characters of the string one by one except the character 'o'. The function doesn't need to return -// any value. It should just print to the terminal. - -noOhs("code"); -// prints -// c -// d -// e - -noOhs("school"); -// prints -// s -// c -// h -// l -``` - -### oddSum - -Create an `odd-sum.js` file and solve the function below: - -```js -// Write a function named `oddSum(max)` that accepts a max number as an argument. The function should -// return the total sum of all odd numbers from 1 to the max, inclusive. -// -// For example, oddSum(10) should return 25 because 1 + 3 + 5 + 7 + 9 = 25 - -console.log(oddSum(10)); // 25 -console.log(oddSum(5)); // 9 -``` - -### stringRepeater - -Create a `string-repeater.js` file and solve the function below: - - -```js -// Write a function named `stringRepeater(str, num)` that accepts a string and a number as arguments. -// The function should return a new string consisting of the `str` repeated `num` number of times. - -console.log(stringRepeater("q", 4)); // 'qqqq' -console.log(stringRepeater("go", 2)); // 'gogo' -console.log(stringRepeater("tac", 3)); // 'tactactac' -``` - -### productUpTo - -Create a `product-up-to.js` file and solve the function below: - - -```js -// Write a function named `productUpTo(max)` that accepts a max number as an argument. The function -// should return the total product of all whole numbers from 1 to the max, inclusive. A product is a -// number obtained from multiplying numbers together. -// -// For example, productUpTo(4) should return 24 because 1 * 2 * 3 * 4 = 24 - -console.log(productUpTo(4)); // 24 -console.log(productUpTo(5)); // 120 -console.log(productUpTo(7)); // 5040 -``` - -### divByEither - -Create a `div-by-either.js` file and solve the function below: - - -```js -// Write a function named `divByEither(num1, num2, max)` that accepts three numbers as arguments. -// The function should print out all positive numbers less than max that are divisible by num1 or num2. -// The function doesn't need to return any value. It should just print to the terminal. - -divByEither(4, 3, 16); -// prints -// 3 -// 4 -// 6 -// 8 -// 9 -// 12 -// 15 - -divByEither(7, 5, 20); -// prints -// 5 -// 7 -// 10 -// 14 -// 15 -``` - -## Walkthrough - - - - diff --git a/javascript-practice/03_loops/exercises/B_loops_exercise/right.html b/javascript-practice/03_loops/exercises/B_loops_exercise/right.html deleted file mode 100644 index 392a77b..0000000 --- a/javascript-practice/03_loops/exercises/B_loops_exercise/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -B_loops_exercise - - - Stable - - - - - - - - - - - - -
Folders
<Go Back>
-
- - - - -
FileFileFileFileFileFileFileFile
README.html right.html README.md 
- -

-Folders: 1
-Files: 3
-Size of all files: 39702 KB

- - - \ No newline at end of file diff --git a/javascript-practice/03_loops/exercises/C_loops_exercise/README.html b/javascript-practice/03_loops/exercises/C_loops_exercise/README.html deleted file mode 100644 index 08c73c1..0000000 --- a/javascript-practice/03_loops/exercises/C_loops_exercise/README.html +++ /dev/null @@ -1,242 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Document - - - - - - - - - -
- - - - -
HOME -
- - - -

Like a Broken Record

-

If you get stuck during this exercise, reference this walkthrough. Only watch enough of the walkthrough to - get - yourself unstuck, then pause the video and pick up the exercise on your own.

- -

You are getting good at solving problems using loops. Let’s up the difficulty.

-

-AZ

-

Instructions

-

Create a new folder named C_loops, this is where you’ll save all of your files. Solve each of - the - prompts below. Create a new file for each prompt and execute your code to see if it matches the example - output. -

-

divisibleRange

-

Create a divisible-range.js file and solve the function below:

- -

reverseIterate

-

Create a reverse-iterate.js file and solve the function below:

- -

removeCapitals

-

Create a remove-capitals.js file and solve the function below:

- -

raisePower

-

Create a raise-power.js file and solve the function below:

- -

censorE

-

Create a censor-e.js file and solve the function below:

- -

fizzBuzz

-

Create a fizz-buzz.js file and solve the function below:

- -

Walkthrough

-

Watch the walkthrough in it’s entirety so you don’t miss out on any knowledge. - walkthrough - even - -

- - - diff --git a/javascript-practice/03_loops/exercises/C_loops_exercise/README.md b/javascript-practice/03_loops/exercises/C_loops_exercise/README.md deleted file mode 100644 index 391e139..0000000 --- a/javascript-practice/03_loops/exercises/C_loops_exercise/README.md +++ /dev/null @@ -1,149 +0,0 @@ -# Like a Broken Record - -If you get stuck during this exercise, reference this walkthrough. Only watch enough of the -walkthrough to get yourself unstuck, then pause the video and pick up the exercise on your own. - -+ [Lecture](https://youtu.be/3uEzx16zwIM) - -You are getting good at solving problems using loops. Let's up the difficulty. - --AZ - -## Instructions - -Create a new folder named `C_loops`, this is where you'll save all of your files. Solve each of the -prompts below. Create a new file for each prompt and execute your code to see if it matches the -example output. - -### divisibleRange - -Create a `divisible-range.js` file and solve the function below: - -```js -// Write a function `divisibleRange(min, max, num)` that accepts three numbers as arguments. The -// function should print all numbers between `min` and `max` (exclusive) that are also divisible by -// num. - -divisibleRange(17, 40, 9); -// prints -// 18 -// 27 -// 36 - -divisibleRange(10, 24, 4); -// prints -// 12 -// 16 -// 20 -``` - -### reverseIterate - -Create a `reverse-iterate.js` file and solve the function below: - -```js -// Write a function `reverseIterate` that accepts a string as an argument. The function should print -// the characters of the string one by one, in reverse order. The function doesn't need to return any -// value. It should just print to the terminal. - -reverseIterate("carrot"); -// prints -// t -// o -// r -// r -// a -// c - -reverseIterate("box"); -// prints -// x -// o -// b -``` - -### removeCapitals - -Create a `remove-capitals.js` file and solve the function below: - -```js -// Write a function `removeCapitals` that accepts a string as an argument. The function should return a -// new version of the string with all capital letters removed. - -console.log(removeCapitals("fOrEver")); // 'frver' -console.log(removeCapitals("raiNCoat")); // 'raioat' -console.log(removeCapitals("cElLAr Door")); // 'clr oor' -``` - -### raisePower - -Create a `raise-power.js` file and solve the function below: - -```js -// Write a function `raisePower(base, exponent)` that accepts two numbers, `base` and `exponent`. The -// function should return `base` raised to the `exponent` power. -// -// For example, raisePower(2, 5) should return 32 because 2 * 2 * 2 * 2 * 2 = 32 -// For example, raisePower(4, 3) should return 64 because 4 * 4 * 4 = 64 - -console.log(raisePower(2, 5)); // 32 -console.log(raisePower(4, 3)); // 64 -console.log(raisePower(10, 4)); // 10000 -console.log(raisePower(7, 2)); // 49 -``` - -### censorE - -Create a `censor-e.js` file and solve the function below: - -```js -// Write a function `censorE` that accepts a string as an argument. The function should return the a new -// version of string where all characters that are 'e's are replaced with '*'s. - -console.log(censorE("speedy")); // 'sp**dy' -console.log(censorE("pending")); // 'p*nding' -console.log(censorE("scene")); // 'sc*n*' -console.log(censorE("heat")); // 'h*at' -``` - -### fizzBuzz - -Create a `fizz-buzz.js` file and solve the function below: - -```js -// Write a function `fizzBuzz` that accepts a max number as an argument. The function should -// print all numbers less than or equal to max that are divisible by either 3 or 5 but not both 3 -// and 5. The function doesn't need to return any value. It should just print to the terminal. - -fizzBuzz(18); -// prints -// 3 -// 5 -// 6 -// 9 -// 10 -// 12 -// 18 - -fizzBuzz(33); -// prints -// 3 -// 5 -// 6 -// 9 -// 10 -// 12 -// 18 -// 20 -// 21 -// 24 -// 25 -// 27 -// 33 -``` - -## Walkthrough - - - - diff --git a/javascript-practice/03_loops/exercises/C_loops_exercise/right.html b/javascript-practice/03_loops/exercises/C_loops_exercise/right.html deleted file mode 100644 index 4f60822..0000000 --- a/javascript-practice/03_loops/exercises/C_loops_exercise/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -C_loops_exercise - - - Stable - - - - - - - - - - - - -
Folders
<Go Back>
-
- - - - -
FileFileFileFileFileFileFileFile
README.html right.html README.md 
- -

-Folders: 1
-Files: 3
-Size of all files: 38962 KB

- - - \ No newline at end of file diff --git a/javascript-practice/03_loops/exercises/right.html b/javascript-practice/03_loops/exercises/right.html deleted file mode 100644 index ddba288..0000000 --- a/javascript-practice/03_loops/exercises/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -exercises - - - Stable - - - - - - - - - - - - -
Folders
<Go Back> A_loops_exercise B_loops_exercise C_loops_exercise
-
- - - - -
FileFileFileFileFileFileFileFile
right.html 
- -

-Folders: 4
-Files: 1
-Size of all files: 13954 KB

- - - \ No newline at end of file diff --git a/javascript-practice/03_loops/right.html b/javascript-practice/03_loops/right.html deleted file mode 100644 index 867c229..0000000 --- a/javascript-practice/03_loops/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -03_loops - - - Stable - - - - - - - - - - - - -
Folders
<Go Back> exercises solutions
-
- - - - -
FileFileFileFileFileFileFileFile
right.html 
- -

-Folders: 3
-Files: 1
-Size of all files: 13823 KB

- - - \ No newline at end of file diff --git a/javascript-practice/03_loops/solutions/A_loops_solution/count-up.js b/javascript-practice/03_loops/solutions/A_loops_solution/count-up.js deleted file mode 100644 index 25fae41..0000000 --- a/javascript-practice/03_loops/solutions/A_loops_solution/count-up.js +++ /dev/null @@ -1,23 +0,0 @@ -// Write a function `countUp(max)` that accepts a max number as an argument. The function should print -// all numbers from 1 up to and including the max. The function doesn't need to return any value. It -// should just print to the terminal. - -let countUp = function ( max ) { - for ( let i = 1; i <= max; i++ ) { - console.log( i ); - } -}; - -countUp( 5 ); -// prints -// 1 -// 2 -// 3 -// 4 -// 5 - -countUp( 3 ); -// prints -// 1 -// 2 -// 3 diff --git a/javascript-practice/03_loops/solutions/A_loops_solution/evens.js b/javascript-practice/03_loops/solutions/A_loops_solution/evens.js deleted file mode 100644 index 4824d72..0000000 --- a/javascript-practice/03_loops/solutions/A_loops_solution/evens.js +++ /dev/null @@ -1,24 +0,0 @@ -// Write a function `evens(max)` that accepts a max number as an argument. The function should print -// all positive even numbers that are less than the max. - -let evens = function ( max ) { - for ( let i = 1; i < max; i++ ) { - if ( i % 2 === 0 ) { - console.log( i ); - } - } -}; - -evens( 11 ); -// prints -// 2 -// 4 -// 6 -// 8 -// 10 - -evens( 8 ); -// prints -// 2 -// 4 -// 6 diff --git a/javascript-practice/03_loops/solutions/A_loops_solution/min-to-max.js b/javascript-practice/03_loops/solutions/A_loops_solution/min-to-max.js deleted file mode 100644 index 1e84cdc..0000000 --- a/javascript-practice/03_loops/solutions/A_loops_solution/min-to-max.js +++ /dev/null @@ -1,24 +0,0 @@ -// Write a function `minToMax(min, max)` that accepts two numbers as arguments. The function should -// print all numbers from min to max inclusive. The function doesn't need to return any value. It -// should just print to the terminal. - - -let minToMax = function ( min, max ) { - for ( let i = min; i <= max; i++ ) { - console.log( i ); - } -}; - -minToMax( 5, 9 ); -// prints -// 5 -// 6 -// 7 -// 8 -// 9 - -minToMax( 11, 13 ); -// prints -// 11 -// 12 -// 13 diff --git a/javascript-practice/03_loops/solutions/A_loops_solution/one-to-four.js b/javascript-practice/03_loops/solutions/A_loops_solution/one-to-four.js deleted file mode 100644 index bc52c2c..0000000 --- a/javascript-practice/03_loops/solutions/A_loops_solution/one-to-four.js +++ /dev/null @@ -1,16 +0,0 @@ -// Write a function `oneToFour` that prints all whole numbers from one to four, inclusive. The function -// takes in no arguments and doesn't need to return any value. It should just print to the terminal. - -let oneToFour = function () { - for ( let i = 1; i <= 4; i++ ) { - console.log( i ); - } -}; - - -oneToFour(); -// prints -// 1 -// 2 -// 3 -// 4 diff --git a/javascript-practice/03_loops/solutions/A_loops_solution/right.html b/javascript-practice/03_loops/solutions/A_loops_solution/right.html deleted file mode 100644 index 1c73f0d..0000000 --- a/javascript-practice/03_loops/solutions/A_loops_solution/right.html +++ /dev/null @@ -1,552 +0,0 @@ - - - - - -A_loops_solution - - - Stable - - - - - - - - - - - - -
Folders
<Go Back>
-
- - - - - -
FileFileFileFileFileFileFileFile
right.html evens.js one-to-four.js snippet-2.js snippet-3.js snippet-4.js snippet-5.js string-i...te.js 
count-up.js min-to-max.js snippet-1.js 
- -

-Folders: 1
-Files: 11
-Size of all files: 17959 KB

- - - \ No newline at end of file diff --git a/javascript-practice/03_loops/solutions/A_loops_solution/snippet-1.js b/javascript-practice/03_loops/solutions/A_loops_solution/snippet-1.js deleted file mode 100644 index e2d253c..0000000 --- a/javascript-practice/03_loops/solutions/A_loops_solution/snippet-1.js +++ /dev/null @@ -1,17 +0,0 @@ -// snippet 1 -console.log( "hello" ); - -for ( let i = 0; i < 5; i++ ) { - console.log( "code" ); -} - -console.log( "goodbye" ); - - -hello -code -code -code -code -code -goodbye diff --git a/javascript-practice/03_loops/solutions/A_loops_solution/snippet-2.js b/javascript-practice/03_loops/solutions/A_loops_solution/snippet-2.js deleted file mode 100644 index 53d5b80..0000000 --- a/javascript-practice/03_loops/solutions/A_loops_solution/snippet-2.js +++ /dev/null @@ -1,23 +0,0 @@ -// snippet 2 -console.log( "hi" ); - -for ( let i = 3; i <= 7; i++ ) { - console.log( "program" ); - console.log( i ); -} - -console.log( "bye" ); - - -// hi -// program -// 3 -// program -// 4 -// program -// 5 -// program -// 6 -// program -// 7 -// bye diff --git a/javascript-practice/03_loops/solutions/A_loops_solution/snippet-3.js b/javascript-practice/03_loops/solutions/A_loops_solution/snippet-3.js deleted file mode 100644 index 780141b..0000000 --- a/javascript-practice/03_loops/solutions/A_loops_solution/snippet-3.js +++ /dev/null @@ -1,25 +0,0 @@ -// snippet 3 -let foo = function () { - for ( let num = 10; num > 0; num -= 2 ) { - console.log( num ); - } -}; - -console.log( "begin" ); -foo(); -console.log( "end" ); -foo(); - - -// begin -// 10 -// 8 -// 6 -// 4 -// 2 -// end -// 10 -// 8 -// 6 -// 4 -// 2 diff --git a/javascript-practice/03_loops/solutions/A_loops_solution/snippet-4.js b/javascript-practice/03_loops/solutions/A_loops_solution/snippet-4.js deleted file mode 100644 index 69e0ccc..0000000 --- a/javascript-practice/03_loops/solutions/A_loops_solution/snippet-4.js +++ /dev/null @@ -1,20 +0,0 @@ -// snippet 4 -let word = "street"; -for ( let i = 0; i < word.length; i++ ) { - console.log( i ); - console.log( word[ i ] ); -} - - -// 0 -// s -// 1 -// t -// 2 -// r -// 3 -// e -// 4 -// e -// 5 -// t diff --git a/javascript-practice/03_loops/solutions/A_loops_solution/snippet-5.js b/javascript-practice/03_loops/solutions/A_loops_solution/snippet-5.js deleted file mode 100644 index 773d949..0000000 --- a/javascript-practice/03_loops/solutions/A_loops_solution/snippet-5.js +++ /dev/null @@ -1,15 +0,0 @@ -// snippet 5 -let total = 0; // 10 -for ( let i = 1; i < 5; i++ ) { - total += i; - console.log( total ); -} - -console.log( "grand total: " + total ); - - -// 1 -// 3 -// 6 -// 10 -// grand total: 10 diff --git a/javascript-practice/03_loops/solutions/A_loops_solution/string-iterate.js b/javascript-practice/03_loops/solutions/A_loops_solution/string-iterate.js deleted file mode 100644 index 125d232..0000000 --- a/javascript-practice/03_loops/solutions/A_loops_solution/string-iterate.js +++ /dev/null @@ -1,24 +0,0 @@ -// Write a function `stringIterate` that accepts a string as an argument. The function should print out -// each character of the string, one by one. The function doesn't need to return any value. It should -// just print to the terminal. - -let stringIterate = function ( string ) { - for ( let i = 0; i < string.length; i++ ) { - console.log( string[ i ] ); - } -}; - -stringIterate( "celery" ); -// prints -// c -// e -// l -// e -// r -// y - -stringIterate( "hat" ); -// prints -// h -// a -// t diff --git a/javascript-practice/03_loops/solutions/B_loops_solution/div-by-either.js b/javascript-practice/03_loops/solutions/B_loops_solution/div-by-either.js deleted file mode 100644 index 7b008cd..0000000 --- a/javascript-practice/03_loops/solutions/B_loops_solution/div-by-either.js +++ /dev/null @@ -1,29 +0,0 @@ -// Write a function named `divByEither(num1, num2, max)` that accepts three numbers as arguments. -// The function should print out all positive numbers less than max that are divisible by num1 or num2. -// The function doesn't need to return any value. It should just print to the terminal. - -let divByEither = function ( num1, num2, max ) { - for ( let i = 1; i < max; i++ ) { - if ( i % num1 === 0 || i % num2 === 0 ) { - console.log( i ); - } - } -}; - -divByEither( 4, 3, 16 ); -// prints -// 3 -// 4 -// 6 -// 8 -// 9 -// 12 -// 15 - -divByEither( 7, 5, 20 ); -// prints -// 5 -// 7 -// 10 -// 14 -// 15 diff --git a/javascript-practice/03_loops/solutions/B_loops_solution/five-multiples-of.js b/javascript-practice/03_loops/solutions/B_loops_solution/five-multiples-of.js deleted file mode 100644 index 49ff190..0000000 --- a/javascript-practice/03_loops/solutions/B_loops_solution/five-multiples-of.js +++ /dev/null @@ -1,25 +0,0 @@ -// Write a function named `fiveMultiplesOf` that accepts a number as an argument. The function should -// print out the first five multiples of the given number. The function doesn't need to return any -// value. It should just print to the terminal. - -let fiveMultiplesOf = function ( num ) { - for ( let i = 1; i <= 5; i++ ) { - console.log( i * num ); - } -}; - -fiveMultiplesOf( 7 ); -// prints -// 7 -// 14 -// 21 -// 28 -// 35 - -fiveMultiplesOf( 3 ); -// prints -// 3 -// 6 -// 9 -// 12 -// 15 diff --git a/javascript-practice/03_loops/solutions/B_loops_solution/no-ohs.js b/javascript-practice/03_loops/solutions/B_loops_solution/no-ohs.js deleted file mode 100644 index b459cca..0000000 --- a/javascript-practice/03_loops/solutions/B_loops_solution/no-ohs.js +++ /dev/null @@ -1,25 +0,0 @@ -// Write a function named `noOhs` that accepts a string as an argument. The functions should print the -// characters of the string one by one except the character 'o'. The function doesn't need to return -// any value. It should just print to the terminal. - -let noOhs = function ( str ) { - for ( let i = 0; i < str.length; i++ ) { - let char = str[ i ]; - if ( char !== 'o' ) { - console.log( char ); - } - } -}; - -noOhs( "code" ); -// prints -// c -// d -// e - -noOhs( "school" ); -// prints -// s -// c -// h -// l diff --git a/javascript-practice/03_loops/solutions/B_loops_solution/odd-sum.js b/javascript-practice/03_loops/solutions/B_loops_solution/odd-sum.js deleted file mode 100644 index 53568cc..0000000 --- a/javascript-practice/03_loops/solutions/B_loops_solution/odd-sum.js +++ /dev/null @@ -1,19 +0,0 @@ -// Write a function named `oddSum(max)` that accepts a max number as an argument. The function should -// return the total sum of all odd numbers from 1 to the max, inclusive. -// -// For example, oddSum(10) should return 25 because 1 + 3 + 5 + 7 + 9 = 25 - -let oddSum = function ( max ) { - let sum = 0; - - for ( let i = 1; i <= max; i++ ) { - if ( i % 2 === 1 ) { - sum += i; - } - } - - return sum; -}; - -console.log( oddSum( 10 ) ); // 25 -console.log( oddSum( 5 ) ); // 9 diff --git a/javascript-practice/03_loops/solutions/B_loops_solution/product-up-to.js b/javascript-practice/03_loops/solutions/B_loops_solution/product-up-to.js deleted file mode 100644 index dd2b84f..0000000 --- a/javascript-practice/03_loops/solutions/B_loops_solution/product-up-to.js +++ /dev/null @@ -1,19 +0,0 @@ -// Write a function named `productUpTo(max)` that accepts a max number as an argument. The function -// should return the total product of all whole numbers from 1 to the max, inclusive. A product is a -// number obtained from multiplying numbers together. -// -// For example, productUpTo(4) should return 24 because 1 * 2 * 3 * 4 = 24 - -let productUpTo = function ( max ) { - let product = 1; - - for ( let i = 1; i <= max; i++ ) { - product *= i; - } - - return product; -}; - -console.log( productUpTo( 4 ) ); // 24 -console.log( productUpTo( 5 ) ); // 120 -console.log( productUpTo( 7 ) ); // 5040 diff --git a/javascript-practice/03_loops/solutions/B_loops_solution/right.html b/javascript-practice/03_loops/solutions/B_loops_solution/right.html deleted file mode 100644 index e7c951d..0000000 --- a/javascript-practice/03_loops/solutions/B_loops_solution/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -B_loops_solution - - - Stable - - - - - - - - - - - - -
Folders
<Go Back>
-
- - - - -
FileFileFileFileFileFileFileFile
right.html div-by-either.js five-mul...of.js no-ohs.js odd-sum.js product-up-to.js string-r...er.js sum-up-to.js 
- -

-Folders: 1
-Files: 8
-Size of all files: 18181 KB

- - - \ No newline at end of file diff --git a/javascript-practice/03_loops/solutions/B_loops_solution/string-repeater.js b/javascript-practice/03_loops/solutions/B_loops_solution/string-repeater.js deleted file mode 100644 index dce4816..0000000 --- a/javascript-practice/03_loops/solutions/B_loops_solution/string-repeater.js +++ /dev/null @@ -1,16 +0,0 @@ -// Write a function named `stringRepeater(str, num)` that accepts a string and a number as arguments. -// The function should return a new string consisting of the `str` repeated `num` number of times. - -let stringRepeater = function ( str, num ) { - let repeatedStr = ''; - - for ( let i = 1; i <= num; i++ ) { - repeatedStr += str - } - - return repeatedStr; -}; - -console.log( stringRepeater( "q", 4 ) ); // 'qqqq' -console.log( stringRepeater( "go", 2 ) ); // 'gogo' -console.log( stringRepeater( "tac", 3 ) ); // 'tactactac' diff --git a/javascript-practice/03_loops/solutions/B_loops_solution/sum-up-to.js b/javascript-practice/03_loops/solutions/B_loops_solution/sum-up-to.js deleted file mode 100644 index 423178e..0000000 --- a/javascript-practice/03_loops/solutions/B_loops_solution/sum-up-to.js +++ /dev/null @@ -1,18 +0,0 @@ -// Write a function named `sumUpTo(max)` that accepts a max number as an argument. The function should -// return the total sum of all whole numbers from 1 to the max, inclusive. -// -// For example, sumUpTo(4) should return 10 because 1 + 2 + 3 + 4 = 10. - -let sumUpTo = function ( max ) { - let sum = 0; - - for ( let i = 1; i <= max; i++ ) { - sum += i - } - - return sum; -}; - -console.log( sumUpTo( 4 ) ); // 10 -console.log( sumUpTo( 5 ) ); // 15 -console.log( sumUpTo( 2 ) ); // 3 diff --git a/javascript-practice/03_loops/solutions/C_loops_solution/censor-e.js b/javascript-practice/03_loops/solutions/C_loops_solution/censor-e.js deleted file mode 100644 index 1fe7ea5..0000000 --- a/javascript-practice/03_loops/solutions/C_loops_solution/censor-e.js +++ /dev/null @@ -1,23 +0,0 @@ -// Write a function `censorE` that accepts a string as an argument. The function should return the a new -// version of string where all characters that are 'e's are replaced with '*'s. - -let censorE = function ( str ) { - let newStr = ''; - - for ( let i = 0; i < str.length; i++ ) { - let char = str[ i ]; - - if ( char === 'e' ) { - newStr += '*'; - } else { - newStr += char; - } - } - - return newStr; -}; - -console.log( censorE( "speedy" ) ); // 'sp**dy' -console.log( censorE( "pending" ) ); // 'p*nding' -console.log( censorE( "scene" ) ); // 'sc*n*' -console.log( censorE( "heat" ) ); // 'h*at' diff --git a/javascript-practice/03_loops/solutions/C_loops_solution/divisible-range.js b/javascript-practice/03_loops/solutions/C_loops_solution/divisible-range.js deleted file mode 100644 index 9bfdb29..0000000 --- a/javascript-practice/03_loops/solutions/C_loops_solution/divisible-range.js +++ /dev/null @@ -1,23 +0,0 @@ -// Write a function `divisibleRange(min, max, num)` that accepts three numbers as arguments. The -// function should print all numbers between `min` and `max` (exclusive) that are also divisible by -// num. - -let divisibleRange = function ( min, max, num ) { - for ( let i = min + 1; i < max; i++ ) { - if ( i % num === 0 ) { - console.log( i ); - } - } -}; - -divisibleRange( 17, 40, 9 ); -// prints -// 18 -// 27 -// 36 - -divisibleRange( 10, 24, 4 ); -// prints -// 12 -// 16 -// 20 diff --git a/javascript-practice/03_loops/solutions/C_loops_solution/fizz-buzz.js b/javascript-practice/03_loops/solutions/C_loops_solution/fizz-buzz.js deleted file mode 100644 index 6143ec2..0000000 --- a/javascript-practice/03_loops/solutions/C_loops_solution/fizz-buzz.js +++ /dev/null @@ -1,37 +0,0 @@ -// Write a function `fizzBuzz` that accepts a max number as an argument. The function should -// print all numbers less than or equal to max that are divisible by either 3 or 5 but not both 3 -// and 5. The function doesn't need to return any value. It should just print to the terminal. - -let fizzBuzz = function ( max ) { - for ( let i = 1; i <= max; i++ ) { - if ( ( i % 3 === 0 || i % 5 === 0 ) && !( i % 3 === 0 && i % 5 === 0 ) ) { - console.log( i ); - } - } -}; - -fizzBuzz( 18 ); -// prints -// 3 -// 5 -// 6 -// 9 -// 10 -// 12 -// 18 - -fizzBuzz( 33 ); -// prints -// 3 -// 5 -// 6 -// 9 -// 10 -// 12 -// 18 -// 20 -// 21 -// 24 -// 25 -// 27 -// 33 diff --git a/javascript-practice/03_loops/solutions/C_loops_solution/raise-power.js b/javascript-practice/03_loops/solutions/C_loops_solution/raise-power.js deleted file mode 100644 index 1c42cd4..0000000 --- a/javascript-practice/03_loops/solutions/C_loops_solution/raise-power.js +++ /dev/null @@ -1,20 +0,0 @@ -// Write a function `raisePower(base, exponent)` that accepts two numbers, `base` and `exponent`. The -// function should return `base` raised to the `exponent` power. -// -// For example, raisePower(2, 5) should return 32 because 2 * 2 * 2 * 2 * 2 = 32 -// For example, raisePower(4, 3) should return 64 because 4 * 4 * 4 = 64 - -let raisePower = function ( base, exponent ) { - let product = 1; - - for ( let i = 1; i <= exponent; i++ ) { - product *= base; - } - - return product; -}; - -console.log( raisePower( 2, 5 ) ); // 32 -console.log( raisePower( 4, 3 ) ); // 64 -console.log( raisePower( 10, 4 ) ); // 10000 -console.log( raisePower( 7, 2 ) ); // 49 diff --git a/javascript-practice/03_loops/solutions/C_loops_solution/remove-capitals.js b/javascript-practice/03_loops/solutions/C_loops_solution/remove-capitals.js deleted file mode 100644 index 287cfe7..0000000 --- a/javascript-practice/03_loops/solutions/C_loops_solution/remove-capitals.js +++ /dev/null @@ -1,19 +0,0 @@ -// Write a function `removeCapitals` that accepts a string as an argument. The function should return a -// new version of the string with all capital letters removed. - -let removeCapitals = function ( str ) { - let newStr = ''; - - for ( let i = 0; i < str.length; i++ ) { - let char = str[ i ]; - if ( char === char.toLowerCase() ) { - newStr += char; - } - } - - return newStr; -}; - -console.log( removeCapitals( "fOrEver" ) ); // 'frver' -console.log( removeCapitals( "raiNCoat" ) ); // 'raioat' -console.log( removeCapitals( "cElLAr Door" ) ); // 'clr oor' diff --git a/javascript-practice/03_loops/solutions/C_loops_solution/reverse-iterate.js b/javascript-practice/03_loops/solutions/C_loops_solution/reverse-iterate.js deleted file mode 100644 index cb082c5..0000000 --- a/javascript-practice/03_loops/solutions/C_loops_solution/reverse-iterate.js +++ /dev/null @@ -1,24 +0,0 @@ -// Write a function `reverseIterate` that accepts a string as an argument. The function should print -// the characters of the string one by one, in reverse order. The function doesn't need to return any -// value. It should just print to the terminal. - -let reverseIterate = function ( str ) { - for ( let i = str.length - 1; i >= 0; i-- ) { - console.log( str[ i ] ); - } -}; - -reverseIterate( "carrot" ); -// prints -// t -// o -// r -// r -// a -// c - -reverseIterate( "box" ); -// prints -// x -// o -// b diff --git a/javascript-practice/03_loops/solutions/C_loops_solution/right.html b/javascript-practice/03_loops/solutions/C_loops_solution/right.html deleted file mode 100644 index ca4fd88..0000000 --- a/javascript-practice/03_loops/solutions/C_loops_solution/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -C_loops_solution - - - Stable - - - - - - - - - - - - -
Folders
<Go Back>
-
- - - - -
FileFileFileFileFileFileFileFile
right.html censor-e.js divisibl...ge.js fizz-buzz.js raise-power.js remove-c...ls.js reverse-...te.js 
- -

-Folders: 1
-Files: 7
-Size of all files: 17893 KB

- - - \ No newline at end of file diff --git a/javascript-practice/03_loops/solutions/right.html b/javascript-practice/03_loops/solutions/right.html deleted file mode 100644 index 65a3e44..0000000 --- a/javascript-practice/03_loops/solutions/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -solutions - - - Stable - - - - - - - - - - - - -
Folders
<Go Back> A_loops_solution B_loops_solution C_loops_solution
-
- - - - -
FileFileFileFileFileFileFileFile
right.html 
- -

-Folders: 4
-Files: 1
-Size of all files: 13954 KB

- - - \ No newline at end of file diff --git a/javascript-practice/04_arrays/.DS_Store b/javascript-practice/04_arrays/.DS_Store deleted file mode 100644 index 046e534..0000000 Binary files a/javascript-practice/04_arrays/.DS_Store and /dev/null differ diff --git a/javascript-practice/04_arrays/exercises/A_arrays_exercise/README.html b/javascript-practice/04_arrays/exercises/A_arrays_exercise/README.html deleted file mode 100644 index 8ba86e5..0000000 --- a/javascript-practice/04_arrays/exercises/A_arrays_exercise/README.html +++ /dev/null @@ -1,236 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Document - - - - - - - - - -
- - - - -
HOME -
- - - -

All Programmers Need a Raise

-

Arrays are a construct that programmers use to store related values in a single variable. An - array - contains one or more elements.

-

Before you start this exercise, make sure you have watched the lecture first.

- - get - yourself unstuck, then pause the video and pick up the exercise on your own.

- -

New programmers often ask why the first index is 0 and not 1. Let’s go half on it. 0.5?

-

-AZ

-

Instructions

-

Create a new folder named A_arrays, this is where you’ll save all of your files. Solve each of - the - prompts below. Create a new file for each prompt and execute your code to see if it matches the example - output. -

-

total

-

Create a total.js file and solve the function below:

- -

stayPositive

-

Create a stay-positive.js file and solve the function below:

- -

bleepVowels

-

Create a bleep-vowels.js file and solve the function below:

- -

filterLongWords

-

Create a filter-long-words.js file and solve the function below:

- -

numOdds

-

Create a num-odds.js file and solve the function below:

- -

stringsToLengths

-

Create a strings-to-lengths.js file and solve the function below:

- -

divisors

-

Create a divisors.js file and solve the function below:

- - even - -

- - - diff --git a/javascript-practice/04_arrays/exercises/A_arrays_exercise/README.md b/javascript-practice/04_arrays/exercises/A_arrays_exercise/README.md deleted file mode 100644 index 946061b..0000000 --- a/javascript-practice/04_arrays/exercises/A_arrays_exercise/README.md +++ /dev/null @@ -1,126 +0,0 @@ -# All Programmers Need a Raise - -_Arrays_ are a construct that programmers use to store related values in a single variable. An -_array_ contains one or more _elements_. - -Before you start this exercise, make sure you have watched the lecture first. - -+ [Lecture](https://youtu.be/ekVhX_HfbBE) - -If you get stuck during this exercise, reference this walkthrough. Only watch enough of the -walkthrough to get yourself unstuck, then pause the video and pick up the exercise on your own. - -+ [Walkthrough](https://youtu.be/mibav-eq9EY) - -New programmers often ask why the first index is 0 and not 1. Let's go half on it. 0.5? - --AZ - -## Instructions - -Create a new folder named `A_arrays`, this is where you'll save all of your files. Solve each of the -prompts below. Create a new file for each prompt and execute your code to see if it matches the -example output. - -### total - -Create a `total.js` file and solve the function below: - -```js -// Write a function `total` that accepts an array of numbers as an argument. The function should return -// the total sum of all elements of the array. - -console.log(total([3, 2, 8])); // 13 -console.log(total([-5, 7, 4, 6])); // 12 -console.log(total([7])); // 7 -console.log(total([])); // 0 -``` - -### stayPositive - -Create a `stay-positive.js` file and solve the function below: - -```js -// Write a function `stayPositive` that accepts an array of numbers as an argument. The function should -// return an array containing only the positive numbers. - -console.log(stayPositive([10, -4, 3, 6])); // [10, 3, 6] -console.log(stayPositive([-5, 11, -40, 30.3, -2])); // [11, 30.3] -console.log(stayPositive([-11, -30])); // [] -``` - -### bleepVowels - -Create a `bleep-vowels.js` file and solve the function below: - -```js -// Write a function `bleepVowels` that accepts a string as an argument. The function should return -// a new string where all vowels are replaced with `*`s. Vowels are the letters a, e, i, o, u. - -console.log(bleepVowels("skateboard")); // 'sk*t*b**rd' -console.log(bleepVowels("slipper")); // 'sl*pp*r' -console.log(bleepVowels("range")); // 'r*ng*' -console.log(bleepVowels("brisk morning")); // 'br*sk m*rn*ng' -``` - -### filterLongWords - -Create a `filter-long-words.js` file and solve the function below: - -```js -// Write a function `filterLongWords` that accepts an array of strings as an argument. The function -// should return a new array containing only the strings that are less than 5 characters long. - -console.log(filterLongWords(["kale", "cat", "retro", "axe", "heirloom"])); -// ['kale', 'cat', 'axe'] - -console.log(filterLongWords(["disrupt", "pour", "trade", "pic"])); -// ['pour', 'pic'] -``` - -### numOdds - -Create a `num-odds.js` file and solve the function below: - -```js -// Write a function `numOdds` that accepts an array of numbers as an argument. The function should -// return a number representing the count of odd elements in the array. - -console.log(numOdds([4, 7, 2, 5, 9])); // 3 -console.log(numOdds([11, 31, 58, 99, 21, 60])); // 4 -console.log(numOdds([100, 40, 4])); // 0 -``` - -### stringsToLengths - -Create a `strings-to-lengths.js` file and solve the function below: - -```js -// Write a function `stringsToLengths` that accepts an array of strings as an argument. The function -// should return a new array containing the lengths of the elements of the original array. - -console.log(stringsToLengths(["belly", "echo", "irony", "pickled"])); -// [5, 4, 5, 7] - -console.log(stringsToLengths(["on", "off", "handmade"])); -// [2, 3, 8] -``` - -### divisors - -Create a `divisors.js` file and solve the function below: - -```js -// Write a function `divisors` that accepts a number as an argument. The function should return an -// array containing all positive numbers that can divide into the argument. - -console.log(divisors(15)); // [1, 3, 5, 15] -console.log(divisors(7)); // [1, 7] -console.log(divisors(24)); // [1, 2, 3, 4, 6, 8, 12, 24] -``` - -## Walkthrough - - - - diff --git a/javascript-practice/04_arrays/exercises/A_arrays_exercise/right.html b/javascript-practice/04_arrays/exercises/A_arrays_exercise/right.html deleted file mode 100644 index 7c1a38f..0000000 --- a/javascript-practice/04_arrays/exercises/A_arrays_exercise/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -A_arrays_exercise - - - Stable - - - - - - - - - - - - -
Folders
<Go Back>
-
- - - - -
FileFileFileFileFileFileFileFile
README.html right.html README.md 
- -

-Folders: 1
-Files: 3
-Size of all files: 38472 KB

- - - \ No newline at end of file diff --git a/javascript-practice/04_arrays/exercises/B_arrays_exercise/README.html b/javascript-practice/04_arrays/exercises/B_arrays_exercise/README.html deleted file mode 100644 index a0d8ee9..0000000 --- a/javascript-practice/04_arrays/exercises/B_arrays_exercise/README.html +++ /dev/null @@ -1,251 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Document - - - - - - - - - -
- - - - -
HOME -
- - - -

Arrays for Days

-

More array practice!

-

Before you start this exercise, make sure you have watched the lecture first.

- - get - yourself unstuck, then pause the video and pick up the exercise on your own.

- -

You may have noticed we added a few new patterns and techniques to our toolbox. The only way to get familiar - with - your tools is to use them. Write code. Run it.

-

-AZ

-

Instructions

-

Create a new folder named B_arrays, this is where you’ll save all of your files. Solve each of - the - prompts below. Create a new file for each prompt and execute your code to see if it matches the example - output. -

-

makeAcronym

-

Create a make-acronym.js file and solve the function below:

- -

reverseArray

-

Create a reverse-array.js file and solve the function below:

- -

yourAverageFunction

-

Create a your-average-function.js file and solve the function below:

- -

chooseDivisibles

-

Create a choose-divisibles.js file and solve the function below:

- -

maximum

-

Create a maximum.js file and solve the function below:

- -

wordCount

-

Create a word-count.js file and solve the function below:

- - even - -

- - - diff --git a/javascript-practice/04_arrays/exercises/B_arrays_exercise/README.md b/javascript-practice/04_arrays/exercises/B_arrays_exercise/README.md deleted file mode 100644 index 0dbf97c..0000000 --- a/javascript-practice/04_arrays/exercises/B_arrays_exercise/README.md +++ /dev/null @@ -1,111 +0,0 @@ -# Arrays for Days - -More array practice! - -Before you start this exercise, make sure you have watched the lecture first. - -+ [Lecture](https://youtu.be/M4OpbSGGnjw) - -If you get stuck during this exercise, reference this walkthrough. Only watch enough of the -walkthrough to get yourself unstuck, then pause the video and pick up the exercise on your own. - -+ [Walkthrough](https://youtu.be/l6dwZkBfi08) - -You may have noticed we added a few new patterns and techniques to our toolbox. The only way to get -familiar with your tools is to use them. Write code. Run it. - --AZ - -## Instructions - -Create a new folder named `B_arrays`, this is where you'll save all of your files. Solve each of the -prompts below. Create a new file for each prompt and execute your code to see if it matches the -example output. - -### makeAcronym - -Create a `make-acronym.js` file and solve the function below: - -```js -// Write a function `makeAcronym` that accepts a sentence string as an argument. The function should -// return a string containing the first character of each word in the sentence. - -console.log(makeAcronym("New York")); // NY -console.log(makeAcronym("same stuff different day")); // SSDD -console.log(makeAcronym("Laugh out loud")); // LOL -console.log(makeAcronym("don't over think stuff")); // DOTS -``` - -### reverseArray - -Create a `reverse-array.js` file and solve the function below: - -```js -// Write a function `reverseArray` that accepts an array as an argument. The function should return a -// array containing the elements of the original array in reverse order. - -console.log(reverseArray(["zero", "one", "two", "three"])); // ['three', 'two', 'one', 'zero'] -console.log(reverseArray([7, 1, 8])); // [8, 1, 7] -``` - -### yourAverageFunction - -Create a `your-average-function.js` file and solve the function below: - -```js -// Write a function `yourAverageFunction` that accepts an array of numbers as an argument. The -// function should return the average of all elements of the array. If the input array is empty, -// then the function should return null. - -console.log(yourAverageFunction([5, 2, 7, 24])); // 9.5 -console.log(yourAverageFunction([100, 6])); // 53 -console.log(yourAverageFunction([31, 32, 40, 12, 33])); // 29.6 -console.log(yourAverageFunction([])); // null -``` - -### chooseDivisibles - -Create a `choose-divisibles.js` file and solve the function below: - -```js -// Write a function `chooseDivisibles(numbers, target)` that accepts an array of numbers and a -// target number as arguments. The function should return an array containing elements of the original -// array that are divisible by the target. - -console.log(chooseDivisibles([40, 7, 22, 20, 24], 4)); // [40, 20, 24] -console.log(chooseDivisibles([9, 33, 8, 17], 3)); // [9, 33] -console.log(chooseDivisibles([4, 25, 1000], 10)); // [1000] -``` - -### maximum - -Create a `maximum.js` file and solve the function below: - -```js -// Write a function `maximum` that accepts an array of numbers as an argument. The function should -// return the largest number of the array. If the array is empty, then the function should return null. - -console.log(maximum([5, 6, 3, 7])); // 7 -console.log(maximum([17, 15, 19, 11, 2])); // 19 -console.log(maximum([])); // null -``` - -### wordCount - -Create a `word-count.js` file and solve the function below: - -```js -// Write a function `wordCount(sentence, targetWords)` that accepts a sentence string and an array of -// `targetWords`. The function should return a count of the number of words of the sentence that are -// in `targetWords`. - -console.log(wordCount("open the window please", ["please", "open", "sorry"])); // 2 -console.log(wordCount("drive to the cinema", ["the", "driver"])); // 1 -console.log(wordCount("can I have that can", ["can", "I"])); // 3 -``` - -## Walkthrough - - - - diff --git a/javascript-practice/04_arrays/exercises/B_arrays_exercise/right.html b/javascript-practice/04_arrays/exercises/B_arrays_exercise/right.html deleted file mode 100644 index 76307eb..0000000 --- a/javascript-practice/04_arrays/exercises/B_arrays_exercise/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -B_arrays_exercise - - - Stable - - - - - - - - - - - - -
Folders
<Go Back>
-
- - - - -
FileFileFileFileFileFileFileFile
README.html right.html README.md 
- -

-Folders: 1
-Files: 3
-Size of all files: 37614 KB

- - - \ No newline at end of file diff --git a/javascript-practice/04_arrays/exercises/C_arrays_exercise/README.html b/javascript-practice/04_arrays/exercises/C_arrays_exercise/README.html deleted file mode 100644 index 4bb5197..0000000 --- a/javascript-practice/04_arrays/exercises/C_arrays_exercise/README.html +++ /dev/null @@ -1,222 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Document - - - - - - - - - -
- - - - -
HOME -
- - - -

Array Buffet

-

Let’s do one more array exercise before we hit the next topic.

-

If you get stuck during this exercise, reference this walkthrough. Only watch enough of the walkthrough to - get - yourself unstuck, then pause the video and pick up the exercise on your own.

- -

Remember that time at the beginning of the course where you couldn’t read or write any code? Look at you now, - smarty - pants.

-

-AZ

-

Instructions

-

Create a new folder named C_arrays, this is where you’ll save all of your files. Solve each of - the - prompts below. Create a new file for each prompt and execute your code to see if it matches the example - output. -

-

lengthiestWord

-

Create a lengthiest-word.js file and solve the function below:

- -

alternatingCaps

-

Create an alternating-caps.js file and solve the function below:

- -

numberRange

-

Create a number-range.js file and solve the function below:

- -

removeShortWords

-

Create a remove-short-words.js file and solve the function below:

- -

commonElements

-

Create a common-elements.js file and solve the function below:

- -

Walkthrough

-

Watch the walkthrough in it’s entirety so you don’t miss out on any knowledge. - walkthrough - even - -

- - - diff --git a/javascript-practice/04_arrays/exercises/C_arrays_exercise/README.md b/javascript-practice/04_arrays/exercises/C_arrays_exercise/README.md deleted file mode 100644 index 9c3e884..0000000 --- a/javascript-practice/04_arrays/exercises/C_arrays_exercise/README.md +++ /dev/null @@ -1,97 +0,0 @@ -# Array Buffet - -Let's do one more array exercise before we hit the next topic. - -If you get stuck during this exercise, reference this walkthrough. Only watch enough of the -walkthrough to get yourself unstuck, then pause the video and pick up the exercise on your own. - -+ [Walkthrough](https://youtu.be/Whk1gGafY78) - -Remember that time at the beginning of the course where you couldn't read or write any code? Look at -you now, smarty pants. - --AZ - -## Instructions - -Create a new folder named `C_arrays`, this is where you'll save all of your files. Solve each of the -prompts below. Create a new file for each prompt and execute your code to see if it matches the -example output. - -### lengthiestWord - -Create a `lengthiest-word.js` file and solve the function below: - -```js -// Write a function `lengthiestWord` that accepts a sentence string as an argument. The function should -// return the longest word of the sentence. If there is a tie, return the word that appears later -// in the sentence. - -console.log(lengthiestWord("I am pretty hungry")); // 'hungry' -console.log(lengthiestWord("we should think outside of the box")); // 'outside' -console.log(lengthiestWord("down the rabbit hole")); // 'rabbit' -console.log(lengthiestWord("simmer down")); // 'simmer' -``` - -### alternatingCaps - -Create an `alternating-caps.js` file and solve the function below: - -```js -// Write a function `alternatingCaps` that accepts a sentence string as an argument. The function should -// return the sentence where words alternate between lowercase and uppercase. - -console.log(alternatingCaps("take them to school")); // 'take THEM to SCHOOL' -console.log(alternatingCaps("What did ThEy EAT before?")); // 'what DID they EAT before?' -``` - -### numberRange - -Create a `number-range.js` file and solve the function below: - -```js -// Write a function `numberRange(min, max, step)` that accepts three numbers as arguments, `min`, -// `max`, and `step`. The function should return all numbers between `min` and `max` at `step` intervals. -// `min` and `max` are inclusive. - -console.log(numberRange(10, 40, 5)); // [10, 15, 20, 25, 30, 35, 40] -console.log(numberRange(14, 24, 3)); // [14, 17, 20, 23] -console.log(numberRange(8, 35, 6)); // [8, 14, 20, 26, 32] -``` - -### removeShortWords - -Create a `remove-short-words.js` file and solve the function below: - -```js -// Write a function `removeShortWords` that accepts a sentence string as an argument. The function -// should return a new sentence where all of the words shorter than 4 characters are removed. - -console.log(removeShortWords("knock on the door will you")); // 'knock door will' -console.log(removeShortWords("a terrible plan")); // 'terrible plan' -console.log(removeShortWords("run faster that way")); // 'faster that' -``` - -### commonElements - -Create a `common-elements.js` file and solve the function below: - -```js -// Write a function `commonElements` that accepts two arrays as arguments. The function should return -// a new array containing the elements that are found in both of the input arrays. The order of -// the elements in the output array doesn't matter as long as the function returns the correct elements. - -let arr1 = ["a", "c", "d", "b"]; -let arr2 = ["b", "a", "y"]; -console.log(commonElements(arr1, arr2)); // ['a', 'b'] - -let arr3 = [4, 7]; -let arr4 = [32, 7, 1, 4]; -console.log(commonElements(arr3, arr4)); // [4, 7] -``` - -## Walkthrough - - - - diff --git a/javascript-practice/04_arrays/exercises/C_arrays_exercise/right.html b/javascript-practice/04_arrays/exercises/C_arrays_exercise/right.html deleted file mode 100644 index fe5e054..0000000 --- a/javascript-practice/04_arrays/exercises/C_arrays_exercise/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -C_arrays_exercise - - - Stable - - - - - - - - - - - - -
Folders
<Go Back>
-
- - - - -
FileFileFileFileFileFileFileFile
README.html right.html README.md 
- -

-Folders: 1
-Files: 3
-Size of all files: 34754 KB

- - - \ No newline at end of file diff --git a/javascript-practice/04_arrays/exercises/right.html b/javascript-practice/04_arrays/exercises/right.html deleted file mode 100644 index 07c240a..0000000 --- a/javascript-practice/04_arrays/exercises/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -exercises - - - Stable - - - - - - - - - - - - -
Folders
<Go Back> A_arrays...rcise B_arrays...rcise C_arrays...rcise
-
- - - - -
FileFileFileFileFileFileFileFile
right.html 
- -

-Folders: 4
-Files: 1
-Size of all files: 13957 KB

- - - \ No newline at end of file diff --git a/javascript-practice/04_arrays/right.html b/javascript-practice/04_arrays/right.html deleted file mode 100644 index 3fea72b..0000000 --- a/javascript-practice/04_arrays/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -04_arrays - - - Stable - - - - - - - - - - - - -
Folders
<Go Back> exercises solutions
-
- - - - -
FileFileFileFileFileFileFileFile
right.html 
- -

-Folders: 3
-Files: 1
-Size of all files: 13824 KB

- - - \ No newline at end of file diff --git a/javascript-practice/04_arrays/solutions/A_arrays_solution/bleep-vowels.js b/javascript-practice/04_arrays/solutions/A_arrays_solution/bleep-vowels.js deleted file mode 100644 index eb0e46b..0000000 --- a/javascript-practice/04_arrays/solutions/A_arrays_solution/bleep-vowels.js +++ /dev/null @@ -1,24 +0,0 @@ -// Write a function `bleepVowels` that accepts a string as an argument. The function should return -// a new string where all vowels are replaced with `*`s. Vowels are the letters a, e, i, o, u. - -let bleepVowels = function ( str ) { - let vowels = [ "a", "e", "i", "o", "u" ]; - let bleeped = ""; - - for ( let i = 0; i < str.length; i++ ) { - let char = str[ i ]; - - if ( vowels.indexOf( char ) > -1 ) { - bleeped += "*"; - } else { - bleeped += char; - } - } - - return bleeped; -}; - -console.log( bleepVowels( "skateboard" ) ); // 'sk*t*b**rd' -console.log( bleepVowels( "slipper" ) ); // 'sl*pp*r' -console.log( bleepVowels( "range" ) ); // 'r*ng*' -console.log( bleepVowels( "brisk morning" ) ); // 'br*sk m*rn*ng' diff --git a/javascript-practice/04_arrays/solutions/A_arrays_solution/divisors.js b/javascript-practice/04_arrays/solutions/A_arrays_solution/divisors.js deleted file mode 100644 index e68c6d5..0000000 --- a/javascript-practice/04_arrays/solutions/A_arrays_solution/divisors.js +++ /dev/null @@ -1,18 +0,0 @@ -// Write a function `divisors` that accepts a number as an argument. The function should return an -// array containing all positive numbers that can divide into the argument. - -let divisors = function ( n ) { - let numbers = []; - - for ( let i = 1; i <= n; i++ ) { - if ( n % i === 0 ) { - numbers.push( i ); - } - } - - return numbers; -}; - -console.log( divisors( 15 ) ); // [1, 3, 5, 15] -console.log( divisors( 7 ) ); // [1, 7] -console.log( divisors( 24 ) ); // [1, 2, 3, 4, 6, 8, 12, 24] diff --git a/javascript-practice/04_arrays/solutions/A_arrays_solution/filter-long-words.js b/javascript-practice/04_arrays/solutions/A_arrays_solution/filter-long-words.js deleted file mode 100644 index 8147110..0000000 --- a/javascript-practice/04_arrays/solutions/A_arrays_solution/filter-long-words.js +++ /dev/null @@ -1,22 +0,0 @@ -// Write a function `filterLongWords` that accepts an array of strings as an argument. The function -// should return a new array containing only the strings that are less than 5 characters long. - -let filterLongWords = function ( words ) { - let chosenWords = []; - - for ( let i = 0; i < words.length; i++ ) { - let word = words[ i ]; - - if ( word.length < 5 ) { - chosenWords.push( word ); - } - } - - return chosenWords; -}; - -console.log( filterLongWords( [ "kale", "cat", "retro", "axe", "heirloom" ] ) ); -// ['kale', 'cat', 'axe'] - -console.log( filterLongWords( [ "disrupt", "pour", "trade", "pic" ] ) ); -// ['pour', 'pic'] diff --git a/javascript-practice/04_arrays/solutions/A_arrays_solution/num-odds.js b/javascript-practice/04_arrays/solutions/A_arrays_solution/num-odds.js deleted file mode 100644 index 6f7d1cf..0000000 --- a/javascript-practice/04_arrays/solutions/A_arrays_solution/num-odds.js +++ /dev/null @@ -1,18 +0,0 @@ -// Write a function `numOdds` that accepts an array of numbers as an argument. The function should -// return a number representing the count of odd elements in the array. - -let numOdds = function ( numbers ) { - let count = 0; - - for ( let i = 0; i < numbers.length; i++ ) { - if ( numbers[ i ] % 2 === 1 ) { - count += 1; - } - } - - return count; -}; - -console.log( numOdds( [ 4, 7, 2, 5, 9 ] ) ); // 3 -console.log( numOdds( [ 11, 31, 58, 99, 21, 60 ] ) ); // 4 -console.log( numOdds( [ 100, 40, 4 ] ) ); // 0 diff --git a/javascript-practice/04_arrays/solutions/A_arrays_solution/right.html b/javascript-practice/04_arrays/solutions/A_arrays_solution/right.html deleted file mode 100644 index e5e10a3..0000000 --- a/javascript-practice/04_arrays/solutions/A_arrays_solution/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -A_arrays_solution - - - Stable - - - - - - - - - - - - -
Folders
<Go Back>
-
- - - - -
FileFileFileFileFileFileFileFile
right.html bleep-vowels.js divisors.js filter-l...ds.js num-odds.js stay-positive.js strings-...hs.js total.js 
- -

-Folders: 1
-Files: 8
-Size of all files: 18414 KB

- - - \ No newline at end of file diff --git a/javascript-practice/04_arrays/solutions/A_arrays_solution/stay-positive.js b/javascript-practice/04_arrays/solutions/A_arrays_solution/stay-positive.js deleted file mode 100644 index 096d8d3..0000000 --- a/javascript-practice/04_arrays/solutions/A_arrays_solution/stay-positive.js +++ /dev/null @@ -1,19 +0,0 @@ -// Write a function `stayPositive` that accepts an array of numbers as an argument. The function should -// return an array containing only the positive numbers. - -let stayPositive = function ( numbers ) { - let positives = []; - - for ( let i = 0; i < numbers.length; i++ ) { - if ( numbers[ i ] > 0 ) { - positives.push( numbers[ i ] ); - } - } - - return positives; -}; - - -console.log( stayPositive( [ 10, -4, 3, 6 ] ) ); // [10, 3, 6] -console.log( stayPositive( [ -5, 11, -40, 30.3, -2 ] ) ); // [11, 30.3] -console.log( stayPositive( [ -11, -30 ] ) ); // [] diff --git a/javascript-practice/04_arrays/solutions/A_arrays_solution/strings-to-lengths.js b/javascript-practice/04_arrays/solutions/A_arrays_solution/strings-to-lengths.js deleted file mode 100644 index 4b71e56..0000000 --- a/javascript-practice/04_arrays/solutions/A_arrays_solution/strings-to-lengths.js +++ /dev/null @@ -1,18 +0,0 @@ -// Write a function `stringsToLengths` that accepts an array of strings as an argument. The function -// should return a new array containing the lengths of the elements of the original array. - -let stringsToLengths = function ( words ) { - let lengths = []; - - for ( let i = 0; i < words.length; i++ ) { - lengths.push( words[ i ].length ); - } - - return lengths; -}; - -console.log( stringsToLengths( [ "belly", "echo", "irony", "pickled" ] ) ); -// [5, 4, 5, 7] - -console.log( stringsToLengths( [ "on", "off", "handmade" ] ) ); -// [2, 3, 8] diff --git a/javascript-practice/04_arrays/solutions/A_arrays_solution/total.js b/javascript-practice/04_arrays/solutions/A_arrays_solution/total.js deleted file mode 100644 index 14745c1..0000000 --- a/javascript-practice/04_arrays/solutions/A_arrays_solution/total.js +++ /dev/null @@ -1,15 +0,0 @@ -// Write a function `total` that accepts an array of numbers as an argument. The function should return -// the total sum of all elements of the array. - -let total = function ( numbers ) { - let sum = 0; - for ( let i = 0; i < numbers.length; i++ ) { - sum += numbers[ i ]; - } - return sum; -}; - -console.log( total( [ 3, 2, 8 ] ) ); // 13 -console.log( total( [ -5, 7, 4, 6 ] ) ); // 12 -console.log( total( [ 7 ] ) ); // 7 -console.log( total( [] ) ); // 0 diff --git a/javascript-practice/04_arrays/solutions/B_arrays_solution/choose-divisibles.js b/javascript-practice/04_arrays/solutions/B_arrays_solution/choose-divisibles.js deleted file mode 100644 index 4c9b08e..0000000 --- a/javascript-practice/04_arrays/solutions/B_arrays_solution/choose-divisibles.js +++ /dev/null @@ -1,21 +0,0 @@ -// Write a function `chooseDivisibles(numbers, target)` that accepts an array of numbers and a -// target number as arguments. The function should return an array containing elements of the original -// array that are divisible by the target. - -let chooseDivisibles = function ( numbers, target ) { - let divisibles = []; - - for ( let i = 0; i < numbers.length; i++ ) { - let num = numbers[ i ]; - - if ( num % target === 0 ) { - divisibles.push( num ); - } - } - - return divisibles; -}; - -console.log( chooseDivisibles( [ 40, 7, 22, 20, 24 ], 4 ) ); // [40, 20, 24] -console.log( chooseDivisibles( [ 9, 33, 8, 17 ], 3 ) ); // [9, 33] -console.log( chooseDivisibles( [ 4, 25, 1000 ], 10 ) ); // [1000] diff --git a/javascript-practice/04_arrays/solutions/B_arrays_solution/make-acronym.js b/javascript-practice/04_arrays/solutions/B_arrays_solution/make-acronym.js deleted file mode 100644 index 3ec32ba..0000000 --- a/javascript-practice/04_arrays/solutions/B_arrays_solution/make-acronym.js +++ /dev/null @@ -1,19 +0,0 @@ -// Write a function `makeAcronym` that accepts a sentence string as an argument. The function should -// return a string containing the first character of each word in the sentence. - -let makeAcronym = function ( sentence ) { - let words = sentence.split( ' ' ); - let acronym = ''; - - for ( let i = 0; i < words.length; i++ ) { - let word = words[ i ]; - acronym += word[ 0 ]; - } - - return acronym.toUpperCase(); -}; - -console.log( makeAcronym( "New York" ) ); // NY -console.log( makeAcronym( "same stuff different day" ) ); // SSDD -console.log( makeAcronym( "Laugh out loud" ) ); // LOL -console.log( makeAcronym( "don't over think stuff" ) ); // DOTS diff --git a/javascript-practice/04_arrays/solutions/B_arrays_solution/maximum.js b/javascript-practice/04_arrays/solutions/B_arrays_solution/maximum.js deleted file mode 100644 index e426353..0000000 --- a/javascript-practice/04_arrays/solutions/B_arrays_solution/maximum.js +++ /dev/null @@ -1,21 +0,0 @@ -// Write a function `maximum` that accepts an array of numbers as an argument. The function should -// return the largest number of the array. If the array is empty, then the function should return null. - -let maximum = function ( numbers ) { - if ( numbers.length === 0 ) { - return null; - } - - let currentMax = numbers[ 0 ]; - for ( let i = 1; i < numbers.length; i++ ) { - if ( numbers[ i ] > currentMax ) { - currentMax = numbers[ i ]; - } - } - - return currentMax; -}; - -console.log( maximum( [ 5, 6, 3, 7 ] ) ); // 7 -console.log( maximum( [ 17, 15, 19, 11, 2 ] ) ); // 19 -console.log( maximum( [] ) ); // null diff --git a/javascript-practice/04_arrays/solutions/B_arrays_solution/reverse-array.js b/javascript-practice/04_arrays/solutions/B_arrays_solution/reverse-array.js deleted file mode 100644 index 5e2c42a..0000000 --- a/javascript-practice/04_arrays/solutions/B_arrays_solution/reverse-array.js +++ /dev/null @@ -1,29 +0,0 @@ -// Write a function `reverseArray` that accepts an array as an argument. The function should return a -// array containing the elements of the original array in reverse order. - -let reverseArray1 = function ( array ) { - let reversed = []; - - for ( let i = array.length - 1; i >= 0; i-- ) { - reversed.push( array[ i ] ); - } - - return reversed; -}; - -console.log( reverseArray1( [ "zero", "one", "two", "three" ] ) ); // ['three', 'two', 'one', 'zero'] -console.log( reverseArray1( [ 7, 1, 8 ] ) ); // [8, 1, 7] - - -let reverseArray2 = function ( array ) { - let reversed = []; - - for ( let i = 0; i < array.length; i++ ) { - reversed.unshift( array[ i ] ); - } - - return reversed; -}; - -console.log( reverseArray2( [ "zero", "one", "two", "three" ] ) ); // ['three', 'two', 'one', 'zero'] -console.log( reverseArray2( [ 7, 1, 8 ] ) ); // [8, 1, 7] diff --git a/javascript-practice/04_arrays/solutions/B_arrays_solution/right.html b/javascript-practice/04_arrays/solutions/B_arrays_solution/right.html deleted file mode 100644 index 75a5850..0000000 --- a/javascript-practice/04_arrays/solutions/B_arrays_solution/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -B_arrays_solution - - - Stable - - - - - - - - - - - - -
Folders
<Go Back>
-
- - - - -
FileFileFileFileFileFileFileFile
right.html choose-d...es.js make-acronym.js maximum.js reverse-array.js word-count.js your-ave...on.js 
- -

-Folders: 1
-Files: 7
-Size of all files: 18674 KB

- - - \ No newline at end of file diff --git a/javascript-practice/04_arrays/solutions/B_arrays_solution/word-count.js b/javascript-practice/04_arrays/solutions/B_arrays_solution/word-count.js deleted file mode 100644 index dbf132f..0000000 --- a/javascript-practice/04_arrays/solutions/B_arrays_solution/word-count.js +++ /dev/null @@ -1,22 +0,0 @@ -// Write a function `wordCount(sentence, targetWords)` that accepts a sentence string and an array of -// `targetWords`. The function should return a count of the number of words of the sentence that are -// in `targetWords`. - -let wordCount = function ( sentence, targetWords ) { - let words = sentence.split( ' ' ); - let count = 0; - - for ( let i = 0; i < words.length; i++ ) { - let word = words[ i ]; - - if ( targetWords.includes( word ) ) { - count++; - } - } - - return count; -}; - -console.log( wordCount( "open the window please", [ "please", "open", "sorry" ] ) ); // 2 -console.log( wordCount( "drive to the cinema", [ "the", "driver" ] ) ); // 1 -console.log( wordCount( "can I have that can", [ "can", "I" ] ) ); // 3 diff --git a/javascript-practice/04_arrays/solutions/B_arrays_solution/your-average-function.js b/javascript-practice/04_arrays/solutions/B_arrays_solution/your-average-function.js deleted file mode 100644 index 7e8908e..0000000 --- a/javascript-practice/04_arrays/solutions/B_arrays_solution/your-average-function.js +++ /dev/null @@ -1,21 +0,0 @@ -// Write a function `yourAverageFunction` that accepts an array of numbers as an argument. The -// function should return the average of all elements of the array. If the input array is empty, -// then the function should return null. - -let yourAverageFunction = function ( nums ) { - if ( nums.length === 0 ) { - return null; - } - - let sum = 0; - for ( let i = 0; i < nums.length; i++ ) { - sum += nums[ i ]; - } - - return sum / nums.length; -}; - -console.log( yourAverageFunction( [ 5, 2, 7, 24 ] ) ); // 9.5 -console.log( yourAverageFunction( [ 100, 6 ] ) ); // 53 -console.log( yourAverageFunction( [ 31, 32, 40, 12, 33 ] ) ); // 29.6 -console.log( yourAverageFunction( [] ) ); // null diff --git a/javascript-practice/04_arrays/solutions/C_arrays_solution/alternating-caps.js b/javascript-practice/04_arrays/solutions/C_arrays_solution/alternating-caps.js deleted file mode 100644 index 22d4ad6..0000000 --- a/javascript-practice/04_arrays/solutions/C_arrays_solution/alternating-caps.js +++ /dev/null @@ -1,21 +0,0 @@ -// Write a function `alternatingCaps` that accepts a sentence string as an argument. The function should -// return the sentence where words alternate between lowercase and uppercase. - -let alternatingCaps = function ( sentence ) { - let words = sentence.split( ' ' ); - let newWords = []; - - for ( let i = 0; i < words.length; i++ ) { - let word = words[ i ]; - if ( i % 2 === 0 ) { - newWords.push( word.toLowerCase() ); - } else { - newWords.push( word.toUpperCase() ); - } - } - - return newWords.join( ' ' ); -}; - -console.log( alternatingCaps( "take them to school" ) ); // 'take THEM to SCHOOL' -console.log( alternatingCaps( "What did ThEy EAT before?" ) ); // 'what DID they EAT before?' diff --git a/javascript-practice/04_arrays/solutions/C_arrays_solution/common-elements.js b/javascript-practice/04_arrays/solutions/C_arrays_solution/common-elements.js deleted file mode 100644 index d9da9a4..0000000 --- a/javascript-practice/04_arrays/solutions/C_arrays_solution/common-elements.js +++ /dev/null @@ -1,25 +0,0 @@ -// Write a function `commonElements` that accepts two arrays as arguments. The function should return -// a new array containing the elements that are found in both of the input arrays. The order of -// the elements in the output array doesn't matter as long as the function returns the correct elements. - -let commonElements = function ( array1, array2 ) { - let common = []; - - for ( let i = 0; i < array1.length; i++ ) { - let ele = array1[ i ]; - - if ( array2.includes( ele ) ) { - common.push( ele ); - } - } - - return common; -}; - -let arr1 = [ "a", "c", "d", "b" ]; -let arr2 = [ "b", "a", "y" ]; -console.log( commonElements( arr1, arr2 ) ); // ['a', 'b'] - -let arr3 = [ 4, 7 ]; -let arr4 = [ 32, 7, 1, 4 ]; -console.log( commonElements( arr3, arr4 ) ); // [4, 7] diff --git a/javascript-practice/04_arrays/solutions/C_arrays_solution/lengthiest-word.js b/javascript-practice/04_arrays/solutions/C_arrays_solution/lengthiest-word.js deleted file mode 100644 index ecc59b6..0000000 --- a/javascript-practice/04_arrays/solutions/C_arrays_solution/lengthiest-word.js +++ /dev/null @@ -1,23 +0,0 @@ -// Write a function `lengthiestWord` that accepts a sentence string as an argument. The function should -// return the longest word of the sentence. If there is a tie, return the word that appears later -// in the sentence. - -let lengthiestWord = function ( sentence ) { - let words = sentence.split( ' ' ); - let longest = words[ 0 ]; // pretty - - for ( let i = 1; i < words.length; i++ ) { - let word = words[ i ]; - if ( word.length >= longest.length ) { - longest = word; - } - } - - return longest; -}; - - -console.log( lengthiestWord( "I am pretty hungry" ) ); // 'hungry' -console.log( lengthiestWord( "we should think outside of the box" ) ); // 'outside' -console.log( lengthiestWord( "down the rabbit hole" ) ); // 'rabbit' -console.log( lengthiestWord( "simmer down" ) ); // 'simmer' diff --git a/javascript-practice/04_arrays/solutions/C_arrays_solution/number-range.js b/javascript-practice/04_arrays/solutions/C_arrays_solution/number-range.js deleted file mode 100644 index b4ec5ea..0000000 --- a/javascript-practice/04_arrays/solutions/C_arrays_solution/number-range.js +++ /dev/null @@ -1,17 +0,0 @@ -// Write a function `numberRange(min, max, step)` that accepts three numbers as arguments, `min`, -// `max`, and `step`. The function should return all numbers between `min` and `max` at `step` intervals. -// `min` and `max` are inclusive. - -let numberRange = function ( min, max, step ) { - let range = []; - - for ( let i = min; i <= max; i += step ) { - range.push( i ); - } - - return range; -}; - -console.log( numberRange( 10, 40, 5 ) ); // [10, 15, 20, 25, 30, 35, 40] -console.log( numberRange( 14, 24, 3 ) ); // [14, 17, 20, 23] -console.log( numberRange( 8, 35, 6 ) ); // [8, 14, 20, 26, 32] diff --git a/javascript-practice/04_arrays/solutions/C_arrays_solution/remove-short-words.js b/javascript-practice/04_arrays/solutions/C_arrays_solution/remove-short-words.js deleted file mode 100644 index e325e63..0000000 --- a/javascript-practice/04_arrays/solutions/C_arrays_solution/remove-short-words.js +++ /dev/null @@ -1,21 +0,0 @@ -// Write a function `removeShortWords` that accepts a sentence string as an argument. The function -// should return a new sentence where all of the words shorter than 4 characters are removed. - -let removeShortWords = function ( sentence ) { - let words = sentence.split( ' ' ); - let chosenWords = []; - - for ( let i = 0; i < words.length; i++ ) { - let word = words[ i ]; - - if ( word.length >= 4 ) { - chosenWords.push( word ); - } - } - - return chosenWords.join( ' ' ); -}; - -console.log( removeShortWords( "knock on the door will you" ) ); // 'knock door will' -console.log( removeShortWords( "a terrible plan" ) ); // 'terrible plan' -console.log( removeShortWords( "run faster that way" ) ); // 'faster that' diff --git a/javascript-practice/04_arrays/solutions/C_arrays_solution/right.html b/javascript-practice/04_arrays/solutions/C_arrays_solution/right.html deleted file mode 100644 index 119a583..0000000 --- a/javascript-practice/04_arrays/solutions/C_arrays_solution/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -C_arrays_solution - - - Stable - - - - - - - - - - - - -
Folders
<Go Back>
-
- - - - -
FileFileFileFileFileFileFileFile
right.html alternat...ps.js common-e...ts.js lengthie...rd.js number-range.js remove-s...ds.js 
- -

-Folders: 1
-Files: 6
-Size of all files: 17961 KB

- - - \ No newline at end of file diff --git a/javascript-practice/04_arrays/solutions/right.html b/javascript-practice/04_arrays/solutions/right.html deleted file mode 100644 index a100a1a..0000000 --- a/javascript-practice/04_arrays/solutions/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -solutions - - - Stable - - - - - - - - - - - - -
Folders
<Go Back> A_arrays...ution B_arrays...ution C_arrays...ution
-
- - - - -
FileFileFileFileFileFileFileFile
right.html 
- -

-Folders: 4
-Files: 1
-Size of all files: 13957 KB

- - - \ No newline at end of file diff --git a/javascript-practice/05_nesting/.DS_Store b/javascript-practice/05_nesting/.DS_Store deleted file mode 100644 index b8d8038..0000000 Binary files a/javascript-practice/05_nesting/.DS_Store and /dev/null differ diff --git a/javascript-practice/05_nesting/exercises/.DS_Store b/javascript-practice/05_nesting/exercises/.DS_Store deleted file mode 100644 index fc6aeee..0000000 Binary files a/javascript-practice/05_nesting/exercises/.DS_Store and /dev/null differ diff --git a/javascript-practice/05_nesting/exercises/A_nested_loops_exercise/README.html b/javascript-practice/05_nesting/exercises/A_nested_loops_exercise/README.html deleted file mode 100644 index 3ab9f24..0000000 --- a/javascript-practice/05_nesting/exercises/A_nested_loops_exercise/README.html +++ /dev/null @@ -1,261 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Document - - - - - - - - - -
- - - - -
HOME -
- - - -

Loop the Loop

-

Nested Loops are when we write a loop within the body of another loop. The pattern can be useful to - generate - “pairs” of things.

-

Before you start this exercise, make sure you have watched the lecture first.

- -

If you get stuck during this exercise, reference this walkthrough. Only watch enough of the walkthrough to - get - yourself unstuck, then pause the video and pick up the exercise on your own.

- -

If you are comfortable with single loops, then you’ll find nested loops pretty intuitive. Good thing we - practiced - single loops a ton already.

-

-AZ

-

0. Reading Nested Loops.

-

Create a new folder named A_nested_loops, this is where you’ll save all of your files. Predict - what - would print when executing each of the snippets below. Test your prediction by typing the snippet into their - own - files - and executing the program. Don’t copy and paste.

-

Write the below code into a file named snippet-1.js. Make a prediction for what it will print. - Run - it. -

- -

Write the below code into a file named snippet-2.js. Make a prediction for what it will print. - Run - it. -

- -

Write the below code into a file named snippet-3.js. Make a prediction for what it will print. - Run - it. -

- -

Write the below code into a file named snippet-4.js. Make a prediction for what it will print. - Run - it. -

- -

Write the below code into a file named snippet-5.js. Make a prediction for what it will print. - Run - it. -

- -

1. Writing Nested Loops.

-

In this section of the exercise you’ll be prompted to write a function to accomplish a specific task. Read - the - description and look at the example output to figure out what should be implemented within the function. Write - each - function to a separate file in the A_nested_loops_exercise folder and test your work by running - the - file. -

-

pairPrint

-

Create a pair-print.js file and solve the function below:

- -

printCombinations

-

Create a print-combinations.js file and solve the function below:

- -

twoSum

-

Create a two-sum.js file and solve the function below:

- -

Walkthrough

-

Watch the walkthrough in it’s entirety so you don’t miss out on any knowledge. - walkthrough - even - -

- - - diff --git a/javascript-practice/05_nesting/exercises/A_nested_loops_exercise/README.md b/javascript-practice/05_nesting/exercises/A_nested_loops_exercise/README.md deleted file mode 100644 index 726c65b..0000000 --- a/javascript-practice/05_nesting/exercises/A_nested_loops_exercise/README.md +++ /dev/null @@ -1,178 +0,0 @@ -# Loop the Loop - -_Nested Loops_ are when we write a loop within the body of another loop. The pattern can be useful -to generate "pairs" of things. - -Before you start this exercise, make sure you have watched the lecture first. - -+ [Lecture](https://youtu.be/68VmjvtOGGI) - -If you get stuck during this exercise, reference this walkthrough. Only watch enough of the -walkthrough to get yourself unstuck, then pause the video and pick up the exercise on your own. - -+ [Walkthrough](https://youtu.be/seiovGIFokM) - -If you are comfortable with single loops, then you'll find nested loops pretty intuitive. Good thing -we practiced single loops a ton already. - --AZ - -## 0. Reading Nested Loops. - -Create a new folder named `A_nested_loops`, this is where you'll save all of your files. Predict -what would print when executing each of the snippets below. Test your prediction by typing the -snippet into their own files and executing the program. Don't copy and paste. - -Write the below code into a file named `snippet-1.js`. Make a prediction for what it will print. Run -it. - -```js -// snippet 1 -for (let i = 1; i <= 4; i++) { - for (let j = 1; j <= 3; j++) { - console.log(i, j); - } -} -``` - -Write the below code into a file named `snippet-2.js`. Make a prediction for what it will print. Run -it. - -```js -// snippet 2 -for (let n = 0; n < 2; n++) { - console.log("n=" + n); - for (let m = 0; m < 5; m++) { - console.log(" m=" + m); - } - console.log("n=" + n); -} -``` - -Write the below code into a file named `snippet-3.js`. Make a prediction for what it will print. Run -it. - -```js -// snippet 3 -let friends = ["philip", "abby", "phelipe", "simcha"]; - -for (let i = 0; i < friends.length; i++) { - for (let j = 0; j < friends.length; j++) { - console.log(friends[i], friends[j]); - } -} -``` - -Write the below code into a file named `snippet-4.js`. Make a prediction for what it will print. Run -it. - -```js -// snippet 4 -let locations = ["flatbush", "williamsburg", "bushwick", "greenpoint"]; - -for (let i = 0; i < locations.length; i++) { - for (let j = i + 1; j < locations.length; j++) { - console.log(locations[i], locations[j]); - } -} -``` - -Write the below code into a file named `snippet-5.js`. Make a prediction for what it will print. Run -it. - -```js -// snippet 5 -let colors = ["red", "purple", "orange"]; - -for (let i = 0; i < colors.length; i++) { - let colorStr = colors[i]; - console.log(colorStr); - - for (let j = 0; j < colorStr.length; j++) { - let char = colorStr[j]; - console.log(char); - } -} -``` - -## 1. Writing Nested Loops. - -In this section of the exercise you'll be prompted to write a function to accomplish a specific -task. Read the description and look at the example output to figure out what should be implemented -within the function. Write each function to a separate file in the `A_nested_loops_exercise` folder -and test your work by running the file. - -### pairPrint - -Create a `pair-print.js` file and solve the function below: - -```js -// Write a function `pairPrint` that accepts an array as an argument. The function should print -// all unique pairs of elements in the array. The function doesn't need to return any value. It -// should just print to the terminal. - -pairPrint(["artichoke", "broccoli", "carrot", "daikon"]); -// prints -// artichoke - broccoli -// artichoke - carrot -// artichoke - daikon -// broccoli - carrot -// broccoli - daikon -// carrot - daikon - -pairPrint(["apple", "banana", "clementine"]); -// prints -// apple - banana -// apple - clementine -// banana - clementine -``` - -### printCombinations - -Create a `print-combinations.js` file and solve the function below: - -```js -// Write a function `printCombinations`that accepts two arrays as arguments. The function should -// print all combinations of the elements generated by taking an element from the first array and -// and an element from the second array. The function doesn't need to return any value. It -// should just print to the terminal. - -let colors = ["gray", "cream", "cyan"]; -let clothes = ["shirt", "flannel"]; -printCombinations(colors, clothes); -// prints -// gray shirt -// gray flannel -// cream shirt -// cream flannel -// cyan shirt -// cyan flannel - -printCombinations(["hot", "cold"], ["soup", "tea"]); -// prints -// hot soup -// hot tea -// cold soup -// cold tea -``` - -### twoSum - -Create a `two-sum.js` file and solve the function below: - -```js -// Write a function `twoSum(numbers, target)` that accepts an array of numbers and a target number -// as an argument. The function should return a boolean indicating whether or not there exists a pair -// of distinct elements in the array that sum to the target. - -console.log(twoSum([2, 3, 5, 9], 7)); // true -console.log(twoSum([2, 3, 5, 9], 4)); // false -console.log(twoSum([6, 3, 4], 10)); // true -console.log(twoSum([6, 5, 1], 10)); // false -``` - -## Walkthrough - - - - diff --git a/javascript-practice/05_nesting/exercises/A_nested_loops_exercise/right.html b/javascript-practice/05_nesting/exercises/A_nested_loops_exercise/right.html deleted file mode 100644 index 6c06802..0000000 --- a/javascript-practice/05_nesting/exercises/A_nested_loops_exercise/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -A_nested_loops_exercise - - - Stable - - - - - - - - - - - - -
Folders
<Go Back>
-
- - - - -
FileFileFileFileFileFileFileFile
README.html right.html README.md 
- -

-Folders: 1
-Files: 3
-Size of all files: 46096 KB

- - - \ No newline at end of file diff --git a/javascript-practice/05_nesting/exercises/B_two_dimensional_arrays_exercise/README.html b/javascript-practice/05_nesting/exercises/B_two_dimensional_arrays_exercise/README.html deleted file mode 100644 index 57fb58a..0000000 --- a/javascript-practice/05_nesting/exercises/B_two_dimensional_arrays_exercise/README.html +++ /dev/null @@ -1,255 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Document - - - - - - - - - -
- - - - -
HOME -
- - - -

Adding a New Dimension

-

A two-dimensional array is an array that contains other arrays as elements. Programmers use - multidimensional - arrays when dealing with data that has many layers. It is also useful to represent a grid space.

-

Before you start this exercise, make sure you have watched the lecture first.

- -

If you get stuck during this exercise, reference this walkthrough. Only watch enough of the walkthrough to - get - yourself unstuck, then pause the video and pick up the exercise on your own.

- -

Loops in loops? Arrays in arrays? What’s next, functions in functions?

-

-AZ

-

Instructions

-

Create a new folder named B_two_dimensional_arrays_exercise, this is where you’ll save all of - your - files. Solve each of the prompts below. Create a new file for each prompt and execute your code to see if it - matches - the example output.

-

Heads up. Not all of the problems below require 2D arrays. It’s up to you to figure out what is the right - tool - for - the job.

-

print2d

-

Create a print-2d.js file and solve the function below:

- -

makeMatrix

-

Create a make-matrix.js file and solve the function below:

- -

totalProduct

-

Create a total-product.js file and solve the function below:

- -

twoSumPairs

-

Create a two-sum-pairs.js file and solve the function below:

- -

zipper

-

Create a zipper.js file and solve the function below:

- -

Walkthrough

-

Watch the walkthrough in it’s entirety so you don’t miss out on any knowledge. - walkthrough - even - -

- - - diff --git a/javascript-practice/05_nesting/exercises/B_two_dimensional_arrays_exercise/README.md b/javascript-practice/05_nesting/exercises/B_two_dimensional_arrays_exercise/README.md deleted file mode 100644 index 77fbf1c..0000000 --- a/javascript-practice/05_nesting/exercises/B_two_dimensional_arrays_exercise/README.md +++ /dev/null @@ -1,165 +0,0 @@ -# Adding a New Dimension - -A _two-dimensional array_ is an array that contains other arrays as elements. Programmers use -multidimensional arrays when dealing with data that has many layers. It is also useful to represent -a grid space. - -Before you start this exercise, make sure you have watched the lecture first. - -+ [Lecture](https://youtu.be/CDpJ4PIWAlE) - -If you get stuck during this exercise, reference this walkthrough. Only watch enough of the -walkthrough to get yourself unstuck, then pause the video and pick up the exercise on your own. - -+ [Walkthrough](https://youtu.be/ajSXu2D2gzg) - -Loops in loops? Arrays in arrays? What's next, functions in functions? - --AZ - -## Instructions - -Create a new folder named `B_two_dimensional_arrays_exercise`, this is where you'll save all of your -files. Solve each of the prompts below. Create a new file for each prompt and execute your code to -see if it matches the example output. - -Heads up. Not all of the problems below require 2D arrays. It's up to you to figure out what is the -right tool for the job. - -### print2d - -Create a `print-2d.js` file and solve the function below: - -```js -// Write a function `print2d` that accepts a two-dimensional array as an argument. The function -// should print all inner elements of the array. - -let array1 = [ - ["a", "b", "c", "d"], - ["e", "f"], - ["g", "h", "i"], -]; -print2d(array1); -// prints -// a -// b -// c -// d -// e -// f -// g -// h -// i - -let array2 = [[9, 3, 4], [11], [42, 100]]; -print2d(array2); -// prints -// 9 -// 3 -// 4 -// 11 -// 42 -// 100 -``` - -### makeMatrix - -Create a `make-matrix.js` file and solve the function below: - -```js -// Write a function `makeMatrix(m, n, value)` that accepts three arguments. The function should return -// a 2-dimensional array of height `m` and width `n` that contains the `value` as every element. - -console.log(makeMatrix(3, 5, null)); -// [ -// [ null, null, null, null, null ], -// [ null, null, null, null, null ], -// [ null, null, null, null, null ] -// ] - -console.log(makeMatrix(4, 2, "x")); -// [ -// [ 'x', 'x' ], -// [ 'x', 'x' ], -// [ 'x', 'x' ], -// [ 'x', 'x' ] -// ] - -console.log(makeMatrix(2, 2, 0)); -// [ -// [ 0, 0 ], -// [ 0, 0 ] -// ] -``` - -### totalProduct - -Create a `total-product.js` file and solve the function below: - -```js -// Write a function `totalProduct(array)` that accepts a 2D array of numbers. The function should return -// the total product of all numbers in the array. - -let array1 = [ - [3, 5, 2], - [6, 2], -]; -console.log(totalProduct(array1)); // 360 - -let array2 = [ - [4, 6], - [2, 3], - [1, 2], -]; -console.log(totalProduct(array2)); // 288 -``` - -### twoSumPairs - -Create a `two-sum-pairs.js` file and solve the function below: - -```js -// Write a function `twoSumPairs(numbers, target)` that accepts an array of numbers and a target number -// as arguments. The function should return a 2D array containing all unique pairs of elements that -// sum to the target. - -console.log(twoSumPairs([2, 3, 4, 6, 5], 8)); // [ [2, 6], [3, 5] ] -console.log(twoSumPairs([10, 7, 4, 5, 2], 12)); // [ [10, 2], [7, 5] ] -console.log(twoSumPairs([3, 9, 8], 11)); // [ [3, 8] ] -console.log(twoSumPairs([3, 9, 8], 10)); // [ ] -``` - -### zipper - -Create a `zipper.js` file and solve the function below: - -```js -// Write a function `zipper` that accepts two arrays as arguments. The function should return a 2D -// array containing pairs of elements at the same indices. You can assume that the arrays have the -// same length. - -let array1 = ["a", "b", "c", "d"]; -let array2 = [-1, -2, -3, -4]; -console.log(zipper(array1, array2)); -// [ -// ['a', -1], -// ['b', -2], -// ['c', -3], -// ['d', -4], -// ] - -let array3 = ["whisper", "talk", "shout"]; -let array4 = ["quiet", "normal", "loud"]; -console.log(zipper(array3, array4)); -// [ -// ['whisper', 'quiet'], -// ['talk', 'normal'], -// ['shout', 'loud'], -// ] -``` - -## Walkthrough - - - - diff --git a/javascript-practice/05_nesting/exercises/B_two_dimensional_arrays_exercise/right.html b/javascript-practice/05_nesting/exercises/B_two_dimensional_arrays_exercise/right.html deleted file mode 100644 index 35bb8b4..0000000 --- a/javascript-practice/05_nesting/exercises/B_two_dimensional_arrays_exercise/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -B_two_dimensional_arrays_exercise - - - Stable - - - - - - - - - - - - -
Folders
<Go Back>
-
- - - - -
FileFileFileFileFileFileFileFile
README.html right.html README.md 
- -

-Folders: 1
-Files: 3
-Size of all files: 43450 KB

- - - \ No newline at end of file diff --git a/javascript-practice/05_nesting/exercises/C_more_problems_exercise/README.html b/javascript-practice/05_nesting/exercises/C_more_problems_exercise/README.html deleted file mode 100644 index db82950..0000000 --- a/javascript-practice/05_nesting/exercises/C_more_problems_exercise/README.html +++ /dev/null @@ -1,221 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Document - - - - - - - - - -
- - - - -
HOME -
- - - -

Problems Make Perfect

-

More problems === more practice.

-

If you get stuck during this exercise, reference this walkthrough. Only watch enough of the walkthrough to - get - yourself unstuck, then pause the video and pick up the exercise on your own.

-

I’ll keep writing problems if you keep coding. Deal?

-

-AZ

-

Instructions

-

Create a new folder named C_more_problems, this is where you’ll save all of your files. Solve - each - of - the prompts below. Create a new file for each prompt and execute your code to see if it matches the example - output. -

-

This problem set tests a few different concepts. Any concepts we’ve covered are fair game. Some of the - following - problems are tough, but they only require knowledge of concepts we’ve already covered. Give them a shot.

-

removeDupes

-

Create a remove-dupes.js file and solve the function below:

- -

removeVowels

-

Create a remove-vowels.js file and solve the function below:

- -

spam

-

Create a spam.js file and solve the function below:

- -

removeFirstVowel

-

Create a remove-first-vowel.js file and solve the function below:

- -

shortenLongWords

-

Create a shorten-long-words.js file and solve the function below:

- - - - diff --git a/javascript-practice/05_nesting/exercises/C_more_problems_exercise/README.md b/javascript-practice/05_nesting/exercises/C_more_problems_exercise/README.md deleted file mode 100644 index e4d85f8..0000000 --- a/javascript-practice/05_nesting/exercises/C_more_problems_exercise/README.md +++ /dev/null @@ -1,95 +0,0 @@ -# Problems Make Perfect - -More problems `===` more practice. - -If you get stuck during this exercise, reference this walkthrough. Only watch enough of the -walkthrough to get yourself unstuck, then pause the video and pick up the exercise on your own. - -I'll keep writing problems if you keep coding. Deal? - --AZ - -## Instructions - -Create a new folder named `C_more_problems`, this is where you'll save all of your files. Solve each -of the prompts below. Create a new file for each prompt and execute your code to see if it matches -the example output. - -This problem set tests a few different concepts. Any concepts we've covered are fair game. Some of -the following problems are tough, but they only require knowledge of concepts we've already covered. -Give them a shot. - -### removeDupes - -Create a `remove-dupes.js` file and solve the function below: - -```js -// Write a function `removeDupes` that accepts an array as an argument. The function should return a -// new array where each element only appears once. - -console.log(removeDupes(["x", "y", "y", "x", "z"])); // ['x', 'y', 'z'] -console.log(removeDupes([false, false, true, false])); // [false, true] -console.log(removeDupes([42, 5, 7, 42, 7, 3, 7, 7])); // [42, 5, 7, 3] -``` - -### removeVowels - -Create a `remove-vowels.js` file and solve the function below: - -```js -// Write a function `removeVowels` that accepts a string as an argument. The function should return -// a version of the string where all vowels are removed. - -console.log(removeVowels("jello")); // jll -console.log(removeVowels("sensitivity")); // snstvty -console.log(removeVowels("cellar door")); // cllr dr -``` - -### spam - -Create a `spam.js` file and solve the function below: - -```js -// Write a function `spam` that accepts a 2D array as an argument. The array contains pairs as elements. -// The first element of every pair is a number and the second element is a word. The function should -// return a string containing the words repeated the specified number of times. See the examples. - -let array1 = [ - ["hi", 3], - ["bye", 2], -]; -console.log(spam(array1)); // 'hi hi hi bye bye' - -let array2 = [ - ["cat", 1], - ["dog", 2], - ["bird", 4], -]; -console.log(spam(array2)); // 'cat dog dog bird bird bird bird' -``` - -### removeFirstVowel - -Create a `remove-first-vowel.js` file and solve the function below: - -```js -// Write a function `removeFirstVowel` that accepts a string as an argument. The function should return -// the string with it's first vowel removed. - -console.log(removeFirstVowel("volcano")); // 'vlcano' -console.log(removeFirstVowel("celery")); // 'clery' -console.log(removeFirstVowel("juice")); // 'jice' -``` - -### shortenLongWords - -Create a `shorten-long-words.js` file and solve the function below: - -```js -// Write a function `shortenLongWords` that accepts a sentence string as an argument. The function -// should return the same sentence where words longer than 4 characters have their vowels removed. - -console.log(shortenLongWords("they are very noble people")); // 'they are very nbl ppl' -console.log(shortenLongWords("stick with it")); // 'stck with it' -console.log(shortenLongWords("ballerina, you must have seen her")); // 'bllrna, you must have seen her' -``` diff --git a/javascript-practice/05_nesting/exercises/C_more_problems_exercise/right.html b/javascript-practice/05_nesting/exercises/C_more_problems_exercise/right.html deleted file mode 100644 index bf8dfac..0000000 --- a/javascript-practice/05_nesting/exercises/C_more_problems_exercise/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -C_more_problems_exercise - - - Stable - - - - - - - - - - - - -
Folders
<Go Back>
-
- - - - -
FileFileFileFileFileFileFileFile
README.html right.html README.md 
- -

-Folders: 1
-Files: 3
-Size of all files: 34259 KB

- - - \ No newline at end of file diff --git a/javascript-practice/05_nesting/exercises/right.html b/javascript-practice/05_nesting/exercises/right.html deleted file mode 100644 index 806d517..0000000 --- a/javascript-practice/05_nesting/exercises/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -exercises - - - Stable - - - - - - - - - - - - -
Folders
<Go Back> A_nested...rcise B_two_di...rcise C_more_p...rcise
-
- - - - -
FileFileFileFileFileFileFileFile
right.html 
- -

-Folders: 4
-Files: 1
-Size of all files: 13986 KB

- - - \ No newline at end of file diff --git a/javascript-practice/05_nesting/right.html b/javascript-practice/05_nesting/right.html deleted file mode 100644 index a6c0865..0000000 --- a/javascript-practice/05_nesting/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -05_nesting - - - Stable - - - - - - - - - - - - -
Folders
<Go Back> exercises solutions
-
- - - - -
FileFileFileFileFileFileFileFile
right.html 
- -

-Folders: 3
-Files: 1
-Size of all files: 13825 KB

- - - \ No newline at end of file diff --git a/javascript-practice/05_nesting/solutions/.DS_Store b/javascript-practice/05_nesting/solutions/.DS_Store deleted file mode 100644 index 66b049e..0000000 Binary files a/javascript-practice/05_nesting/solutions/.DS_Store and /dev/null differ diff --git a/javascript-practice/05_nesting/solutions/A_nested_loops_solution/pair-print.js b/javascript-practice/05_nesting/solutions/A_nested_loops_solution/pair-print.js deleted file mode 100644 index 1dda0fb..0000000 --- a/javascript-practice/05_nesting/solutions/A_nested_loops_solution/pair-print.js +++ /dev/null @@ -1,26 +0,0 @@ -// Write a function `pairPrint` that accepts an array as an argument. The function should print -// all unique pairs of elements in the array. The function doesn't need to return any value. It -// should just print to the terminal. - -let pairPrint = function ( array ) { - for ( let i = 0; i < array.length; i++ ) { - for ( let j = i + 1; j < array.length; j++ ) { - console.log( array[ i ] + ' - ' + array[ j ] ); - } - } -}; - -pairPrint( [ "artichoke", "broccoli", "carrot", "daikon" ] ); -// prints -// artichoke - broccoli -// artichoke - carrot -// artichoke - daikon -// broccoli - carrot -// broccoli - daikon -// carrot - daikon - -pairPrint( [ "apple", "banana", "clementine" ] ); -// prints -// apple - banana -// apple - clementine -// banana - clementine diff --git a/javascript-practice/05_nesting/solutions/A_nested_loops_solution/print-combinations.js b/javascript-practice/05_nesting/solutions/A_nested_loops_solution/print-combinations.js deleted file mode 100644 index c979205..0000000 --- a/javascript-practice/05_nesting/solutions/A_nested_loops_solution/print-combinations.js +++ /dev/null @@ -1,34 +0,0 @@ -// Write a function `printCombinations`that accepts two arrays as arguments. The function should -// print all combinations of the elements generated by taking an element from the first array and -// and an element from the second array. The function doesn't need to return any value. It -// should just print to the terminal. - - -let printCombinations = function ( array1, array2 ) { - for ( let i = 0; i < array1.length; i++ ) { - let ele1 = array1[ i ]; - - for ( let j = 0; j < array2.length; j++ ) { - let ele2 = array2[ j ]; - console.log( ele1, ele2 ); - } - } -}; - -let colors = [ "gray", "cream", "cyan" ]; -let clothes = [ "shirt", "flannel" ]; -printCombinations( colors, clothes ); -// prints -// gray shirt -// gray flannel -// cream shirt -// cream flannel -// cyan shirt -// cyan flannel - -printCombinations( [ "hot", "cold" ], [ "soup", "tea" ] ); -// prints -// hot soup -// hot tea -// cold soup -// cold tea diff --git a/javascript-practice/05_nesting/solutions/A_nested_loops_solution/right.html b/javascript-practice/05_nesting/solutions/A_nested_loops_solution/right.html deleted file mode 100644 index 2766bbd..0000000 --- a/javascript-practice/05_nesting/solutions/A_nested_loops_solution/right.html +++ /dev/null @@ -1,552 +0,0 @@ - - - - - -A_nested_loops_solution - - - Stable - - - - - - - - - - - - -
Folders
<Go Back>
-
- - - - - -
FileFileFileFileFileFileFileFile
right.html print-co...ns.js snippet-1.js snippet-2.js snippet-3.js snippet-4.js snippet-5.js two-sum.js 
pair-print.js 
- -

-Folders: 1
-Files: 9
-Size of all files: 18700 KB

- - - \ No newline at end of file diff --git a/javascript-practice/05_nesting/solutions/A_nested_loops_solution/snippet-1.js b/javascript-practice/05_nesting/solutions/A_nested_loops_solution/snippet-1.js deleted file mode 100644 index b63d6b8..0000000 --- a/javascript-practice/05_nesting/solutions/A_nested_loops_solution/snippet-1.js +++ /dev/null @@ -1,19 +0,0 @@ -// snippet 1 -for ( let i = 1; i <= 4; i++ ) { - for ( let j = 1; j <= 3; j++ ) { - console.log( i, j ); - } -} - -// 1 1 -// 1 2 -// 1 3 -// 2 1 -// 2 2 -// 2 3 -// 3 1 -// 3 2 -// 3 3 -// 4 1 -// 4 2 -// 4 3 diff --git a/javascript-practice/05_nesting/solutions/A_nested_loops_solution/snippet-2.js b/javascript-practice/05_nesting/solutions/A_nested_loops_solution/snippet-2.js deleted file mode 100644 index c883c7a..0000000 --- a/javascript-practice/05_nesting/solutions/A_nested_loops_solution/snippet-2.js +++ /dev/null @@ -1,23 +0,0 @@ -// snippet 2 -for ( let n = 0; n < 2; n++ ) { - console.log( "n=" + n ); - for ( let m = 0; m < 5; m++ ) { - console.log( " m=" + m ); - } - console.log( "n=" + n ); -} - -// n=0 -// m=0 -// m=1 -// m=2 -// m=3 -// m=4 -// n=0 -// n=1 -// m=0 -// m=1 -// m=2 -// m=3 -// m=4 -// n=1 diff --git a/javascript-practice/05_nesting/solutions/A_nested_loops_solution/snippet-3.js b/javascript-practice/05_nesting/solutions/A_nested_loops_solution/snippet-3.js deleted file mode 100644 index 80498c4..0000000 --- a/javascript-practice/05_nesting/solutions/A_nested_loops_solution/snippet-3.js +++ /dev/null @@ -1,25 +0,0 @@ -// snippet 3 -let friends = [ "philip", "abby", "phelipe", "simcha" ]; - -for ( let i = 0; i < friends.length; i++ ) { - for ( let j = 0; j < friends.length; j++ ) { - console.log( friends[ i ], friends[ j ] ); - } -} - -// philip philip -// philip abby -// philip phelipe -// philip simcha -// abby philip -// abby abby -// abby phelipe -// abby simcha -// phelipe philip -// phelipe abby -// phelipe phelipe -// phelipe simcha -// simcha philip -// simcha abby -// simcha phelipe -// simcha simcha diff --git a/javascript-practice/05_nesting/solutions/A_nested_loops_solution/snippet-4.js b/javascript-practice/05_nesting/solutions/A_nested_loops_solution/snippet-4.js deleted file mode 100644 index b096864..0000000 --- a/javascript-practice/05_nesting/solutions/A_nested_loops_solution/snippet-4.js +++ /dev/null @@ -1,15 +0,0 @@ -// snippet 4 -let locations = [ "flatbush", "williamsburg", "bushwick", "greenpoint" ]; - -for ( let i = 0; i < locations.length; i++ ) { - for ( let j = i + 1; j < locations.length; j++ ) { - console.log( locations[ i ], locations[ j ] ); - } -} - -// flatbush williamsburg -// flatbush bushwick -// flatbush greenpoint -// williamsburg bushwick -// williamsburg greenpoint -// bushwick greenpoint diff --git a/javascript-practice/05_nesting/solutions/A_nested_loops_solution/snippet-5.js b/javascript-practice/05_nesting/solutions/A_nested_loops_solution/snippet-5.js deleted file mode 100644 index f89fd34..0000000 --- a/javascript-practice/05_nesting/solutions/A_nested_loops_solution/snippet-5.js +++ /dev/null @@ -1,31 +0,0 @@ -// snippet 5 -let colors = [ "red", "purple", "orange" ]; - -for ( let i = 0; i < colors.length; i++ ) { - let colorStr = colors[ i ]; - console.log( colorStr ); - - for ( let j = 0; j < colorStr.length; j++ ) { - let char = colorStr[ j ]; - console.log( char ); - } -} - -// red -// r -// e -// d -// purple -// p -// u -// r -// p -// l -// e -// orange -// o -// r -// a -// n -// g -// e diff --git a/javascript-practice/05_nesting/solutions/A_nested_loops_solution/two-sum.js b/javascript-practice/05_nesting/solutions/A_nested_loops_solution/two-sum.js deleted file mode 100644 index b3d6cd6..0000000 --- a/javascript-practice/05_nesting/solutions/A_nested_loops_solution/two-sum.js +++ /dev/null @@ -1,20 +0,0 @@ -// Write a function `twoSum(numbers, target)` that accepts an array of numbers and a target number -// as an argument. The function should return a boolean indicating whether or not there exists a pair -// of distinct elements in the array that sum to the target. - -let twoSum = function ( numbers, target ) { - for ( let i = 0; i < numbers.length; i++ ) { - for ( let j = i + 1; j < numbers.length; j++ ) { - if ( numbers[ i ] + numbers[ j ] === target ) { - return true; - } - } - } - - return false; -}; - -console.log( twoSum( [ 2, 3, 5, 9 ], 7 ) ); // true -console.log( twoSum( [ 2, 3, 5, 9 ], 4 ) ); // false -console.log( twoSum( [ 6, 3, 4 ], 10 ) ); // true -console.log( twoSum( [ 6, 5, 1 ], 10 ) ); // false diff --git a/javascript-practice/05_nesting/solutions/B_two_dimensional_arrays_solution/make-matrix.js b/javascript-practice/05_nesting/solutions/B_two_dimensional_arrays_solution/make-matrix.js deleted file mode 100644 index 410fc23..0000000 --- a/javascript-practice/05_nesting/solutions/B_two_dimensional_arrays_solution/make-matrix.js +++ /dev/null @@ -1,40 +0,0 @@ -// Write a function `makeMatrix(m, n, value)` that accepts three arguments. The function should return -// a 2-dimensional array of height `m` and width `n` that contains the `value` as every element. - -let makeMatrix = function ( m, n, value ) { - let matrix = []; - - for ( let i = 0; i < m; i++ ) { - let row = []; - - for ( let j = 0; j < n; j++ ) { - row.push( value ); - } - - matrix.push( row ); - } - - - return matrix; -}; - -console.log( makeMatrix( 3, 5, null ) ); -// [ -// [ null, null, null, null, null ], -// [ null, null, null, null, null ], -// [ null, null, null, null, null ] -// ] - -console.log( makeMatrix( 4, 2, "x" ) ); -// [ -// [ 'x', 'x' ], -// [ 'x', 'x' ], -// [ 'x', 'x' ], -// [ 'x', 'x' ] -// ] - -console.log( makeMatrix( 2, 2, 0 ) ); -// [ -// [ 0, 0 ], -// [ 0, 0 ] -// ] diff --git a/javascript-practice/05_nesting/solutions/B_two_dimensional_arrays_solution/print-2d.js b/javascript-practice/05_nesting/solutions/B_two_dimensional_arrays_solution/print-2d.js deleted file mode 100644 index b51909e..0000000 --- a/javascript-practice/05_nesting/solutions/B_two_dimensional_arrays_solution/print-2d.js +++ /dev/null @@ -1,43 +0,0 @@ -// Write a function `print2d` that accepts a two-dimensional array as an argument. The function -// should print all inner elements of the array. - -let print2d = function ( array ) { - for ( let i = 0; i < array.length; i++ ) { - let subarray = array[ i ]; - for ( let j = 0; j < subarray.length; j++ ) { - console.log( subarray[ j ] ); - } - } -}; - - -let array1 = [ - [ "a", "b", "c", "d" ], - [ "e", "f" ], - [ "g", "h", "i" ], -]; -print2d( array1 ); -// prints -// a -// b -// c -// d -// e -// f -// g -// h -// i - -let array2 = [ - [ 9, 3, 4 ], - [ 11 ], - [ 42, 100 ] -]; -print2d( array2 ); -// prints -// 9 -// 3 -// 4 -// 11 -// 42 -// 100 diff --git a/javascript-practice/05_nesting/solutions/B_two_dimensional_arrays_solution/right.html b/javascript-practice/05_nesting/solutions/B_two_dimensional_arrays_solution/right.html deleted file mode 100644 index 80ab991..0000000 --- a/javascript-practice/05_nesting/solutions/B_two_dimensional_arrays_solution/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -B_two_dimensional_arrays_solution - - - Stable - - - - - - - - - - - - -
Folders
<Go Back>
-
- - - - -
FileFileFileFileFileFileFileFile
right.html make-matrix.js print-2d.js total-product.js two-sum-pairs.js zipper.js 
- -

-Folders: 1
-Files: 6
-Size of all files: 18064 KB

- - - \ No newline at end of file diff --git a/javascript-practice/05_nesting/solutions/B_two_dimensional_arrays_solution/total-product.js b/javascript-practice/05_nesting/solutions/B_two_dimensional_arrays_solution/total-product.js deleted file mode 100644 index fab11c3..0000000 --- a/javascript-practice/05_nesting/solutions/B_two_dimensional_arrays_solution/total-product.js +++ /dev/null @@ -1,29 +0,0 @@ -// Write a function `totalProduct(array)` that accepts a 2D array of numbers. The function should return -// the total product of all numbers in the array. - -let totalProduct = function ( array ) { - let product = 1; - - for ( let i = 0; i < array.length; i++ ) { - let subarray = array[ i ]; - - for ( let j = 0; j < subarray.length; j++ ) { - product *= subarray[ j ]; - } - } - - return product; -}; - -let array1 = [ - [ 3, 5, 2 ], - [ 6, 2 ], -]; -console.log( totalProduct( array1 ) ); // 360 - -let array2 = [ - [ 4, 6 ], - [ 2, 3 ], - [ 1, 2 ], -]; -console.log( totalProduct( array2 ) ); // 288 diff --git a/javascript-practice/05_nesting/solutions/B_two_dimensional_arrays_solution/two-sum-pairs.js b/javascript-practice/05_nesting/solutions/B_two_dimensional_arrays_solution/two-sum-pairs.js deleted file mode 100644 index c98f900..0000000 --- a/javascript-practice/05_nesting/solutions/B_two_dimensional_arrays_solution/two-sum-pairs.js +++ /dev/null @@ -1,27 +0,0 @@ -// Write a function `twoSumPairs(numbers, target)` that accepts an array of numbers and a target number -// as arguments. The function should return a 2D array containing all unique pairs of elements that -// sum to the target. - -let twoSumPairs = function ( numbers, target ) { - let pairs = []; - - for ( let i = 0; i < numbers.length; i++ ) { - let num1 = numbers[ i ]; - - for ( let j = i + 1; j < numbers.length; j++ ) { - let num2 = numbers[ j ]; - - if ( num1 + num2 === target ) { - let pair = [ num1, num2 ]; - pairs.push( pair ); - } - } - } - - return pairs; -}; - -console.log( twoSumPairs( [ 2, 3, 4, 6, 5 ], 8 ) ); // [ [2, 6], [3, 5] ] -console.log( twoSumPairs( [ 10, 7, 4, 5, 2 ], 12 ) ); // [ [10, 2], [7, 5] ] -console.log( twoSumPairs( [ 3, 9, 8 ], 11 ) ); // [ [3, 8] ] -console.log( twoSumPairs( [ 3, 9, 8 ], 10 ) ); // [ ] diff --git a/javascript-practice/05_nesting/solutions/B_two_dimensional_arrays_solution/zipper.js b/javascript-practice/05_nesting/solutions/B_two_dimensional_arrays_solution/zipper.js deleted file mode 100644 index d65fcf1..0000000 --- a/javascript-practice/05_nesting/solutions/B_two_dimensional_arrays_solution/zipper.js +++ /dev/null @@ -1,35 +0,0 @@ -// Write a function `zipper` that accepts two arrays as arguments. The function should return a 2D -// array containing pairs of elements at the same indices. - - -let zipper = function ( arr1, arr2 ) { - let result = []; - - for ( let i = 0; i < arr1.length; i++ ) { - let el1 = arr1[ i ]; - let el2 = arr2[ i ]; - let pair = [ el1, el2 ]; - result.push( pair ); - } - - return result; -}; - -let array1 = [ "a", "b", "c", "d" ]; -let array2 = [ -1, -2, -3, -4 ]; -console.log( zipper( array1, array2 ) ); -// [ -// ['a', -1], -// ['b', -2], -// ['c', -3], -// ['d', -4], -// ] - -let array3 = [ "whisper", "talk", "shout" ]; -let array4 = [ "quiet", "normal", "loud" ]; -console.log( zipper( array3, array4 ) ); -// [ -// ['whisper', 'quiet'], -// ['talk', 'normal'], -// ['shout', 'loud'], -// ] diff --git a/javascript-practice/05_nesting/solutions/C_more_problems_solution/remove-dupes.js b/javascript-practice/05_nesting/solutions/C_more_problems_solution/remove-dupes.js deleted file mode 100644 index 55cd504..0000000 --- a/javascript-practice/05_nesting/solutions/C_more_problems_solution/remove-dupes.js +++ /dev/null @@ -1,19 +0,0 @@ -// Write a function `removeDupes` that accepts an array as an argument. The function should return a -// new array where each element only appears once. - -let removeDupes = function ( array ) { - let uniques = []; - - for ( let i = 0; i < array.length; i++ ) { - let ele = array[ i ]; - if ( !uniques.includes( ele ) ) { - uniques.push( ele ); - } - } - - return uniques; -}; - -console.log( removeDupes( [ "x", "y", "y", "x", "z" ] ) ); // ['x', 'y', 'z'] -console.log( removeDupes( [ false, false, true, false ] ) ); // [false, true] -console.log( removeDupes( [ 42, 5, 7, 42, 7, 3, 7, 7 ] ) ); // [42, 5, 7, 3] diff --git a/javascript-practice/05_nesting/solutions/C_more_problems_solution/remove-first-vowel.js b/javascript-practice/05_nesting/solutions/C_more_problems_solution/remove-first-vowel.js deleted file mode 100644 index 12ec5fa..0000000 --- a/javascript-practice/05_nesting/solutions/C_more_problems_solution/remove-first-vowel.js +++ /dev/null @@ -1,21 +0,0 @@ -// Write a function `removeFirstVowel` that accepts a string as an argument. The function should return -// the string with it's first vowel removed. - -let removeFirstVowel = function ( str ) { - let vowels = 'aeiou'; - - for ( let i = 0; i < str.length; i++ ) { - let char = str[ i ]; - if ( vowels.includes( char ) ) { - return str.slice( 0, i ) + str.slice( i + 1 ); - } - } - - return str; -}; - -console.log( removeFirstVowel( "volcano" ) ); // 'vlcano' -console.log( removeFirstVowel( "celery" ) ); // 'clery' -console.log( removeFirstVowel( "juice" ) ); // 'jice' -console.log( removeFirstVowel( "bridge" ) ); // 'brdge' -console.log( removeFirstVowel( "try" ) ); // 'try' diff --git a/javascript-practice/05_nesting/solutions/C_more_problems_solution/remove-vowels.js b/javascript-practice/05_nesting/solutions/C_more_problems_solution/remove-vowels.js deleted file mode 100644 index eb2d0df..0000000 --- a/javascript-practice/05_nesting/solutions/C_more_problems_solution/remove-vowels.js +++ /dev/null @@ -1,20 +0,0 @@ -// Write a function `removeVowels` that accepts a string as an argument. The function should return -// a version of the string where all vowels are removed. - -let removeVowels = function ( str ) { - let newStr = ''; - let vowels = 'aeiou'; - - for ( let i = 0; i < str.length; i++ ) { - let char = str[ i ]; - if ( !vowels.includes( char ) ) { - newStr += char; - } - } - - return newStr; -}; - -console.log( removeVowels( "jello" ) ); // jll -console.log( removeVowels( "sensitivity" ) ); // snstvty -console.log( removeVowels( "cellar door" ) ); // cllr dr diff --git a/javascript-practice/05_nesting/solutions/C_more_problems_solution/right.html b/javascript-practice/05_nesting/solutions/C_more_problems_solution/right.html deleted file mode 100644 index 82a9f4a..0000000 --- a/javascript-practice/05_nesting/solutions/C_more_problems_solution/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -C_more_problems_solution - - - Stable - - - - - - - - - - - - -
Folders
<Go Back>
-
- - - - -
FileFileFileFileFileFileFileFile
right.html remove-dupes.js remove-f...el.js remove-vowels.js shorten-...ds.js spam.js 
- -

-Folders: 1
-Files: 6
-Size of all files: 18146 KB

- - - \ No newline at end of file diff --git a/javascript-practice/05_nesting/solutions/C_more_problems_solution/shorten-long-words.js b/javascript-practice/05_nesting/solutions/C_more_problems_solution/shorten-long-words.js deleted file mode 100644 index 69e2fcc..0000000 --- a/javascript-practice/05_nesting/solutions/C_more_problems_solution/shorten-long-words.js +++ /dev/null @@ -1,38 +0,0 @@ -// Write a function `shortenLongWords` that accepts a sentence string as an argument. The function -// should return the same sentence where words longer than 4 characters have their vowels removed. - -let removeVowels = function ( str ) { - let newStr = ''; - let vowels = 'aeiou'; - - for ( let i = 0; i < str.length; i++ ) { - let char = str[ i ]; - if ( !vowels.includes( char ) ) { - newStr += char; - } - } - - return newStr; -}; - -let shortenLongWords = function ( sentence ) { - let words = sentence.split( ' ' ); - let newWords = []; - - for ( let i = 0; i < words.length; i++ ) { - let word = words[ i ]; - if ( word.length > 4 ) { - let noVowels = removeVowels( word ); - newWords.push( noVowels ); - } else { - // leave it the same - newWords.push( word ); - } - } - - return newWords.join( ' ' ); -}; - -console.log( shortenLongWords( "they are very noble people" ) ); // 'they are very nbl ppl' -console.log( shortenLongWords( "stick with it" ) ); // 'stck with it' -console.log( shortenLongWords( "ballerina, you must have seen her" ) ); // 'bllrna, you must have seen her diff --git a/javascript-practice/05_nesting/solutions/C_more_problems_solution/spam.js b/javascript-practice/05_nesting/solutions/C_more_problems_solution/spam.js deleted file mode 100644 index 90ea5f9..0000000 --- a/javascript-practice/05_nesting/solutions/C_more_problems_solution/spam.js +++ /dev/null @@ -1,32 +0,0 @@ -// Write a function `spam` that accepts a 2D array as an argument. The array contains pairs as elements. -// The first element of every pair is a number and the second element is a word. The function should -// return a string containing the words repeated the specified number of times. See the examples. - -let spam = function ( pairs ) { - let words = []; - - for ( let i = 0; i < pairs.length; i++ ) { - let pair = pairs[ i ]; - let word = pair[ 0 ]; - let num = pair[ 1 ]; - - for ( let j = 0; j < num; j++ ) { - words.push( word ); - } - } - - return words.join( ' ' ); -}; - -let array1 = [ - [ "hi", 3 ], - [ "bye", 2 ], -]; -console.log( spam( array1 ) ); // 'hi hi hi bye bye' - -let array2 = [ - [ "cat", 1 ], - [ "dog", 2 ], - [ "bird", 4 ], -]; -console.log( spam( array2 ) ); // 'cat dog dog bird bird bird bird' diff --git a/javascript-practice/05_nesting/solutions/right.html b/javascript-practice/05_nesting/solutions/right.html deleted file mode 100644 index 37e76f4..0000000 --- a/javascript-practice/05_nesting/solutions/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -solutions - - - Stable - - - - - - - - - - - - -
Folders
<Go Back> A_nested...ution B_two_di...ution C_more_p...ution
-
- - - - -
FileFileFileFileFileFileFileFile
right.html 
- -

-Folders: 4
-Files: 1
-Size of all files: 13986 KB

- - - \ No newline at end of file diff --git a/javascript-practice/06_decomposition_pattern/A_decomposing_problems_exercise/README.html b/javascript-practice/06_decomposition_pattern/A_decomposing_problems_exercise/README.html deleted file mode 100644 index 10de9c8..0000000 --- a/javascript-practice/06_decomposition_pattern/A_decomposing_problems_exercise/README.html +++ /dev/null @@ -1,293 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Document - - - - - - - - - -
- - - - -
HOME -
- - - -

Dividing and Conquering

-

Decomposition is a pattern that programmers use to take a complex problem and break it down into - smaller - sub-problems that can be managed better individually.

-

Before you start this exercise, make sure you have watched the lecture first.

-

If you get stuck during this exercise, reference this walkthrough. Only watch enough of the walkthrough to - get - yourself unstuck, then pause the video and pick up the exercise on your own.

-

This is might be my favorite topic. I think it’s very high leverage because it is relatively easy to - implement - but greatly increases the elegance of your code. Prefer to solve complex problems with simple solutions.

-

-AZ

-

0. Composition

-

Create a new folder named A_decomposing_problems_exercise, this is where you’ll save all of your - files. Predict what would print when executing each of the snippets below. Test your prediction by typing the - snippet into their own files and executing the program. Don’t copy and paste.

-

Write the below code into a file named snippet-1.js. Make a prediction for what it will print. - Run - it.

- -

Write the below code into a file named snippet-2.js. Make a prediction for what it will print. - Run - it.

- -

Write the below code into a file named snippet-3.js. Make a prediction for what it will print. - Run - it.

- -

1. Decomposition

-

In this section of the exercise you’ll be prompted to write a function to accomplish a specific task. Read - the - description and look at the example output to figure out what should be implemented within the function. Write - each function to a separate file in the A_decomposing_problems_exercise folder and test your work - by - running the file.

-

Some (but not all) of the problems below should be decomposed with a helper function.

-

doubleVowel

-

Create a double-vowel.js file and solve the function below:

- -

funnyPhrase

-

Create a funny-phrase.js file and solve the function below:

- -

isPrime

-

Create an is-prime.js file and solve the function below:

- -

pickPrimes

-

Create a pick-primes.js file and solve the function below:

- -

Walkthrough

-

Watch the walkthrough in it’s entirety so you don’t miss out on any knowledge. - walkthrough - even if you were able to complete this exercise easily, so you don’t miss any tips. Watch it in 1.5x speed if - you - like.

- - - diff --git a/javascript-practice/06_decomposition_pattern/A_decomposing_problems_exercise/README.md b/javascript-practice/06_decomposition_pattern/A_decomposing_problems_exercise/README.md deleted file mode 100644 index 4ae5207..0000000 --- a/javascript-practice/06_decomposition_pattern/A_decomposing_problems_exercise/README.md +++ /dev/null @@ -1,162 +0,0 @@ -# Dividing and Conquering - -_Decomposition_ is a pattern that programmers use to take a complex problem and break it down into -smaller sub-problems that can be managed better individually. - -Before you start this exercise, make sure you have watched the lecture first. - -If you get stuck during this exercise, reference this walkthrough. Only watch enough of the -walkthrough to get yourself unstuck, then pause the video and pick up the exercise on your own. - -This is might be my favorite topic. I think it's very high leverage because it is relatively easy to -implement but greatly increases the elegance of your code. Prefer to solve complex problems with -simple solutions. - --AZ - -## 0. Composition - -Create a new folder named `A_decomposing_problems_exercise`, this is where you'll save all of your -files. Predict what would print when executing each of the snippets below. Test your prediction by -typing the snippet into their own files and executing the program. Don't copy and paste. - -Write the below code into a file named `snippet-1.js`. Make a prediction for what it will print. Run -it. - -```js -// snippet 1 - -let flim = function () { - console.log("leak"); - flam(); - console.log("geek"); -}; - -let flam = function () { - console.log("beak"); - console.log("sneak"); -}; - -flim(); -``` - -Write the below code into a file named `snippet-2.js`. Make a prediction for what it will print. Run -it. - -```js -let alice = function (n) { - for (let i = 0; i <= n; i++) { - bob(i); - } -}; - -let bob = function (n) { - if (n % 2 === 0) { - console.log("good"); - } else { - console.log("bad"); - } -}; - -alice(4); -``` - -Write the below code into a file named `snippet-3.js`. Make a prediction for what it will print. Run -it. - -```js -// snippet 3 - -let foo = function () { - for (let i = 0; i < 5; i++) { - console.log("i = " + i); - bar(); - } -}; - -let bar = function () { - for (let j = 0; j < 5; j++) { - console.log(" j = " + j); - } -}; - -foo(); -``` - -## 1. Decomposition - -In this section of the exercise you'll be prompted to write a function to accomplish a specific -task. Read the description and look at the example output to figure out what should be implemented -within the function. Write each function to a separate file in the `A_decomposing_problems_exercise` -folder and test your work by running the file. - -Some (but not all) of the problems below should be decomposed with a helper function. - -### doubleVowel - -Create a `double-vowel.js` file and solve the function below: - -```js -// Write a function `doubleVowel` that accepts a string as an argument. The function should return -// the string where every occurrence of a vowel in the original string is repeated twice consecutively. -// Vowels are the letters a, e, i, o, u. - -console.log(doubleVowel("runner")); // 'ruunneer' -console.log(doubleVowel("stoplight")); // 'stoopliight' -console.log(doubleVowel("gardener")); // 'gaardeeneer' -``` - -### funnyPhrase - -Create a `funny-phrase.js` file and solve the function below: - -```js -// Write a function `funnyPhrase` that accepts a sentence string as an argument. The function should -// return the sentence where every other word has its vowels repeated twice consecutively. -// Vowels are the letters a, e, i, o, u. - -console.log(funnyPhrase("she dreamed of being a runner")); // 'she dreeaameed of beeiing a ruunneer' -console.log(funnyPhrase("park near the stoplight")); // 'park neeaar the stoopliight' -console.log(funnyPhrase("we need many gardeners")); // 'we neeeed many gaardeeneers' -``` - -### isPrime - -Create an `is-prime.js` file and solve the function below: - -```js -// Write a function `isPrime` that accepts a number as an argument. The function should return a -// boolean indicating whether or not the given number is prime. A prime number is a number that is -// only divisible by 1 and itself. The smallest prime number is 1. -// -// For example, 11 is a prime because it is only divisible by 1 and 11. -// For example, 8 is not a prime because it is divisible by 1, 2, 4, and 8 - -console.log(isPrime(11)); // true -console.log(isPrime(8)); // false -console.log(isPrime(7)); // true -console.log(isPrime(21)); // false -console.log(isPrime(2)); // true -console.log(isPrime(15)); // false -console.log(isPrime(1)); // false -``` - -### pickPrimes - -Create a `pick-primes.js` file and solve the function below: - -```js -// Write a function `pickPrimes` that accepts an array of numbers as an argument. The function should -// return an array containing only the prime numbers. A prime number is a number that is -// only divisible by 1 and itself. The smallest prime number is 1. - -console.log(pickPrimes([12, 3, 7, 18, 11])); // [3, 7, 11] -console.log(pickPrimes([17, 23, 9, 42])); // [17, 23] -console.log(pickPrimes([4, 2048, 100, 55])); // [] -``` - -## Walkthrough - - - - diff --git a/javascript-practice/06_decomposition_pattern/A_decomposing_problems_exercise/right.html b/javascript-practice/06_decomposition_pattern/A_decomposing_problems_exercise/right.html deleted file mode 100644 index 4c79a16..0000000 --- a/javascript-practice/06_decomposition_pattern/A_decomposing_problems_exercise/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -A_decomposing_problems_exercise - - - Stable - - - - - - - - - - - - -
Folders
<Go Back>
-
- - - - -
FileFileFileFileFileFileFileFile
README.html right.html README.md 
- -

-Folders: 1
-Files: 3
-Size of all files: 44650 KB

- - - \ No newline at end of file diff --git a/javascript-practice/06_decomposition_pattern/B_decomposing_problems_exercise/README.html b/javascript-practice/06_decomposition_pattern/B_decomposing_problems_exercise/README.html deleted file mode 100644 index 2e5fc8d..0000000 --- a/javascript-practice/06_decomposition_pattern/B_decomposing_problems_exercise/README.html +++ /dev/null @@ -1,197 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Document - - - - - - - - - -
- - - - -
HOME -
- - - -

Predisposed to Decompose

-

More practice on decomposing!

-

If you get stuck during this exercise, reference this walkthrough. Only watch enough of the walkthrough to - get - yourself unstuck, then pause the video and pick up the exercise on your own.

-

Write code. Run it.

-

-AZ

-

Instructions

-

Create a new folder named B_decomposing_problems_exercise, this is where you’ll save all of your - files. Solve each of the prompts below. Create a new file for each prompt and execute your code to see if it - matches the example output.

-

Some (but not all) of the problems below should be decomposed with a helper function.

-

removeLastVowel

-

Create a remove-last-vowel.js file and solve the function below:

- -

pickPrefix

-

Create a pick-prefix.js file and solve the function below:

- -

trendyText

-

Create a trendy-text.js file and solve the function below:

- -

mostLetterWord

-

Create a most-letter-word file and solve the function below:

- -

Walkthrough

-

Watch the walkthrough in it’s entirety so you don’t miss out on any knowledge. - walkthrough - even if you were able to complete this exercise easily, so you don’t miss any tips. Watch it in 1.5x speed if - you - like.

- - - diff --git a/javascript-practice/06_decomposition_pattern/B_decomposing_problems_exercise/README.md b/javascript-practice/06_decomposition_pattern/B_decomposing_problems_exercise/README.md deleted file mode 100644 index fcd5680..0000000 --- a/javascript-practice/06_decomposition_pattern/B_decomposing_problems_exercise/README.md +++ /dev/null @@ -1,82 +0,0 @@ -# Predisposed to Decompose - -More practice on decomposing! - -If you get stuck during this exercise, reference this walkthrough. Only watch enough of the -walkthrough to get yourself unstuck, then pause the video and pick up the exercise on your own. - -Write code. Run it. - --AZ - -## Instructions - -Create a new folder named `B_decomposing_problems_exercise`, this is where you'll save all of your -files. Solve each of the prompts below. Create a new file for each prompt and execute your code to -see if it matches the example output. - -Some (but not all) of the problems below should be decomposed with a helper function. - -### removeLastVowel - -Create a `remove-last-vowel.js` file and solve the function below: - -```js -// Write a function `removeLastVowel` that accepts a string as argument. The function should return -// the string with its last vowel removed. Vowels are the letters a, e, i, o, u - -console.log(removeLastVowel("speaker")); // 'speakr' -console.log(removeLastVowel("trading")); // 'tradng' -console.log(removeLastVowel("thunder")); // 'thundr' -console.log(removeLastVowel("myth")); // 'myth' -``` - -### pickPrefix - -Create a `pick-prefix.js` file and solve the function below: - -```js -// Write a function `pickPrefix(strings, prefix)` that accepts an array of strings and a prefix string -// as an argument. The function should return the an array of words that begin with the prefix. - -console.log(pickPrefix(['connect', 'company', 'concert', 'cram'], 'con')); -// ['connect', 'concert'] - -console.log(pickPrefix(['miner', 'mistake', 'misspeak', 'moose', 'mission'], 'mis')); -// [''mistake', 'misspeak', 'mission'] -``` - -### trendyText - -Create a `trendy-text.js` file and solve the function below: - -```js -// Write a function `trendyText` that accepts a sentence string as an argument. The function should -// return the sentence where the last vowel of every word is removed. - -console.log(trendyText("the concert will be epic")); // 'th concrt wll be epc' -console.log(trendyText("breakfast food is wonderful")); // 'breakfst fod s wonderfl' -console.log(trendyText("the weather will improve hopefully")); // 'th weathr wll improv hopeflly' -``` - -### mostLetterWord - -Create a `most-letter-word` file and solve the function below: - -```js -// Write a function `mostLetterWord` that accepts a sentence string and a character as arguments. -// The function should return the word of the sentence that contains the character the most number -// of times. You can assume that the sentence contains at least one word. If there is a tie, return -// the word that appears earlier in the sentence. - -console.log(mostLetterWord('she received an award for excellence in science', 'e')); // 'excellence' -console.log(mostLetterWord('she received an award for excellence in science', 'a')); // 'award' -console.log(mostLetterWord('I hope sophomore year comes soon', 'o')); // 'sophomore' -console.log(mostLetterWord('I hope sophomore year comes soon', 's')); // 'sophomore' -``` - -## Walkthrough - - - - diff --git a/javascript-practice/06_decomposition_pattern/B_decomposing_problems_exercise/right.html b/javascript-practice/06_decomposition_pattern/B_decomposing_problems_exercise/right.html deleted file mode 100644 index 56cca3a..0000000 --- a/javascript-practice/06_decomposition_pattern/B_decomposing_problems_exercise/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -B_decomposing_problems_exercise - - - Stable - - - - - - - - - - - - -
Folders
<Go Back>
-
- - - - -
FileFileFileFileFileFileFileFile
README.html right.html README.md 
- -

-Folders: 1
-Files: 3
-Size of all files: 32192 KB

- - - \ No newline at end of file diff --git a/javascript-practice/06_decomposition_pattern/C_decomposing_problems_exercise/README.html b/javascript-practice/06_decomposition_pattern/C_decomposing_problems_exercise/README.html deleted file mode 100644 index 13c05ce..0000000 --- a/javascript-practice/06_decomposition_pattern/C_decomposing_problems_exercise/README.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - Document - - - - - - - - -
- - - - -
HOME -
- - - -

Building It Up By Breaking It Down

-

Three reasons why you’ll improve as a programmer. You won’t believe number 3!

-

If you get stuck during this exercise, reference this walkthrough. Only watch enough of the walkthrough to - get - yourself unstuck, then pause the video and pick up the exercise on your own.

-

I’m going to make you practice so much that you wish you had never subscribed.

-

-AZ

-

Instructions

-

Create a new folder named C_decomposing_problems_exercise, this is where you’ll save all of your - files. - Solve each of the prompts below. Create a new file for each prompt and execute your code to see if it matches - the - example output.

-

lalaLanguage

-

Create a lala-language.js file and solve the function below:

- -

pickPerfectSquares

-

Create a pick-perfect-squares.js file and solve the function below:

- -

censorSentence

-

Create a censor-sentence.js file and solve the function below:

- -

Walkthrough

-

Watch the walkthrough in it’s entirety so you don’t miss out on any knowledge. - walkthrough - even - -

- - - diff --git a/javascript-practice/06_decomposition_pattern/C_decomposing_problems_exercise/README.md b/javascript-practice/06_decomposition_pattern/C_decomposing_problems_exercise/README.md deleted file mode 100644 index c1c116a..0000000 --- a/javascript-practice/06_decomposition_pattern/C_decomposing_problems_exercise/README.md +++ /dev/null @@ -1,68 +0,0 @@ -# Building It Up By Breaking It Down - -Three reasons why you'll improve as a programmer. You won't believe number 3! - -If you get stuck during this exercise, reference this walkthrough. Only watch enough of the -walkthrough to get yourself unstuck, then pause the video and pick up the exercise on your own. - -I'm going to make you practice so much that you wish you had never subscribed. - --AZ - -## Instructions - -Create a new folder named `C_decomposing_problems_exercise`, this is where you'll save all of your -files. Solve each of the prompts below. Create a new file for each prompt and execute your code to -see if it matches the example output. - -### lalaLanguage - -Create a `lala-language.js` file and solve the function below: - -```js -// Write a function `lalaLanguage` that accepts a sentence string as an argument. The function should -// return a new sentence where words longer that 3 characters are modified. Modified words should have -// each vowel followed by 'l' and the same vowel repeated again. See the examples. - -console.log(lalaLanguage('this is pretty strange')); // 'thilis is preletty stralangele' -console.log(lalaLanguage('can you speak our language')); // 'can you spelealak our lalangulualagele' -``` - -### pickPerfectSquares - -Create a `pick-perfect-squares.js` file and solve the function below: - -```js -// Write a function `pickPerfectSquares` that accepts an array of numbers as an argument. The function -// should return an array containing only the elements that are perfect squares. A perfect square -// is a number that can result from multiplying some number by itself. -// -// For example, 4 is a perfect square because 2 * 2 = 4 -// For example, 81 is a perfect square because 9 * 9 = 81 - -console.log(pickPerfectSquares([6, 4, 81, 21, 36])); // [4, 81, 36] -console.log(pickPerfectSquares([100, 24, 144])); // [100, 144] -console.log(pickPerfectSquares([30, 25])); // [25] -``` - -### censorSentence - -Create a `censor-sentence.js` file and solve the function below: - -```js -// Write a function `censorSentence(sentence, targetWords)` that accepts a sentence string and an array -// of target words as arguments. The function should return a new sentence where any target words -// have all of their characters replaced with '*'s. - -console.log(censorSentence('where the heck is my celery', ['heck', 'celery'])); -// 'where the **** is my ******' - -console.log(censorSentence('why you little sweetheart', ['sweetheart', 'salad'])); -// 'why you little **********' -``` - -## Walkthrough - - - - diff --git a/javascript-practice/06_decomposition_pattern/C_decomposing_problems_exercise/right.html b/javascript-practice/06_decomposition_pattern/C_decomposing_problems_exercise/right.html deleted file mode 100644 index ddb36aa..0000000 --- a/javascript-practice/06_decomposition_pattern/C_decomposing_problems_exercise/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -C_decomposing_problems_exercise - - - Stable - - - - - - - - - - - - -
Folders
<Go Back>
-
- - - - -
FileFileFileFileFileFileFileFile
README.html right.html README.md 
- -

-Folders: 1
-Files: 3
-Size of all files: 29016 KB

- - - \ No newline at end of file diff --git a/javascript-practice/06_decomposition_pattern/right.html b/javascript-practice/06_decomposition_pattern/right.html deleted file mode 100644 index 1acfdf0..0000000 --- a/javascript-practice/06_decomposition_pattern/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -06_decomposition_pattern - - - Stable - - - - - - - - - - - - -
Folders
<Go Back> A_decomp...rcise B_decomp...rcise C_decomp...rcise
-
- - - - -
FileFileFileFileFileFileFileFile
right.html 
- -

-Folders: 4
-Files: 1
-Size of all files: 14014 KB

- - - \ No newline at end of file diff --git a/javascript-practice/07_objects/A_objects_exercise/README.html b/javascript-practice/07_objects/A_objects_exercise/README.html deleted file mode 100644 index 70009f1..0000000 --- a/javascript-practice/07_objects/A_objects_exercise/README.html +++ /dev/null @@ -1,401 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Document - - - - - - - - - -
- - - - -
HOME -
- - - -

An Objective Perspective

-

Objects are a construct programmers use to represent entities and the properties they possess. - Whereas - arrays use numbers to index their values, objects use strings to index their values. These strings - are - referred to as keys.

-

Before you start this exercise, make sure you have watched the lecture first.

-

If you get stuck during this exercise, reference this walkthrough. Only watch enough of the walkthrough to - get - yourself unstuck, then pause the video and pick up the exercise on your own.

-

As you grow into a web developer, you’ll be dealing with objects a ton. I also like teaching - objects because I get to use obscure references in my examples.

-

-AZ

-

0. Objects In Mirror Are Closer Then They Appear.

-

Create a new folder named A_objects_exercise, this is where you’ll save all of your files. - Predict - what would print when executing each of the snippets below. Test your prediction by typing the snippet into - their - own files and executing the program. Don’t copy and paste.

-

Write the below code into a file named snippet-1.js. Make a prediction for what it will print. - Run - it.

- -

Write the below code into a file named snippet-2.js. Make a prediction for what it will print. - Run -

- -

Write the below code into a file named snippet-3.js. Make a prediction for what it will print. - Run - it.

- -

Write the below code into a file named snippet-4.js. Make a prediction for what it will print. - Run - it.

- -

1. I Object, Your Honor.

-

In this section of the exercise you’ll be prompted to write a function to accomplish a specific task. Read - the - description and look at the example output to figure out what should be implemented within the function. Write - each function to a separate file in the A_objects_exercise folder and test your work by running - the - file.

-

emailParse

-

Create a email-parse.js file and solve the function below:

- -

keyPair

-

Create a key-pair.js file and solve the function below:

- -

elementQuantities

-

Create a element-quantities.js file and solve the function below:

- -

maxObjectValue

-

Create a max-object-value.js file and solve the function below:

- -

Walkthrough

-

Watch the walkthrough in it’s entirety so you don’t miss out on any knowledge. - walkthrough - even if you were able to complete this exercise easily, so you don’t miss any tips. Watch it in 1.5x speed if - you - like.

- - - diff --git a/javascript-practice/07_objects/A_objects_exercise/README.md b/javascript-practice/07_objects/A_objects_exercise/README.md deleted file mode 100644 index e91a003..0000000 --- a/javascript-practice/07_objects/A_objects_exercise/README.md +++ /dev/null @@ -1,206 +0,0 @@ -# An Objective Perspective - -_Objects_ are a construct programmers use to represent entities and the properties they possess. -Whereas arrays use numbers to index their values, _objects_ use strings to index their values. These -strings are referred to as _keys_. - -Before you start this exercise, make sure you have watched the lecture first. - -If you get stuck during this exercise, reference this walkthrough. Only watch enough of the -walkthrough to get yourself unstuck, then pause the video and pick up the exercise on your own. - -As you grow into a web developer, you'll be dealing with objects a **ton**. I also like teaching -objects because I get to use obscure references in my examples. - --AZ - -## 0. Objects In Mirror Are Closer Then They Appear. - -Create a new folder named `A_objects_exercise`, this is where you'll save all of your files. Predict -what would print when executing each of the snippets below. Test your prediction by typing the -snippet into their own files and executing the program. Don't copy and paste. - -Write the below code into a file named `snippet-1.js`. Make a prediction for what it will print. Run -it. - -```js -// snippet 1 -let movie = { - title: "Fight Club", - year: 1999, - genre: ["drama", "thriller"], - starring: ["Brad Pitt", "Edward Norton"], -}; - -console.log(movie.year); -console.log(movie["title"]); -console.log(movie.genre); -console.log(movie.genre[0]); -console.log(movie.genre[1]); - -console.log(movie.duration); -console.log(movie["starring"][1]); -console.log(movie.starring.length); -``` - -Write the below code into a file named `snippet-2.js`. Make a prediction for what it will print. Run - -```js -// snippet 2 -let restaurant = { - name: "Bob's Burgers", - location: "123 Ocean Avenue", - owners: ["Bob Belcher", "Linda Belcher"], - established: 2011, - menu: ["burgers", "fries", "shakes"], -}; - -console.log("owners" in restaurant); -console.log("employees" in restaurant); - -let someKey = "menu"; -console.log(someKey in restaurant); - -console.log(restaurant.menu); -console.log(restaurant["menu"]); -console.log(restaurant[someKey]); -console.log(restaurant.someKey); - -console.log(restaurant.menu.includes("fries")); -``` - -Write the below code into a file named `snippet-3.js`. Make a prediction for what it will print. Run -it. - -```js -// snippet 3 -let dog = { - name: "Manny", - age: 5, - breed: "pug", - color: "fawn", - favoriteFoods: ["bacon"], -}; - -console.log(dog.age); -console.log(dog.breed); -console.log(dog.favoriteFoods); - -dog.age++; -dog.breed = dog.breed.toUpperCase(); -dog.favoriteFoods.push("sausage"); - -console.log(dog.age); -console.log(dog.breed); -console.log(dog.favoriteFoods); - -for (let property in dog) { - console.log(property + " is " + dog[property]); -} -``` - -Write the below code into a file named `snippet-4.js`. Make a prediction for what it will print. Run -it. - -```js -// snippet 4 -let recipe = { - name: "Old Fashioned Pancakes", - difficulty: "easy", - tasty: true, - ingredients: ["eggs", "milk", "butter", "flour", "sugar"], -}; - -console.log(recipe.name); -console.log(recipe["name"]); -console.log(recipe.ingredients.length); -console.log(recipe.calories); - -let someVariable = "difficulty"; -console.log(recipe[someVariable]); -console.log(recipe.someVariable); - -for (let i = 0; i < recipe.ingredients.length; i++) { - console.log(recipe.ingredients[i]); -} -``` - -## 1. I Object, Your Honor. - -In this section of the exercise you'll be prompted to write a function to accomplish a specific -task. Read the description and look at the example output to figure out what should be implemented -within the function. Write each function to a separate file in the `A_objects_exercise` folder and -test your work by running the file. - -### emailParse - -Create a `email-parse.js` file and solve the function below: - -```js -// Create a function `emailParse` that accepts an email address string as an argument. The function -// should return an object containing `username` and `domain` as keys. See the examples. -// You can assume that the argument will be a valid email address. - -console.log(emailParse("coolcoder42@goodmail.com")); -// { username: 'coolcoder42', domain: 'goodmail.com' } - -console.log(emailParse("az@woohoomail.com")); -// { username: 'az', domain: 'woohoomail.com' } - -console.log(emailParse("1337pr0graMmer@coldmail.edu")); -// { username: '1337pr0graMmer', domain: 'coldmail.edu' } -``` - -### keyPair - -Create a `key-pair.js` file and solve the function below: - -```js -// Write a function `keyPair(obj1, obj2, key)` that accepts two objects and a key string as arguments. -// The function should return an array containing the values of the given key in `obj1` and `obj2`. -// See the examples. - -let cat1 = { name: "jinkee", breed: "calico" }; -let cat2 = { name: "garfield", breed: "red tabby" }; -console.log(keyPair(cat1, cat2, "breed")); // [ 'calico', 'red tabby' ] -console.log(keyPair(cat1, cat2, "name")); // [ 'jinkee', 'garfield ] - -let sport1 = { name: "volleyball", team: true }; -let sport2 = { name: "golf", team: false }; -console.log(keyPair(sport1, sport2, "team")); // [ true, false ] -``` - -### elementQuantities - -Create a `element-quantities.js` file and solve the function below: - -```js -// Create a function `elementQuantities` that accepts an object as an argument. The object contains -// elements as keys and quantities as values. The function should return an array containing the elements -// appearing with the correct quantities. See the examples. - -let quantities1 = { cat: 3, bird: 1, dog: 2 }; -console.log(elementQuantities(quantities1)); // ['cat', 'cat', 'cat', 'bird, 'dog', 'dog'] - -let quantities2 = { blue: 3, brown: 1 }; -console.log(elementQuantities(quantities2)); // ['blue', 'blue', 'blue', 'brown'] -``` - -### maxObjectValue - -Create a `max-object-value.js` file and solve the function below: - -```js -// Write a function `maxObjectValue` that accepts an object as an argument. Write a function that -// returns an array containing the key, value pair for the largest value within the object. You can -// assume that all values are numbers and there are no ties. - -console.log(maxObjectValue({ a: 5, b: 2, c: 6, d: 7, e: 4 })); // ['d', 7] -console.log(maxObjectValue({ lychee: 11, rambutan: 13, papaya: 9 })); // ['rambutan', 13] -``` - -## Walkthrough - - - - diff --git a/javascript-practice/07_objects/A_objects_exercise/right.html b/javascript-practice/07_objects/A_objects_exercise/right.html deleted file mode 100644 index 3a8ac52..0000000 --- a/javascript-practice/07_objects/A_objects_exercise/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -A_objects_exercise - - - Stable - - - - - - - - - - - - -
Folders
<Go Back>
-
- - - - -
FileFileFileFileFileFileFileFile
README.html right.html README.md 
- -

-Folders: 1
-Files: 3
-Size of all files: 58824 KB

- - - \ No newline at end of file diff --git a/javascript-practice/07_objects/B_objects_exercise/README.html b/javascript-practice/07_objects/B_objects_exercise/README.html deleted file mode 100644 index b6fa3d6..0000000 --- a/javascript-practice/07_objects/B_objects_exercise/README.html +++ /dev/null @@ -1,337 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Document - - - - - - - - - -
- - - - -
HOME -
- - - - - - - - - - - - - - - - - - - - - - - - - - Document - - - - - - - -
- - - - -
HOME -
- - - - -
- - - - -
HOME -
- - - -

Object Obsession

-

More practice on JavaScript objects!

-

Before you start this exercise, make sure you have watched the lecture first.

-

If you get stuck during this exercise, reference this walkthrough. Only watch enough of the - walkthrough to - get yourself unstuck, then pause the video and pick up the exercise on your own.

-

Keep practicing. Hopefully you are practicing everyday. Consistency beats intensity given a long - enough - timeline. If want to become proficient quickly, then practice intensely and consistently.

-

-AZ

-

Instructions

-

Create a new folder named B_objects_exercise, this is where you’ll save all of your - files. Solve - each of the prompts below. Create a new file for each prompt and execute your code to see if it - matches the - example output.

-

characterCount

-

Create a character-count.js file and solve the function below:

- -

letterMap

-

Create a letter-map.js file and solve the function below:

- -

mostCommonLetter

-

Create a most-common-letter.js file and solve the function below:

- -

wordReplace

-

Create a word-replace.js file and solve the function below:

- -

getAverageAge

-

Create a get-average-age.js file and solve the function below:

- -

Walkthrough

-

Watch the walkthrough in it’s entirety so you don’t miss out on any knowledge. - walkthrough even if you were able to complete this exercise easily, so you don’t miss any tips. Watch - it in - 1.5x speed if you like.

- - - diff --git a/javascript-practice/07_objects/B_objects_exercise/README.md b/javascript-practice/07_objects/B_objects_exercise/README.md deleted file mode 100644 index c398468..0000000 --- a/javascript-practice/07_objects/B_objects_exercise/README.md +++ /dev/null @@ -1,108 +0,0 @@ -# Object Obsession - -More practice on JavaScript objects! - -Before you start this exercise, make sure you have watched the lecture first. - -If you get stuck during this exercise, reference this walkthrough. Only watch enough of the -walkthrough to get yourself unstuck, then pause the video and pick up the exercise on your own. - -Keep practicing. Hopefully you are practicing everyday. Consistency beats intensity given a long -enough timeline. If want to become proficient quickly, then practice intensely and consistently. - --AZ - -## Instructions - -Create a new folder named `B_objects_exercise`, this is where you'll save all of your files. Solve -each of the prompts below. Create a new file for each prompt and execute your code to see if it -matches the example output. - -### characterCount - -Create a `character-count.js` file and solve the function below: - -```js -// Write a function `characterCount` that accepts a string as an argument. The function should return -// an object containing the count of characters in the string. - -console.log(characterCount("evening")); // { e: 2, v: 1, n: 2, i: 1 , g: 1 } -console.log(characterCount("mississippi")); // { m: 1, i: 4, s: 4, p: 2 } -console.log(characterCount("chili")); // { c: 1, h: 1, i: 2, l: 1 } -``` - -### letterMap - -Create a `letter-map.js` file and solve the function below: - -```js -// Write a function `letterMap` that accepts a string and an object as arguments. The function should -// return a version of the string where characters that appear as keys in object are replaced with -// their corresponding values. - -console.log(letterMap("symbolic", { y: "i", o: "a", c: "k" })); // 'simbalik' -console.log(letterMap("colossal", { o: "x", s: "p" })); // 'cxlxppal' -console.log(letterMap("miniscule", { u: "t", i: "f", e: "q" })); // 'mfnfsctlq' -``` - -### mostCommonLetter - -Create a `most-common-letter.js` file and solve the function below: - -```js -// Write a function `mostCommonLetter` that accepts a string as an argument. The function should return -// the character that appears most frequently in the string. You can assume that there are no ties. - -console.log(mostCommonLetter("building")); // 'i' -console.log(mostCommonLetter("shoestring")); // 's' -console.log(mostCommonLetter("preparedness")); // 'e' -``` - -### wordReplace - -Create a `word-replace.js` file and solve the function below: - -```js -// Write a function `wordReplace` that accepts a sentence string and an object as arguments. The -// function should return a new sentence where words that are keys of the object are replaced with -// their corresponding values. - -console.log(wordReplace("I never take naps during the day", { never: "always", day: "weekend" })); -// 'I always take naps during the weekend' - -console.log(wordReplace("the park is closed", { closed: "open", the: "a" })); -// 'a park is open' - -console.log(wordReplace("I do what I want", { I: "we", cat: "dog" })); -// 'we do what we want' -``` - -### getAverageAge - -Create a `get-average-age.js` file and solve the function below: - -```js -// Write a function `getAverageAge` function that accepts an array of objects representing people. -// The function should return the average age of the people. - -let peeps = [ - { name: "Lovelace", age: 36, born: "London, UK" }, - { name: "Kleene", age: 85, born: "Connecticut, US" }, - { name: "Turing", age: 41, born: "London, UK" }, - { name: "Hopper", age: 85, born: "New York, US" }, -]; -console.log(getAverageAge(peeps)); // 61.75 - -let people = [ - { name: "Orwell", age: 46, born: "Bihar, India" }, - { name: "Bradbury", age: 91, born: "California, US" }, - { name: "Huxley", age: 69, born: "California, US" }, -]; -console.log(getAverageAge(people)); // 86.66 -``` - -## Walkthrough - - - - diff --git a/javascript-practice/07_objects/B_objects_exercise/right.html b/javascript-practice/07_objects/B_objects_exercise/right.html deleted file mode 100644 index 107bfb3..0000000 --- a/javascript-practice/07_objects/B_objects_exercise/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -B_objects_exercise - - - Stable - - - - - - - - - - - - -
Folders
<Go Back>
-
- - - - -
FileFileFileFileFileFileFileFile
README.html right.html README.md 
- -

-Folders: 1
-Files: 3
-Size of all files: 46612 KB

- - - \ No newline at end of file diff --git a/javascript-practice/07_objects/C_objects_exercise/README.html b/javascript-practice/07_objects/C_objects_exercise/README.html deleted file mode 100644 index 8a211dc..0000000 --- a/javascript-practice/07_objects/C_objects_exercise/README.html +++ /dev/null @@ -1,278 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - Document - - - - - - - - -
- - - - -
HOME -
- - - -

Obnoxious Objects

-

Still more exercises on JavaScript objects!

-

Before you start this exercise, make sure you have watched the lecture first.

-

If you get stuck during this exercise, reference this walkthrough. Only watch enough of the walkthrough to - get - yourself unstuck, then pause the video and pick up the exercise on your own.

-

Practice, practice, practice, practice.

-

-AZ

-

Instructions

-

Create a new folder named C_objects_exercise, this is where you’ll save all of your files. Solve - each of - the prompts below. Create a new file for each prompt and execute your code to see if it matches the example - output. -

-

greatestPopulation

-

Create a greatest-population.js file and solve the function below:

- -

pluck

-

Create a pluck.js file and solve the function below:

- -

objectAdd

-

Create a object-add.js file and solve the function below:

- -

secretCipher

-

Create a secret-cipher.js file and solve the function below:

- -

Walkthrough

-

Watch the walkthrough in it’s entirety so you don’t miss out on any knowledge. - walkthrough - even - -

- - - diff --git a/javascript-practice/07_objects/C_objects_exercise/README.md b/javascript-practice/07_objects/C_objects_exercise/README.md deleted file mode 100644 index dbd233e..0000000 --- a/javascript-practice/07_objects/C_objects_exercise/README.md +++ /dev/null @@ -1,102 +0,0 @@ -# Obnoxious Objects - -Still more exercises on JavaScript objects! - -Before you start this exercise, make sure you have watched the lecture first. - -If you get stuck during this exercise, reference this walkthrough. Only watch enough of the -walkthrough to get yourself unstuck, then pause the video and pick up the exercise on your own. - -Practice, practice, practice, practice. - --AZ - -## Instructions - -Create a new folder named `C_objects_exercise`, this is where you'll save all of your files. Solve -each of the prompts below. Create a new file for each prompt and execute your code to see if it -matches the example output. - -### greatestPopulation - -Create a `greatest-population.js` file and solve the function below: - -```js -// Write a function `greatestPopulation` that accepts an array of country objects as an argument. -// The function should return the name of the country that has the largest population. -// You can assume that the array contains at least one country. - -let countries1 = [ - { name: "Cameroon", population: 27744989, gdp: 38.68 }, - { name: "Belarus", population: 9477918, gdp: 59.66 }, - { name: "Indonesia", population: 267026366, gdp: 1042 }, - { name: "Guyana", population: 750204, gdp: 3.88 }, -]; - -console.log(greatestPopulation(countries1)); // 'Indonesia' - -let countries1 = [ - { name: "New Zealand", population: 4925477, gdp: 204.9 }, - { name: "Mozambique", population: 30098197, gdp: 14.72 }, - { name: "Greenland", population: 57616, gdp: 2.71 }, - { name: "Kazakhstan", population: 19091949, gdp: 179.3 }, - { name: "Burma", population: 56590071, gdp: 71.21 }, -]; - -console.log(greatestPopulation(countries2)); // 'Burma' -``` - -### pluck - -Create a `pluck.js` file and solve the function below: - -```js -// Write a function `pluck` that accepts an object and an array of strings as an argument. The function -// should return a new object containing the keys of the original object that are found in the array. - -console.log(pluck({name: 'Fido', color: 'Brown', breed: 'German Shepherd'}, ['name', 'breed'])); -// { name: 'Fido', breed: 'German Shepherd' } - -console.log(pluck({ make: 'Tesla', mpg: 93 , model: 'Model X', color: 'white' }, ['make', 'model'])); -// { make: 'Tesla', model: 'Model X' } -``` - -### objectAdd - -Create a `object-add.js` file and solve the function below: - -```js -// Write a function `objectAdd` that accepts two objects as arguments. The function should return -// a new object containing the same keys as the object arguments. If a key is found in both -// objects, its corresponding value should be the sum of the values in the object arguments. If a key -// is only found in one of the objects, then it's corresponding value should be the same as that one -// object. - -let obj1 = { x: 3, y: 10}; -let obj2 = { y: 2, x: 1}; -console.log(objectAdd(obj1, obj2)); // { x: 4, y: 12 } - -let obj3 = { a: 3, b: 2, c: -1}; -let obj4 = { b: 5, c: 1, e: 4}; -console.log(objectAdd(obj3, obj4)); // { a: 3, b: 7, c: 0, e: 4 } -``` - -### secretCipher - -Create a `secret-cipher.js` file and solve the function below: - -```js -// Write a function `secretCipher` that accepts a string and an object as arguments. The function -// should return a new string where characters of the original string are replaced with their -// corresponding values in the object. If a character of the string does not exist as a key of the -// object, then it should be replaced with a question mark (?). - -console.log(secretCipher("jello", { j: "r", l: "s", e: "i" })); // 'riss?' -console.log(secretCipher("lantern", { e: "o", l: "p", n: "m", r: "j" })); // 'p?m?ojm' -``` - -## Walkthrough - - - - diff --git a/javascript-practice/07_objects/C_objects_exercise/right.html b/javascript-practice/07_objects/C_objects_exercise/right.html deleted file mode 100644 index ed18e63..0000000 --- a/javascript-practice/07_objects/C_objects_exercise/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -C_objects_exercise - - - Stable - - - - - - - - - - - - -
Folders
<Go Back>
-
- - - - -
FileFileFileFileFileFileFileFile
README.html right.html README.md 
- -

-Folders: 1
-Files: 3
-Size of all files: 41065 KB

- - - \ No newline at end of file diff --git a/javascript-practice/07_objects/right.html b/javascript-practice/07_objects/right.html deleted file mode 100644 index b76b7f9..0000000 --- a/javascript-practice/07_objects/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -07_objects - - - Stable - - - - - - - - - - - - -
Folders
<Go Back> A_object...rcise B_object...rcise C_object...rcise
-
- - - - -
FileFileFileFileFileFileFileFile
right.html 
- -

-Folders: 4
-Files: 1
-Size of all files: 13961 KB

- - - \ No newline at end of file diff --git a/javascript-practice/08_higher_order_functions/A_native_callback_methods_exercise/README.html b/javascript-practice/08_higher_order_functions/A_native_callback_methods_exercise/README.html deleted file mode 100644 index 89c8be9..0000000 --- a/javascript-practice/08_higher_order_functions/A_native_callback_methods_exercise/README.html +++ /dev/null @@ -1,466 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Document - - - - - - - - - -
- - - - -
HOME -
- - - -

Native Callback Methods Exercise

-

There are a handful of useful array methods utilizing callbacks that are built into JavaScript. The - forEach, map, filter, every, and some methods - can - implement common patterns quickly. These methods can greatly clean up our code if we master their usage.

-

In my experience teaching, students are somewhat resistant to learning this new topic because they can - “solve” - these - same problems utilizing just the basics that they are already comfortable with. You could forgo these - methods - in favor of manually implementing the target behavior with a nothing-fancy loop, however these methods will - become - very useful if you have the patience to learn them. They are also a fairly common topic in software - engineering - job - interviews. There is much discomfort that comes with learning something new. Practice until it’s comfortable. -

-

-AZ

-

0. Interpret.

-

Create a new folder named A_native_callback_methods_exercise, this is where you’ll save all of - your - files. Predict what would print when executing each of the snippets below. Test your prediction by typing the - snippet - into their own files and executing the program. Don’t copy and paste.

-

Write the below code into a file named snippet-1.js. Make a prediction for what it will print. - Run - it. -

- - - - -

1. Solve.

-

Solve each of the prompts below. Create a new file for each prompt and execute your code to see if it matches - the - example output.

-

forEachSum

-

Create a for-each-sum.js file and solve the function below:

- -

pickAdults

-

Create a pick-adults.js file and solve the function below:

- -

wordMap

-

Create a word-map.js file and solve the function below:

- -

commonElements

-

Create a common-elements.js file and solve the function below:

- -

getInitials

-

Create a get-initials.js file and solve the function below:

- -

Walkthrough

-

Watch the walkthrough in it’s entirety so you don’t miss out on any knowledge. - walkthrough - even - -

- - - diff --git a/javascript-practice/08_higher_order_functions/A_native_callback_methods_exercise/README.md b/javascript-practice/08_higher_order_functions/A_native_callback_methods_exercise/README.md deleted file mode 100644 index 7df5efc..0000000 --- a/javascript-practice/08_higher_order_functions/A_native_callback_methods_exercise/README.md +++ /dev/null @@ -1,208 +0,0 @@ -# Native Callback Methods Exercise - -There are a handful of useful array methods utilizing callbacks that are built into JavaScript. The -`forEach`, `map`, `filter`, `every`, and `some` methods can implement common patterns -quickly. These methods can greatly clean up our code if we master their usage. - -In my experience teaching, students are somewhat resistant to learning this new topic because they -can "solve" these same problems utilizing just the basics that they are already comfortable with. -You _could_ forgo these methods in favor of manually implementing the target behavior with a -nothing-fancy loop, however these methods will become very useful if you have the patience to learn -them. They are also a fairly common topic in software engineering job interviews. There is much -discomfort that comes with learning something new. Practice until it's comfortable. - --AZ - -### 0. Interpret. - -Create a new folder named `A_native_callback_methods_exercise`, this is where you'll save all of -your files. Predict what would print when executing each of the snippets below. Test your prediction -by typing the snippet into their own files and executing the program. Don't copy and paste. - -Write the below code into a file named `snippet-1.js`. Make a prediction for what it will print. Run -it. - -```js -// snippet-1 -let foo = function (s) { - return s.slice(1).toUpperCase(); -}; - -let arr = ['mashy', 'brando', 'thanasi']; -let res = arr.map(foo); -console.log(res); -``` - -```js -// snippet-2 -let friends = ['nader', 'matty', 'jennifer', 'lora']; - -let chosen = friends[0]; - -friends.forEach(function (friend) { - if (friend.length > chosen.length) { - chosen = friend; - } -}); - -console.log(chosen); -``` - -```js -// snippet-3 -let isEven = function (n) { - return n % 2 === 0; -}; - -let isOdd = function (n) { - return !isEven(n); -}; - -let nums1 = [42, 3, 8, 9]; -console.log(nums1.filter(isEven)); -console.log(nums1.map(isOdd)); -``` - -```js -// snippet-4 -let doggos = [ - { name: 'bella', type: 'canine', age: 4, breed: 'yorkshire terrier' }, - { name: 'manny', type: 'canine', age: 2, breed: 'pug' }, - { name: 'yoshi', type: 'canine', age: 3, breed: 'german shepherd' }, - { name: 'blossom', type: 'canine', age: 3, breed: 'german shepherd' } -]; - -let result1 = doggos.every(function (ele) { - return ele.type === 'canine'; -}); - -console.log(result1); - -let result2 = doggos.every(function (ele) { - return ele.breed === 'german shepherd'; -}); - -console.log(result2); - -let result3 = doggos.some(function (ele) { - return ele.breed === 'german shepherd'; -}); - -console.log(result3); - -let isOld = function (person) { - return person.age > 5; -}; - -let result4 = doggos.some(isOld); - -console.log(result4); -``` - -### 1. Solve. - -Solve each of the prompts below. Create a new file for each prompt and execute your code to see if it -matches the example output. - -### forEachSum - -Create a `for-each-sum.js` file and solve the function below: - -```js -// Write a function `forEachSum` that accepts an array of numbers as an argument and returns the total -// sum of all numbers. -// Your function must utilize the native Array#forEach method. - -console.log(forEachSum([10, 3, 5])); // 18 -console.log(forEachSum([-6, 7, 9, 4])); // 14 -console.log(forEachSum([])); // 0 -``` - -### pickAdults - -Create a `pick-adults.js` file and solve the function below: - -```js -// Write a function `pickAdults` that accepts an array of person objects and returns the objects that -// have an age of at least 18. -// Your function must utilize the native Array#filter method. - -let people = [ - { name: 'alice', age: 22 }, - { name: 'bob', age: 37 }, - { name: 'pam', age: 16 }, - { name: 'jim', age: 18 } -]; -console.log(pickAdults(people)); -// [ { name: 'alice', age: 22 }, { name: 'bob', age: 37 }, { name: 'jim', age: 18 } ] - -let people2 = [ - { name: 'betty', age: 23 }, - { name: 'ben', age: 15 }, - { name: 'yansi', age: 21 } -]; -console.log(pickAdults(people2)); -// [ { name: 'betty', age: 23 }, { name: 'yansi', age: 21 } ] -``` - -### wordMap - -Create a `word-map.js` file and solve the function below: - -```js -// Write a function `wordMap` that accepts a sentence string and an object as arguments. The function -// should return a new sentence where words that exist as keys in the object are replaced with their -// corresponding values. -// Your function must utilize the native Array#map method. - -console.log(wordMap('open the pod bay doors', {pod: 'ship', open: 'close'})); -// 'close the ship bay doors' - -console.log(wordMap('breakfast food is good', {breakfast: 'brunch', good: 'great'})); -// 'brunch food is great' -``` - -### commonElements - -Create a `common-elements.js` file and solve the function below: - -```js -// Write a function `commonElements` that accepts two arrays as arguments. The function should -// return a new array containing the elements that are found in both input arrays. -// Your function must utilize the native Array#filter method. - -console.log(commonElements(['a', 'b', 'c'], ['c', 'a'])); // ['a', 'c'] -console.log(commonElements(['cat', 'dog', 'mouse', 'fish'], ['dog', 'rat'])); // ['dog'] -console.log(commonElements(['skip', 'jump'], ['swim', 'hop'])); // [] -``` - - -### getInitials - -Create a `get-initials.js` file and solve the function below: - -```js -// Write a function `getInitials` that accepts an array of students as an argument. The function should -// return an array containing the initials of each student. -// Your function must utilize the native Array#map method. - -let students1 = [ - { first: 'ada', last: 'yonath', subject: 'chemistry' }, - { first: 'nelly', last: 'sachs', subject: 'literature' }, - { first: 'rosalyn', last: 'yallow', subject: 'medicine' } -]; -console.log(getInitials(students1)); // ['AY', 'NS', 'RY'] - - -let students2 = [ - { first: 'margaret', last: 'knight' }, - { first: 'ellen', last: 'ochoa' }, -]; -console.log(getInitials(students2)); // ['MK', 'EO'] -``` - -## Walkthrough - - - - diff --git a/javascript-practice/08_higher_order_functions/A_native_callback_methods_exercise/right.html b/javascript-practice/08_higher_order_functions/A_native_callback_methods_exercise/right.html deleted file mode 100644 index 618f1b1..0000000 --- a/javascript-practice/08_higher_order_functions/A_native_callback_methods_exercise/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -A_native_callback_methods_exercise - - - Stable - - - - - - - - - - - - -
Folders
<Go Back>
-
- - - - -
FileFileFileFileFileFileFileFile
README.html right.html README.md 
- -

-Folders: 1
-Files: 3
-Size of all files: 61174 KB

- - - \ No newline at end of file diff --git a/javascript-practice/08_higher_order_functions/B_native_callback_methods_exercise/README.html b/javascript-practice/08_higher_order_functions/B_native_callback_methods_exercise/README.html deleted file mode 100644 index d57f163..0000000 --- a/javascript-practice/08_higher_order_functions/B_native_callback_methods_exercise/README.html +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Document - - - - - - - - - -
- - - - -
HOME -
- - - - - - - diff --git a/javascript-practice/08_higher_order_functions/B_native_callback_methods_exercise/README.md b/javascript-practice/08_higher_order_functions/B_native_callback_methods_exercise/README.md deleted file mode 100644 index e6559a9..0000000 --- a/javascript-practice/08_higher_order_functions/B_native_callback_methods_exercise/README.md +++ /dev/null @@ -1,28 +0,0 @@ -```js -// snippet-5 - -let nums = [3, 7, 2, 9]; - -let res1 = nums.reduce(function (a, b) { - return a + b; -}); - -console.log(res1); - - -let res2 = nums.reduce(function (a, b) { - return a + b; -}, -10); - -console.log(res2); - -let res3 = nums.reduce(function (a, b) { - if (b < a) { - return b; - } else { - return a; - } -}); - -console.log(res3); -``` diff --git a/javascript-practice/08_higher_order_functions/B_native_callback_methods_exercise/right.html b/javascript-practice/08_higher_order_functions/B_native_callback_methods_exercise/right.html deleted file mode 100644 index dbdaf0e..0000000 --- a/javascript-practice/08_higher_order_functions/B_native_callback_methods_exercise/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -B_native_callback_methods_exercise - - - Stable - - - - - - - - - - - - -
Folders
<Go Back>
-
- - - - -
FileFileFileFileFileFileFileFile
README.html right.html README.md 
- -

-Folders: 1
-Files: 3
-Size of all files: 22887 KB

- - - \ No newline at end of file diff --git a/javascript-practice/08_higher_order_functions/right.html b/javascript-practice/08_higher_order_functions/right.html deleted file mode 100644 index 4f9cf2c..0000000 --- a/javascript-practice/08_higher_order_functions/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -08_higher_order_functions - - - Stable - - - - - - - - - - - - -
Folders
<Go Back> A_native...rcise B_native...rcise
-
- - - - -
FileFileFileFileFileFileFileFile
right.html 
- -

-Folders: 3
-Files: 1
-Size of all files: 13904 KB

- - - \ No newline at end of file diff --git a/javascript-practice/index.html b/javascript-practice/index.html deleted file mode 100644 index f3f7ca8..0000000 --- a/javascript-practice/index.html +++ /dev/null @@ -1,25 +0,0 @@ - - - -C:/NEW_BOOTCAMP/Lambda/CIRRICULUMN/prep/javascript-practice - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/javascript-practice/left.html b/javascript-practice/left.html deleted file mode 100644 index 6d65195..0000000 --- a/javascript-practice/left.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -/NEW_BOOTCAMP/Lambda/CIRRICULUMN/prep/javascript-practice - - - Stable - - - - - - - - - - - - - - - - - - - - - -
Folders
<RETURN TO NAVIGATION>
00_expre...ables
01_conditionals
02_functions
03_loops
04_arrays
05_nesting
06_decom...ttern
07_objects
08_highe...tions
-
- - - - \ No newline at end of file diff --git a/javascript-practice/right.html b/javascript-practice/right.html deleted file mode 100644 index cd88003..0000000 --- a/javascript-practice/right.html +++ /dev/null @@ -1,552 +0,0 @@ - - - - - -javascript-practice - - - Stable - - - - - - - - - - - - - -
Folders
-ALL-JS-Files 00_expre...ables 02_functions 04_arrays 06_decom...ttern 08_highe...tions
<Go Back> 01_conditionals 03_loops 05_nesting 07_objects simple-side-bar
-
- - - - -
FileFileFileFileFileFileFileFile
index.html left.html right.html 
- -

-Folders: 12
-Files: 3
-Size of all files: 30254 KB

- - - \ No newline at end of file diff --git a/javascript-practice/simple-side-bar/.gitignore b/javascript-practice/simple-side-bar/.gitignore deleted file mode 100644 index b512c09..0000000 --- a/javascript-practice/simple-side-bar/.gitignore +++ /dev/null @@ -1 +0,0 @@ -node_modules \ No newline at end of file diff --git a/javascript-practice/simple-side-bar/.travis.yml b/javascript-practice/simple-side-bar/.travis.yml deleted file mode 100644 index 18f48b1..0000000 --- a/javascript-practice/simple-side-bar/.travis.yml +++ /dev/null @@ -1,11 +0,0 @@ -sudo: false -language: node_js -node_js: - - "node" -install: npm install -script: - - npm test - - gulp -cache: - directories: - - node_modules diff --git a/javascript-practice/simple-side-bar/README.md b/javascript-practice/simple-side-bar/README.md deleted file mode 100644 index 76159ed..0000000 --- a/javascript-practice/simple-side-bar/README.md +++ /dev/null @@ -1,56 +0,0 @@ -# [Simple Sidebar](https://github.com/bgoonz/bootstrap-sidebar-template) - -[Simple Sidebar](https://github.com/bgoonz/bootstrap-sidebar-template) is an off canvas sidebar navigation template -## Preview - -[![Simple Sidebar Preview](https://assets.startbootstrap.com/img/screenshots/templates/simple-sidebar.png)](https://startbootstrap.github.io/startbootstrap-simple-sidebar/) - -**[View Live Preview](https://startbootstrap.github.io/startbootstrap-simple-sidebar/)** - -## Status - - - -## Download and Installation - -To begin using this template, choose one of the following options to get started: - -* [Download the latest release on Start Bootstrap](https://github.com/bgoonz/bootstrap-sidebar-template) -* Install via npm: `npm i startbootstrap-simple-sidebar` -* Clone the repo: `git clone https://github.com/StartBootstrap/startbootstrap-simple-sidebar.git` -* [Fork, Clone, or Download on GitHub](https://github.com/StartBootstrap/startbootstrap-simple-sidebar) - -## Usage - -### Basic Usage - -After downloading, simply edit the HTML and CSS files included with the template in your favorite text editor to make changes. These are the only files you need to worry about, you can ignore everything else! To preview the changes you make to the code, you can open the `index.html` file in your web browser. - -### Advanced Usage - -After installation, run `npm install` and then run `npm start` which will open up a preview of the template in your default browser, watch for changes to core template files, and live reload the browser when changes are saved. You can view the `gulpfile.js` to see which tasks are included with the dev environment. - -You must have npm and Gulp installed globally on your machine in order to use these features. - -## Bugs and Issues - -Have a bug or an issue with this template? [Open a new issue](https://github.com/StartBootstrap/startbootstrap-simple-sidebar/issues) here on GitHub or leave a comment on the [template overview page at Start Bootstrap](https://github.com/bgoonz/bootstrap-sidebar-template). - -## About - -Start Bootstrap is an open source library of free Bootstrap templates and themes. All of the free templates and themes on Start Bootstrap are released under the MIT license, which means you can use them for any purpose, even for commercial projects. - -* -* - -Start Bootstrap was created by and is maintained by **[David Miller](https://davidmiller.io/)**. - -* -* -* - -Start Bootstrap is based on the [Bootstrap](https://getbootstrap.com/) framework created by [Mark Otto](https://twitter.com/mdo) and [Jacob Thorton](https://twitter.com/fat). - -## Copyright and License - -Copyright 2013-2020 Start Bootstrap LLC. Code released under the [MIT](https://github.com/StartBootstrap/startbootstrap-simple-sidebar/blob/gh-pages/LICENSE) license. diff --git a/javascript-practice/simple-side-bar/css/right.html b/javascript-practice/simple-side-bar/css/right.html deleted file mode 100644 index ddb46ff..0000000 --- a/javascript-practice/simple-side-bar/css/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -css - - - Stable - - - - - - - - - - - - -
Folders
<Go Back>
-
- - - - -
FileFileFileFileFileFileFileFile
simple-s...r.css right.html 
- -

-Folders: 1
-Files: 2
-Size of all files: 14767 KB

- - - \ No newline at end of file diff --git a/javascript-practice/simple-side-bar/css/simple-sidebar.css b/javascript-practice/simple-side-bar/css/simple-sidebar.css deleted file mode 100644 index 3515ab4..0000000 --- a/javascript-practice/simple-side-bar/css/simple-sidebar.css +++ /dev/null @@ -1,45 +0,0 @@ - - #wrapper { - overflow-x: hidden; - } - -#sidebar-wrapper { - min-height: 100vh; - margin-left: -15rem; - -webkit-transition: margin .25s ease-out; - -moz-transition: margin .25s ease-out; - -o-transition: margin .25s ease-out; - transition: margin .25s ease-out; -} - -#sidebar-wrapper .sidebar-heading { - padding: 0.875rem 1.25rem; - font-size: 1.2rem; -} - -#sidebar-wrapper .list-group { - width: 15rem; -} - -#page-content-wrapper { - min-width: 100vw; -} - -#wrapper.toggled #sidebar-wrapper { - margin-left: 0; -} - -@media (min-width: 768px) { - #sidebar-wrapper { - margin-left: 0; - } - - #page-content-wrapper { - min-width: 0; - width: 100%; - } - - #wrapper.toggled #sidebar-wrapper { - margin-left: -15rem; - } -} diff --git a/javascript-practice/simple-side-bar/directory.html b/javascript-practice/simple-side-bar/directory.html deleted file mode 100644 index 558fb4b..0000000 --- a/javascript-practice/simple-side-bar/directory.html +++ /dev/null @@ -1,25 +0,0 @@ - - - -C:/NEW_BOOTCAMP/Lambda/CIRRICULUMN/prep/_Resources/simple-side-bar - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/javascript-practice/simple-side-bar/gulpfile.js b/javascript-practice/simple-side-bar/gulpfile.js deleted file mode 100644 index a08e74b..0000000 --- a/javascript-practice/simple-side-bar/gulpfile.js +++ /dev/null @@ -1,61 +0,0 @@ -"use strict"; - -// Load plugins -const browsersync = require("browser-sync").create(); -const del = require("del"); -const gulp = require("gulp"); -const merge = require("merge-stream"); - -// BrowserSync -function browserSync(done) { - browsersync.init({ - server: { - baseDir: "./" - }, - port: 3000 - }); - done(); -} - -// BrowserSync reload -function browserSyncReload(done) { - browsersync.reload(); - done(); -} - -// Clean vendor -function clean() { - return del(["./vendor/"]); -} - -// Bring third party dependencies from node_modules into vendor directory -function modules() { - // Bootstrap - var bootstrap = gulp.src('./node_modules/bootstrap/dist/**/*') - .pipe(gulp.dest('./vendor/bootstrap')); - // jQuery - var jquery = gulp.src([ - './node_modules/jquery/dist/*', - '!./node_modules/jquery/dist/core.js' - ]) - .pipe(gulp.dest('./vendor/jquery')); - return merge(bootstrap, jquery); -} - -// Watch files -function watchFiles() { - gulp.watch("./**/*.css", browserSyncReload); - gulp.watch("./**/*.html", browserSyncReload); -} - -// Define complex tasks -const vendor = gulp.series(clean, modules); -const build = gulp.series(vendor); -const watch = gulp.series(build, gulp.parallel(watchFiles, browserSync)); - -// Export tasks -exports.clean = clean; -exports.vendor = vendor; -exports.build = build; -exports.watch = watch; -exports.default = build; diff --git a/javascript-practice/simple-side-bar/index.html b/javascript-practice/simple-side-bar/index.html deleted file mode 100644 index 541c7b6..0000000 --- a/javascript-practice/simple-side-bar/index.html +++ /dev/null @@ -1,114 +0,0 @@ - - - - - - - - - - - Simple Sidebar Template - - - - - - - - - - - -
- - - - - - -
- - - -
-

Simple Sidebar

-

The starting state of the menu will appear collapsed on smaller screens, and will appear non-collapsed on - larger screens. When toggled using the button below, the menu will change.

-

Make sure to keep all page content within the #page-content-wrapper. The top navbar is - optional, and just for demonstration. Just create an element with the #menu-toggle ID which - will toggle the menu when clicked.

-
-
- - -
- - - - - - - - - - - - diff --git a/javascript-practice/simple-side-bar/left.html b/javascript-practice/simple-side-bar/left.html deleted file mode 100644 index 93a63cd..0000000 --- a/javascript-practice/simple-side-bar/left.html +++ /dev/null @@ -1,649 +0,0 @@ - - - - - - /NEW_BOOTCAMP/Lambda/CIRRICULUMN/prep/_Resources/simple-side-bar - - - Stable - - - - - - - - - - - - - - - - - - - - - - -
Folders
<RETURN TO - NAVIGATION>
css
vendor
-
- - - - - diff --git a/javascript-practice/simple-side-bar/package-lock.json b/javascript-practice/simple-side-bar/package-lock.json deleted file mode 100644 index 50cf98e..0000000 --- a/javascript-practice/simple-side-bar/package-lock.json +++ /dev/null @@ -1,5271 +0,0 @@ -{ - "name": "startbootstrap-simple-sidebar", - "version": "5.1.3", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@nodelib/fs.scandir": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", - "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.3", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", - "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", - "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.3", - "fastq": "^1.6.0" - } - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "dev": true, - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", - "dev": true - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ansi-colors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", - "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", - "dev": true, - "requires": { - "ansi-wrap": "^0.1.0" - } - }, - "ansi-gray": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", - "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", - "dev": true - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "append-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", - "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", - "dev": true, - "requires": { - "buffer-equal": "^1.0.0" - } - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-filter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", - "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", - "dev": true, - "requires": { - "make-iterator": "^1.0.0" - } - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", - "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", - "dev": true, - "requires": { - "make-iterator": "^1.0.0" - } - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", - "dev": true - }, - "array-initial": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", - "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", - "dev": true, - "requires": { - "array-slice": "^1.0.0", - "is-number": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } - } - }, - "array-last": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", - "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", - "dev": true, - "requires": { - "is-number": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } - } - }, - "array-slice": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", - "dev": true - }, - "array-sort": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", - "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", - "dev": true, - "requires": { - "default-compare": "^1.0.0", - "get-value": "^2.0.6", - "kind-of": "^5.0.2" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "arraybuffer.slice": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", - "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "async-done": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.1.tgz", - "integrity": "sha512-R1BaUeJ4PMoLNJuk+0tLJgjmEqVsdN118+Z8O+alhnQDQgy0kmD5Mqi0DNEmMx2LM0Ed5yekKu+ZXYvIHceicg==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.2", - "process-nextick-args": "^1.0.7", - "stream-exhaust": "^1.0.1" - }, - "dependencies": { - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - } - } - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "async-each-series": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz", - "integrity": "sha1-dhfBkXQB/Yykooqtzj266Yr+tDI=", - "dev": true - }, - "async-settle": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", - "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", - "dev": true, - "requires": { - "async-done": "^1.2.2" - } - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "axios": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", - "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", - "dev": true, - "requires": { - "follow-redirects": "^1.10.0" - } - }, - "bach": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", - "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", - "dev": true, - "requires": { - "arr-filter": "^1.1.1", - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "array-each": "^1.0.0", - "array-initial": "^1.0.0", - "array-last": "^1.1.1", - "async-done": "^1.2.2", - "async-settle": "^1.0.0", - "now-and-later": "^2.0.0" - } - }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "base64-arraybuffer": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", - "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=", - "dev": true - }, - "base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", - "dev": true - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", - "dev": true - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true - }, - "blob": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", - "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", - "dev": true - }, - "bootstrap": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.0.1.tgz", - "integrity": "sha512-Fl79+wsLOZKoiU345KeEaWD0ik8WKRI5zm0YSPj2oF1Qr+BO7z0fco6GbUtqjoG1h4VI89PeKJnMsMMVQdKKTw==" - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "browser-sync": { - "version": "2.26.14", - "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.26.14.tgz", - "integrity": "sha512-3TtpsheGolJT6UFtM2CZWEcGJmI4ZEvoCKiKE2bvcDnPxRkhQT4nIGVtfiyPcoHKXGM0LwMOZmYJNWfiNfVXWA==", - "dev": true, - "requires": { - "browser-sync-client": "^2.26.14", - "browser-sync-ui": "^2.26.14", - "bs-recipes": "1.3.4", - "bs-snippet-injector": "^2.0.1", - "chokidar": "^3.5.1", - "connect": "3.6.6", - "connect-history-api-fallback": "^1", - "dev-ip": "^1.0.1", - "easy-extender": "^2.3.4", - "eazy-logger": "3.1.0", - "etag": "^1.8.1", - "fresh": "^0.5.2", - "fs-extra": "3.0.1", - "http-proxy": "^1.18.1", - "immutable": "^3", - "localtunnel": "^2.0.1", - "micromatch": "^4.0.2", - "opn": "5.3.0", - "portscanner": "2.1.1", - "qs": "6.2.3", - "raw-body": "^2.3.2", - "resp-modifier": "6.0.2", - "rx": "4.1.0", - "send": "0.16.2", - "serve-index": "1.9.1", - "serve-static": "1.13.2", - "server-destroy": "1.0.1", - "socket.io": "2.4.0", - "ua-parser-js": "^0.7.18", - "yargs": "^15.4.1" - }, - "dependencies": { - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", - "dev": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.3.1", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "browser-sync-client": { - "version": "2.26.14", - "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.26.14.tgz", - "integrity": "sha512-be0m1MchmKv/26r/yyyolxXcBi052aYrmaQep5nm8YNMjFcEyzv0ZoOKn/c3WEXNlEB/KeXWaw70fAOJ+/F1zQ==", - "dev": true, - "requires": { - "etag": "1.8.1", - "fresh": "0.5.2", - "mitt": "^1.1.3", - "rxjs": "^5.5.6" - } - }, - "browser-sync-ui": { - "version": "2.26.14", - "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.26.14.tgz", - "integrity": "sha512-6oT1sboM4KVNnWCCJDMGbRIeTBw97toMFQ+srImvwQ6J5t9KMgizaIX8HcKLiemsUMSJkgGM9RVKIpq2UblgOA==", - "dev": true, - "requires": { - "async-each-series": "0.1.1", - "connect-history-api-fallback": "^1", - "immutable": "^3", - "server-destroy": "1.0.1", - "socket.io-client": "^2.4.0", - "stream-throttle": "^0.1.3" - } - }, - "bs-recipes": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz", - "integrity": "sha1-DS1NSKcYyMBEdp/cT4lZLci2lYU=", - "dev": true - }, - "bs-snippet-injector": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/bs-snippet-injector/-/bs-snippet-injector-2.0.1.tgz", - "integrity": "sha1-YbU5PxH1JVntEgaTEANDtu2wTdU=", - "dev": true - }, - "buffer-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", - "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", - "dev": true - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "chokidar": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.5.tgz", - "integrity": "sha512-i0TprVWp+Kj4WRPtInjexJ8Q+BqTE909VpH8xVhXrJkoc5QC8VO9TryGOqTr+2hljzc1sC62t22h5tZePodM/A==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true, - "optional": true - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, - "clone-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", - "dev": true - }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "cloneable-readable": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz", - "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "process-nextick-args": "^2.0.0", - "readable-stream": "^2.3.5" - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "collection-map": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", - "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", - "dev": true, - "requires": { - "arr-map": "^2.0.2", - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - } - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", - "dev": true - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "connect": { - "version": "3.6.6", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", - "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", - "dev": true, - "requires": { - "debug": "2.6.9", - "finalhandler": "1.1.0", - "parseurl": "~1.3.2", - "utils-merge": "1.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", - "dev": true - }, - "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", - "dev": true - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "copy-props": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz", - "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==", - "dev": true, - "requires": { - "each-props": "^1.3.0", - "is-plain-object": "^2.0.1" - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true, - "requires": { - "es5-ext": "^0.10.9" - } - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "default-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", - "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", - "dev": true, - "requires": { - "kind-of": "^5.0.2" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "default-resolution": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", - "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=", - "dev": true - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "del": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", - "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", - "dev": true, - "requires": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - } - } - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true - }, - "dev-ip": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", - "integrity": "sha1-p2o+0YVb56ASu4rBbLgPPADcKPA=", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - }, - "dependencies": { - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - } - } - }, - "dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "each-props": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", - "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.1", - "object.defaults": "^1.1.0" - } - }, - "easy-extender": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz", - "integrity": "sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==", - "dev": true, - "requires": { - "lodash": "^4.17.10" - } - }, - "eazy-logger": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-3.1.0.tgz", - "integrity": "sha512-/snsn2JqBtUSSstEl4R0RKjkisGHAhvYj89i7r3ytNUKW12y178KDZwXLXIgwDqLW6E/VRMT9qfld7wvFae8bQ==", - "dev": true, - "requires": { - "tfunk": "^4.0.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "engine.io": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.5.0.tgz", - "integrity": "sha512-21HlvPUKaitDGE4GXNtQ7PLP0Sz4aWLddMPw2VTyFz1FVZqu/kZsJUO8WNpKuE/OCL7nkfRaOui2ZCJloGznGA==", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.4.1", - "debug": "~4.1.0", - "engine.io-parser": "~2.2.0", - "ws": "~7.4.2" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - } - } - }, - "engine.io-client": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.1.tgz", - "integrity": "sha512-oVu9kBkGbcggulyVF0kz6BV3ganqUeqXvD79WOFKa+11oK692w1NyFkuEj4xrkFRpZhn92QOqTk4RQq5LiBXbQ==", - "dev": true, - "requires": { - "component-emitter": "~1.3.0", - "component-inherit": "0.0.3", - "debug": "~3.1.0", - "engine.io-parser": "~2.2.0", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "ws": "~7.4.2", - "xmlhttprequest-ssl": "~1.5.4", - "yeast": "0.1.2" - }, - "dependencies": { - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - } - } - }, - "engine.io-parser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz", - "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==", - "dev": true, - "requires": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.4", - "blob": "0.0.5", - "has-binary2": "~1.0.2" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es5-ext": { - "version": "0.10.50", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.50.tgz", - "integrity": "sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw==", - "dev": true, - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.1", - "next-tick": "^1.0.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "es6-weak-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", - "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.14", - "es6-iterator": "^2.0.1", - "es6-symbol": "^3.1.1" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true - }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "fancy-log": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", - "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", - "dev": true, - "requires": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "parse-node-version": "^1.0.0", - "time-stamp": "^1.0.0" - } - }, - "fast-glob": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", - "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", - "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" - }, - "dependencies": { - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "fastq": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.9.0.tgz", - "integrity": "sha512-i7FVWL8HhVY+CTkwFxkN2mk3h+787ixS5S63eb78diVRc1MCssarHq3W5cj0av7YDSwmaV928RNag+U1etRQ7w==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "finalhandler": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", - "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.1", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.3.1", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - } - }, - "fined": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", - "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^2.0.3", - "object.defaults": "^1.1.0", - "object.pick": "^1.2.0", - "parse-filepath": "^1.0.1" - } - }, - "flagged-respawn": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", - "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", - "dev": true - }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "follow-redirects": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.3.tgz", - "integrity": "sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA==", - "dev": true - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true - }, - "fs-extra": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", - "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^3.0.0", - "universalify": "^0.1.0" - } - }, - "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "fs-mkdirp-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", - "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "through2": "^2.0.3" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", - "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", - "dev": true, - "optional": true, - "requires": { - "nan": "^2.12.1", - "node-pre-gyp": "^0.12.0" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true, - "optional": true - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "dev": true, - "optional": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", - "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true, - "optional": true - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true, - "optional": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true, - "optional": true - }, - "needle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.3.0.tgz", - "integrity": "sha512-QBZu7aAFR0522EyaXZM0FZ9GLpq6lvQ3uq8gteiDUp7wKdy0lSd2hPlgFwVuW1CBkfEs9PfDQsQzZghLs/psdg==", - "dev": true, - "optional": true, - "requires": { - "debug": "^4.1.0", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz", - "integrity": "sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==", - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - } - }, - "nopt": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz", - "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.1.tgz", - "integrity": "sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==", - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true, - "optional": true - }, - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true, - "optional": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true, - "optional": true - } - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "glob-stream": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", - "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", - "dev": true, - "requires": { - "extend": "^3.0.0", - "glob": "^7.1.1", - "glob-parent": "^3.1.0", - "is-negated-glob": "^1.0.0", - "ordered-read-streams": "^1.0.0", - "pumpify": "^1.3.5", - "readable-stream": "^2.1.5", - "remove-trailing-separator": "^1.0.1", - "to-absolute-glob": "^2.0.0", - "unique-stream": "^2.0.2" - } - }, - "glob-watcher": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.3.tgz", - "integrity": "sha512-8tWsULNEPHKQ2MR4zXuzSmqbdyV5PtwwCaWSGQ1WwHsJ07ilNeN1JB8ntxhckbnpSHaf9dXFUHzIWvm1I13dsg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-done": "^1.2.0", - "chokidar": "^2.0.0", - "is-negated-glob": "^1.0.0", - "just-debounce": "^1.0.0", - "object.defaults": "^1.1.0" - } - }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } - }, - "globby": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", - "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - } - }, - "glogg": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", - "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", - "dev": true, - "requires": { - "sparkles": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", - "dev": true - }, - "gulp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", - "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", - "dev": true, - "requires": { - "glob-watcher": "^5.0.3", - "gulp-cli": "^2.2.0", - "undertaker": "^1.2.1", - "vinyl-fs": "^3.0.0" - }, - "dependencies": { - "gulp-cli": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.2.0.tgz", - "integrity": "sha512-rGs3bVYHdyJpLqR0TUBnlcZ1O5O++Zs4bA0ajm+zr3WFCfiSLjGwoCBqFs18wzN+ZxahT9DkOK5nDf26iDsWjA==", - "dev": true, - "requires": { - "ansi-colors": "^1.0.1", - "archy": "^1.0.0", - "array-sort": "^1.0.0", - "color-support": "^1.1.3", - "concat-stream": "^1.6.0", - "copy-props": "^2.0.1", - "fancy-log": "^1.3.2", - "gulplog": "^1.0.0", - "interpret": "^1.1.0", - "isobject": "^3.0.1", - "liftoff": "^3.1.0", - "matchdep": "^2.0.0", - "mute-stdout": "^1.0.0", - "pretty-hrtime": "^1.0.0", - "replace-homedir": "^1.0.0", - "semver-greatest-satisfied-range": "^1.1.0", - "v8flags": "^3.0.1", - "yargs": "^7.1.0" - } - }, - "yargs": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", - "dev": true, - "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^5.0.0" - } - }, - "yargs-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", - "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", - "dev": true, - "requires": { - "camelcase": "^3.0.0" - } - } - } - }, - "gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", - "dev": true, - "requires": { - "glogg": "^1.0.0" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-binary2": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", - "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", - "dev": true, - "requires": { - "isarray": "2.0.1" - } - }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", - "dev": true - }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", - "dev": true - }, - "http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - } - } - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true - }, - "immutable": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", - "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true - }, - "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", - "dev": true - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "dev": true, - "requires": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-negated-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", - "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-number-like": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", - "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", - "dev": true, - "requires": { - "lodash.isfinite": "^3.3.2" - } - }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", - "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "dev": true, - "requires": { - "is-unc-path": "^1.0.0" - } - }, - "is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "dev": true, - "requires": { - "unc-path-regex": "^0.1.2" - } - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-valid-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", - "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true - }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "jquery": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", - "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "jsonfile": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", - "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "just-debounce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", - "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "last-run": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", - "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", - "dev": true, - "requires": { - "default-resolution": "^2.0.0", - "es6-weak-map": "^2.0.1" - } - }, - "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "dev": true, - "requires": { - "readable-stream": "^2.0.5" - } - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "lead": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", - "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", - "dev": true, - "requires": { - "flush-write-stream": "^1.0.2" - } - }, - "liftoff": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", - "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", - "dev": true, - "requires": { - "extend": "^3.0.0", - "findup-sync": "^3.0.0", - "fined": "^1.0.1", - "flagged-respawn": "^1.0.0", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.0", - "rechoir": "^0.6.2", - "resolve": "^1.1.7" - } - }, - "limiter": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", - "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==", - "dev": true - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, - "localtunnel": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.1.tgz", - "integrity": "sha512-LiaI5wZdz0xFkIQpXbNI62ZnNn8IMsVhwxHmhA+h4vj8R9JG/07bQHWwQlyy7b95/5fVOCHJfIHv+a5XnkvaJA==", - "dev": true, - "requires": { - "axios": "0.21.1", - "debug": "4.3.1", - "openurl": "1.1.1", - "yargs": "16.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz", - "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - } - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.isfinite": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", - "integrity": "sha1-+4m2WpqAKBgz8LdHizpRBPiY67M=", - "dev": true - }, - "make-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", - "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "matchdep": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", - "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", - "dev": true, - "requires": { - "findup-sync": "^2.0.0", - "micromatch": "^3.0.4", - "resolve": "^1.4.0", - "stack-trace": "0.0.10" - }, - "dependencies": { - "findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^3.1.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - } - }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", - "dev": true - }, - "mime-db": { - "version": "1.47.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", - "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==", - "dev": true - }, - "mime-types": { - "version": "2.1.30", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", - "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", - "dev": true, - "requires": { - "mime-db": "1.47.0" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true, - "optional": true - }, - "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mitt": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz", - "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==", - "dev": true - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "optional": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "mute-stdout": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", - "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", - "dev": true - }, - "nan": { - "version": "2.13.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz", - "integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==", - "dev": true, - "optional": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", - "dev": true - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "now-and-later": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", - "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", - "dev": true, - "requires": { - "once": "^1.3.2" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", - "dev": true, - "requires": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "object.map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", - "dev": true, - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "object.reduce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", - "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", - "dev": true, - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - } - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "openurl": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", - "integrity": "sha1-OHW0sO96UsFW8NtB1GCduw+Us4c=", - "dev": true - }, - "opn": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", - "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", - "dev": true, - "requires": { - "is-wsl": "^1.1.0" - } - }, - "ordered-read-streams": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", - "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "^1.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", - "dev": true, - "requires": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "parse-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", - "dev": true - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "parseqs": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", - "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==", - "dev": true - }, - "parseuri": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", - "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==", - "dev": true - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", - "dev": true, - "requires": { - "path-root-regex": "^0.1.0" - } - }, - "path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", - "dev": true - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "portscanner": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.1.1.tgz", - "integrity": "sha1-6rtAnk3iSVD1oqUW01rnaTQ/u5Y=", - "dev": true, - "requires": { - "async": "1.5.2", - "is-number-like": "^1.0.3" - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - } - }, - "qs": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.3.tgz", - "integrity": "sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=", - "dev": true - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "raw-body": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", - "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.3", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - } - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "remove-bom-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", - "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5", - "is-utf8": "^0.2.1" - } - }, - "remove-bom-stream": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", - "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", - "dev": true, - "requires": { - "remove-bom-buffer": "^3.0.0", - "safe-buffer": "^5.1.0", - "through2": "^2.0.3" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "dev": true - }, - "replace-homedir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", - "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1", - "is-absolute": "^1.0.0", - "remove-trailing-separator": "^1.1.0" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true - }, - "resolve": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.1.tgz", - "integrity": "sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - } - }, - "resolve-options": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", - "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", - "dev": true, - "requires": { - "value-or-function": "^3.0.0" - } - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "resp-modifier": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz", - "integrity": "sha1-sSTeXE+6/LpUH0j/pzlw9KpFa08=", - "dev": true, - "requires": { - "debug": "^2.2.0", - "minimatch": "^3.0.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-parallel": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz", - "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==", - "dev": true - }, - "rx": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", - "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", - "dev": true - }, - "rxjs": { - "version": "5.5.12", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", - "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", - "dev": true, - "requires": { - "symbol-observable": "1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true - }, - "semver-greatest-satisfied-range": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", - "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", - "dev": true, - "requires": { - "sver-compat": "^1.5.0" - } - }, - "send": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", - "on-finished": "~2.3.0", - "range-parser": "~1.2.0", - "statuses": "~1.4.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "dev": true - } - } - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - } - } - }, - "serve-static": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.2", - "send": "0.16.2" - } - }, - "server-destroy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", - "integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=", - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "socket.io": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.4.0.tgz", - "integrity": "sha512-9UPJ1UTvKayuQfVv2IQ3k7tCQC/fboDyIK62i99dAQIyHKaBsNdTpwHLgKJ6guRWxRtC9H+138UwpaGuQO9uWQ==", - "dev": true, - "requires": { - "debug": "~4.1.0", - "engine.io": "~3.5.0", - "has-binary2": "~1.0.2", - "socket.io-adapter": "~1.1.0", - "socket.io-client": "2.4.0", - "socket.io-parser": "~3.4.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "socket.io-parser": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz", - "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", - "dev": true, - "requires": { - "component-emitter": "1.2.1", - "debug": "~4.1.0", - "isarray": "2.0.1" - } - } - } - }, - "socket.io-adapter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", - "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==", - "dev": true - }, - "socket.io-client": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.4.0.tgz", - "integrity": "sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ==", - "dev": true, - "requires": { - "backo2": "1.0.2", - "component-bind": "1.0.0", - "component-emitter": "~1.3.0", - "debug": "~3.1.0", - "engine.io-client": "~3.5.0", - "has-binary2": "~1.0.2", - "indexof": "0.0.1", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "socket.io-parser": "~3.3.0", - "to-array": "0.1.4" - }, - "dependencies": { - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - } - } - }, - "socket.io-parser": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.2.tgz", - "integrity": "sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg==", - "dev": true, - "requires": { - "component-emitter": "~1.3.0", - "debug": "~3.1.0", - "isarray": "2.0.1" - }, - "dependencies": { - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - } - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "dev": true, - "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "sparkles": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", - "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", - "dev": true - }, - "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", - "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==", - "dev": true - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", - "dev": true - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", - "dev": true - }, - "stream-exhaust": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", - "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", - "dev": true - }, - "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", - "dev": true - }, - "stream-throttle": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz", - "integrity": "sha1-rdV8jXzHOoFjDTHNVdOWHPr7qcM=", - "dev": true, - "requires": { - "commander": "^2.2.0", - "limiter": "^1.0.5" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "sver-compat": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", - "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", - "dev": true, - "requires": { - "es6-iterator": "^2.0.1", - "es6-symbol": "^3.1.1" - } - }, - "symbol-observable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", - "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", - "dev": true - }, - "tar": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - }, - "tfunk": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tfunk/-/tfunk-4.0.0.tgz", - "integrity": "sha512-eJQ0dGfDIzWNiFNYFVjJ+Ezl/GmwHaFTBTjrtqNPW0S7cuVDBrZrmzUz6VkMeCR4DZFqhd4YtLwsw3i2wYHswQ==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "dlv": "^1.1.3" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "through2-filter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", - "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", - "dev": true, - "requires": { - "through2": "~2.0.0", - "xtend": "~4.0.0" - } - }, - "time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", - "dev": true - }, - "to-absolute-glob": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", - "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", - "dev": true, - "requires": { - "is-absolute": "^1.0.0", - "is-negated-glob": "^1.0.0" - } - }, - "to-array": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "to-through": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", - "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", - "dev": true, - "requires": { - "through2": "^2.0.3" - } - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "dev": true - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "ua-parser-js": { - "version": "0.7.27", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.27.tgz", - "integrity": "sha512-eXMaRYK2skomGocoX0x9sBXzx5A1ZVQgXfrW4mTc8dT0zS7olEcyfudAzRC5tIIRgLxQ69B6jut3DI+n5hslPA==", - "dev": true - }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", - "dev": true - }, - "undertaker": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.1.tgz", - "integrity": "sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "bach": "^1.0.0", - "collection-map": "^1.0.0", - "es6-weak-map": "^2.0.1", - "last-run": "^1.1.0", - "object.defaults": "^1.0.0", - "object.reduce": "^1.0.0", - "undertaker-registry": "^1.0.0" - } - }, - "undertaker-registry": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", - "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=", - "dev": true - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "unique-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", - "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", - "dev": true, - "requires": { - "json-stable-stringify-without-jsonify": "^1.0.1", - "through2-filter": "^3.0.0" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - } - } - }, - "upath": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", - "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", - "dev": true - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true - }, - "v8flags": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.2.tgz", - "integrity": "sha512-MtivA7GF24yMPte9Rp/BWGCYQNaUj86zeYxV/x2RRJMKagImbbv3u8iJC57lNhWLPcGLJmHcHmFWkNsplbbLWw==", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "value-or-function": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", - "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", - "dev": true - }, - "vinyl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", - "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", - "dev": true, - "requires": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - } - }, - "vinyl-fs": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", - "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", - "dev": true, - "requires": { - "fs-mkdirp-stream": "^1.0.0", - "glob-stream": "^6.1.0", - "graceful-fs": "^4.0.0", - "is-valid-glob": "^1.0.0", - "lazystream": "^1.0.0", - "lead": "^1.0.0", - "object.assign": "^4.0.4", - "pumpify": "^1.3.5", - "readable-stream": "^2.3.3", - "remove-bom-buffer": "^3.0.0", - "remove-bom-stream": "^1.2.0", - "resolve-options": "^1.1.0", - "through2": "^2.0.0", - "to-through": "^2.0.0", - "value-or-function": "^3.0.0", - "vinyl": "^2.0.0", - "vinyl-sourcemap": "^1.1.0" - } - }, - "vinyl-sourcemap": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", - "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", - "dev": true, - "requires": { - "append-buffer": "^1.0.2", - "convert-source-map": "^1.5.0", - "graceful-fs": "^4.1.6", - "normalize-path": "^2.1.1", - "now-and-later": "^2.0.0", - "remove-bom-buffer": "^3.0.0", - "vinyl": "^2.0.0" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "ws": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz", - "integrity": "sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==", - "dev": true - }, - "xmlhttprequest-ssl": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", - "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", - "dev": true - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, - "y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "optional": true - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", - "dev": true - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "yargs-parser": { - "version": "20.2.7", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", - "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", - "dev": true - }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", - "dev": true - } - } -} diff --git a/javascript-practice/simple-side-bar/package.json b/javascript-practice/simple-side-bar/package.json deleted file mode 100644 index 1932514..0000000 --- a/javascript-practice/simple-side-bar/package.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "title": "Simple Sidebar", - "name": "startbootstrap-simple-sidebar", - "version": "5.1.3", - "scripts": { - "start": "node_modules/.bin/gulp watch" - }, - "description": "A simple sidebar navigation HTMl template built with Bootstrap", - "keywords": [ - "css", - "sass", - "html", - "responsive", - "theme", - "template" - ], - "homepage": "https://startbootstrap.com/template/simple-sidebar", - "bugs": { - "url": "https://github.com/StartBootstrap/startbootstrap-simple-sidebar/issues", - "email": "feedback@startbootstrap.com" - }, - "license": "MIT", - "author": "Start Bootstrap", - "contributors": [ - "David Miller (https://davidmiller.io/)" - ], - "repository": { - "type": "git", - "url": "https://github.com/StartBootstrap/startbootstrap-simple-sidebar.git" - }, - "dependencies": { - "bootstrap": "5.0.1", - "jquery": "3.6.0" - }, - "devDependencies": { - "browser-sync": "2.26.14", - "del": "6.0.0", - "gulp": "4.0.2", - "merge-stream": "2.0.0" - } -} diff --git a/javascript-practice/simple-side-bar/right.html b/javascript-practice/simple-side-bar/right.html deleted file mode 100644 index 877cdd0..0000000 --- a/javascript-practice/simple-side-bar/right.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -simple-side-bar - - - Stable - - - - - - - - - - - - -
Folders
<Go Back> css vendor
-
- - - - -
FileFileFileFileFileFileFileFile
directory.html index.html left.html right.html gulpfile.js package-....json package.json README.md 
- -

-Folders: 3
-Files: 8
-Size of all files: 281770 KB

- - - \ No newline at end of file diff --git a/javascript-practice/simple-side-bar/vendor/bootstrap/css/bootstrap-grid.css b/javascript-practice/simple-side-bar/vendor/bootstrap/css/bootstrap-grid.css deleted file mode 100644 index 9cfa07a..0000000 --- a/javascript-practice/simple-side-bar/vendor/bootstrap/css/bootstrap-grid.css +++ /dev/null @@ -1,3872 +0,0 @@ -/*! - * Bootstrap Grid v4.5.3 (https://getbootstrap.com/) - * Copyright 2011-2020 The Bootstrap Authors - * Copyright 2011-2020 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */ -html { - box-sizing: border-box; - -ms-overflow-style: scrollbar; -} - -*, -*::before, -*::after { - box-sizing: inherit; -} - -.container, -.container-fluid, -.container-sm, -.container-md, -.container-lg, -.container-xl { - width: 100%; - padding-right: 15px; - padding-left: 15px; - margin-right: auto; - margin-left: auto; -} - -@media (min-width: 576px) { - .container, .container-sm { - max-width: 540px; - } -} - -@media (min-width: 768px) { - .container, .container-sm, .container-md { - max-width: 720px; - } -} - -@media (min-width: 992px) { - .container, .container-sm, .container-md, .container-lg { - max-width: 960px; - } -} - -@media (min-width: 1200px) { - .container, .container-sm, .container-md, .container-lg, .container-xl { - max-width: 1140px; - } -} - -.row { - display: -ms-flexbox; - display: flex; - -ms-flex-wrap: wrap; - flex-wrap: wrap; - margin-right: -15px; - margin-left: -15px; -} - -.no-gutters { - margin-right: 0; - margin-left: 0; -} - -.no-gutters > .col, -.no-gutters > [class*="col-"] { - padding-right: 0; - padding-left: 0; -} - -.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col, -.col-auto, .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, .col-sm, -.col-sm-auto, .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, .col-md, -.col-md-auto, .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, .col-lg, -.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl, -.col-xl-auto { - position: relative; - width: 100%; - padding-right: 15px; - padding-left: 15px; -} - -.col { - -ms-flex-preferred-size: 0; - flex-basis: 0; - -ms-flex-positive: 1; - flex-grow: 1; - max-width: 100%; -} - -.row-cols-1 > * { - -ms-flex: 0 0 100%; - flex: 0 0 100%; - max-width: 100%; -} - -.row-cols-2 > * { - -ms-flex: 0 0 50%; - flex: 0 0 50%; - max-width: 50%; -} - -.row-cols-3 > * { - -ms-flex: 0 0 33.333333%; - flex: 0 0 33.333333%; - max-width: 33.333333%; -} - -.row-cols-4 > * { - -ms-flex: 0 0 25%; - flex: 0 0 25%; - max-width: 25%; -} - -.row-cols-5 > * { - -ms-flex: 0 0 20%; - flex: 0 0 20%; - max-width: 20%; -} - -.row-cols-6 > * { - -ms-flex: 0 0 16.666667%; - flex: 0 0 16.666667%; - max-width: 16.666667%; -} - -.col-auto { - -ms-flex: 0 0 auto; - flex: 0 0 auto; - width: auto; - max-width: 100%; -} - -.col-1 { - -ms-flex: 0 0 8.333333%; - flex: 0 0 8.333333%; - max-width: 8.333333%; -} - -.col-2 { - -ms-flex: 0 0 16.666667%; - flex: 0 0 16.666667%; - max-width: 16.666667%; -} - -.col-3 { - -ms-flex: 0 0 25%; - flex: 0 0 25%; - max-width: 25%; -} - -.col-4 { - -ms-flex: 0 0 33.333333%; - flex: 0 0 33.333333%; - max-width: 33.333333%; -} - -.col-5 { - -ms-flex: 0 0 41.666667%; - flex: 0 0 41.666667%; - max-width: 41.666667%; -} - -.col-6 { - -ms-flex: 0 0 50%; - flex: 0 0 50%; - max-width: 50%; -} - -.col-7 { - -ms-flex: 0 0 58.333333%; - flex: 0 0 58.333333%; - max-width: 58.333333%; -} - -.col-8 { - -ms-flex: 0 0 66.666667%; - flex: 0 0 66.666667%; - max-width: 66.666667%; -} - -.col-9 { - -ms-flex: 0 0 75%; - flex: 0 0 75%; - max-width: 75%; -} - -.col-10 { - -ms-flex: 0 0 83.333333%; - flex: 0 0 83.333333%; - max-width: 83.333333%; -} - -.col-11 { - -ms-flex: 0 0 91.666667%; - flex: 0 0 91.666667%; - max-width: 91.666667%; -} - -.col-12 { - -ms-flex: 0 0 100%; - flex: 0 0 100%; - max-width: 100%; -} - -.order-first { - -ms-flex-order: -1; - order: -1; -} - -.order-last { - -ms-flex-order: 13; - order: 13; -} - -.order-0 { - -ms-flex-order: 0; - order: 0; -} - -.order-1 { - -ms-flex-order: 1; - order: 1; -} - -.order-2 { - -ms-flex-order: 2; - order: 2; -} - -.order-3 { - -ms-flex-order: 3; - order: 3; -} - -.order-4 { - -ms-flex-order: 4; - order: 4; -} - -.order-5 { - -ms-flex-order: 5; - order: 5; -} - -.order-6 { - -ms-flex-order: 6; - order: 6; -} - -.order-7 { - -ms-flex-order: 7; - order: 7; -} - -.order-8 { - -ms-flex-order: 8; - order: 8; -} - -.order-9 { - -ms-flex-order: 9; - order: 9; -} - -.order-10 { - -ms-flex-order: 10; - order: 10; -} - -.order-11 { - -ms-flex-order: 11; - order: 11; -} - -.order-12 { - -ms-flex-order: 12; - order: 12; -} - -.offset-1 { - margin-left: 8.333333%; -} - -.offset-2 { - margin-left: 16.666667%; -} - -.offset-3 { - margin-left: 25%; -} - -.offset-4 { - margin-left: 33.333333%; -} - -.offset-5 { - margin-left: 41.666667%; -} - -.offset-6 { - margin-left: 50%; -} - -.offset-7 { - margin-left: 58.333333%; -} - -.offset-8 { - margin-left: 66.666667%; -} - -.offset-9 { - margin-left: 75%; -} - -.offset-10 { - margin-left: 83.333333%; -} - -.offset-11 { - margin-left: 91.666667%; -} - -@media (min-width: 576px) { - .col-sm { - -ms-flex-preferred-size: 0; - flex-basis: 0; - -ms-flex-positive: 1; - flex-grow: 1; - max-width: 100%; - } - .row-cols-sm-1 > * { - -ms-flex: 0 0 100%; - flex: 0 0 100%; - max-width: 100%; - } - .row-cols-sm-2 > * { - -ms-flex: 0 0 50%; - flex: 0 0 50%; - max-width: 50%; - } - .row-cols-sm-3 > * { - -ms-flex: 0 0 33.333333%; - flex: 0 0 33.333333%; - max-width: 33.333333%; - } - .row-cols-sm-4 > * { - -ms-flex: 0 0 25%; - flex: 0 0 25%; - max-width: 25%; - } - .row-cols-sm-5 > * { - -ms-flex: 0 0 20%; - flex: 0 0 20%; - max-width: 20%; - } - .row-cols-sm-6 > * { - -ms-flex: 0 0 16.666667%; - flex: 0 0 16.666667%; - max-width: 16.666667%; - } - .col-sm-auto { - -ms-flex: 0 0 auto; - flex: 0 0 auto; - width: auto; - max-width: 100%; - } - .col-sm-1 { - -ms-flex: 0 0 8.333333%; - flex: 0 0 8.333333%; - max-width: 8.333333%; - } - .col-sm-2 { - -ms-flex: 0 0 16.666667%; - flex: 0 0 16.666667%; - max-width: 16.666667%; - } - .col-sm-3 { - -ms-flex: 0 0 25%; - flex: 0 0 25%; - max-width: 25%; - } - .col-sm-4 { - -ms-flex: 0 0 33.333333%; - flex: 0 0 33.333333%; - max-width: 33.333333%; - } - .col-sm-5 { - -ms-flex: 0 0 41.666667%; - flex: 0 0 41.666667%; - max-width: 41.666667%; - } - .col-sm-6 { - -ms-flex: 0 0 50%; - flex: 0 0 50%; - max-width: 50%; - } - .col-sm-7 { - -ms-flex: 0 0 58.333333%; - flex: 0 0 58.333333%; - max-width: 58.333333%; - } - .col-sm-8 { - -ms-flex: 0 0 66.666667%; - flex: 0 0 66.666667%; - max-width: 66.666667%; - } - .col-sm-9 { - -ms-flex: 0 0 75%; - flex: 0 0 75%; - max-width: 75%; - } - .col-sm-10 { - -ms-flex: 0 0 83.333333%; - flex: 0 0 83.333333%; - max-width: 83.333333%; - } - .col-sm-11 { - -ms-flex: 0 0 91.666667%; - flex: 0 0 91.666667%; - max-width: 91.666667%; - } - .col-sm-12 { - -ms-flex: 0 0 100%; - flex: 0 0 100%; - max-width: 100%; - } - .order-sm-first { - -ms-flex-order: -1; - order: -1; - } - .order-sm-last { - -ms-flex-order: 13; - order: 13; - } - .order-sm-0 { - -ms-flex-order: 0; - order: 0; - } - .order-sm-1 { - -ms-flex-order: 1; - order: 1; - } - .order-sm-2 { - -ms-flex-order: 2; - order: 2; - } - .order-sm-3 { - -ms-flex-order: 3; - order: 3; - } - .order-sm-4 { - -ms-flex-order: 4; - order: 4; - } - .order-sm-5 { - -ms-flex-order: 5; - order: 5; - } - .order-sm-6 { - -ms-flex-order: 6; - order: 6; - } - .order-sm-7 { - -ms-flex-order: 7; - order: 7; - } - .order-sm-8 { - -ms-flex-order: 8; - order: 8; - } - .order-sm-9 { - -ms-flex-order: 9; - order: 9; - } - .order-sm-10 { - -ms-flex-order: 10; - order: 10; - } - .order-sm-11 { - -ms-flex-order: 11; - order: 11; - } - .order-sm-12 { - -ms-flex-order: 12; - order: 12; - } - .offset-sm-0 { - margin-left: 0; - } - .offset-sm-1 { - margin-left: 8.333333%; - } - .offset-sm-2 { - margin-left: 16.666667%; - } - .offset-sm-3 { - margin-left: 25%; - } - .offset-sm-4 { - margin-left: 33.333333%; - } - .offset-sm-5 { - margin-left: 41.666667%; - } - .offset-sm-6 { - margin-left: 50%; - } - .offset-sm-7 { - margin-left: 58.333333%; - } - .offset-sm-8 { - margin-left: 66.666667%; - } - .offset-sm-9 { - margin-left: 75%; - } - .offset-sm-10 { - margin-left: 83.333333%; - } - .offset-sm-11 { - margin-left: 91.666667%; - } -} - -@media (min-width: 768px) { - .col-md { - -ms-flex-preferred-size: 0; - flex-basis: 0; - -ms-flex-positive: 1; - flex-grow: 1; - max-width: 100%; - } - .row-cols-md-1 > * { - -ms-flex: 0 0 100%; - flex: 0 0 100%; - max-width: 100%; - } - .row-cols-md-2 > * { - -ms-flex: 0 0 50%; - flex: 0 0 50%; - max-width: 50%; - } - .row-cols-md-3 > * { - -ms-flex: 0 0 33.333333%; - flex: 0 0 33.333333%; - max-width: 33.333333%; - } - .row-cols-md-4 > * { - -ms-flex: 0 0 25%; - flex: 0 0 25%; - max-width: 25%; - } - .row-cols-md-5 > * { - -ms-flex: 0 0 20%; - flex: 0 0 20%; - max-width: 20%; - } - .row-cols-md-6 > * { - -ms-flex: 0 0 16.666667%; - flex: 0 0 16.666667%; - max-width: 16.666667%; - } - .col-md-auto { - -ms-flex: 0 0 auto; - flex: 0 0 auto; - width: auto; - max-width: 100%; - } - .col-md-1 { - -ms-flex: 0 0 8.333333%; - flex: 0 0 8.333333%; - max-width: 8.333333%; - } - .col-md-2 { - -ms-flex: 0 0 16.666667%; - flex: 0 0 16.666667%; - max-width: 16.666667%; - } - .col-md-3 { - -ms-flex: 0 0 25%; - flex: 0 0 25%; - max-width: 25%; - } - .col-md-4 { - -ms-flex: 0 0 33.333333%; - flex: 0 0 33.333333%; - max-width: 33.333333%; - } - .col-md-5 { - -ms-flex: 0 0 41.666667%; - flex: 0 0 41.666667%; - max-width: 41.666667%; - } - .col-md-6 { - -ms-flex: 0 0 50%; - flex: 0 0 50%; - max-width: 50%; - } - .col-md-7 { - -ms-flex: 0 0 58.333333%; - flex: 0 0 58.333333%; - max-width: 58.333333%; - } - .col-md-8 { - -ms-flex: 0 0 66.666667%; - flex: 0 0 66.666667%; - max-width: 66.666667%; - } - .col-md-9 { - -ms-flex: 0 0 75%; - flex: 0 0 75%; - max-width: 75%; - } - .col-md-10 { - -ms-flex: 0 0 83.333333%; - flex: 0 0 83.333333%; - max-width: 83.333333%; - } - .col-md-11 { - -ms-flex: 0 0 91.666667%; - flex: 0 0 91.666667%; - max-width: 91.666667%; - } - .col-md-12 { - -ms-flex: 0 0 100%; - flex: 0 0 100%; - max-width: 100%; - } - .order-md-first { - -ms-flex-order: -1; - order: -1; - } - .order-md-last { - -ms-flex-order: 13; - order: 13; - } - .order-md-0 { - -ms-flex-order: 0; - order: 0; - } - .order-md-1 { - -ms-flex-order: 1; - order: 1; - } - .order-md-2 { - -ms-flex-order: 2; - order: 2; - } - .order-md-3 { - -ms-flex-order: 3; - order: 3; - } - .order-md-4 { - -ms-flex-order: 4; - order: 4; - } - .order-md-5 { - -ms-flex-order: 5; - order: 5; - } - .order-md-6 { - -ms-flex-order: 6; - order: 6; - } - .order-md-7 { - -ms-flex-order: 7; - order: 7; - } - .order-md-8 { - -ms-flex-order: 8; - order: 8; - } - .order-md-9 { - -ms-flex-order: 9; - order: 9; - } - .order-md-10 { - -ms-flex-order: 10; - order: 10; - } - .order-md-11 { - -ms-flex-order: 11; - order: 11; - } - .order-md-12 { - -ms-flex-order: 12; - order: 12; - } - .offset-md-0 { - margin-left: 0; - } - .offset-md-1 { - margin-left: 8.333333%; - } - .offset-md-2 { - margin-left: 16.666667%; - } - .offset-md-3 { - margin-left: 25%; - } - .offset-md-4 { - margin-left: 33.333333%; - } - .offset-md-5 { - margin-left: 41.666667%; - } - .offset-md-6 { - margin-left: 50%; - } - .offset-md-7 { - margin-left: 58.333333%; - } - .offset-md-8 { - margin-left: 66.666667%; - } - .offset-md-9 { - margin-left: 75%; - } - .offset-md-10 { - margin-left: 83.333333%; - } - .offset-md-11 { - margin-left: 91.666667%; - } -} - -@media (min-width: 992px) { - .col-lg { - -ms-flex-preferred-size: 0; - flex-basis: 0; - -ms-flex-positive: 1; - flex-grow: 1; - max-width: 100%; - } - .row-cols-lg-1 > * { - -ms-flex: 0 0 100%; - flex: 0 0 100%; - max-width: 100%; - } - .row-cols-lg-2 > * { - -ms-flex: 0 0 50%; - flex: 0 0 50%; - max-width: 50%; - } - .row-cols-lg-3 > * { - -ms-flex: 0 0 33.333333%; - flex: 0 0 33.333333%; - max-width: 33.333333%; - } - .row-cols-lg-4 > * { - -ms-flex: 0 0 25%; - flex: 0 0 25%; - max-width: 25%; - } - .row-cols-lg-5 > * { - -ms-flex: 0 0 20%; - flex: 0 0 20%; - max-width: 20%; - } - .row-cols-lg-6 > * { - -ms-flex: 0 0 16.666667%; - flex: 0 0 16.666667%; - max-width: 16.666667%; - } - .col-lg-auto { - -ms-flex: 0 0 auto; - flex: 0 0 auto; - width: auto; - max-width: 100%; - } - .col-lg-1 { - -ms-flex: 0 0 8.333333%; - flex: 0 0 8.333333%; - max-width: 8.333333%; - } - .col-lg-2 { - -ms-flex: 0 0 16.666667%; - flex: 0 0 16.666667%; - max-width: 16.666667%; - } - .col-lg-3 { - -ms-flex: 0 0 25%; - flex: 0 0 25%; - max-width: 25%; - } - .col-lg-4 { - -ms-flex: 0 0 33.333333%; - flex: 0 0 33.333333%; - max-width: 33.333333%; - } - .col-lg-5 { - -ms-flex: 0 0 41.666667%; - flex: 0 0 41.666667%; - max-width: 41.666667%; - } - .col-lg-6 { - -ms-flex: 0 0 50%; - flex: 0 0 50%; - max-width: 50%; - } - .col-lg-7 { - -ms-flex: 0 0 58.333333%; - flex: 0 0 58.333333%; - max-width: 58.333333%; - } - .col-lg-8 { - -ms-flex: 0 0 66.666667%; - flex: 0 0 66.666667%; - max-width: 66.666667%; - } - .col-lg-9 { - -ms-flex: 0 0 75%; - flex: 0 0 75%; - max-width: 75%; - } - .col-lg-10 { - -ms-flex: 0 0 83.333333%; - flex: 0 0 83.333333%; - max-width: 83.333333%; - } - .col-lg-11 { - -ms-flex: 0 0 91.666667%; - flex: 0 0 91.666667%; - max-width: 91.666667%; - } - .col-lg-12 { - -ms-flex: 0 0 100%; - flex: 0 0 100%; - max-width: 100%; - } - .order-lg-first { - -ms-flex-order: -1; - order: -1; - } - .order-lg-last { - -ms-flex-order: 13; - order: 13; - } - .order-lg-0 { - -ms-flex-order: 0; - order: 0; - } - .order-lg-1 { - -ms-flex-order: 1; - order: 1; - } - .order-lg-2 { - -ms-flex-order: 2; - order: 2; - } - .order-lg-3 { - -ms-flex-order: 3; - order: 3; - } - .order-lg-4 { - -ms-flex-order: 4; - order: 4; - } - .order-lg-5 { - -ms-flex-order: 5; - order: 5; - } - .order-lg-6 { - -ms-flex-order: 6; - order: 6; - } - .order-lg-7 { - -ms-flex-order: 7; - order: 7; - } - .order-lg-8 { - -ms-flex-order: 8; - order: 8; - } - .order-lg-9 { - -ms-flex-order: 9; - order: 9; - } - .order-lg-10 { - -ms-flex-order: 10; - order: 10; - } - .order-lg-11 { - -ms-flex-order: 11; - order: 11; - } - .order-lg-12 { - -ms-flex-order: 12; - order: 12; - } - .offset-lg-0 { - margin-left: 0; - } - .offset-lg-1 { - margin-left: 8.333333%; - } - .offset-lg-2 { - margin-left: 16.666667%; - } - .offset-lg-3 { - margin-left: 25%; - } - .offset-lg-4 { - margin-left: 33.333333%; - } - .offset-lg-5 { - margin-left: 41.666667%; - } - .offset-lg-6 { - margin-left: 50%; - } - .offset-lg-7 { - margin-left: 58.333333%; - } - .offset-lg-8 { - margin-left: 66.666667%; - } - .offset-lg-9 { - margin-left: 75%; - } - .offset-lg-10 { - margin-left: 83.333333%; - } - .offset-lg-11 { - margin-left: 91.666667%; - } -} - -@media (min-width: 1200px) { - .col-xl { - -ms-flex-preferred-size: 0; - flex-basis: 0; - -ms-flex-positive: 1; - flex-grow: 1; - max-width: 100%; - } - .row-cols-xl-1 > * { - -ms-flex: 0 0 100%; - flex: 0 0 100%; - max-width: 100%; - } - .row-cols-xl-2 > * { - -ms-flex: 0 0 50%; - flex: 0 0 50%; - max-width: 50%; - } - .row-cols-xl-3 > * { - -ms-flex: 0 0 33.333333%; - flex: 0 0 33.333333%; - max-width: 33.333333%; - } - .row-cols-xl-4 > * { - -ms-flex: 0 0 25%; - flex: 0 0 25%; - max-width: 25%; - } - .row-cols-xl-5 > * { - -ms-flex: 0 0 20%; - flex: 0 0 20%; - max-width: 20%; - } - .row-cols-xl-6 > * { - -ms-flex: 0 0 16.666667%; - flex: 0 0 16.666667%; - max-width: 16.666667%; - } - .col-xl-auto { - -ms-flex: 0 0 auto; - flex: 0 0 auto; - width: auto; - max-width: 100%; - } - .col-xl-1 { - -ms-flex: 0 0 8.333333%; - flex: 0 0 8.333333%; - max-width: 8.333333%; - } - .col-xl-2 { - -ms-flex: 0 0 16.666667%; - flex: 0 0 16.666667%; - max-width: 16.666667%; - } - .col-xl-3 { - -ms-flex: 0 0 25%; - flex: 0 0 25%; - max-width: 25%; - } - .col-xl-4 { - -ms-flex: 0 0 33.333333%; - flex: 0 0 33.333333%; - max-width: 33.333333%; - } - .col-xl-5 { - -ms-flex: 0 0 41.666667%; - flex: 0 0 41.666667%; - max-width: 41.666667%; - } - .col-xl-6 { - -ms-flex: 0 0 50%; - flex: 0 0 50%; - max-width: 50%; - } - .col-xl-7 { - -ms-flex: 0 0 58.333333%; - flex: 0 0 58.333333%; - max-width: 58.333333%; - } - .col-xl-8 { - -ms-flex: 0 0 66.666667%; - flex: 0 0 66.666667%; - max-width: 66.666667%; - } - .col-xl-9 { - -ms-flex: 0 0 75%; - flex: 0 0 75%; - max-width: 75%; - } - .col-xl-10 { - -ms-flex: 0 0 83.333333%; - flex: 0 0 83.333333%; - max-width: 83.333333%; - } - .col-xl-11 { - -ms-flex: 0 0 91.666667%; - flex: 0 0 91.666667%; - max-width: 91.666667%; - } - .col-xl-12 { - -ms-flex: 0 0 100%; - flex: 0 0 100%; - max-width: 100%; - } - .order-xl-first { - -ms-flex-order: -1; - order: -1; - } - .order-xl-last { - -ms-flex-order: 13; - order: 13; - } - .order-xl-0 { - -ms-flex-order: 0; - order: 0; - } - .order-xl-1 { - -ms-flex-order: 1; - order: 1; - } - .order-xl-2 { - -ms-flex-order: 2; - order: 2; - } - .order-xl-3 { - -ms-flex-order: 3; - order: 3; - } - .order-xl-4 { - -ms-flex-order: 4; - order: 4; - } - .order-xl-5 { - -ms-flex-order: 5; - order: 5; - } - .order-xl-6 { - -ms-flex-order: 6; - order: 6; - } - .order-xl-7 { - -ms-flex-order: 7; - order: 7; - } - .order-xl-8 { - -ms-flex-order: 8; - order: 8; - } - .order-xl-9 { - -ms-flex-order: 9; - order: 9; - } - .order-xl-10 { - -ms-flex-order: 10; - order: 10; - } - .order-xl-11 { - -ms-flex-order: 11; - order: 11; - } - .order-xl-12 { - -ms-flex-order: 12; - order: 12; - } - .offset-xl-0 { - margin-left: 0; - } - .offset-xl-1 { - margin-left: 8.333333%; - } - .offset-xl-2 { - margin-left: 16.666667%; - } - .offset-xl-3 { - margin-left: 25%; - } - .offset-xl-4 { - margin-left: 33.333333%; - } - .offset-xl-5 { - margin-left: 41.666667%; - } - .offset-xl-6 { - margin-left: 50%; - } - .offset-xl-7 { - margin-left: 58.333333%; - } - .offset-xl-8 { - margin-left: 66.666667%; - } - .offset-xl-9 { - margin-left: 75%; - } - .offset-xl-10 { - margin-left: 83.333333%; - } - .offset-xl-11 { - margin-left: 91.666667%; - } -} - -.d-none { - display: none !important; -} - -.d-inline { - display: inline !important; -} - -.d-inline-block { - display: inline-block !important; -} - -.d-block { - display: block !important; -} - -.d-table { - display: table !important; -} - -.d-table-row { - display: table-row !important; -} - -.d-table-cell { - display: table-cell !important; -} - -.d-flex { - display: -ms-flexbox !important; - display: flex !important; -} - -.d-inline-flex { - display: -ms-inline-flexbox !important; - display: inline-flex !important; -} - -@media (min-width: 576px) { - .d-sm-none { - display: none !important; - } - .d-sm-inline { - display: inline !important; - } - .d-sm-inline-block { - display: inline-block !important; - } - .d-sm-block { - display: block !important; - } - .d-sm-table { - display: table !important; - } - .d-sm-table-row { - display: table-row !important; - } - .d-sm-table-cell { - display: table-cell !important; - } - .d-sm-flex { - display: -ms-flexbox !important; - display: flex !important; - } - .d-sm-inline-flex { - display: -ms-inline-flexbox !important; - display: inline-flex !important; - } -} - -@media (min-width: 768px) { - .d-md-none { - display: none !important; - } - .d-md-inline { - display: inline !important; - } - .d-md-inline-block { - display: inline-block !important; - } - .d-md-block { - display: block !important; - } - .d-md-table { - display: table !important; - } - .d-md-table-row { - display: table-row !important; - } - .d-md-table-cell { - display: table-cell !important; - } - .d-md-flex { - display: -ms-flexbox !important; - display: flex !important; - } - .d-md-inline-flex { - display: -ms-inline-flexbox !important; - display: inline-flex !important; - } -} - -@media (min-width: 992px) { - .d-lg-none { - display: none !important; - } - .d-lg-inline { - display: inline !important; - } - .d-lg-inline-block { - display: inline-block !important; - } - .d-lg-block { - display: block !important; - } - .d-lg-table { - display: table !important; - } - .d-lg-table-row { - display: table-row !important; - } - .d-lg-table-cell { - display: table-cell !important; - } - .d-lg-flex { - display: -ms-flexbox !important; - display: flex !important; - } - .d-lg-inline-flex { - display: -ms-inline-flexbox !important; - display: inline-flex !important; - } -} - -@media (min-width: 1200px) { - .d-xl-none { - display: none !important; - } - .d-xl-inline { - display: inline !important; - } - .d-xl-inline-block { - display: inline-block !important; - } - .d-xl-block { - display: block !important; - } - .d-xl-table { - display: table !important; - } - .d-xl-table-row { - display: table-row !important; - } - .d-xl-table-cell { - display: table-cell !important; - } - .d-xl-flex { - display: -ms-flexbox !important; - display: flex !important; - } - .d-xl-inline-flex { - display: -ms-inline-flexbox !important; - display: inline-flex !important; - } -} - -@media print { - .d-print-none { - display: none !important; - } - .d-print-inline { - display: inline !important; - } - .d-print-inline-block { - display: inline-block !important; - } - .d-print-block { - display: block !important; - } - .d-print-table { - display: table !important; - } - .d-print-table-row { - display: table-row !important; - } - .d-print-table-cell { - display: table-cell !important; - } - .d-print-flex { - display: -ms-flexbox !important; - display: flex !important; - } - .d-print-inline-flex { - display: -ms-inline-flexbox !important; - display: inline-flex !important; - } -} - -.flex-row { - -ms-flex-direction: row !important; - flex-direction: row !important; -} - -.flex-column { - -ms-flex-direction: column !important; - flex-direction: column !important; -} - -.flex-row-reverse { - -ms-flex-direction: row-reverse !important; - flex-direction: row-reverse !important; -} - -.flex-column-reverse { - -ms-flex-direction: column-reverse !important; - flex-direction: column-reverse !important; -} - -.flex-wrap { - -ms-flex-wrap: wrap !important; - flex-wrap: wrap !important; -} - -.flex-nowrap { - -ms-flex-wrap: nowrap !important; - flex-wrap: nowrap !important; -} - -.flex-wrap-reverse { - -ms-flex-wrap: wrap-reverse !important; - flex-wrap: wrap-reverse !important; -} - -.flex-fill { - -ms-flex: 1 1 auto !important; - flex: 1 1 auto !important; -} - -.flex-grow-0 { - -ms-flex-positive: 0 !important; - flex-grow: 0 !important; -} - -.flex-grow-1 { - -ms-flex-positive: 1 !important; - flex-grow: 1 !important; -} - -.flex-shrink-0 { - -ms-flex-negative: 0 !important; - flex-shrink: 0 !important; -} - -.flex-shrink-1 { - -ms-flex-negative: 1 !important; - flex-shrink: 1 !important; -} - -.justify-content-start { - -ms-flex-pack: start !important; - justify-content: flex-start !important; -} - -.justify-content-end { - -ms-flex-pack: end !important; - justify-content: flex-end !important; -} - -.justify-content-center { - -ms-flex-pack: center !important; - justify-content: center !important; -} - -.justify-content-between { - -ms-flex-pack: justify !important; - justify-content: space-between !important; -} - -.justify-content-around { - -ms-flex-pack: distribute !important; - justify-content: space-around !important; -} - -.align-items-start { - -ms-flex-align: start !important; - align-items: flex-start !important; -} - -.align-items-end { - -ms-flex-align: end !important; - align-items: flex-end !important; -} - -.align-items-center { - -ms-flex-align: center !important; - align-items: center !important; -} - -.align-items-baseline { - -ms-flex-align: baseline !important; - align-items: baseline !important; -} - -.align-items-stretch { - -ms-flex-align: stretch !important; - align-items: stretch !important; -} - -.align-content-start { - -ms-flex-line-pack: start !important; - align-content: flex-start !important; -} - -.align-content-end { - -ms-flex-line-pack: end !important; - align-content: flex-end !important; -} - -.align-content-center { - -ms-flex-line-pack: center !important; - align-content: center !important; -} - -.align-content-between { - -ms-flex-line-pack: justify !important; - align-content: space-between !important; -} - -.align-content-around { - -ms-flex-line-pack: distribute !important; - align-content: space-around !important; -} - -.align-content-stretch { - -ms-flex-line-pack: stretch !important; - align-content: stretch !important; -} - -.align-self-auto { - -ms-flex-item-align: auto !important; - align-self: auto !important; -} - -.align-self-start { - -ms-flex-item-align: start !important; - align-self: flex-start !important; -} - -.align-self-end { - -ms-flex-item-align: end !important; - align-self: flex-end !important; -} - -.align-self-center { - -ms-flex-item-align: center !important; - align-self: center !important; -} - -.align-self-baseline { - -ms-flex-item-align: baseline !important; - align-self: baseline !important; -} - -.align-self-stretch { - -ms-flex-item-align: stretch !important; - align-self: stretch !important; -} - -@media (min-width: 576px) { - .flex-sm-row { - -ms-flex-direction: row !important; - flex-direction: row !important; - } - .flex-sm-column { - -ms-flex-direction: column !important; - flex-direction: column !important; - } - .flex-sm-row-reverse { - -ms-flex-direction: row-reverse !important; - flex-direction: row-reverse !important; - } - .flex-sm-column-reverse { - -ms-flex-direction: column-reverse !important; - flex-direction: column-reverse !important; - } - .flex-sm-wrap { - -ms-flex-wrap: wrap !important; - flex-wrap: wrap !important; - } - .flex-sm-nowrap { - -ms-flex-wrap: nowrap !important; - flex-wrap: nowrap !important; - } - .flex-sm-wrap-reverse { - -ms-flex-wrap: wrap-reverse !important; - flex-wrap: wrap-reverse !important; - } - .flex-sm-fill { - -ms-flex: 1 1 auto !important; - flex: 1 1 auto !important; - } - .flex-sm-grow-0 { - -ms-flex-positive: 0 !important; - flex-grow: 0 !important; - } - .flex-sm-grow-1 { - -ms-flex-positive: 1 !important; - flex-grow: 1 !important; - } - .flex-sm-shrink-0 { - -ms-flex-negative: 0 !important; - flex-shrink: 0 !important; - } - .flex-sm-shrink-1 { - -ms-flex-negative: 1 !important; - flex-shrink: 1 !important; - } - .justify-content-sm-start { - -ms-flex-pack: start !important; - justify-content: flex-start !important; - } - .justify-content-sm-end { - -ms-flex-pack: end !important; - justify-content: flex-end !important; - } - .justify-content-sm-center { - -ms-flex-pack: center !important; - justify-content: center !important; - } - .justify-content-sm-between { - -ms-flex-pack: justify !important; - justify-content: space-between !important; - } - .justify-content-sm-around { - -ms-flex-pack: distribute !important; - justify-content: space-around !important; - } - .align-items-sm-start { - -ms-flex-align: start !important; - align-items: flex-start !important; - } - .align-items-sm-end { - -ms-flex-align: end !important; - align-items: flex-end !important; - } - .align-items-sm-center { - -ms-flex-align: center !important; - align-items: center !important; - } - .align-items-sm-baseline { - -ms-flex-align: baseline !important; - align-items: baseline !important; - } - .align-items-sm-stretch { - -ms-flex-align: stretch !important; - align-items: stretch !important; - } - .align-content-sm-start { - -ms-flex-line-pack: start !important; - align-content: flex-start !important; - } - .align-content-sm-end { - -ms-flex-line-pack: end !important; - align-content: flex-end !important; - } - .align-content-sm-center { - -ms-flex-line-pack: center !important; - align-content: center !important; - } - .align-content-sm-between { - -ms-flex-line-pack: justify !important; - align-content: space-between !important; - } - .align-content-sm-around { - -ms-flex-line-pack: distribute !important; - align-content: space-around !important; - } - .align-content-sm-stretch { - -ms-flex-line-pack: stretch !important; - align-content: stretch !important; - } - .align-self-sm-auto { - -ms-flex-item-align: auto !important; - align-self: auto !important; - } - .align-self-sm-start { - -ms-flex-item-align: start !important; - align-self: flex-start !important; - } - .align-self-sm-end { - -ms-flex-item-align: end !important; - align-self: flex-end !important; - } - .align-self-sm-center { - -ms-flex-item-align: center !important; - align-self: center !important; - } - .align-self-sm-baseline { - -ms-flex-item-align: baseline !important; - align-self: baseline !important; - } - .align-self-sm-stretch { - -ms-flex-item-align: stretch !important; - align-self: stretch !important; - } -} - -@media (min-width: 768px) { - .flex-md-row { - -ms-flex-direction: row !important; - flex-direction: row !important; - } - .flex-md-column { - -ms-flex-direction: column !important; - flex-direction: column !important; - } - .flex-md-row-reverse { - -ms-flex-direction: row-reverse !important; - flex-direction: row-reverse !important; - } - .flex-md-column-reverse { - -ms-flex-direction: column-reverse !important; - flex-direction: column-reverse !important; - } - .flex-md-wrap { - -ms-flex-wrap: wrap !important; - flex-wrap: wrap !important; - } - .flex-md-nowrap { - -ms-flex-wrap: nowrap !important; - flex-wrap: nowrap !important; - } - .flex-md-wrap-reverse { - -ms-flex-wrap: wrap-reverse !important; - flex-wrap: wrap-reverse !important; - } - .flex-md-fill { - -ms-flex: 1 1 auto !important; - flex: 1 1 auto !important; - } - .flex-md-grow-0 { - -ms-flex-positive: 0 !important; - flex-grow: 0 !important; - } - .flex-md-grow-1 { - -ms-flex-positive: 1 !important; - flex-grow: 1 !important; - } - .flex-md-shrink-0 { - -ms-flex-negative: 0 !important; - flex-shrink: 0 !important; - } - .flex-md-shrink-1 { - -ms-flex-negative: 1 !important; - flex-shrink: 1 !important; - } - .justify-content-md-start { - -ms-flex-pack: start !important; - justify-content: flex-start !important; - } - .justify-content-md-end { - -ms-flex-pack: end !important; - justify-content: flex-end !important; - } - .justify-content-md-center { - -ms-flex-pack: center !important; - justify-content: center !important; - } - .justify-content-md-between { - -ms-flex-pack: justify !important; - justify-content: space-between !important; - } - .justify-content-md-around { - -ms-flex-pack: distribute !important; - justify-content: space-around !important; - } - .align-items-md-start { - -ms-flex-align: start !important; - align-items: flex-start !important; - } - .align-items-md-end { - -ms-flex-align: end !important; - align-items: flex-end !important; - } - .align-items-md-center { - -ms-flex-align: center !important; - align-items: center !important; - } - .align-items-md-baseline { - -ms-flex-align: baseline !important; - align-items: baseline !important; - } - .align-items-md-stretch { - -ms-flex-align: stretch !important; - align-items: stretch !important; - } - .align-content-md-start { - -ms-flex-line-pack: start !important; - align-content: flex-start !important; - } - .align-content-md-end { - -ms-flex-line-pack: end !important; - align-content: flex-end !important; - } - .align-content-md-center { - -ms-flex-line-pack: center !important; - align-content: center !important; - } - .align-content-md-between { - -ms-flex-line-pack: justify !important; - align-content: space-between !important; - } - .align-content-md-around { - -ms-flex-line-pack: distribute !important; - align-content: space-around !important; - } - .align-content-md-stretch { - -ms-flex-line-pack: stretch !important; - align-content: stretch !important; - } - .align-self-md-auto { - -ms-flex-item-align: auto !important; - align-self: auto !important; - } - .align-self-md-start { - -ms-flex-item-align: start !important; - align-self: flex-start !important; - } - .align-self-md-end { - -ms-flex-item-align: end !important; - align-self: flex-end !important; - } - .align-self-md-center { - -ms-flex-item-align: center !important; - align-self: center !important; - } - .align-self-md-baseline { - -ms-flex-item-align: baseline !important; - align-self: baseline !important; - } - .align-self-md-stretch { - -ms-flex-item-align: stretch !important; - align-self: stretch !important; - } -} - -@media (min-width: 992px) { - .flex-lg-row { - -ms-flex-direction: row !important; - flex-direction: row !important; - } - .flex-lg-column { - -ms-flex-direction: column !important; - flex-direction: column !important; - } - .flex-lg-row-reverse { - -ms-flex-direction: row-reverse !important; - flex-direction: row-reverse !important; - } - .flex-lg-column-reverse { - -ms-flex-direction: column-reverse !important; - flex-direction: column-reverse !important; - } - .flex-lg-wrap { - -ms-flex-wrap: wrap !important; - flex-wrap: wrap !important; - } - .flex-lg-nowrap { - -ms-flex-wrap: nowrap !important; - flex-wrap: nowrap !important; - } - .flex-lg-wrap-reverse { - -ms-flex-wrap: wrap-reverse !important; - flex-wrap: wrap-reverse !important; - } - .flex-lg-fill { - -ms-flex: 1 1 auto !important; - flex: 1 1 auto !important; - } - .flex-lg-grow-0 { - -ms-flex-positive: 0 !important; - flex-grow: 0 !important; - } - .flex-lg-grow-1 { - -ms-flex-positive: 1 !important; - flex-grow: 1 !important; - } - .flex-lg-shrink-0 { - -ms-flex-negative: 0 !important; - flex-shrink: 0 !important; - } - .flex-lg-shrink-1 { - -ms-flex-negative: 1 !important; - flex-shrink: 1 !important; - } - .justify-content-lg-start { - -ms-flex-pack: start !important; - justify-content: flex-start !important; - } - .justify-content-lg-end { - -ms-flex-pack: end !important; - justify-content: flex-end !important; - } - .justify-content-lg-center { - -ms-flex-pack: center !important; - justify-content: center !important; - } - .justify-content-lg-between { - -ms-flex-pack: justify !important; - justify-content: space-between !important; - } - .justify-content-lg-around { - -ms-flex-pack: distribute !important; - justify-content: space-around !important; - } - .align-items-lg-start { - -ms-flex-align: start !important; - align-items: flex-start !important; - } - .align-items-lg-end { - -ms-flex-align: end !important; - align-items: flex-end !important; - } - .align-items-lg-center { - -ms-flex-align: center !important; - align-items: center !important; - } - .align-items-lg-baseline { - -ms-flex-align: baseline !important; - align-items: baseline !important; - } - .align-items-lg-stretch { - -ms-flex-align: stretch !important; - align-items: stretch !important; - } - .align-content-lg-start { - -ms-flex-line-pack: start !important; - align-content: flex-start !important; - } - .align-content-lg-end { - -ms-flex-line-pack: end !important; - align-content: flex-end !important; - } - .align-content-lg-center { - -ms-flex-line-pack: center !important; - align-content: center !important; - } - .align-content-lg-between { - -ms-flex-line-pack: justify !important; - align-content: space-between !important; - } - .align-content-lg-around { - -ms-flex-line-pack: distribute !important; - align-content: space-around !important; - } - .align-content-lg-stretch { - -ms-flex-line-pack: stretch !important; - align-content: stretch !important; - } - .align-self-lg-auto { - -ms-flex-item-align: auto !important; - align-self: auto !important; - } - .align-self-lg-start { - -ms-flex-item-align: start !important; - align-self: flex-start !important; - } - .align-self-lg-end { - -ms-flex-item-align: end !important; - align-self: flex-end !important; - } - .align-self-lg-center { - -ms-flex-item-align: center !important; - align-self: center !important; - } - .align-self-lg-baseline { - -ms-flex-item-align: baseline !important; - align-self: baseline !important; - } - .align-self-lg-stretch { - -ms-flex-item-align: stretch !important; - align-self: stretch !important; - } -} - -@media (min-width: 1200px) { - .flex-xl-row { - -ms-flex-direction: row !important; - flex-direction: row !important; - } - .flex-xl-column { - -ms-flex-direction: column !important; - flex-direction: column !important; - } - .flex-xl-row-reverse { - -ms-flex-direction: row-reverse !important; - flex-direction: row-reverse !important; - } - .flex-xl-column-reverse { - -ms-flex-direction: column-reverse !important; - flex-direction: column-reverse !important; - } - .flex-xl-wrap { - -ms-flex-wrap: wrap !important; - flex-wrap: wrap !important; - } - .flex-xl-nowrap { - -ms-flex-wrap: nowrap !important; - flex-wrap: nowrap !important; - } - .flex-xl-wrap-reverse { - -ms-flex-wrap: wrap-reverse !important; - flex-wrap: wrap-reverse !important; - } - .flex-xl-fill { - -ms-flex: 1 1 auto !important; - flex: 1 1 auto !important; - } - .flex-xl-grow-0 { - -ms-flex-positive: 0 !important; - flex-grow: 0 !important; - } - .flex-xl-grow-1 { - -ms-flex-positive: 1 !important; - flex-grow: 1 !important; - } - .flex-xl-shrink-0 { - -ms-flex-negative: 0 !important; - flex-shrink: 0 !important; - } - .flex-xl-shrink-1 { - -ms-flex-negative: 1 !important; - flex-shrink: 1 !important; - } - .justify-content-xl-start { - -ms-flex-pack: start !important; - justify-content: flex-start !important; - } - .justify-content-xl-end { - -ms-flex-pack: end !important; - justify-content: flex-end !important; - } - .justify-content-xl-center { - -ms-flex-pack: center !important; - justify-content: center !important; - } - .justify-content-xl-between { - -ms-flex-pack: justify !important; - justify-content: space-between !important; - } - .justify-content-xl-around { - -ms-flex-pack: distribute !important; - justify-content: space-around !important; - } - .align-items-xl-start { - -ms-flex-align: start !important; - align-items: flex-start !important; - } - .align-items-xl-end { - -ms-flex-align: end !important; - align-items: flex-end !important; - } - .align-items-xl-center { - -ms-flex-align: center !important; - align-items: center !important; - } - .align-items-xl-baseline { - -ms-flex-align: baseline !important; - align-items: baseline !important; - } - .align-items-xl-stretch { - -ms-flex-align: stretch !important; - align-items: stretch !important; - } - .align-content-xl-start { - -ms-flex-line-pack: start !important; - align-content: flex-start !important; - } - .align-content-xl-end { - -ms-flex-line-pack: end !important; - align-content: flex-end !important; - } - .align-content-xl-center { - -ms-flex-line-pack: center !important; - align-content: center !important; - } - .align-content-xl-between { - -ms-flex-line-pack: justify !important; - align-content: space-between !important; - } - .align-content-xl-around { - -ms-flex-line-pack: distribute !important; - align-content: space-around !important; - } - .align-content-xl-stretch { - -ms-flex-line-pack: stretch !important; - align-content: stretch !important; - } - .align-self-xl-auto { - -ms-flex-item-align: auto !important; - align-self: auto !important; - } - .align-self-xl-start { - -ms-flex-item-align: start !important; - align-self: flex-start !important; - } - .align-self-xl-end { - -ms-flex-item-align: end !important; - align-self: flex-end !important; - } - .align-self-xl-center { - -ms-flex-item-align: center !important; - align-self: center !important; - } - .align-self-xl-baseline { - -ms-flex-item-align: baseline !important; - align-self: baseline !important; - } - .align-self-xl-stretch { - -ms-flex-item-align: stretch !important; - align-self: stretch !important; - } -} - -.m-0 { - margin: 0 !important; -} - -.mt-0, -.my-0 { - margin-top: 0 !important; -} - -.mr-0, -.mx-0 { - margin-right: 0 !important; -} - -.mb-0, -.my-0 { - margin-bottom: 0 !important; -} - -.ml-0, -.mx-0 { - margin-left: 0 !important; -} - -.m-1 { - margin: 0.25rem !important; -} - -.mt-1, -.my-1 { - margin-top: 0.25rem !important; -} - -.mr-1, -.mx-1 { - margin-right: 0.25rem !important; -} - -.mb-1, -.my-1 { - margin-bottom: 0.25rem !important; -} - -.ml-1, -.mx-1 { - margin-left: 0.25rem !important; -} - -.m-2 { - margin: 0.5rem !important; -} - -.mt-2, -.my-2 { - margin-top: 0.5rem !important; -} - -.mr-2, -.mx-2 { - margin-right: 0.5rem !important; -} - -.mb-2, -.my-2 { - margin-bottom: 0.5rem !important; -} - -.ml-2, -.mx-2 { - margin-left: 0.5rem !important; -} - -.m-3 { - margin: 1rem !important; -} - -.mt-3, -.my-3 { - margin-top: 1rem !important; -} - -.mr-3, -.mx-3 { - margin-right: 1rem !important; -} - -.mb-3, -.my-3 { - margin-bottom: 1rem !important; -} - -.ml-3, -.mx-3 { - margin-left: 1rem !important; -} - -.m-4 { - margin: 1.5rem !important; -} - -.mt-4, -.my-4 { - margin-top: 1.5rem !important; -} - -.mr-4, -.mx-4 { - margin-right: 1.5rem !important; -} - -.mb-4, -.my-4 { - margin-bottom: 1.5rem !important; -} - -.ml-4, -.mx-4 { - margin-left: 1.5rem !important; -} - -.m-5 { - margin: 3rem !important; -} - -.mt-5, -.my-5 { - margin-top: 3rem !important; -} - -.mr-5, -.mx-5 { - margin-right: 3rem !important; -} - -.mb-5, -.my-5 { - margin-bottom: 3rem !important; -} - -.ml-5, -.mx-5 { - margin-left: 3rem !important; -} - -.p-0 { - padding: 0 !important; -} - -.pt-0, -.py-0 { - padding-top: 0 !important; -} - -.pr-0, -.px-0 { - padding-right: 0 !important; -} - -.pb-0, -.py-0 { - padding-bottom: 0 !important; -} - -.pl-0, -.px-0 { - padding-left: 0 !important; -} - -.p-1 { - padding: 0.25rem !important; -} - -.pt-1, -.py-1 { - padding-top: 0.25rem !important; -} - -.pr-1, -.px-1 { - padding-right: 0.25rem !important; -} - -.pb-1, -.py-1 { - padding-bottom: 0.25rem !important; -} - -.pl-1, -.px-1 { - padding-left: 0.25rem !important; -} - -.p-2 { - padding: 0.5rem !important; -} - -.pt-2, -.py-2 { - padding-top: 0.5rem !important; -} - -.pr-2, -.px-2 { - padding-right: 0.5rem !important; -} - -.pb-2, -.py-2 { - padding-bottom: 0.5rem !important; -} - -.pl-2, -.px-2 { - padding-left: 0.5rem !important; -} - -.p-3 { - padding: 1rem !important; -} - -.pt-3, -.py-3 { - padding-top: 1rem !important; -} - -.pr-3, -.px-3 { - padding-right: 1rem !important; -} - -.pb-3, -.py-3 { - padding-bottom: 1rem !important; -} - -.pl-3, -.px-3 { - padding-left: 1rem !important; -} - -.p-4 { - padding: 1.5rem !important; -} - -.pt-4, -.py-4 { - padding-top: 1.5rem !important; -} - -.pr-4, -.px-4 { - padding-right: 1.5rem !important; -} - -.pb-4, -.py-4 { - padding-bottom: 1.5rem !important; -} - -.pl-4, -.px-4 { - padding-left: 1.5rem !important; -} - -.p-5 { - padding: 3rem !important; -} - -.pt-5, -.py-5 { - padding-top: 3rem !important; -} - -.pr-5, -.px-5 { - padding-right: 3rem !important; -} - -.pb-5, -.py-5 { - padding-bottom: 3rem !important; -} - -.pl-5, -.px-5 { - padding-left: 3rem !important; -} - -.m-n1 { - margin: -0.25rem !important; -} - -.mt-n1, -.my-n1 { - margin-top: -0.25rem !important; -} - -.mr-n1, -.mx-n1 { - margin-right: -0.25rem !important; -} - -.mb-n1, -.my-n1 { - margin-bottom: -0.25rem !important; -} - -.ml-n1, -.mx-n1 { - margin-left: -0.25rem !important; -} - -.m-n2 { - margin: -0.5rem !important; -} - -.mt-n2, -.my-n2 { - margin-top: -0.5rem !important; -} - -.mr-n2, -.mx-n2 { - margin-right: -0.5rem !important; -} - -.mb-n2, -.my-n2 { - margin-bottom: -0.5rem !important; -} - -.ml-n2, -.mx-n2 { - margin-left: -0.5rem !important; -} - -.m-n3 { - margin: -1rem !important; -} - -.mt-n3, -.my-n3 { - margin-top: -1rem !important; -} - -.mr-n3, -.mx-n3 { - margin-right: -1rem !important; -} - -.mb-n3, -.my-n3 { - margin-bottom: -1rem !important; -} - -.ml-n3, -.mx-n3 { - margin-left: -1rem !important; -} - -.m-n4 { - margin: -1.5rem !important; -} - -.mt-n4, -.my-n4 { - margin-top: -1.5rem !important; -} - -.mr-n4, -.mx-n4 { - margin-right: -1.5rem !important; -} - -.mb-n4, -.my-n4 { - margin-bottom: -1.5rem !important; -} - -.ml-n4, -.mx-n4 { - margin-left: -1.5rem !important; -} - -.m-n5 { - margin: -3rem !important; -} - -.mt-n5, -.my-n5 { - margin-top: -3rem !important; -} - -.mr-n5, -.mx-n5 { - margin-right: -3rem !important; -} - -.mb-n5, -.my-n5 { - margin-bottom: -3rem !important; -} - -.ml-n5, -.mx-n5 { - margin-left: -3rem !important; -} - -.m-auto { - margin: auto !important; -} - -.mt-auto, -.my-auto { - margin-top: auto !important; -} - -.mr-auto, -.mx-auto { - margin-right: auto !important; -} - -.mb-auto, -.my-auto { - margin-bottom: auto !important; -} - -.ml-auto, -.mx-auto { - margin-left: auto !important; -} - -@media (min-width: 576px) { - .m-sm-0 { - margin: 0 !important; - } - .mt-sm-0, - .my-sm-0 { - margin-top: 0 !important; - } - .mr-sm-0, - .mx-sm-0 { - margin-right: 0 !important; - } - .mb-sm-0, - .my-sm-0 { - margin-bottom: 0 !important; - } - .ml-sm-0, - .mx-sm-0 { - margin-left: 0 !important; - } - .m-sm-1 { - margin: 0.25rem !important; - } - .mt-sm-1, - .my-sm-1 { - margin-top: 0.25rem !important; - } - .mr-sm-1, - .mx-sm-1 { - margin-right: 0.25rem !important; - } - .mb-sm-1, - .my-sm-1 { - margin-bottom: 0.25rem !important; - } - .ml-sm-1, - .mx-sm-1 { - margin-left: 0.25rem !important; - } - .m-sm-2 { - margin: 0.5rem !important; - } - .mt-sm-2, - .my-sm-2 { - margin-top: 0.5rem !important; - } - .mr-sm-2, - .mx-sm-2 { - margin-right: 0.5rem !important; - } - .mb-sm-2, - .my-sm-2 { - margin-bottom: 0.5rem !important; - } - .ml-sm-2, - .mx-sm-2 { - margin-left: 0.5rem !important; - } - .m-sm-3 { - margin: 1rem !important; - } - .mt-sm-3, - .my-sm-3 { - margin-top: 1rem !important; - } - .mr-sm-3, - .mx-sm-3 { - margin-right: 1rem !important; - } - .mb-sm-3, - .my-sm-3 { - margin-bottom: 1rem !important; - } - .ml-sm-3, - .mx-sm-3 { - margin-left: 1rem !important; - } - .m-sm-4 { - margin: 1.5rem !important; - } - .mt-sm-4, - .my-sm-4 { - margin-top: 1.5rem !important; - } - .mr-sm-4, - .mx-sm-4 { - margin-right: 1.5rem !important; - } - .mb-sm-4, - .my-sm-4 { - margin-bottom: 1.5rem !important; - } - .ml-sm-4, - .mx-sm-4 { - margin-left: 1.5rem !important; - } - .m-sm-5 { - margin: 3rem !important; - } - .mt-sm-5, - .my-sm-5 { - margin-top: 3rem !important; - } - .mr-sm-5, - .mx-sm-5 { - margin-right: 3rem !important; - } - .mb-sm-5, - .my-sm-5 { - margin-bottom: 3rem !important; - } - .ml-sm-5, - .mx-sm-5 { - margin-left: 3rem !important; - } - .p-sm-0 { - padding: 0 !important; - } - .pt-sm-0, - .py-sm-0 { - padding-top: 0 !important; - } - .pr-sm-0, - .px-sm-0 { - padding-right: 0 !important; - } - .pb-sm-0, - .py-sm-0 { - padding-bottom: 0 !important; - } - .pl-sm-0, - .px-sm-0 { - padding-left: 0 !important; - } - .p-sm-1 { - padding: 0.25rem !important; - } - .pt-sm-1, - .py-sm-1 { - padding-top: 0.25rem !important; - } - .pr-sm-1, - .px-sm-1 { - padding-right: 0.25rem !important; - } - .pb-sm-1, - .py-sm-1 { - padding-bottom: 0.25rem !important; - } - .pl-sm-1, - .px-sm-1 { - padding-left: 0.25rem !important; - } - .p-sm-2 { - padding: 0.5rem !important; - } - .pt-sm-2, - .py-sm-2 { - padding-top: 0.5rem !important; - } - .pr-sm-2, - .px-sm-2 { - padding-right: 0.5rem !important; - } - .pb-sm-2, - .py-sm-2 { - padding-bottom: 0.5rem !important; - } - .pl-sm-2, - .px-sm-2 { - padding-left: 0.5rem !important; - } - .p-sm-3 { - padding: 1rem !important; - } - .pt-sm-3, - .py-sm-3 { - padding-top: 1rem !important; - } - .pr-sm-3, - .px-sm-3 { - padding-right: 1rem !important; - } - .pb-sm-3, - .py-sm-3 { - padding-bottom: 1rem !important; - } - .pl-sm-3, - .px-sm-3 { - padding-left: 1rem !important; - } - .p-sm-4 { - padding: 1.5rem !important; - } - .pt-sm-4, - .py-sm-4 { - padding-top: 1.5rem !important; - } - .pr-sm-4, - .px-sm-4 { - padding-right: 1.5rem !important; - } - .pb-sm-4, - .py-sm-4 { - padding-bottom: 1.5rem !important; - } - .pl-sm-4, - .px-sm-4 { - padding-left: 1.5rem !important; - } - .p-sm-5 { - padding: 3rem !important; - } - .pt-sm-5, - .py-sm-5 { - padding-top: 3rem !important; - } - .pr-sm-5, - .px-sm-5 { - padding-right: 3rem !important; - } - .pb-sm-5, - .py-sm-5 { - padding-bottom: 3rem !important; - } - .pl-sm-5, - .px-sm-5 { - padding-left: 3rem !important; - } - .m-sm-n1 { - margin: -0.25rem !important; - } - .mt-sm-n1, - .my-sm-n1 { - margin-top: -0.25rem !important; - } - .mr-sm-n1, - .mx-sm-n1 { - margin-right: -0.25rem !important; - } - .mb-sm-n1, - .my-sm-n1 { - margin-bottom: -0.25rem !important; - } - .ml-sm-n1, - .mx-sm-n1 { - margin-left: -0.25rem !important; - } - .m-sm-n2 { - margin: -0.5rem !important; - } - .mt-sm-n2, - .my-sm-n2 { - margin-top: -0.5rem !important; - } - .mr-sm-n2, - .mx-sm-n2 { - margin-right: -0.5rem !important; - } - .mb-sm-n2, - .my-sm-n2 { - margin-bottom: -0.5rem !important; - } - .ml-sm-n2, - .mx-sm-n2 { - margin-left: -0.5rem !important; - } - .m-sm-n3 { - margin: -1rem !important; - } - .mt-sm-n3, - .my-sm-n3 { - margin-top: -1rem !important; - } - .mr-sm-n3, - .mx-sm-n3 { - margin-right: -1rem !important; - } - .mb-sm-n3, - .my-sm-n3 { - margin-bottom: -1rem !important; - } - .ml-sm-n3, - .mx-sm-n3 { - margin-left: -1rem !important; - } - .m-sm-n4 { - margin: -1.5rem !important; - } - .mt-sm-n4, - .my-sm-n4 { - margin-top: -1.5rem !important; - } - .mr-sm-n4, - .mx-sm-n4 { - margin-right: -1.5rem !important; - } - .mb-sm-n4, - .my-sm-n4 { - margin-bottom: -1.5rem !important; - } - .ml-sm-n4, - .mx-sm-n4 { - margin-left: -1.5rem !important; - } - .m-sm-n5 { - margin: -3rem !important; - } - .mt-sm-n5, - .my-sm-n5 { - margin-top: -3rem !important; - } - .mr-sm-n5, - .mx-sm-n5 { - margin-right: -3rem !important; - } - .mb-sm-n5, - .my-sm-n5 { - margin-bottom: -3rem !important; - } - .ml-sm-n5, - .mx-sm-n5 { - margin-left: -3rem !important; - } - .m-sm-auto { - margin: auto !important; - } - .mt-sm-auto, - .my-sm-auto { - margin-top: auto !important; - } - .mr-sm-auto, - .mx-sm-auto { - margin-right: auto !important; - } - .mb-sm-auto, - .my-sm-auto { - margin-bottom: auto !important; - } - .ml-sm-auto, - .mx-sm-auto { - margin-left: auto !important; - } -} - -@media (min-width: 768px) { - .m-md-0 { - margin: 0 !important; - } - .mt-md-0, - .my-md-0 { - margin-top: 0 !important; - } - .mr-md-0, - .mx-md-0 { - margin-right: 0 !important; - } - .mb-md-0, - .my-md-0 { - margin-bottom: 0 !important; - } - .ml-md-0, - .mx-md-0 { - margin-left: 0 !important; - } - .m-md-1 { - margin: 0.25rem !important; - } - .mt-md-1, - .my-md-1 { - margin-top: 0.25rem !important; - } - .mr-md-1, - .mx-md-1 { - margin-right: 0.25rem !important; - } - .mb-md-1, - .my-md-1 { - margin-bottom: 0.25rem !important; - } - .ml-md-1, - .mx-md-1 { - margin-left: 0.25rem !important; - } - .m-md-2 { - margin: 0.5rem !important; - } - .mt-md-2, - .my-md-2 { - margin-top: 0.5rem !important; - } - .mr-md-2, - .mx-md-2 { - margin-right: 0.5rem !important; - } - .mb-md-2, - .my-md-2 { - margin-bottom: 0.5rem !important; - } - .ml-md-2, - .mx-md-2 { - margin-left: 0.5rem !important; - } - .m-md-3 { - margin: 1rem !important; - } - .mt-md-3, - .my-md-3 { - margin-top: 1rem !important; - } - .mr-md-3, - .mx-md-3 { - margin-right: 1rem !important; - } - .mb-md-3, - .my-md-3 { - margin-bottom: 1rem !important; - } - .ml-md-3, - .mx-md-3 { - margin-left: 1rem !important; - } - .m-md-4 { - margin: 1.5rem !important; - } - .mt-md-4, - .my-md-4 { - margin-top: 1.5rem !important; - } - .mr-md-4, - .mx-md-4 { - margin-right: 1.5rem !important; - } - .mb-md-4, - .my-md-4 { - margin-bottom: 1.5rem !important; - } - .ml-md-4, - .mx-md-4 { - margin-left: 1.5rem !important; - } - .m-md-5 { - margin: 3rem !important; - } - .mt-md-5, - .my-md-5 { - margin-top: 3rem !important; - } - .mr-md-5, - .mx-md-5 { - margin-right: 3rem !important; - } - .mb-md-5, - .my-md-5 { - margin-bottom: 3rem !important; - } - .ml-md-5, - .mx-md-5 { - margin-left: 3rem !important; - } - .p-md-0 { - padding: 0 !important; - } - .pt-md-0, - .py-md-0 { - padding-top: 0 !important; - } - .pr-md-0, - .px-md-0 { - padding-right: 0 !important; - } - .pb-md-0, - .py-md-0 { - padding-bottom: 0 !important; - } - .pl-md-0, - .px-md-0 { - padding-left: 0 !important; - } - .p-md-1 { - padding: 0.25rem !important; - } - .pt-md-1, - .py-md-1 { - padding-top: 0.25rem !important; - } - .pr-md-1, - .px-md-1 { - padding-right: 0.25rem !important; - } - .pb-md-1, - .py-md-1 { - padding-bottom: 0.25rem !important; - } - .pl-md-1, - .px-md-1 { - padding-left: 0.25rem !important; - } - .p-md-2 { - padding: 0.5rem !important; - } - .pt-md-2, - .py-md-2 { - padding-top: 0.5rem !important; - } - .pr-md-2, - .px-md-2 { - padding-right: 0.5rem !important; - } - .pb-md-2, - .py-md-2 { - padding-bottom: 0.5rem !important; - } - .pl-md-2, - .px-md-2 { - padding-left: 0.5rem !important; - } - .p-md-3 { - padding: 1rem !important; - } - .pt-md-3, - .py-md-3 { - padding-top: 1rem !important; - } - .pr-md-3, - .px-md-3 { - padding-right: 1rem !important; - } - .pb-md-3, - .py-md-3 { - padding-bottom: 1rem !important; - } - .pl-md-3, - .px-md-3 { - padding-left: 1rem !important; - } - .p-md-4 { - padding: 1.5rem !important; - } - .pt-md-4, - .py-md-4 { - padding-top: 1.5rem !important; - } - .pr-md-4, - .px-md-4 { - padding-right: 1.5rem !important; - } - .pb-md-4, - .py-md-4 { - padding-bottom: 1.5rem !important; - } - .pl-md-4, - .px-md-4 { - padding-left: 1.5rem !important; - } - .p-md-5 { - padding: 3rem !important; - } - .pt-md-5, - .py-md-5 { - padding-top: 3rem !important; - } - .pr-md-5, - .px-md-5 { - padding-right: 3rem !important; - } - .pb-md-5, - .py-md-5 { - padding-bottom: 3rem !important; - } - .pl-md-5, - .px-md-5 { - padding-left: 3rem !important; - } - .m-md-n1 { - margin: -0.25rem !important; - } - .mt-md-n1, - .my-md-n1 { - margin-top: -0.25rem !important; - } - .mr-md-n1, - .mx-md-n1 { - margin-right: -0.25rem !important; - } - .mb-md-n1, - .my-md-n1 { - margin-bottom: -0.25rem !important; - } - .ml-md-n1, - .mx-md-n1 { - margin-left: -0.25rem !important; - } - .m-md-n2 { - margin: -0.5rem !important; - } - .mt-md-n2, - .my-md-n2 { - margin-top: -0.5rem !important; - } - .mr-md-n2, - .mx-md-n2 { - margin-right: -0.5rem !important; - } - .mb-md-n2, - .my-md-n2 { - margin-bottom: -0.5rem !important; - } - .ml-md-n2, - .mx-md-n2 { - margin-left: -0.5rem !important; - } - .m-md-n3 { - margin: -1rem !important; - } - .mt-md-n3, - .my-md-n3 { - margin-top: -1rem !important; - } - .mr-md-n3, - .mx-md-n3 { - margin-right: -1rem !important; - } - .mb-md-n3, - .my-md-n3 { - margin-bottom: -1rem !important; - } - .ml-md-n3, - .mx-md-n3 { - margin-left: -1rem !important; - } - .m-md-n4 { - margin: -1.5rem !important; - } - .mt-md-n4, - .my-md-n4 { - margin-top: -1.5rem !important; - } - .mr-md-n4, - .mx-md-n4 { - margin-right: -1.5rem !important; - } - .mb-md-n4, - .my-md-n4 { - margin-bottom: -1.5rem !important; - } - .ml-md-n4, - .mx-md-n4 { - margin-left: -1.5rem !important; - } - .m-md-n5 { - margin: -3rem !important; - } - .mt-md-n5, - .my-md-n5 { - margin-top: -3rem !important; - } - .mr-md-n5, - .mx-md-n5 { - margin-right: -3rem !important; - } - .mb-md-n5, - .my-md-n5 { - margin-bottom: -3rem !important; - } - .ml-md-n5, - .mx-md-n5 { - margin-left: -3rem !important; - } - .m-md-auto { - margin: auto !important; - } - .mt-md-auto, - .my-md-auto { - margin-top: auto !important; - } - .mr-md-auto, - .mx-md-auto { - margin-right: auto !important; - } - .mb-md-auto, - .my-md-auto { - margin-bottom: auto !important; - } - .ml-md-auto, - .mx-md-auto { - margin-left: auto !important; - } -} - -@media (min-width: 992px) { - .m-lg-0 { - margin: 0 !important; - } - .mt-lg-0, - .my-lg-0 { - margin-top: 0 !important; - } - .mr-lg-0, - .mx-lg-0 { - margin-right: 0 !important; - } - .mb-lg-0, - .my-lg-0 { - margin-bottom: 0 !important; - } - .ml-lg-0, - .mx-lg-0 { - margin-left: 0 !important; - } - .m-lg-1 { - margin: 0.25rem !important; - } - .mt-lg-1, - .my-lg-1 { - margin-top: 0.25rem !important; - } - .mr-lg-1, - .mx-lg-1 { - margin-right: 0.25rem !important; - } - .mb-lg-1, - .my-lg-1 { - margin-bottom: 0.25rem !important; - } - .ml-lg-1, - .mx-lg-1 { - margin-left: 0.25rem !important; - } - .m-lg-2 { - margin: 0.5rem !important; - } - .mt-lg-2, - .my-lg-2 { - margin-top: 0.5rem !important; - } - .mr-lg-2, - .mx-lg-2 { - margin-right: 0.5rem !important; - } - .mb-lg-2, - .my-lg-2 { - margin-bottom: 0.5rem !important; - } - .ml-lg-2, - .mx-lg-2 { - margin-left: 0.5rem !important; - } - .m-lg-3 { - margin: 1rem !important; - } - .mt-lg-3, - .my-lg-3 { - margin-top: 1rem !important; - } - .mr-lg-3, - .mx-lg-3 { - margin-right: 1rem !important; - } - .mb-lg-3, - .my-lg-3 { - margin-bottom: 1rem !important; - } - .ml-lg-3, - .mx-lg-3 { - margin-left: 1rem !important; - } - .m-lg-4 { - margin: 1.5rem !important; - } - .mt-lg-4, - .my-lg-4 { - margin-top: 1.5rem !important; - } - .mr-lg-4, - .mx-lg-4 { - margin-right: 1.5rem !important; - } - .mb-lg-4, - .my-lg-4 { - margin-bottom: 1.5rem !important; - } - .ml-lg-4, - .mx-lg-4 { - margin-left: 1.5rem !important; - } - .m-lg-5 { - margin: 3rem !important; - } - .mt-lg-5, - .my-lg-5 { - margin-top: 3rem !important; - } - .mr-lg-5, - .mx-lg-5 { - margin-right: 3rem !important; - } - .mb-lg-5, - .my-lg-5 { - margin-bottom: 3rem !important; - } - .ml-lg-5, - .mx-lg-5 { - margin-left: 3rem !important; - } - .p-lg-0 { - padding: 0 !important; - } - .pt-lg-0, - .py-lg-0 { - padding-top: 0 !important; - } - .pr-lg-0, - .px-lg-0 { - padding-right: 0 !important; - } - .pb-lg-0, - .py-lg-0 { - padding-bottom: 0 !important; - } - .pl-lg-0, - .px-lg-0 { - padding-left: 0 !important; - } - .p-lg-1 { - padding: 0.25rem !important; - } - .pt-lg-1, - .py-lg-1 { - padding-top: 0.25rem !important; - } - .pr-lg-1, - .px-lg-1 { - padding-right: 0.25rem !important; - } - .pb-lg-1, - .py-lg-1 { - padding-bottom: 0.25rem !important; - } - .pl-lg-1, - .px-lg-1 { - padding-left: 0.25rem !important; - } - .p-lg-2 { - padding: 0.5rem !important; - } - .pt-lg-2, - .py-lg-2 { - padding-top: 0.5rem !important; - } - .pr-lg-2, - .px-lg-2 { - padding-right: 0.5rem !important; - } - .pb-lg-2, - .py-lg-2 { - padding-bottom: 0.5rem !important; - } - .pl-lg-2, - .px-lg-2 { - padding-left: 0.5rem !important; - } - .p-lg-3 { - padding: 1rem !important; - } - .pt-lg-3, - .py-lg-3 { - padding-top: 1rem !important; - } - .pr-lg-3, - .px-lg-3 { - padding-right: 1rem !important; - } - .pb-lg-3, - .py-lg-3 { - padding-bottom: 1rem !important; - } - .pl-lg-3, - .px-lg-3 { - padding-left: 1rem !important; - } - .p-lg-4 { - padding: 1.5rem !important; - } - .pt-lg-4, - .py-lg-4 { - padding-top: 1.5rem !important; - } - .pr-lg-4, - .px-lg-4 { - padding-right: 1.5rem !important; - } - .pb-lg-4, - .py-lg-4 { - padding-bottom: 1.5rem !important; - } - .pl-lg-4, - .px-lg-4 { - padding-left: 1.5rem !important; - } - .p-lg-5 { - padding: 3rem !important; - } - .pt-lg-5, - .py-lg-5 { - padding-top: 3rem !important; - } - .pr-lg-5, - .px-lg-5 { - padding-right: 3rem !important; - } - .pb-lg-5, - .py-lg-5 { - padding-bottom: 3rem !important; - } - .pl-lg-5, - .px-lg-5 { - padding-left: 3rem !important; - } - .m-lg-n1 { - margin: -0.25rem !important; - } - .mt-lg-n1, - .my-lg-n1 { - margin-top: -0.25rem !important; - } - .mr-lg-n1, - .mx-lg-n1 { - margin-right: -0.25rem !important; - } - .mb-lg-n1, - .my-lg-n1 { - margin-bottom: -0.25rem !important; - } - .ml-lg-n1, - .mx-lg-n1 { - margin-left: -0.25rem !important; - } - .m-lg-n2 { - margin: -0.5rem !important; - } - .mt-lg-n2, - .my-lg-n2 { - margin-top: -0.5rem !important; - } - .mr-lg-n2, - .mx-lg-n2 { - margin-right: -0.5rem !important; - } - .mb-lg-n2, - .my-lg-n2 { - margin-bottom: -0.5rem !important; - } - .ml-lg-n2, - .mx-lg-n2 { - margin-left: -0.5rem !important; - } - .m-lg-n3 { - margin: -1rem !important; - } - .mt-lg-n3, - .my-lg-n3 { - margin-top: -1rem !important; - } - .mr-lg-n3, - .mx-lg-n3 { - margin-right: -1rem !important; - } - .mb-lg-n3, - .my-lg-n3 { - margin-bottom: -1rem !important; - } - .ml-lg-n3, - .mx-lg-n3 { - margin-left: -1rem !important; - } - .m-lg-n4 { - margin: -1.5rem !important; - } - .mt-lg-n4, - .my-lg-n4 { - margin-top: -1.5rem !important; - } - .mr-lg-n4, - .mx-lg-n4 { - margin-right: -1.5rem !important; - } - .mb-lg-n4, - .my-lg-n4 { - margin-bottom: -1.5rem !important; - } - .ml-lg-n4, - .mx-lg-n4 { - margin-left: -1.5rem !important; - } - .m-lg-n5 { - margin: -3rem !important; - } - .mt-lg-n5, - .my-lg-n5 { - margin-top: -3rem !important; - } - .mr-lg-n5, - .mx-lg-n5 { - margin-right: -3rem !important; - } - .mb-lg-n5, - .my-lg-n5 { - margin-bottom: -3rem !important; - } - .ml-lg-n5, - .mx-lg-n5 { - margin-left: -3rem !important; - } - .m-lg-auto { - margin: auto !important; - } - .mt-lg-auto, - .my-lg-auto { - margin-top: auto !important; - } - .mr-lg-auto, - .mx-lg-auto { - margin-right: auto !important; - } - .mb-lg-auto, - .my-lg-auto { - margin-bottom: auto !important; - } - .ml-lg-auto, - .mx-lg-auto { - margin-left: auto !important; - } -} - -@media (min-width: 1200px) { - .m-xl-0 { - margin: 0 !important; - } - .mt-xl-0, - .my-xl-0 { - margin-top: 0 !important; - } - .mr-xl-0, - .mx-xl-0 { - margin-right: 0 !important; - } - .mb-xl-0, - .my-xl-0 { - margin-bottom: 0 !important; - } - .ml-xl-0, - .mx-xl-0 { - margin-left: 0 !important; - } - .m-xl-1 { - margin: 0.25rem !important; - } - .mt-xl-1, - .my-xl-1 { - margin-top: 0.25rem !important; - } - .mr-xl-1, - .mx-xl-1 { - margin-right: 0.25rem !important; - } - .mb-xl-1, - .my-xl-1 { - margin-bottom: 0.25rem !important; - } - .ml-xl-1, - .mx-xl-1 { - margin-left: 0.25rem !important; - } - .m-xl-2 { - margin: 0.5rem !important; - } - .mt-xl-2, - .my-xl-2 { - margin-top: 0.5rem !important; - } - .mr-xl-2, - .mx-xl-2 { - margin-right: 0.5rem !important; - } - .mb-xl-2, - .my-xl-2 { - margin-bottom: 0.5rem !important; - } - .ml-xl-2, - .mx-xl-2 { - margin-left: 0.5rem !important; - } - .m-xl-3 { - margin: 1rem !important; - } - .mt-xl-3, - .my-xl-3 { - margin-top: 1rem !important; - } - .mr-xl-3, - .mx-xl-3 { - margin-right: 1rem !important; - } - .mb-xl-3, - .my-xl-3 { - margin-bottom: 1rem !important; - } - .ml-xl-3, - .mx-xl-3 { - margin-left: 1rem !important; - } - .m-xl-4 { - margin: 1.5rem !important; - } - .mt-xl-4, - .my-xl-4 { - margin-top: 1.5rem !important; - } - .mr-xl-4, - .mx-xl-4 { - margin-right: 1.5rem !important; - } - .mb-xl-4, - .my-xl-4 { - margin-bottom: 1.5rem !important; - } - .ml-xl-4, - .mx-xl-4 { - margin-left: 1.5rem !important; - } - .m-xl-5 { - margin: 3rem !important; - } - .mt-xl-5, - .my-xl-5 { - margin-top: 3rem !important; - } - .mr-xl-5, - .mx-xl-5 { - margin-right: 3rem !important; - } - .mb-xl-5, - .my-xl-5 { - margin-bottom: 3rem !important; - } - .ml-xl-5, - .mx-xl-5 { - margin-left: 3rem !important; - } - .p-xl-0 { - padding: 0 !important; - } - .pt-xl-0, - .py-xl-0 { - padding-top: 0 !important; - } - .pr-xl-0, - .px-xl-0 { - padding-right: 0 !important; - } - .pb-xl-0, - .py-xl-0 { - padding-bottom: 0 !important; - } - .pl-xl-0, - .px-xl-0 { - padding-left: 0 !important; - } - .p-xl-1 { - padding: 0.25rem !important; - } - .pt-xl-1, - .py-xl-1 { - padding-top: 0.25rem !important; - } - .pr-xl-1, - .px-xl-1 { - padding-right: 0.25rem !important; - } - .pb-xl-1, - .py-xl-1 { - padding-bottom: 0.25rem !important; - } - .pl-xl-1, - .px-xl-1 { - padding-left: 0.25rem !important; - } - .p-xl-2 { - padding: 0.5rem !important; - } - .pt-xl-2, - .py-xl-2 { - padding-top: 0.5rem !important; - } - .pr-xl-2, - .px-xl-2 { - padding-right: 0.5rem !important; - } - .pb-xl-2, - .py-xl-2 { - padding-bottom: 0.5rem !important; - } - .pl-xl-2, - .px-xl-2 { - padding-left: 0.5rem !important; - } - .p-xl-3 { - padding: 1rem !important; - } - .pt-xl-3, - .py-xl-3 { - padding-top: 1rem !important; - } - .pr-xl-3, - .px-xl-3 { - padding-right: 1rem !important; - } - .pb-xl-3, - .py-xl-3 { - padding-bottom: 1rem !important; - } - .pl-xl-3, - .px-xl-3 { - padding-left: 1rem !important; - } - .p-xl-4 { - padding: 1.5rem !important; - } - .pt-xl-4, - .py-xl-4 { - padding-top: 1.5rem !important; - } - .pr-xl-4, - .px-xl-4 { - padding-right: 1.5rem !important; - } - .pb-xl-4, - .py-xl-4 { - padding-bottom: 1.5rem !important; - } - .pl-xl-4, - .px-xl-4 { - padding-left: 1.5rem !important; - } - .p-xl-5 { - padding: 3rem !important; - } - .pt-xl-5, - .py-xl-5 { - padding-top: 3rem !important; - } - .pr-xl-5, - .px-xl-5 { - padding-right: 3rem !important; - } - .pb-xl-5, - .py-xl-5 { - padding-bottom: 3rem !important; - } - .pl-xl-5, - .px-xl-5 { - padding-left: 3rem !important; - } - .m-xl-n1 { - margin: -0.25rem !important; - } - .mt-xl-n1, - .my-xl-n1 { - margin-top: -0.25rem !important; - } - .mr-xl-n1, - .mx-xl-n1 { - margin-right: -0.25rem !important; - } - .mb-xl-n1, - .my-xl-n1 { - margin-bottom: -0.25rem !important; - } - .ml-xl-n1, - .mx-xl-n1 { - margin-left: -0.25rem !important; - } - .m-xl-n2 { - margin: -0.5rem !important; - } - .mt-xl-n2, - .my-xl-n2 { - margin-top: -0.5rem !important; - } - .mr-xl-n2, - .mx-xl-n2 { - margin-right: -0.5rem !important; - } - .mb-xl-n2, - .my-xl-n2 { - margin-bottom: -0.5rem !important; - } - .ml-xl-n2, - .mx-xl-n2 { - margin-left: -0.5rem !important; - } - .m-xl-n3 { - margin: -1rem !important; - } - .mt-xl-n3, - .my-xl-n3 { - margin-top: -1rem !important; - } - .mr-xl-n3, - .mx-xl-n3 { - margin-right: -1rem !important; - } - .mb-xl-n3, - .my-xl-n3 { - margin-bottom: -1rem !important; - } - .ml-xl-n3, - .mx-xl-n3 { - margin-left: -1rem !important; - } - .m-xl-n4 { - margin: -1.5rem !important; - } - .mt-xl-n4, - .my-xl-n4 { - margin-top: -1.5rem !important; - } - .mr-xl-n4, - .mx-xl-n4 { - margin-right: -1.5rem !important; - } - .mb-xl-n4, - .my-xl-n4 { - margin-bottom: -1.5rem !important; - } - .ml-xl-n4, - .mx-xl-n4 { - margin-left: -1.5rem !important; - } - .m-xl-n5 { - margin: -3rem !important; - } - .mt-xl-n5, - .my-xl-n5 { - margin-top: -3rem !important; - } - .mr-xl-n5, - .mx-xl-n5 { - margin-right: -3rem !important; - } - .mb-xl-n5, - .my-xl-n5 { - margin-bottom: -3rem !important; - } - .ml-xl-n5, - .mx-xl-n5 { - margin-left: -3rem !important; - } - .m-xl-auto { - margin: auto !important; - } - .mt-xl-auto, - .my-xl-auto { - margin-top: auto !important; - } - .mr-xl-auto, - .mx-xl-auto { - margin-right: auto !important; - } - .mb-xl-auto, - .my-xl-auto { - margin-bottom: auto !important; - } - .ml-xl-auto, - .mx-xl-auto { - margin-left: auto !important; - } -} -/*# sourceMappingURL=bootstrap-grid.css.map */ \ No newline at end of file diff --git a/javascript-practice/simple-side-bar/vendor/bootstrap/css/bootstrap-grid.css.map b/javascript-practice/simple-side-bar/vendor/bootstrap/css/bootstrap-grid.css.map deleted file mode 100644 index a664f98..0000000 --- a/javascript-practice/simple-side-bar/vendor/bootstrap/css/bootstrap-grid.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../../scss/bootstrap-grid.scss","bootstrap-grid.css","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_breakpoints.scss","../../scss/_variables.scss","../../scss/mixins/_grid-framework.scss","../../scss/utilities/_display.scss","../../scss/utilities/_flex.scss","../../scss/utilities/_spacing.scss"],"names":[],"mappings":"AAAA;;;;;ECKE;ADEF;EACE,sBAAsB;EACtB,6BAA6B;ACA/B;;ADGA;;;EAGE,mBAAmB;ACArB;;ACTE;;;;;;ECDA,WAAW;EACX,mBAA0B;EAC1B,kBAAyB;EACzB,kBAAkB;EAClB,iBAAiB;AFmBnB;;AGgCI;EFzCE;IACE,gBG+LG;EJlLT;AACF;;AG0BI;EFzCE;IACE,gBGgMG;EJ7KT;AACF;;AGoBI;EFzCE;IACE,gBGiMG;EJxKT;AACF;;AGcI;EFzCE;IACE,iBGkMI;EJnKV;AACF;;ACJE;ECnCA,oBAAa;EAAb,aAAa;EACb,mBAAe;EAAf,eAAe;EACf,mBAA0B;EAC1B,kBAAyB;AF2C3B;;ACLE;EACE,eAAe;EACf,cAAc;ADQlB;;ACVE;;EAMI,gBAAgB;EAChB,eAAe;ADSrB;;AK/DE;;;;;;EACE,kBAAkB;EAClB,WAAW;EACX,mBAA0B;EAC1B,kBAAyB;ALuE7B;;AKjDM;EACE,0BAAa;EAAb,aAAa;EACb,oBAAY;EAAZ,YAAY;EACZ,eAAe;ALoDvB;;AK/CU;EHwBN,kBAAuB;EAAvB,cAAuB;EACvB,eAAwB;AF2B5B;;AKpDU;EHwBN,iBAAuB;EAAvB,aAAuB;EACvB,cAAwB;AFgC5B;;AKzDU;EHwBN,wBAAuB;EAAvB,oBAAuB;EACvB,qBAAwB;AFqC5B;;AK9DU;EHwBN,iBAAuB;EAAvB,aAAuB;EACvB,cAAwB;AF0C5B;;AKnEU;EHwBN,iBAAuB;EAAvB,aAAuB;EACvB,cAAwB;AF+C5B;;AKxEU;EHwBN,wBAAuB;EAAvB,oBAAuB;EACvB,qBAAwB;AFoD5B;;AKvEM;EHCJ,kBAAc;EAAd,cAAc;EACd,WAAW;EACX,eAAe;AF0EjB;;AKvEU;EHbR,uBAAsC;EAAtC,mBAAsC;EAItC,oBAAuC;AFqFzC;;AK5EU;EHbR,wBAAsC;EAAtC,oBAAsC;EAItC,qBAAuC;AF0FzC;;AKjFU;EHbR,iBAAsC;EAAtC,aAAsC;EAItC,cAAuC;AF+FzC;;AKtFU;EHbR,wBAAsC;EAAtC,oBAAsC;EAItC,qBAAuC;AFoGzC;;AK3FU;EHbR,wBAAsC;EAAtC,oBAAsC;EAItC,qBAAuC;AFyGzC;;AKhGU;EHbR,iBAAsC;EAAtC,aAAsC;EAItC,cAAuC;AF8GzC;;AKrGU;EHbR,wBAAsC;EAAtC,oBAAsC;EAItC,qBAAuC;AFmHzC;;AK1GU;EHbR,wBAAsC;EAAtC,oBAAsC;EAItC,qBAAuC;AFwHzC;;AK/GU;EHbR,iBAAsC;EAAtC,aAAsC;EAItC,cAAuC;AF6HzC;;AKpHU;EHbR,wBAAsC;EAAtC,oBAAsC;EAItC,qBAAuC;AFkIzC;;AKzHU;EHbR,wBAAsC;EAAtC,oBAAsC;EAItC,qBAAuC;AFuIzC;;AK9HU;EHbR,kBAAsC;EAAtC,cAAsC;EAItC,eAAuC;AF4IzC;;AK7HM;EAAwB,kBAAS;EAAT,SAAS;ALiIvC;;AK/HM;EAAuB,kBDmKG;ECnKH,SDmKG;AJhChC;;AKhIQ;EAAwB,iBADZ;EACY,QADZ;ALqIpB;;AKpIQ;EAAwB,iBADZ;EACY,QADZ;ALyIpB;;AKxIQ;EAAwB,iBADZ;EACY,QADZ;AL6IpB;;AK5IQ;EAAwB,iBADZ;EACY,QADZ;ALiJpB;;AKhJQ;EAAwB,iBADZ;EACY,QADZ;ALqJpB;;AKpJQ;EAAwB,iBADZ;EACY,QADZ;ALyJpB;;AKxJQ;EAAwB,iBADZ;EACY,QADZ;AL6JpB;;AK5JQ;EAAwB,iBADZ;EACY,QADZ;ALiKpB;;AKhKQ;EAAwB,iBADZ;EACY,QADZ;ALqKpB;;AKpKQ;EAAwB,iBADZ;EACY,QADZ;ALyKpB;;AKxKQ;EAAwB,kBADZ;EACY,SADZ;AL6KpB;;AK5KQ;EAAwB,kBADZ;EACY,SADZ;ALiLpB;;AKhLQ;EAAwB,kBADZ;EACY,SADZ;ALqLpB;;AK7KY;EHhBV,sBAA8C;AFiMhD;;AKjLY;EHhBV,uBAA8C;AFqMhD;;AKrLY;EHhBV,gBAA8C;AFyMhD;;AKzLY;EHhBV,uBAA8C;AF6MhD;;AK7LY;EHhBV,uBAA8C;AFiNhD;;AKjMY;EHhBV,gBAA8C;AFqNhD;;AKrMY;EHhBV,uBAA8C;AFyNhD;;AKzMY;EHhBV,uBAA8C;AF6NhD;;AK7MY;EHhBV,gBAA8C;AFiOhD;;AKjNY;EHhBV,uBAA8C;AFqOhD;;AKrNY;EHhBV,uBAA8C;AFyOhD;;AGpOI;EE3BE;IACE,0BAAa;IAAb,aAAa;IACb,oBAAY;IAAZ,YAAY;IACZ,eAAe;ELmQrB;EK9PQ;IHwBN,kBAAuB;IAAvB,cAAuB;IACvB,eAAwB;EFyO1B;EKlQQ;IHwBN,iBAAuB;IAAvB,aAAuB;IACvB,cAAwB;EF6O1B;EKtQQ;IHwBN,wBAAuB;IAAvB,oBAAuB;IACvB,qBAAwB;EFiP1B;EK1QQ;IHwBN,iBAAuB;IAAvB,aAAuB;IACvB,cAAwB;EFqP1B;EK9QQ;IHwBN,iBAAuB;IAAvB,aAAuB;IACvB,cAAwB;EFyP1B;EKlRQ;IHwBN,wBAAuB;IAAvB,oBAAuB;IACvB,qBAAwB;EF6P1B;EKhRI;IHCJ,kBAAc;IAAd,cAAc;IACd,WAAW;IACX,eAAe;EFkRf;EK/QQ;IHbR,uBAAsC;IAAtC,mBAAsC;IAItC,oBAAuC;EF4RvC;EKnRQ;IHbR,wBAAsC;IAAtC,oBAAsC;IAItC,qBAAuC;EFgSvC;EKvRQ;IHbR,iBAAsC;IAAtC,aAAsC;IAItC,cAAuC;EFoSvC;EK3RQ;IHbR,wBAAsC;IAAtC,oBAAsC;IAItC,qBAAuC;EFwSvC;EK/RQ;IHbR,wBAAsC;IAAtC,oBAAsC;IAItC,qBAAuC;EF4SvC;EKnSQ;IHbR,iBAAsC;IAAtC,aAAsC;IAItC,cAAuC;EFgTvC;EKvSQ;IHbR,wBAAsC;IAAtC,oBAAsC;IAItC,qBAAuC;EFoTvC;EK3SQ;IHbR,wBAAsC;IAAtC,oBAAsC;IAItC,qBAAuC;EFwTvC;EK/SQ;IHbR,iBAAsC;IAAtC,aAAsC;IAItC,cAAuC;EF4TvC;EKnTQ;IHbR,wBAAsC;IAAtC,oBAAsC;IAItC,qBAAuC;EFgUvC;EKvTQ;IHbR,wBAAsC;IAAtC,oBAAsC;IAItC,qBAAuC;EFoUvC;EK3TQ;IHbR,kBAAsC;IAAtC,cAAsC;IAItC,eAAuC;EFwUvC;EKzTI;IAAwB,kBAAS;IAAT,SAAS;EL4TrC;EK1TI;IAAuB,kBDmKG;ICnKH,SDmKG;EJ0J9B;EK1TM;IAAwB,iBADZ;IACY,QADZ;EL8TlB;EK7TM;IAAwB,iBADZ;IACY,QADZ;ELiUlB;EKhUM;IAAwB,iBADZ;IACY,QADZ;ELoUlB;EKnUM;IAAwB,iBADZ;IACY,QADZ;ELuUlB;EKtUM;IAAwB,iBADZ;IACY,QADZ;EL0UlB;EKzUM;IAAwB,iBADZ;IACY,QADZ;EL6UlB;EK5UM;IAAwB,iBADZ;IACY,QADZ;ELgVlB;EK/UM;IAAwB,iBADZ;IACY,QADZ;ELmVlB;EKlVM;IAAwB,iBADZ;IACY,QADZ;ELsVlB;EKrVM;IAAwB,iBADZ;IACY,QADZ;ELyVlB;EKxVM;IAAwB,kBADZ;IACY,SADZ;EL4VlB;EK3VM;IAAwB,kBADZ;IACY,SADZ;EL+VlB;EK9VM;IAAwB,kBADZ;IACY,SADZ;ELkWlB;EK1VU;IHhBV,cAA4B;EF6W5B;EK7VU;IHhBV,sBAA8C;EFgX9C;EKhWU;IHhBV,uBAA8C;EFmX9C;EKnWU;IHhBV,gBAA8C;EFsX9C;EKtWU;IHhBV,uBAA8C;EFyX9C;EKzWU;IHhBV,uBAA8C;EF4X9C;EK5WU;IHhBV,gBAA8C;EF+X9C;EK/WU;IHhBV,uBAA8C;EFkY9C;EKlXU;IHhBV,uBAA8C;EFqY9C;EKrXU;IHhBV,gBAA8C;EFwY9C;EKxXU;IHhBV,uBAA8C;EF2Y9C;EK3XU;IHhBV,uBAA8C;EF8Y9C;AACF;;AG1YI;EE3BE;IACE,0BAAa;IAAb,aAAa;IACb,oBAAY;IAAZ,YAAY;IACZ,eAAe;ELyarB;EKpaQ;IHwBN,kBAAuB;IAAvB,cAAuB;IACvB,eAAwB;EF+Y1B;EKxaQ;IHwBN,iBAAuB;IAAvB,aAAuB;IACvB,cAAwB;EFmZ1B;EK5aQ;IHwBN,wBAAuB;IAAvB,oBAAuB;IACvB,qBAAwB;EFuZ1B;EKhbQ;IHwBN,iBAAuB;IAAvB,aAAuB;IACvB,cAAwB;EF2Z1B;EKpbQ;IHwBN,iBAAuB;IAAvB,aAAuB;IACvB,cAAwB;EF+Z1B;EKxbQ;IHwBN,wBAAuB;IAAvB,oBAAuB;IACvB,qBAAwB;EFma1B;EKtbI;IHCJ,kBAAc;IAAd,cAAc;IACd,WAAW;IACX,eAAe;EFwbf;EKrbQ;IHbR,uBAAsC;IAAtC,mBAAsC;IAItC,oBAAuC;EFkcvC;EKzbQ;IHbR,wBAAsC;IAAtC,oBAAsC;IAItC,qBAAuC;EFscvC;EK7bQ;IHbR,iBAAsC;IAAtC,aAAsC;IAItC,cAAuC;EF0cvC;EKjcQ;IHbR,wBAAsC;IAAtC,oBAAsC;IAItC,qBAAuC;EF8cvC;EKrcQ;IHbR,wBAAsC;IAAtC,oBAAsC;IAItC,qBAAuC;EFkdvC;EKzcQ;IHbR,iBAAsC;IAAtC,aAAsC;IAItC,cAAuC;EFsdvC;EK7cQ;IHbR,wBAAsC;IAAtC,oBAAsC;IAItC,qBAAuC;EF0dvC;EKjdQ;IHbR,wBAAsC;IAAtC,oBAAsC;IAItC,qBAAuC;EF8dvC;EKrdQ;IHbR,iBAAsC;IAAtC,aAAsC;IAItC,cAAuC;EFkevC;EKzdQ;IHbR,wBAAsC;IAAtC,oBAAsC;IAItC,qBAAuC;EFsevC;EK7dQ;IHbR,wBAAsC;IAAtC,oBAAsC;IAItC,qBAAuC;EF0evC;EKjeQ;IHbR,kBAAsC;IAAtC,cAAsC;IAItC,eAAuC;EF8evC;EK/dI;IAAwB,kBAAS;IAAT,SAAS;ELkerC;EKheI;IAAuB,kBDmKG;ICnKH,SDmKG;EJgU9B;EKheM;IAAwB,iBADZ;IACY,QADZ;ELoelB;EKneM;IAAwB,iBADZ;IACY,QADZ;ELuelB;EKteM;IAAwB,iBADZ;IACY,QADZ;EL0elB;EKzeM;IAAwB,iBADZ;IACY,QADZ;EL6elB;EK5eM;IAAwB,iBADZ;IACY,QADZ;ELgflB;EK/eM;IAAwB,iBADZ;IACY,QADZ;ELmflB;EKlfM;IAAwB,iBADZ;IACY,QADZ;ELsflB;EKrfM;IAAwB,iBADZ;IACY,QADZ;ELyflB;EKxfM;IAAwB,iBADZ;IACY,QADZ;EL4flB;EK3fM;IAAwB,iBADZ;IACY,QADZ;EL+flB;EK9fM;IAAwB,kBADZ;IACY,SADZ;ELkgBlB;EKjgBM;IAAwB,kBADZ;IACY,SADZ;ELqgBlB;EKpgBM;IAAwB,kBADZ;IACY,SADZ;ELwgBlB;EKhgBU;IHhBV,cAA4B;EFmhB5B;EKngBU;IHhBV,sBAA8C;EFshB9C;EKtgBU;IHhBV,uBAA8C;EFyhB9C;EKzgBU;IHhBV,gBAA8C;EF4hB9C;EK5gBU;IHhBV,uBAA8C;EF+hB9C;EK/gBU;IHhBV,uBAA8C;EFkiB9C;EKlhBU;IHhBV,gBAA8C;EFqiB9C;EKrhBU;IHhBV,uBAA8C;EFwiB9C;EKxhBU;IHhBV,uBAA8C;EF2iB9C;EK3hBU;IHhBV,gBAA8C;EF8iB9C;EK9hBU;IHhBV,uBAA8C;EFijB9C;EKjiBU;IHhBV,uBAA8C;EFojB9C;AACF;;AGhjBI;EE3BE;IACE,0BAAa;IAAb,aAAa;IACb,oBAAY;IAAZ,YAAY;IACZ,eAAe;EL+kBrB;EK1kBQ;IHwBN,kBAAuB;IAAvB,cAAuB;IACvB,eAAwB;EFqjB1B;EK9kBQ;IHwBN,iBAAuB;IAAvB,aAAuB;IACvB,cAAwB;EFyjB1B;EKllBQ;IHwBN,wBAAuB;IAAvB,oBAAuB;IACvB,qBAAwB;EF6jB1B;EKtlBQ;IHwBN,iBAAuB;IAAvB,aAAuB;IACvB,cAAwB;EFikB1B;EK1lBQ;IHwBN,iBAAuB;IAAvB,aAAuB;IACvB,cAAwB;EFqkB1B;EK9lBQ;IHwBN,wBAAuB;IAAvB,oBAAuB;IACvB,qBAAwB;EFykB1B;EK5lBI;IHCJ,kBAAc;IAAd,cAAc;IACd,WAAW;IACX,eAAe;EF8lBf;EK3lBQ;IHbR,uBAAsC;IAAtC,mBAAsC;IAItC,oBAAuC;EFwmBvC;EK/lBQ;IHbR,wBAAsC;IAAtC,oBAAsC;IAItC,qBAAuC;EF4mBvC;EKnmBQ;IHbR,iBAAsC;IAAtC,aAAsC;IAItC,cAAuC;EFgnBvC;EKvmBQ;IHbR,wBAAsC;IAAtC,oBAAsC;IAItC,qBAAuC;EFonBvC;EK3mBQ;IHbR,wBAAsC;IAAtC,oBAAsC;IAItC,qBAAuC;EFwnBvC;EK/mBQ;IHbR,iBAAsC;IAAtC,aAAsC;IAItC,cAAuC;EF4nBvC;EKnnBQ;IHbR,wBAAsC;IAAtC,oBAAsC;IAItC,qBAAuC;EFgoBvC;EKvnBQ;IHbR,wBAAsC;IAAtC,oBAAsC;IAItC,qBAAuC;EFooBvC;EK3nBQ;IHbR,iBAAsC;IAAtC,aAAsC;IAItC,cAAuC;EFwoBvC;EK/nBQ;IHbR,wBAAsC;IAAtC,oBAAsC;IAItC,qBAAuC;EF4oBvC;EKnoBQ;IHbR,wBAAsC;IAAtC,oBAAsC;IAItC,qBAAuC;EFgpBvC;EKvoBQ;IHbR,kBAAsC;IAAtC,cAAsC;IAItC,eAAuC;EFopBvC;EKroBI;IAAwB,kBAAS;IAAT,SAAS;ELwoBrC;EKtoBI;IAAuB,kBDmKG;ICnKH,SDmKG;EJse9B;EKtoBM;IAAwB,iBADZ;IACY,QADZ;EL0oBlB;EKzoBM;IAAwB,iBADZ;IACY,QADZ;EL6oBlB;EK5oBM;IAAwB,iBADZ;IACY,QADZ;ELgpBlB;EK/oBM;IAAwB,iBADZ;IACY,QADZ;ELmpBlB;EKlpBM;IAAwB,iBADZ;IACY,QADZ;ELspBlB;EKrpBM;IAAwB,iBADZ;IACY,QADZ;ELypBlB;EKxpBM;IAAwB,iBADZ;IACY,QADZ;EL4pBlB;EK3pBM;IAAwB,iBADZ;IACY,QADZ;EL+pBlB;EK9pBM;IAAwB,iBADZ;IACY,QADZ;ELkqBlB;EKjqBM;IAAwB,iBADZ;IACY,QADZ;ELqqBlB;EKpqBM;IAAwB,kBADZ;IACY,SADZ;ELwqBlB;EKvqBM;IAAwB,kBADZ;IACY,SADZ;EL2qBlB;EK1qBM;IAAwB,kBADZ;IACY,SADZ;EL8qBlB;EKtqBU;IHhBV,cAA4B;EFyrB5B;EKzqBU;IHhBV,sBAA8C;EF4rB9C;EK5qBU;IHhBV,uBAA8C;EF+rB9C;EK/qBU;IHhBV,gBAA8C;EFksB9C;EKlrBU;IHhBV,uBAA8C;EFqsB9C;EKrrBU;IHhBV,uBAA8C;EFwsB9C;EKxrBU;IHhBV,gBAA8C;EF2sB9C;EK3rBU;IHhBV,uBAA8C;EF8sB9C;EK9rBU;IHhBV,uBAA8C;EFitB9C;EKjsBU;IHhBV,gBAA8C;EFotB9C;EKpsBU;IHhBV,uBAA8C;EFutB9C;EKvsBU;IHhBV,uBAA8C;EF0tB9C;AACF;;AGttBI;EE3BE;IACE,0BAAa;IAAb,aAAa;IACb,oBAAY;IAAZ,YAAY;IACZ,eAAe;ELqvBrB;EKhvBQ;IHwBN,kBAAuB;IAAvB,cAAuB;IACvB,eAAwB;EF2tB1B;EKpvBQ;IHwBN,iBAAuB;IAAvB,aAAuB;IACvB,cAAwB;EF+tB1B;EKxvBQ;IHwBN,wBAAuB;IAAvB,oBAAuB;IACvB,qBAAwB;EFmuB1B;EK5vBQ;IHwBN,iBAAuB;IAAvB,aAAuB;IACvB,cAAwB;EFuuB1B;EKhwBQ;IHwBN,iBAAuB;IAAvB,aAAuB;IACvB,cAAwB;EF2uB1B;EKpwBQ;IHwBN,wBAAuB;IAAvB,oBAAuB;IACvB,qBAAwB;EF+uB1B;EKlwBI;IHCJ,kBAAc;IAAd,cAAc;IACd,WAAW;IACX,eAAe;EFowBf;EKjwBQ;IHbR,uBAAsC;IAAtC,mBAAsC;IAItC,oBAAuC;EF8wBvC;EKrwBQ;IHbR,wBAAsC;IAAtC,oBAAsC;IAItC,qBAAuC;EFkxBvC;EKzwBQ;IHbR,iBAAsC;IAAtC,aAAsC;IAItC,cAAuC;EFsxBvC;EK7wBQ;IHbR,wBAAsC;IAAtC,oBAAsC;IAItC,qBAAuC;EF0xBvC;EKjxBQ;IHbR,wBAAsC;IAAtC,oBAAsC;IAItC,qBAAuC;EF8xBvC;EKrxBQ;IHbR,iBAAsC;IAAtC,aAAsC;IAItC,cAAuC;EFkyBvC;EKzxBQ;IHbR,wBAAsC;IAAtC,oBAAsC;IAItC,qBAAuC;EFsyBvC;EK7xBQ;IHbR,wBAAsC;IAAtC,oBAAsC;IAItC,qBAAuC;EF0yBvC;EKjyBQ;IHbR,iBAAsC;IAAtC,aAAsC;IAItC,cAAuC;EF8yBvC;EKryBQ;IHbR,wBAAsC;IAAtC,oBAAsC;IAItC,qBAAuC;EFkzBvC;EKzyBQ;IHbR,wBAAsC;IAAtC,oBAAsC;IAItC,qBAAuC;EFszBvC;EK7yBQ;IHbR,kBAAsC;IAAtC,cAAsC;IAItC,eAAuC;EF0zBvC;EK3yBI;IAAwB,kBAAS;IAAT,SAAS;EL8yBrC;EK5yBI;IAAuB,kBDmKG;ICnKH,SDmKG;EJ4oB9B;EK5yBM;IAAwB,iBADZ;IACY,QADZ;ELgzBlB;EK/yBM;IAAwB,iBADZ;IACY,QADZ;ELmzBlB;EKlzBM;IAAwB,iBADZ;IACY,QADZ;ELszBlB;EKrzBM;IAAwB,iBADZ;IACY,QADZ;ELyzBlB;EKxzBM;IAAwB,iBADZ;IACY,QADZ;EL4zBlB;EK3zBM;IAAwB,iBADZ;IACY,QADZ;EL+zBlB;EK9zBM;IAAwB,iBADZ;IACY,QADZ;ELk0BlB;EKj0BM;IAAwB,iBADZ;IACY,QADZ;ELq0BlB;EKp0BM;IAAwB,iBADZ;IACY,QADZ;ELw0BlB;EKv0BM;IAAwB,iBADZ;IACY,QADZ;EL20BlB;EK10BM;IAAwB,kBADZ;IACY,SADZ;EL80BlB;EK70BM;IAAwB,kBADZ;IACY,SADZ;ELi1BlB;EKh1BM;IAAwB,kBADZ;IACY,SADZ;ELo1BlB;EK50BU;IHhBV,cAA4B;EF+1B5B;EK/0BU;IHhBV,sBAA8C;EFk2B9C;EKl1BU;IHhBV,uBAA8C;EFq2B9C;EKr1BU;IHhBV,gBAA8C;EFw2B9C;EKx1BU;IHhBV,uBAA8C;EF22B9C;EK31BU;IHhBV,uBAA8C;EF82B9C;EK91BU;IHhBV,gBAA8C;EFi3B9C;EKj2BU;IHhBV,uBAA8C;EFo3B9C;EKp2BU;IHhBV,uBAA8C;EFu3B9C;EKv2BU;IHhBV,gBAA8C;EF03B9C;EK12BU;IHhBV,uBAA8C;EF63B9C;EK72BU;IHhBV,uBAA8C;EFg4B9C;AACF;;AM76BM;EAAwB,wBAA0B;ANi7BxD;;AMj7BM;EAAwB,0BAA0B;ANq7BxD;;AMr7BM;EAAwB,gCAA0B;ANy7BxD;;AMz7BM;EAAwB,yBAA0B;AN67BxD;;AM77BM;EAAwB,yBAA0B;ANi8BxD;;AMj8BM;EAAwB,6BAA0B;ANq8BxD;;AMr8BM;EAAwB,8BAA0B;ANy8BxD;;AMz8BM;EAAwB,+BAA0B;EAA1B,wBAA0B;AN68BxD;;AM78BM;EAAwB,sCAA0B;EAA1B,+BAA0B;ANi9BxD;;AGh6BI;EGjDE;IAAwB,wBAA0B;ENs9BtD;EMt9BI;IAAwB,0BAA0B;ENy9BtD;EMz9BI;IAAwB,gCAA0B;EN49BtD;EM59BI;IAAwB,yBAA0B;EN+9BtD;EM/9BI;IAAwB,yBAA0B;ENk+BtD;EMl+BI;IAAwB,6BAA0B;ENq+BtD;EMr+BI;IAAwB,8BAA0B;ENw+BtD;EMx+BI;IAAwB,+BAA0B;IAA1B,wBAA0B;EN2+BtD;EM3+BI;IAAwB,sCAA0B;IAA1B,+BAA0B;EN8+BtD;AACF;;AG97BI;EGjDE;IAAwB,wBAA0B;ENo/BtD;EMp/BI;IAAwB,0BAA0B;ENu/BtD;EMv/BI;IAAwB,gCAA0B;EN0/BtD;EM1/BI;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hD;;AQpsDQ;EAAgC,yBAA4B;ARwsDpE;;AQvsDQ;;EAEE,6BAAoC;AR0sD9C;;AQxsDQ;;EAEE,+BAAwC;AR2sDlD;;AQzsDQ;;EAEE,gCAA0C;AR4sDpD;;AQ1sDQ;;EAEE,8BAAsC;AR6sDhD;;AQ5tDQ;EAAgC,uBAA4B;ARguDpE;;AQ/tDQ;;EAEE,2BAAoC;ARkuD9C;;AQhuDQ;;EAEE,6BAAwC;ARmuDlD;;AQjuDQ;;EAEE,8BAA0C;ARouDpD;;AQluDQ;;EAEE,4BAAsC;ARquDhD;;AQpvDQ;EAAgC,yBAA4B;ARwvDpE;;AQvvDQ;;EAEE,6BAAoC;AR0vD9C;;AQxvDQ;;EAEE,+BAAwC;AR2vDlD;;AQzvDQ;;EAEE,gCAA0C;AR4vDpD;;AQ1vDQ;;EAEE,8BAAsC;AR6vDhD;;AQ5wDQ;EAAgC,uBAA4B;ARgxDpE;;AQ/wDQ;;EAEE,2BAAoC;ARkxD9C;;AQhxDQ;;EAEE,6BAAwC;ARmxDlD;;AQjxDQ;;EAEE,8BAA0C;ARoxDpD;;AQlxDQ;;EAEE,4BAAsC;ARqxDhD;;AQpyDQ;EAAgC,qBAA4B;ARwyDpE;;AQvyDQ;;EAEE,yBAAoC;AR0yD9C;;AQxyDQ;;EAEE,2BAAwC;AR2yDlD;;AQzyDQ;;EAEE,4BAA0C;AR4yDpD;;AQ1yDQ;;EAEE,0BAAsC;AR6yDhD;;AQ5zDQ;EAAgC,2BAA4B;ARg0DpE;;AQ/zDQ;;EAEE,+BAAoC;ARk0D9C;;AQh0DQ;;EAEE,iCAAwC;ARm0DlD;;AQj0DQ;;EAEE,kCAA0C;ARo0DpD;;AQl0DQ;;EAEE,gCAAsC;ARq0DhD;;AQp1DQ;EAAgC,0BAA4B;ARw1DpE;;AQv1DQ;;EAEE,8BAAoC;AR01D9C;;AQx1DQ;;EAEE,gCAAwC;AR21DlD;;AQz1DQ;;EAEE,iCAA0C;AR41DpD;;AQ11DQ;;EAEE,+BAAsC;AR61DhD;;AQ52DQ;EAAgC,wBAA4B;ARg3DpE;;AQ/2DQ;;EAEE,4BAAoC;ARk3D9C;;AQh3DQ;;EAEE,8BAAwC;ARm3DlD;;AQj3DQ;;EAEE,+BAA0C;ARo3DpD;;AQl3DQ;;EAEE,6BAAsC;ARq3DhD;;AQp4DQ;EAAgC,0BAA4B;ARw4DpE;;AQv4DQ;;EAEE,8BAAoC;AR04D9C;;AQx4DQ;;EAEE,gCAAwC;AR24DlD;;AQz4DQ;;EAEE,iCAA0C;AR44DpD;;AQ14DQ;;EAEE,+BAAsC;AR64DhD;;AQ55DQ;EAAgC,wBAA4B;ARg6DpE;;AQ/5DQ;;EAEE,4BAAoC;ARk6D9C;;AQh6DQ;;EAEE,8BAAwC;ARm6DlD;;AQj6DQ;;EAEE,+BAA0C;ARo6DpD;;AQl6DQ;;EAEE,6BAAsC;ARq6DhD;;AQ75DQ;EAAwB,2BAA2B;ARi6D3D;;AQh6DQ;;EAEE,+BAA+B;ARm6DzC;;AQj6DQ;;EAEE,iCAAiC;ARo6D3C;;AQl6DQ;;EAEE,kCAAkC;ARq6D5C;;AQn6DQ;;EAEE,gCAAgC;ARs6D1C;;AQr7DQ;EAAwB,0BAA2B;ARy7D3D;;AQx7DQ;;EAEE,8BAA+B;AR27DzC;;AQz7DQ;;EAEE,gCAAiC;AR47D3C;;AQ17DQ;;EAEE,iCAAkC;AR67D5C;;AQ37DQ;;EAEE,+BAAgC;AR87D1C;;AQ78DQ;EAAwB,wBAA2B;ARi9D3D;;AQh9DQ;;EAEE,4BAA+B;ARm9DzC;;AQj9DQ;;EAEE,8BAAiC;ARo9D3C;;AQl9DQ;;EAEE,+BAAkC;ARq9D5C;;AQn9DQ;;EAEE,6BAAgC;ARs9D1C;;AQr+DQ;EAAwB,0BAA2B;ARy+D3D;;AQx+DQ;;EAEE,8BAA+B;AR2+DzC;;AQz+DQ;;EAEE,gCAAiC;AR4+D3C;;AQ1+DQ;;EAEE,iCAAkC;AR6+D5C;;AQ3+DQ;;EAEE,+BAAgC;AR8+D1C;;AQ7/DQ;EAAwB,wBAA2B;ARigE3D;;AQhgEQ;;EAEE,4BAA+B;ARmgEzC;;AQjgEQ;;EAEE,8BAAiC;ARogE3C;;AQlgEQ;;EAEE,+BAAkC;ARqgE5C;;AQngEQ;;EAEE,6BAAgC;ARsgE1C;;AQhgEI;EAAmB,uBAAuB;ARogE9C;;AQngEI;;EAEE,2BAA2B;ARsgEjC;;AQpgEI;;EAEE,6BAA6B;ARugEnC;;AQrgEI;;EAEE,8BAA8B;ARwgEpC;;AQtgEI;;EAEE,4BAA4B;ARygElC;;AGlhEI;EKlDI;IAAgC,oBAA4B;ERykElE;EQxkEM;;IAEE,wBAAoC;ER0kE5C;EQxkEM;;IAEE,0BAAwC;ER0kEhD;EQxkEM;;IAEE,2BAA0C;ER0kElD;EQxkEM;;IAEE,yBAAsC;ER0kE9C;EQzlEM;IAAgC,0BAA4B;ER4lElE;EQ3lEM;;IAEE,8BAAoC;ER6lE5C;EQ3lEM;;IAEE,gCAAwC;ER6lEhD;EQ3lEM;;IAEE,iCAA0C;ER6lElD;EQ3lEM;;IAEE,+BAAsC;ER6lE9C;EQ5mEM;IAAgC,yBAA4B;ER+mElE;EQ9mEM;;IAEE,6BAAoC;ERgnE5C;EQ9mEM;;IAEE,+BAAwC;ERgnEhD;EQ9mEM;;IAEE,gCAA0C;ERgnElD;EQ9mEM;;IAEE,8BAAsC;ERgnE9C;EQ/nEM;IAAgC,uBAA4B;ERkoElE;EQjoEM;;IAEE,2BAAoC;ERmoE5C;EQjoEM;;IAEE,6BAAwC;ERmoEhD;EQjoEM;;IAEE,8BAA0C;ERmoElD;EQjoEM;;IAEE,4BAAsC;ERmoE9C;EQlpEM;IAAgC,yBAA4B;ERqpElE;EQppEM;;IAEE,6BAAoC;ERspE5C;EQppEM;;IAEE,+BAAwC;ERspEhD;EQppEM;;IAEE,gCAA0C;ERspElD;EQppEM;;IAEE,8BAAsC;ERspE9C;EQrqEM;IAAgC,uBAA4B;ERwqElE;EQvqEM;;IAEE,2BAAoC;ERyqE5C;EQvqEM;;IAEE,6BAAwC;ERyqEhD;EQvqEM;;IAEE,8BAA0C;ERyqElD;EQvqEM;;IAEE,4BAAsC;ERyqE9C;EQxrEM;IAAgC,qBAA4B;ER2rElE;EQ1rEM;;IAEE,yBAAoC;ER4rE5C;EQ1rEM;;IAEE,2BAAwC;ER4rEhD;EQ1rEM;;IAEE,4BAA0C;ER4rElD;EQ1rEM;;IAEE,0BAAsC;ER4rE9C;EQ3sEM;IAAgC,2BAA4B;ER8sElE;EQ7sEM;;IAEE,+BAAoC;ER+sE5C;EQ7sEM;;IAEE,iCAAwC;ER+sEhD;EQ7sEM;;IAEE,kCAA0C;ER+sElD;EQ7sEM;;IAEE,gCAAsC;ER+sE9C;EQ9tEM;IAAgC,0BAA4B;ERiuElE;EQhuEM;;IAEE,8BAAoC;ERkuE5C;EQhuEM;;IAEE,gCAAwC;ERkuEhD;EQhuEM;;IAEE,iCAA0C;ERkuElD;EQhuEM;;IAEE,+BAAsC;ERkuE9C;EQjvEM;IAAgC,wBAA4B;ERovElE;EQnvEM;;IAEE,4BAAoC;ERqvE5C;EQnvEM;;IAEE,8BAAwC;ERqvEhD;EQnvEM;;IAEE,+BAA0C;ERqvElD;EQnvEM;;IAEE,6BAAsC;ERqvE9C;EQpwEM;IAAgC,0BAA4B;ERuwElE;EQtwEM;;IAEE,8BAAoC;ERwwE5C;EQtwEM;;IAEE,gCAAwC;ERwwEhD;EQtwEM;;IAEE,iCAA0C;ERwwElD;EQtwEM;;IAEE,+BAAsC;ERwwE9C;EQvxEM;IAAgC,wBAA4B;ER0xElE;EQzxEM;;IAEE,4BAAoC;ER2xE5C;EQzxEM;;IAEE,8BAAwC;ER2xEhD;EQzxEM;;IAEE,+BAA0C;ER2xElD;EQzxEM;;IAEE,6BAAsC;ER2xE9C;EQnxEM;IAAwB,2BAA2B;ERsxEzD;EQrxEM;;IAEE,+BAA+B;ERuxEvC;EQrxEM;;IAEE,iCAAiC;ERuxEzC;EQrxEM;;IAEE,kCAAkC;ERuxE1C;EQrxEM;;IAEE,gCAAgC;ERuxExC;EQtyEM;IAAwB,0BAA2B;ERyyEzD;EQxyEM;;IAEE,8BAA+B;ER0yEvC;EQxyEM;;IAEE,gCAAiC;ER0yEzC;EQxyEM;;IAEE,iCAAkC;ER0yE1C;EQxyEM;;IAEE,+BAAgC;ER0yExC;EQzzEM;IAAwB,wBAA2B;ER4zEzD;EQ3zEM;;IAEE,4BAA+B;ER6zEvC;EQ3zEM;;IAEE,8BAAiC;ER6zEzC;EQ3zEM;;IAEE,+BAAkC;ER6zE1C;EQ3zEM;;IAEE,6BAAgC;ER6zExC;EQ50EM;IAAwB,0BAA2B;ER+0EzD;EQ90EM;;IAEE,8BAA+B;ERg1EvC;EQ90EM;;IAEE,gCAAiC;ERg1EzC;EQ90EM;;IAEE,iCAAkC;ERg1E1C;EQ90EM;;IAEE,+BAAgC;ERg1ExC;EQ/1EM;IAAwB,wBAA2B;ERk2EzD;EQj2EM;;IAEE,4BAA+B;ERm2EvC;EQj2EM;;IAEE,8BAAiC;ERm2EzC;EQj2EM;;IAEE,+BAAkC;ERm2E1C;EQj2EM;;IAEE,6BAAgC;ERm2ExC;EQ71EE;IAAmB,uBAAuB;ERg2E5C;EQ/1EE;;IAEE,2BAA2B;ERi2E/B;EQ/1EE;;IAEE,6BAA6B;ERi2EjC;EQ/1EE;;IAEE,8BAA8B;ERi2ElC;EQ/1EE;;IAEE,4BAA4B;ERi2EhC;AACF;;AG32EI;EKlDI;IAAgC,oBAA4B;ERk6ElE;EQj6EM;;IAEE,wBAAoC;ERm6E5C;EQj6EM;;IAEE,0BAAwC;ERm6EhD;EQj6EM;;IAEE,2BAA0C;ERm6ElD;EQj6EM;;IAEE,yBAAsC;ERm6E9C;EQl7EM;IAAgC,0BAA4B;ERq7ElE;EQp7EM;;IAEE,8BAAoC;ERs7E5C;EQp7EM;;IAEE,gCAAwC;ERs7EhD;EQp7EM;;IAEE,iCAA0C;ERs7ElD;EQp7EM;;IAEE,+BAAsC;ERs7E9C;EQr8EM;IAAgC,yBAA4B;ERw8ElE;EQv8EM;;IAEE,6BAAoC;ERy8E5C;EQv8EM;;IAEE,+BAAwC;ERy8EhD;EQv8EM;;IAEE,gCAA0C;ERy8ElD;EQv8EM;;IAEE,8BAAsC;ERy8E9C;EQx9EM;IAAgC,uBAA4B;ER29ElE;EQ19EM;;IAEE,2BAAoC;ER49E5C;EQ19EM;;IAEE,6BAAwC;ER49EhD;EQ19EM;;IAEE,8BAA0C;ER49ElD;EQ19EM;;IAEE,4BAAsC;ER49E9C;EQ3+EM;IAAgC,yBAA4B;ER8+ElE;EQ7+EM;;IAEE,6BAAoC;ER++E5C;EQ7+EM;;IAEE,+BAAwC;ER++EhD;EQ7+EM;;IAEE,gCAA0C;ER++ElD;EQ7+EM;;IAEE,8BAAsC;ER++E9C;EQ9/EM;IAAgC,uBAA4B;ERigFlE;EQhgFM;;IAEE,2BAAoC;ERkgF5C;EQhgFM;;IAEE,6BAAwC;ERkgFhD;EQhgFM;;IAEE,8BAA0C;ERkgFlD;EQhgFM;;IAEE,4BAAsC;ERkgF9C;EQjhFM;IAAgC,qBAA4B;ERohFlE;EQnhFM;;IAEE,yBAAoC;ERqhF5C;EQnhFM;;IAEE,2BAAwC;ERqhFhD;EQnhFM;;IAEE,4BAA0C;ERqhFlD;EQnhFM;;IAEE,0BAAsC;ERqhF9C;EQpiFM;IAAgC,2BAA4B;ERuiFlE;EQtiFM;;IAEE,+BAAoC;ERwiF5C;EQtiFM;;IAEE,iCAAwC;ERwiFhD;EQtiFM;;IAEE,kCAA0C;ERwiFlD;EQtiFM;;IAEE,gCAAsC;ERwiF9C;EQvjFM;IAAgC,0BAA4B;ER0jFlE;EQzjFM;;IAEE,8BAAoC;ER2jF5C;EQzjFM;;IAEE,gCAAwC;ER2jFhD;EQzjFM;;IAEE,iCAA0C;ER2jFlD;EQzjFM;;IAEE,+BAAsC;ER2jF9C;EQ1kFM;IAAgC,wBAA4B;ER6kFlE;EQ5kFM;;IAEE,4BAAoC;ER8kF5C;EQ5kFM;;IAEE,8BAAwC;ER8kFhD;EQ5kFM;;IAEE,+BAA0C;ER8kFlD;EQ5kFM;;IAEE,6BAAsC;ER8kF9C;EQ7lFM;IAAgC,0BAA4B;ERgmFlE;EQ/lFM;;IAEE,8BAAoC;ERimF5C;EQ/lFM;;IAEE,gCAAwC;ERimFhD;EQ/lFM;;IAEE,iCAA0C;ERimFlD;EQ/lFM;;IAEE,+BAAsC;ERimF9C;EQhnFM;IAAgC,wBAA4B;ERmnFlE;EQlnFM;;IAEE,4BAAoC;ERonF5C;EQlnFM;;IAEE,8BAAwC;ERonFhD;EQlnFM;;IAEE,+BAA0C;ERonFlD;EQlnFM;;IAEE,6BAAsC;ERonF9C;EQ5mFM;IAAwB,2BAA2B;ER+mFzD;EQ9mFM;;IAEE,+BAA+B;ERgnFvC;EQ9mFM;;IAEE,iCAAiC;ERgnFzC;EQ9mFM;;IAEE,kCAAkC;ERgnF1C;EQ9mFM;;IAEE,gCAAgC;ERgnFxC;EQ/nFM;IAAwB,0BAA2B;ERkoFzD;EQjoFM;;IAEE,8BAA+B;ERmoFvC;EQjoFM;;IAEE,gCAAiC;ERmoFzC;EQjoFM;;IAEE,iCAAkC;ERmoF1C;EQjoFM;;IAEE,+BAAgC;ERmoFxC;EQlpFM;IAAwB,wBAA2B;ERqpFzD;EQppFM;;IAEE,4BAA+B;ERspFvC;EQppFM;;IAEE,8BAAiC;ERspFzC;EQppFM;;IAEE,+BAAkC;ERspF1C;EQppFM;;IAEE,6BAAgC;ERspFxC;EQrqFM;IAAwB,0BAA2B;ERwqFzD;EQvqFM;;IAEE,8BAA+B;ERyqFvC;EQvqFM;;IAEE,gCAAiC;ERyqFzC;EQvqFM;;IAEE,iCAAkC;ERyqF1C;EQvqFM;;IAEE,+BAAgC;ERyqFxC;EQxrFM;IAAwB,wBAA2B;ER2rFzD;EQ1rFM;;IAEE,4BAA+B;ER4rFvC;EQ1rFM;;IAEE,8BAAiC;ER4rFzC;EQ1rFM;;IAEE,+BAAkC;ER4rF1C;EQ1rFM;;IAEE,6BAAgC;ER4rFxC;EQtrFE;IAAmB,uBAAuB;ERyrF5C;EQxrFE;;IAEE,2BAA2B;ER0rF/B;EQxrFE;;IAEE,6BAA6B;ER0rFjC;EQxrFE;;IAEE,8BAA8B;ER0rFlC;EQxrFE;;IAEE,4BAA4B;ER0rFhC;AACF;;AGpsFI;EKlDI;IAAgC,oBAA4B;ER2vFlE;EQ1vFM;;IAEE,wBAAoC;ER4vF5C;EQ1vFM;;IAEE,0BAAwC;ER4vFhD;EQ1vFM;;IAEE,2BAA0C;ER4vFlD;EQ1vFM;;IAEE,yBAAsC;ER4vF9C;EQ3wFM;IAAgC,0BAA4B;ER8wFlE;EQ7wFM;;IAEE,8BAAoC;ER+wF5C;EQ7wFM;;IAEE,gCAAwC;ER+wFhD;EQ7wFM;;IAEE,iCAA0C;ER+wFlD;EQ7wFM;;IAEE,+BAAsC;ER+wF9C;EQ9xFM;IAAgC,yBAA4B;ERiyFlE;EQhyFM;;IAEE,6BAAoC;ERkyF5C;EQhyFM;;IAEE,+BAAwC;ERkyFhD;EQhyFM;;IAEE,gCAA0C;ERkyFlD;EQhyFM;;IAEE,8BAAsC;ERkyF9C;EQjzFM;IAAgC,uBAA4B;ERozFlE;EQnzFM;;IAEE,2BAAoC;ERqzF5C;EQnzFM;;IAEE,6BAAwC;ERqzFhD;EQnzFM;;IAEE,8BAA0C;ERqzFlD;EQnzFM;;IAEE,4BAAsC;ERqzF9C;EQp0FM;IAAgC,yBAA4B;ERu0FlE;EQt0FM;;IAEE,6BAAoC;ERw0F5C;EQt0FM;;IAEE,+BAAwC;ERw0FhD;EQt0FM;;IAEE,gCAA0C;ERw0FlD;EQt0FM;;IAEE,8BAAsC;ERw0F9C;EQv1FM;IAAgC,uBAA4B;ER01FlE;EQz1FM;;IAEE,2BAAoC;ER21F5C;EQz1FM;;IAEE,6BAAwC;ER21FhD;EQz1FM;;IAEE,8BAA0C;ER21FlD;EQz1FM;;IAEE,4BAAsC;ER21F9C;EQ12FM;IAAgC,qBAA4B;ER62FlE;EQ52FM;;IAEE,yBAAoC;ER82F5C;EQ52FM;;IAEE,2BAAwC;ER82FhD;EQ52FM;;IAEE,4BAA0C;ER82FlD;EQ52FM;;IAEE,0BAAsC;ER82F9C;EQ73FM;IAAgC,2BAA4B;ERg4FlE;EQ/3FM;;IAEE,+BAAoC;ERi4F5C;EQ/3FM;;IAEE,iCAAwC;ERi4FhD;EQ/3FM;;IAEE,kCAA0C;ERi4FlD;EQ/3FM;;IAEE,gCAAsC;ERi4F9C;EQh5FM;IAAgC,0BAA4B;ERm5FlE;EQl5FM;;IAEE,8BAAoC;ERo5F5C;EQl5FM;;IAEE,gCAAwC;ERo5FhD;EQl5FM;;IAEE,iCAA0C;ERo5FlD;EQl5FM;;IAEE,+BAAsC;ERo5F9C;EQn6FM;IAAgC,wBAA4B;ERs6FlE;EQr6FM;;IAEE,4BAAoC;ERu6F5C;EQr6FM;;IAEE,8BAAwC;ERu6FhD;EQr6FM;;IAEE,+BAA0C;ERu6FlD;EQr6FM;;IAEE,6BAAsC;ERu6F9C;EQt7FM;IAAgC,0BAA4B;ERy7FlE;EQx7FM;;IAEE,8BAAoC;ER07F5C;EQx7FM;;IAEE,gCAAwC;ER07FhD;EQx7FM;;IAEE,iCAA0C;ER07FlD;EQx7FM;;IAEE,+BAAsC;ER07F9C;EQz8FM;IAAgC,wBAA4B;ER48FlE;EQ38FM;;IAEE,4BAAoC;ER68F5C;EQ38FM;;IAEE,8BAAwC;ER68FhD;EQ38FM;;IAEE,+BAA0C;ER68FlD;EQ38FM;;IAEE,6BAAsC;ER68F9C;EQr8FM;IAAwB,2BAA2B;ERw8FzD;EQv8FM;;IAEE,+BAA+B;ERy8FvC;EQv8FM;;IAEE,iCAAiC;ERy8FzC;EQv8FM;;IAEE,kCAAkC;ERy8F1C;EQv8FM;;IAEE,gCAAgC;ERy8FxC;EQx9FM;IAAwB,0BAA2B;ER29FzD;EQ19FM;;IAEE,8BAA+B;ER49FvC;EQ19FM;;IAEE,gCAAiC;ER49FzC;EQ19FM;;IAEE,iCAAkC;ER49F1C;EQ19FM;;IAEE,+BAAgC;ER49FxC;EQ3+FM;IAAwB,wBAA2B;ER8+FzD;EQ7+FM;;IAEE,4BAA+B;ER++FvC;EQ7+FM;;IAEE,8BAAiC;ER++FzC;EQ7+FM;;IAEE,+BAAkC;ER++F1C;EQ7+FM;;IAEE,6BAAgC;ER++FxC;EQ9/FM;IAAwB,0BAA2B;ERigGzD;EQhgGM;;IAEE,8BAA+B;ERkgGvC;EQhgGM;;IAEE,gCAAiC;ERkgGzC;EQhgGM;;IAEE,iCAAkC;ERkgG1C;EQhgGM;;IAEE,+BAAgC;ERkgGxC;EQjhGM;IAAwB,wBAA2B;ERohGzD;EQnhGM;;IAEE,4BAA+B;ERqhGvC;EQnhGM;;IAEE,8BAAiC;ERqhGzC;EQnhGM;;IAEE,+BAAkC;ERqhG1C;EQnhGM;;IAEE,6BAAgC;ERqhGxC;EQ/gGE;IAAmB,uBAAuB;ERkhG5C;EQjhGE;;IAEE,2BAA2B;ERmhG/B;EQjhGE;;IAEE,6BAA6B;ERmhGjC;EQjhGE;;IAEE,8BAA8B;ERmhGlC;EQjhGE;;IAEE,4BAA4B;ERmhGhC;AACF;;AG7hGI;EKlDI;IAAgC,oBAA4B;ERolGlE;EQnlGM;;IAEE,wBAAoC;ERqlG5C;EQnlGM;;IAEE,0BAAwC;ERqlGhD;EQnlGM;;IAEE,2BAA0C;ERqlGlD;EQnlGM;;IAEE,yBAAsC;ERqlG9C;EQpmGM;IAAgC,0BAA4B;ERumGlE;EQtmGM;;IAEE,8BAAoC;ERwmG5C;EQtmGM;;IAEE,gCAAwC;ERwmGhD;EQtmGM;;IAEE,iCAA0C;ERwmGlD;EQtmGM;;IAEE,+BAAsC;ERwmG9C;EQvnGM;IAAgC,yBAA4B;ER0nGlE;EQznGM;;IAEE,6BAAoC;ER2nG5C;EQznGM;;IAEE,+BAAwC;ER2nGhD;EQznGM;;IAEE,gCAA0C;ER2nGlD;EQznGM;;IAEE,8BAAsC;ER2nG9C;EQ1oGM;IAAgC,uBAA4B;ER6oGlE;EQ5oGM;;IAEE,2BAAoC;ER8oG5C;EQ5oGM;;IAEE,6BAAwC;ER8oGhD;EQ5oGM;;IAEE,8BAA0C;ER8oGlD;EQ5oGM;;IAEE,4BAAsC;ER8oG9C;EQ7pGM;IAAgC,yBAA4B;ERgqGlE;EQ/pGM;;IAEE,6BAAoC;ERiqG5C;EQ/pGM;;IAEE,+BAAwC;ERiqGhD;EQ/pGM;;IAEE,gCAA0C;ERiqGlD;EQ/pGM;;IAEE,8BAAsC;ERiqG9C;EQhrGM;IAAgC,uBAA4B;ERmrGlE;EQlrGM;;IAEE,2BAAoC;ERorG5C;EQlrGM;;IAEE,6BAAwC;ERorGhD;EQlrGM;;IAEE,8BAA0C;ERorGlD;EQlrGM;;IAEE,4BAAsC;ERorG9C;EQnsGM;IAAgC,qBAA4B;ERssGlE;EQrsGM;;IAEE,yBAAoC;ERusG5C;EQrsGM;;IAEE,2BAAwC;ERusGhD;EQrsGM;;IAEE,4BAA0C;ERusGlD;EQrsGM;;IAEE,0BAAsC;ERusG9C;EQttGM;IAAgC,2BAA4B;ERytGlE;EQxtGM;;IAEE,+BAAoC;ER0tG5C;EQxtGM;;IAEE,iCAAwC;ER0tGhD;EQxtGM;;IAEE,kCAA0C;ER0tGlD;EQxtGM;;IAEE,gCAAsC;ER0tG9C;EQzuGM;IAAgC,0BAA4B;ER4uGlE;EQ3uGM;;IAEE,8BAAoC;ER6uG5C;EQ3uGM;;IAEE,gCAAwC;ER6uGhD;EQ3uGM;;IAEE,iCAA0C;ER6uGlD;EQ3uGM;;IAEE,+BAAsC;ER6uG9C;EQ5vGM;IAAgC,wBAA4B;ER+vGlE;EQ9vGM;;IAEE,4BAAoC;ERgwG5C;EQ9vGM;;IAEE,8BAAwC;ERgwGhD;EQ9vGM;;IAEE,+BAA0C;ERgwGlD;EQ9vGM;;IAEE,6BAAsC;ERgwG9C;EQ/wGM;IAAgC,0BAA4B;ERkxGlE;EQjxGM;;IAEE,8BAAoC;ERmxG5C;EQjxGM;;IAEE,gCAAwC;ERmxGhD;EQjxGM;;IAEE,iCAA0C;ERmxGlD;EQjxGM;;IAEE,+BAAsC;ERmxG9C;EQlyGM;IAAgC,wBAA4B;ERqyGlE;EQpyGM;;IAEE,4BAAoC;ERsyG5C;EQpyGM;;IAEE,8BAAwC;ERsyGhD;EQpyGM;;IAEE,+BAA0C;ERsyGlD;EQpyGM;;IAEE,6BAAsC;ERsyG9C;EQ9xGM;IAAwB,2BAA2B;ERiyGzD;EQhyGM;;IAEE,+BAA+B;ERkyGvC;EQhyGM;;IAEE,iCAAiC;ERkyGzC;EQhyGM;;IAEE,kCAAkC;ERkyG1C;EQhyGM;;IAEE,gCAAgC;ERkyGxC;EQjzGM;IAAwB,0BAA2B;ERozGzD;EQnzGM;;IAEE,8BAA+B;ERqzGvC;EQnzGM;;IAEE,gCAAiC;ERqzGzC;EQnzGM;;IAEE,iCAAkC;ERqzG1C;EQnzGM;;IAEE,+BAAgC;ERqzGxC;EQp0GM;IAAwB,wBAA2B;ERu0GzD;EQt0GM;;IAEE,4BAA+B;ERw0GvC;EQt0GM;;IAEE,8BAAiC;ERw0GzC;EQt0GM;;IAEE,+BAAkC;ERw0G1C;EQt0GM;;IAEE,6BAAgC;ERw0GxC;EQv1GM;IAAwB,0BAA2B;ER01GzD;EQz1GM;;IAEE,8BAA+B;ER21GvC;EQz1GM;;IAEE,gCAAiC;ER21GzC;EQz1GM;;IAEE,iCAAkC;ER21G1C;EQz1GM;;IAEE,+BAAgC;ER21GxC;EQ12GM;IAAwB,wBAA2B;ER62GzD;EQ52GM;;IAEE,4BAA+B;ER82GvC;EQ52GM;;IAEE,8BAAiC;ER82GzC;EQ52GM;;IAEE,+BAAkC;ER82G1C;EQ52GM;;IAEE,6BAAgC;ER82GxC;EQx2GE;IAAmB,uBAAuB;ER22G5C;EQ12GE;;IAEE,2BAA2B;ER42G/B;EQ12GE;;IAEE,6BAA6B;ER42GjC;EQ12GE;;IAEE,8BAA8B;ER42GlC;EQ12GE;;IAEE,4BAA4B;ER42GhC;AACF","file":"bootstrap-grid.css","sourcesContent":["/*!\n * Bootstrap Grid v4.5.3 (https://getbootstrap.com/)\n * Copyright 2011-2020 The Bootstrap Authors\n * Copyright 2011-2020 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n\nhtml {\n box-sizing: border-box;\n -ms-overflow-style: scrollbar;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit;\n}\n\n@import \"functions\";\n@import \"variables\";\n\n@import \"mixins/breakpoints\";\n@import \"mixins/grid-framework\";\n@import \"mixins/grid\";\n\n@import \"grid\";\n@import \"utilities/display\";\n@import \"utilities/flex\";\n@import \"utilities/spacing\";\n","/*!\n * Bootstrap Grid v4.5.3 (https://getbootstrap.com/)\n * Copyright 2011-2020 The Bootstrap Authors\n * Copyright 2011-2020 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\nhtml {\n box-sizing: border-box;\n -ms-overflow-style: scrollbar;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit;\n}\n\n.container,\n.container-fluid,\n.container-sm,\n.container-md,\n.container-lg,\n.container-xl {\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 576px) {\n .container, .container-sm {\n max-width: 540px;\n }\n}\n\n@media (min-width: 768px) {\n .container, .container-sm, .container-md {\n max-width: 720px;\n }\n}\n\n@media (min-width: 992px) {\n .container, .container-sm, .container-md, .container-lg {\n max-width: 960px;\n }\n}\n\n@media (min-width: 1200px) {\n .container, .container-sm, .container-md, .container-lg, .container-xl {\n max-width: 1140px;\n }\n}\n\n.row {\n display: flex;\n flex-wrap: wrap;\n margin-right: -15px;\n margin-left: -15px;\n}\n\n.no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .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, .col-sm,\n.col-sm-auto, .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, .col-md,\n.col-md-auto, .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, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto {\n position: relative;\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n}\n\n.col {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n}\n\n.row-cols-1 > * {\n flex: 0 0 100%;\n max-width: 100%;\n}\n\n.row-cols-2 > * {\n flex: 0 0 50%;\n max-width: 50%;\n}\n\n.row-cols-3 > * {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n}\n\n.row-cols-4 > * {\n flex: 0 0 25%;\n max-width: 25%;\n}\n\n.row-cols-5 > * {\n flex: 0 0 20%;\n max-width: 20%;\n}\n\n.row-cols-6 > * {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n}\n\n.col-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n}\n\n.col-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n}\n\n.col-3 {\n flex: 0 0 25%;\n max-width: 25%;\n}\n\n.col-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n}\n\n.col-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n}\n\n.col-6 {\n flex: 0 0 50%;\n max-width: 50%;\n}\n\n.col-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n}\n\n.col-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n}\n\n.col-9 {\n flex: 0 0 75%;\n max-width: 75%;\n}\n\n.col-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n}\n\n.col-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n}\n\n.col-12 {\n flex: 0 0 100%;\n max-width: 100%;\n}\n\n.order-first {\n order: -1;\n}\n\n.order-last {\n order: 13;\n}\n\n.order-0 {\n order: 0;\n}\n\n.order-1 {\n order: 1;\n}\n\n.order-2 {\n order: 2;\n}\n\n.order-3 {\n order: 3;\n}\n\n.order-4 {\n order: 4;\n}\n\n.order-5 {\n order: 5;\n}\n\n.order-6 {\n order: 6;\n}\n\n.order-7 {\n order: 7;\n}\n\n.order-8 {\n order: 8;\n}\n\n.order-9 {\n order: 9;\n}\n\n.order-10 {\n order: 10;\n}\n\n.order-11 {\n order: 11;\n}\n\n.order-12 {\n order: 12;\n}\n\n.offset-1 {\n margin-left: 8.333333%;\n}\n\n.offset-2 {\n margin-left: 16.666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.333333%;\n}\n\n.offset-5 {\n margin-left: 41.666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.333333%;\n}\n\n.offset-8 {\n margin-left: 66.666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.333333%;\n}\n\n.offset-11 {\n margin-left: 91.666667%;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .row-cols-sm-1 > * {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .row-cols-sm-2 > * {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .row-cols-sm-3 > * {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .row-cols-sm-4 > * {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .row-cols-sm-5 > * {\n flex: 0 0 20%;\n max-width: 20%;\n }\n .row-cols-sm-6 > * {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-sm-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-sm-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-sm-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-sm-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-sm-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-sm-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-sm-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-sm-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-sm-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-sm-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-sm-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-sm-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-sm-first {\n order: -1;\n }\n .order-sm-last {\n order: 13;\n }\n .order-sm-0 {\n order: 0;\n }\n .order-sm-1 {\n order: 1;\n }\n .order-sm-2 {\n order: 2;\n }\n .order-sm-3 {\n order: 3;\n }\n .order-sm-4 {\n order: 4;\n }\n .order-sm-5 {\n order: 5;\n }\n .order-sm-6 {\n order: 6;\n }\n .order-sm-7 {\n order: 7;\n }\n .order-sm-8 {\n order: 8;\n }\n .order-sm-9 {\n order: 9;\n }\n .order-sm-10 {\n order: 10;\n }\n .order-sm-11 {\n order: 11;\n }\n .order-sm-12 {\n order: 12;\n }\n .offset-sm-0 {\n margin-left: 0;\n }\n .offset-sm-1 {\n margin-left: 8.333333%;\n }\n .offset-sm-2 {\n margin-left: 16.666667%;\n }\n .offset-sm-3 {\n margin-left: 25%;\n }\n .offset-sm-4 {\n margin-left: 33.333333%;\n }\n .offset-sm-5 {\n margin-left: 41.666667%;\n }\n .offset-sm-6 {\n margin-left: 50%;\n }\n .offset-sm-7 {\n margin-left: 58.333333%;\n }\n .offset-sm-8 {\n margin-left: 66.666667%;\n }\n .offset-sm-9 {\n margin-left: 75%;\n }\n .offset-sm-10 {\n margin-left: 83.333333%;\n }\n .offset-sm-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 768px) {\n .col-md {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .row-cols-md-1 > * {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .row-cols-md-2 > * {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .row-cols-md-3 > * {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .row-cols-md-4 > * {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .row-cols-md-5 > * {\n flex: 0 0 20%;\n max-width: 20%;\n }\n .row-cols-md-6 > * {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-md-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-md-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-md-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-md-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-md-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-md-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-md-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-md-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-md-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-md-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-md-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-md-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-md-first {\n order: -1;\n }\n .order-md-last {\n order: 13;\n }\n .order-md-0 {\n order: 0;\n }\n .order-md-1 {\n order: 1;\n }\n .order-md-2 {\n order: 2;\n }\n .order-md-3 {\n order: 3;\n }\n .order-md-4 {\n order: 4;\n }\n .order-md-5 {\n order: 5;\n }\n .order-md-6 {\n order: 6;\n }\n .order-md-7 {\n order: 7;\n }\n .order-md-8 {\n order: 8;\n }\n .order-md-9 {\n order: 9;\n }\n .order-md-10 {\n order: 10;\n }\n .order-md-11 {\n order: 11;\n }\n .order-md-12 {\n order: 12;\n }\n .offset-md-0 {\n margin-left: 0;\n }\n .offset-md-1 {\n margin-left: 8.333333%;\n }\n .offset-md-2 {\n margin-left: 16.666667%;\n }\n .offset-md-3 {\n margin-left: 25%;\n }\n .offset-md-4 {\n margin-left: 33.333333%;\n }\n .offset-md-5 {\n margin-left: 41.666667%;\n }\n .offset-md-6 {\n margin-left: 50%;\n }\n .offset-md-7 {\n margin-left: 58.333333%;\n }\n .offset-md-8 {\n margin-left: 66.666667%;\n }\n .offset-md-9 {\n margin-left: 75%;\n }\n .offset-md-10 {\n margin-left: 83.333333%;\n }\n .offset-md-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 992px) {\n .col-lg {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .row-cols-lg-1 > * {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .row-cols-lg-2 > * {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .row-cols-lg-3 > * {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .row-cols-lg-4 > * {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .row-cols-lg-5 > * {\n flex: 0 0 20%;\n max-width: 20%;\n }\n .row-cols-lg-6 > * {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-lg-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-lg-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-lg-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-lg-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-lg-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-lg-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-lg-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-lg-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-lg-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-lg-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-lg-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-lg-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-lg-first {\n order: -1;\n }\n .order-lg-last {\n order: 13;\n }\n .order-lg-0 {\n order: 0;\n }\n .order-lg-1 {\n order: 1;\n }\n .order-lg-2 {\n order: 2;\n }\n .order-lg-3 {\n order: 3;\n }\n .order-lg-4 {\n order: 4;\n }\n .order-lg-5 {\n order: 5;\n }\n .order-lg-6 {\n order: 6;\n }\n .order-lg-7 {\n order: 7;\n }\n .order-lg-8 {\n order: 8;\n }\n .order-lg-9 {\n order: 9;\n }\n .order-lg-10 {\n order: 10;\n }\n .order-lg-11 {\n order: 11;\n }\n .order-lg-12 {\n order: 12;\n }\n .offset-lg-0 {\n margin-left: 0;\n }\n .offset-lg-1 {\n margin-left: 8.333333%;\n }\n .offset-lg-2 {\n margin-left: 16.666667%;\n }\n .offset-lg-3 {\n margin-left: 25%;\n }\n .offset-lg-4 {\n margin-left: 33.333333%;\n }\n .offset-lg-5 {\n margin-left: 41.666667%;\n }\n .offset-lg-6 {\n margin-left: 50%;\n }\n .offset-lg-7 {\n margin-left: 58.333333%;\n }\n .offset-lg-8 {\n margin-left: 66.666667%;\n }\n .offset-lg-9 {\n margin-left: 75%;\n }\n .offset-lg-10 {\n margin-left: 83.333333%;\n }\n .offset-lg-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 1200px) {\n .col-xl {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .row-cols-xl-1 > * {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .row-cols-xl-2 > * {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .row-cols-xl-3 > * {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .row-cols-xl-4 > * {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .row-cols-xl-5 > * {\n flex: 0 0 20%;\n max-width: 20%;\n }\n .row-cols-xl-6 > * {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-xl-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-xl-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xl-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-xl-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-xl-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-xl-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-xl-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-xl-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-xl-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-xl-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-xl-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-xl-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-xl-first {\n order: -1;\n }\n .order-xl-last {\n order: 13;\n }\n .order-xl-0 {\n order: 0;\n }\n .order-xl-1 {\n order: 1;\n }\n .order-xl-2 {\n order: 2;\n }\n .order-xl-3 {\n order: 3;\n }\n .order-xl-4 {\n order: 4;\n }\n .order-xl-5 {\n order: 5;\n }\n .order-xl-6 {\n order: 6;\n }\n .order-xl-7 {\n order: 7;\n }\n .order-xl-8 {\n order: 8;\n }\n .order-xl-9 {\n order: 9;\n }\n .order-xl-10 {\n order: 10;\n }\n .order-xl-11 {\n order: 11;\n }\n .order-xl-12 {\n order: 12;\n }\n .offset-xl-0 {\n margin-left: 0;\n }\n .offset-xl-1 {\n margin-left: 8.333333%;\n }\n .offset-xl-2 {\n margin-left: 16.666667%;\n }\n .offset-xl-3 {\n margin-left: 25%;\n }\n .offset-xl-4 {\n margin-left: 33.333333%;\n }\n .offset-xl-5 {\n margin-left: 41.666667%;\n }\n .offset-xl-6 {\n margin-left: 50%;\n }\n .offset-xl-7 {\n margin-left: 58.333333%;\n }\n .offset-xl-8 {\n margin-left: 66.666667%;\n }\n .offset-xl-9 {\n margin-left: 75%;\n }\n .offset-xl-10 {\n margin-left: 83.333333%;\n }\n .offset-xl-11 {\n margin-left: 91.666667%;\n }\n}\n\n.d-none {\n display: none !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline-flex {\n display: inline-flex !important;\n}\n\n@media (min-width: 576px) {\n .d-sm-none {\n display: none !important;\n }\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 768px) {\n .d-md-none {\n display: none !important;\n }\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: flex !important;\n }\n .d-md-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 992px) {\n .d-lg-none {\n display: none !important;\n }\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 1200px) {\n .d-xl-none {\n display: none !important;\n }\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media print {\n .d-print-none {\n display: none !important;\n }\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: flex !important;\n }\n .d-print-inline-flex {\n display: inline-flex !important;\n }\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.flex-fill {\n flex: 1 1 auto !important;\n}\n\n.flex-grow-0 {\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n flex-shrink: 1 !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n@media (min-width: 576px) {\n .flex-sm-row {\n flex-direction: row !important;\n }\n .flex-sm-column {\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-sm-fill {\n flex: 1 1 auto !important;\n }\n .flex-sm-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n justify-content: center !important;\n }\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n align-items: center !important;\n }\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n align-content: center !important;\n }\n .align-content-sm-between {\n align-content: space-between !important;\n }\n .align-content-sm-around {\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n align-self: auto !important;\n }\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n align-self: center !important;\n }\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 768px) {\n .flex-md-row {\n flex-direction: row !important;\n }\n .flex-md-column {\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-md-fill {\n flex: 1 1 auto !important;\n }\n .flex-md-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n justify-content: center !important;\n }\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n .align-items-md-start {\n align-items: flex-start !important;\n }\n .align-items-md-end {\n align-items: flex-end !important;\n }\n .align-items-md-center {\n align-items: center !important;\n }\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n .align-content-md-start {\n align-content: flex-start !important;\n }\n .align-content-md-end {\n align-content: flex-end !important;\n }\n .align-content-md-center {\n align-content: center !important;\n }\n .align-content-md-between {\n align-content: space-between !important;\n }\n .align-content-md-around {\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n .align-self-md-auto {\n align-self: auto !important;\n }\n .align-self-md-start {\n align-self: flex-start !important;\n }\n .align-self-md-end {\n align-self: flex-end !important;\n }\n .align-self-md-center {\n align-self: center !important;\n }\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 992px) {\n .flex-lg-row {\n flex-direction: row !important;\n }\n .flex-lg-column {\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-lg-fill {\n flex: 1 1 auto !important;\n }\n .flex-lg-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n justify-content: center !important;\n }\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n align-items: center !important;\n }\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n align-content: center !important;\n }\n .align-content-lg-between {\n align-content: space-between !important;\n }\n .align-content-lg-around {\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n align-self: auto !important;\n }\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n align-self: center !important;\n }\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1200px) {\n .flex-xl-row {\n flex-direction: row !important;\n }\n .flex-xl-column {\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .flex-xl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n justify-content: center !important;\n }\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n align-items: center !important;\n }\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n align-content: center !important;\n }\n .align-content-xl-between {\n align-content: space-between !important;\n }\n .align-content-xl-around {\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n align-self: auto !important;\n }\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n align-self: center !important;\n }\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.mt-0,\n.my-0 {\n margin-top: 0 !important;\n}\n\n.mr-0,\n.mx-0 {\n margin-right: 0 !important;\n}\n\n.mb-0,\n.my-0 {\n margin-bottom: 0 !important;\n}\n\n.ml-0,\n.mx-0 {\n margin-left: 0 !important;\n}\n\n.m-1 {\n margin: 0.25rem !important;\n}\n\n.mt-1,\n.my-1 {\n margin-top: 0.25rem !important;\n}\n\n.mr-1,\n.mx-1 {\n margin-right: 0.25rem !important;\n}\n\n.mb-1,\n.my-1 {\n margin-bottom: 0.25rem !important;\n}\n\n.ml-1,\n.mx-1 {\n margin-left: 0.25rem !important;\n}\n\n.m-2 {\n margin: 0.5rem !important;\n}\n\n.mt-2,\n.my-2 {\n margin-top: 0.5rem !important;\n}\n\n.mr-2,\n.mx-2 {\n margin-right: 0.5rem !important;\n}\n\n.mb-2,\n.my-2 {\n margin-bottom: 0.5rem !important;\n}\n\n.ml-2,\n.mx-2 {\n margin-left: 0.5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.mt-3,\n.my-3 {\n margin-top: 1rem !important;\n}\n\n.mr-3,\n.mx-3 {\n margin-right: 1rem !important;\n}\n\n.mb-3,\n.my-3 {\n margin-bottom: 1rem !important;\n}\n\n.ml-3,\n.mx-3 {\n margin-left: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.mt-4,\n.my-4 {\n margin-top: 1.5rem !important;\n}\n\n.mr-4,\n.mx-4 {\n margin-right: 1.5rem !important;\n}\n\n.mb-4,\n.my-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.ml-4,\n.mx-4 {\n margin-left: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.mt-5,\n.my-5 {\n margin-top: 3rem !important;\n}\n\n.mr-5,\n.mx-5 {\n margin-right: 3rem !important;\n}\n\n.mb-5,\n.my-5 {\n margin-bottom: 3rem !important;\n}\n\n.ml-5,\n.mx-5 {\n margin-left: 3rem !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.pt-0,\n.py-0 {\n padding-top: 0 !important;\n}\n\n.pr-0,\n.px-0 {\n padding-right: 0 !important;\n}\n\n.pb-0,\n.py-0 {\n padding-bottom: 0 !important;\n}\n\n.pl-0,\n.px-0 {\n padding-left: 0 !important;\n}\n\n.p-1 {\n padding: 0.25rem !important;\n}\n\n.pt-1,\n.py-1 {\n padding-top: 0.25rem !important;\n}\n\n.pr-1,\n.px-1 {\n padding-right: 0.25rem !important;\n}\n\n.pb-1,\n.py-1 {\n padding-bottom: 0.25rem !important;\n}\n\n.pl-1,\n.px-1 {\n padding-left: 0.25rem !important;\n}\n\n.p-2 {\n padding: 0.5rem !important;\n}\n\n.pt-2,\n.py-2 {\n padding-top: 0.5rem !important;\n}\n\n.pr-2,\n.px-2 {\n padding-right: 0.5rem !important;\n}\n\n.pb-2,\n.py-2 {\n padding-bottom: 0.5rem !important;\n}\n\n.pl-2,\n.px-2 {\n padding-left: 0.5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.pt-3,\n.py-3 {\n padding-top: 1rem !important;\n}\n\n.pr-3,\n.px-3 {\n padding-right: 1rem !important;\n}\n\n.pb-3,\n.py-3 {\n padding-bottom: 1rem !important;\n}\n\n.pl-3,\n.px-3 {\n padding-left: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.pt-4,\n.py-4 {\n padding-top: 1.5rem !important;\n}\n\n.pr-4,\n.px-4 {\n padding-right: 1.5rem !important;\n}\n\n.pb-4,\n.py-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pl-4,\n.px-4 {\n padding-left: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.pt-5,\n.py-5 {\n padding-top: 3rem !important;\n}\n\n.pr-5,\n.px-5 {\n padding-right: 3rem !important;\n}\n\n.pb-5,\n.py-5 {\n padding-bottom: 3rem !important;\n}\n\n.pl-5,\n.px-5 {\n padding-left: 3rem !important;\n}\n\n.m-n1 {\n margin: -0.25rem !important;\n}\n\n.mt-n1,\n.my-n1 {\n margin-top: -0.25rem !important;\n}\n\n.mr-n1,\n.mx-n1 {\n margin-right: -0.25rem !important;\n}\n\n.mb-n1,\n.my-n1 {\n margin-bottom: -0.25rem !important;\n}\n\n.ml-n1,\n.mx-n1 {\n margin-left: -0.25rem !important;\n}\n\n.m-n2 {\n margin: -0.5rem !important;\n}\n\n.mt-n2,\n.my-n2 {\n margin-top: -0.5rem !important;\n}\n\n.mr-n2,\n.mx-n2 {\n margin-right: -0.5rem !important;\n}\n\n.mb-n2,\n.my-n2 {\n margin-bottom: -0.5rem !important;\n}\n\n.ml-n2,\n.mx-n2 {\n margin-left: -0.5rem !important;\n}\n\n.m-n3 {\n margin: -1rem !important;\n}\n\n.mt-n3,\n.my-n3 {\n margin-top: -1rem !important;\n}\n\n.mr-n3,\n.mx-n3 {\n margin-right: -1rem !important;\n}\n\n.mb-n3,\n.my-n3 {\n margin-bottom: -1rem !important;\n}\n\n.ml-n3,\n.mx-n3 {\n margin-left: -1rem !important;\n}\n\n.m-n4 {\n margin: -1.5rem !important;\n}\n\n.mt-n4,\n.my-n4 {\n margin-top: -1.5rem !important;\n}\n\n.mr-n4,\n.mx-n4 {\n margin-right: -1.5rem !important;\n}\n\n.mb-n4,\n.my-n4 {\n margin-bottom: -1.5rem !important;\n}\n\n.ml-n4,\n.mx-n4 {\n margin-left: -1.5rem !important;\n}\n\n.m-n5 {\n margin: -3rem !important;\n}\n\n.mt-n5,\n.my-n5 {\n margin-top: -3rem !important;\n}\n\n.mr-n5,\n.mx-n5 {\n margin-right: -3rem !important;\n}\n\n.mb-n5,\n.my-n5 {\n margin-bottom: -3rem !important;\n}\n\n.ml-n5,\n.mx-n5 {\n margin-left: -3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mt-auto,\n.my-auto {\n margin-top: auto !important;\n}\n\n.mr-auto,\n.mx-auto {\n margin-right: auto !important;\n}\n\n.mb-auto,\n.my-auto {\n margin-bottom: auto !important;\n}\n\n.ml-auto,\n.mx-auto {\n margin-left: auto !important;\n}\n\n@media (min-width: 576px) {\n .m-sm-0 {\n margin: 0 !important;\n }\n .mt-sm-0,\n .my-sm-0 {\n margin-top: 0 !important;\n }\n .mr-sm-0,\n .mx-sm-0 {\n margin-right: 0 !important;\n }\n .mb-sm-0,\n .my-sm-0 {\n margin-bottom: 0 !important;\n }\n .ml-sm-0,\n .mx-sm-0 {\n margin-left: 0 !important;\n }\n .m-sm-1 {\n margin: 0.25rem !important;\n }\n .mt-sm-1,\n .my-sm-1 {\n margin-top: 0.25rem !important;\n }\n .mr-sm-1,\n .mx-sm-1 {\n margin-right: 0.25rem !important;\n }\n .mb-sm-1,\n .my-sm-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-sm-1,\n .mx-sm-1 {\n margin-left: 0.25rem !important;\n }\n .m-sm-2 {\n margin: 0.5rem !important;\n }\n .mt-sm-2,\n .my-sm-2 {\n margin-top: 0.5rem !important;\n }\n .mr-sm-2,\n .mx-sm-2 {\n margin-right: 0.5rem !important;\n }\n .mb-sm-2,\n .my-sm-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-sm-2,\n .mx-sm-2 {\n margin-left: 0.5rem !important;\n }\n .m-sm-3 {\n margin: 1rem !important;\n }\n .mt-sm-3,\n .my-sm-3 {\n margin-top: 1rem !important;\n }\n .mr-sm-3,\n .mx-sm-3 {\n margin-right: 1rem !important;\n }\n .mb-sm-3,\n .my-sm-3 {\n margin-bottom: 1rem !important;\n }\n .ml-sm-3,\n .mx-sm-3 {\n margin-left: 1rem !important;\n }\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n .mt-sm-4,\n .my-sm-4 {\n margin-top: 1.5rem !important;\n }\n .mr-sm-4,\n .mx-sm-4 {\n margin-right: 1.5rem !important;\n }\n .mb-sm-4,\n .my-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-sm-4,\n .mx-sm-4 {\n margin-left: 1.5rem !important;\n }\n .m-sm-5 {\n margin: 3rem !important;\n }\n .mt-sm-5,\n .my-sm-5 {\n margin-top: 3rem !important;\n }\n .mr-sm-5,\n .mx-sm-5 {\n margin-right: 3rem !important;\n }\n .mb-sm-5,\n .my-sm-5 {\n margin-bottom: 3rem !important;\n }\n .ml-sm-5,\n .mx-sm-5 {\n margin-left: 3rem !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .pt-sm-0,\n .py-sm-0 {\n padding-top: 0 !important;\n }\n .pr-sm-0,\n .px-sm-0 {\n padding-right: 0 !important;\n }\n .pb-sm-0,\n .py-sm-0 {\n padding-bottom: 0 !important;\n }\n .pl-sm-0,\n .px-sm-0 {\n padding-left: 0 !important;\n }\n .p-sm-1 {\n padding: 0.25rem !important;\n }\n .pt-sm-1,\n .py-sm-1 {\n padding-top: 0.25rem !important;\n }\n .pr-sm-1,\n .px-sm-1 {\n padding-right: 0.25rem !important;\n }\n .pb-sm-1,\n .py-sm-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-sm-1,\n .px-sm-1 {\n padding-left: 0.25rem !important;\n }\n .p-sm-2 {\n padding: 0.5rem !important;\n }\n .pt-sm-2,\n .py-sm-2 {\n padding-top: 0.5rem !important;\n }\n .pr-sm-2,\n .px-sm-2 {\n padding-right: 0.5rem !important;\n }\n .pb-sm-2,\n .py-sm-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-sm-2,\n .px-sm-2 {\n padding-left: 0.5rem !important;\n }\n .p-sm-3 {\n padding: 1rem !important;\n }\n .pt-sm-3,\n .py-sm-3 {\n padding-top: 1rem !important;\n }\n .pr-sm-3,\n .px-sm-3 {\n padding-right: 1rem !important;\n }\n .pb-sm-3,\n .py-sm-3 {\n padding-bottom: 1rem !important;\n }\n .pl-sm-3,\n .px-sm-3 {\n padding-left: 1rem !important;\n }\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n .pt-sm-4,\n .py-sm-4 {\n padding-top: 1.5rem !important;\n }\n .pr-sm-4,\n .px-sm-4 {\n padding-right: 1.5rem !important;\n }\n .pb-sm-4,\n .py-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-sm-4,\n .px-sm-4 {\n padding-left: 1.5rem !important;\n }\n .p-sm-5 {\n padding: 3rem !important;\n }\n .pt-sm-5,\n .py-sm-5 {\n padding-top: 3rem !important;\n }\n .pr-sm-5,\n .px-sm-5 {\n padding-right: 3rem !important;\n }\n .pb-sm-5,\n .py-sm-5 {\n padding-bottom: 3rem !important;\n }\n .pl-sm-5,\n .px-sm-5 {\n padding-left: 3rem !important;\n }\n .m-sm-n1 {\n margin: -0.25rem !important;\n }\n .mt-sm-n1,\n .my-sm-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-sm-n1,\n .mx-sm-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-sm-n1,\n .my-sm-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-sm-n1,\n .mx-sm-n1 {\n margin-left: -0.25rem !important;\n }\n .m-sm-n2 {\n margin: -0.5rem !important;\n }\n .mt-sm-n2,\n .my-sm-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-sm-n2,\n .mx-sm-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-sm-n2,\n .my-sm-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-sm-n2,\n .mx-sm-n2 {\n margin-left: -0.5rem !important;\n }\n .m-sm-n3 {\n margin: -1rem !important;\n }\n .mt-sm-n3,\n .my-sm-n3 {\n margin-top: -1rem !important;\n }\n .mr-sm-n3,\n .mx-sm-n3 {\n margin-right: -1rem !important;\n }\n .mb-sm-n3,\n .my-sm-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-sm-n3,\n .mx-sm-n3 {\n margin-left: -1rem !important;\n }\n .m-sm-n4 {\n margin: -1.5rem !important;\n }\n .mt-sm-n4,\n .my-sm-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-sm-n4,\n .mx-sm-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-sm-n4,\n .my-sm-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-sm-n4,\n .mx-sm-n4 {\n margin-left: -1.5rem !important;\n }\n .m-sm-n5 {\n margin: -3rem !important;\n }\n .mt-sm-n5,\n .my-sm-n5 {\n margin-top: -3rem !important;\n }\n .mr-sm-n5,\n .mx-sm-n5 {\n margin-right: -3rem !important;\n }\n .mb-sm-n5,\n .my-sm-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-sm-n5,\n .mx-sm-n5 {\n margin-left: -3rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mt-sm-auto,\n .my-sm-auto {\n margin-top: auto !important;\n }\n .mr-sm-auto,\n .mx-sm-auto {\n margin-right: auto !important;\n }\n .mb-sm-auto,\n .my-sm-auto {\n margin-bottom: auto !important;\n }\n .ml-sm-auto,\n .mx-sm-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 768px) {\n .m-md-0 {\n margin: 0 !important;\n }\n .mt-md-0,\n .my-md-0 {\n margin-top: 0 !important;\n }\n .mr-md-0,\n .mx-md-0 {\n margin-right: 0 !important;\n }\n .mb-md-0,\n .my-md-0 {\n margin-bottom: 0 !important;\n }\n .ml-md-0,\n .mx-md-0 {\n margin-left: 0 !important;\n }\n .m-md-1 {\n margin: 0.25rem !important;\n }\n .mt-md-1,\n .my-md-1 {\n margin-top: 0.25rem !important;\n }\n .mr-md-1,\n .mx-md-1 {\n margin-right: 0.25rem !important;\n }\n .mb-md-1,\n .my-md-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-md-1,\n .mx-md-1 {\n margin-left: 0.25rem !important;\n }\n .m-md-2 {\n margin: 0.5rem !important;\n }\n .mt-md-2,\n .my-md-2 {\n margin-top: 0.5rem !important;\n }\n .mr-md-2,\n .mx-md-2 {\n margin-right: 0.5rem !important;\n }\n .mb-md-2,\n .my-md-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-md-2,\n .mx-md-2 {\n margin-left: 0.5rem !important;\n }\n .m-md-3 {\n margin: 1rem !important;\n }\n .mt-md-3,\n .my-md-3 {\n margin-top: 1rem !important;\n }\n .mr-md-3,\n .mx-md-3 {\n margin-right: 1rem !important;\n }\n .mb-md-3,\n .my-md-3 {\n margin-bottom: 1rem !important;\n }\n .ml-md-3,\n .mx-md-3 {\n margin-left: 1rem !important;\n }\n .m-md-4 {\n margin: 1.5rem !important;\n }\n .mt-md-4,\n .my-md-4 {\n margin-top: 1.5rem !important;\n }\n .mr-md-4,\n .mx-md-4 {\n margin-right: 1.5rem !important;\n }\n .mb-md-4,\n .my-md-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-md-4,\n .mx-md-4 {\n margin-left: 1.5rem !important;\n }\n .m-md-5 {\n margin: 3rem !important;\n }\n .mt-md-5,\n .my-md-5 {\n margin-top: 3rem !important;\n }\n .mr-md-5,\n .mx-md-5 {\n margin-right: 3rem !important;\n }\n .mb-md-5,\n .my-md-5 {\n margin-bottom: 3rem !important;\n }\n .ml-md-5,\n .mx-md-5 {\n margin-left: 3rem !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .pt-md-0,\n .py-md-0 {\n padding-top: 0 !important;\n }\n .pr-md-0,\n .px-md-0 {\n padding-right: 0 !important;\n }\n .pb-md-0,\n .py-md-0 {\n padding-bottom: 0 !important;\n }\n .pl-md-0,\n .px-md-0 {\n padding-left: 0 !important;\n }\n .p-md-1 {\n padding: 0.25rem !important;\n }\n .pt-md-1,\n .py-md-1 {\n padding-top: 0.25rem !important;\n }\n .pr-md-1,\n .px-md-1 {\n padding-right: 0.25rem !important;\n }\n .pb-md-1,\n .py-md-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-md-1,\n .px-md-1 {\n padding-left: 0.25rem !important;\n }\n .p-md-2 {\n padding: 0.5rem !important;\n }\n .pt-md-2,\n .py-md-2 {\n padding-top: 0.5rem !important;\n }\n .pr-md-2,\n .px-md-2 {\n padding-right: 0.5rem !important;\n }\n .pb-md-2,\n .py-md-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-md-2,\n .px-md-2 {\n padding-left: 0.5rem !important;\n }\n .p-md-3 {\n padding: 1rem !important;\n }\n .pt-md-3,\n .py-md-3 {\n padding-top: 1rem !important;\n }\n .pr-md-3,\n .px-md-3 {\n padding-right: 1rem !important;\n }\n .pb-md-3,\n .py-md-3 {\n padding-bottom: 1rem !important;\n }\n .pl-md-3,\n .px-md-3 {\n padding-left: 1rem !important;\n }\n .p-md-4 {\n padding: 1.5rem !important;\n }\n .pt-md-4,\n .py-md-4 {\n padding-top: 1.5rem !important;\n }\n .pr-md-4,\n .px-md-4 {\n padding-right: 1.5rem !important;\n }\n .pb-md-4,\n .py-md-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-md-4,\n .px-md-4 {\n padding-left: 1.5rem !important;\n }\n .p-md-5 {\n padding: 3rem !important;\n }\n .pt-md-5,\n .py-md-5 {\n padding-top: 3rem !important;\n }\n .pr-md-5,\n .px-md-5 {\n padding-right: 3rem !important;\n }\n .pb-md-5,\n .py-md-5 {\n padding-bottom: 3rem !important;\n }\n .pl-md-5,\n .px-md-5 {\n padding-left: 3rem !important;\n }\n .m-md-n1 {\n margin: -0.25rem !important;\n }\n .mt-md-n1,\n .my-md-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-md-n1,\n .mx-md-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-md-n1,\n .my-md-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-md-n1,\n .mx-md-n1 {\n margin-left: -0.25rem !important;\n }\n .m-md-n2 {\n margin: -0.5rem !important;\n }\n .mt-md-n2,\n .my-md-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-md-n2,\n .mx-md-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-md-n2,\n .my-md-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-md-n2,\n .mx-md-n2 {\n margin-left: -0.5rem !important;\n }\n .m-md-n3 {\n margin: -1rem !important;\n }\n .mt-md-n3,\n .my-md-n3 {\n margin-top: -1rem !important;\n }\n .mr-md-n3,\n .mx-md-n3 {\n margin-right: -1rem !important;\n }\n .mb-md-n3,\n .my-md-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-md-n3,\n .mx-md-n3 {\n margin-left: -1rem !important;\n }\n .m-md-n4 {\n margin: -1.5rem !important;\n }\n .mt-md-n4,\n .my-md-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-md-n4,\n .mx-md-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-md-n4,\n .my-md-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-md-n4,\n .mx-md-n4 {\n margin-left: -1.5rem !important;\n }\n .m-md-n5 {\n margin: -3rem !important;\n }\n .mt-md-n5,\n .my-md-n5 {\n margin-top: -3rem !important;\n }\n .mr-md-n5,\n .mx-md-n5 {\n margin-right: -3rem !important;\n }\n .mb-md-n5,\n .my-md-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-md-n5,\n .mx-md-n5 {\n margin-left: -3rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mt-md-auto,\n .my-md-auto {\n margin-top: auto !important;\n }\n .mr-md-auto,\n .mx-md-auto {\n margin-right: auto !important;\n }\n .mb-md-auto,\n .my-md-auto {\n margin-bottom: auto !important;\n }\n .ml-md-auto,\n .mx-md-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 992px) {\n .m-lg-0 {\n margin: 0 !important;\n }\n .mt-lg-0,\n .my-lg-0 {\n margin-top: 0 !important;\n }\n .mr-lg-0,\n .mx-lg-0 {\n margin-right: 0 !important;\n }\n .mb-lg-0,\n .my-lg-0 {\n margin-bottom: 0 !important;\n }\n .ml-lg-0,\n .mx-lg-0 {\n margin-left: 0 !important;\n }\n .m-lg-1 {\n margin: 0.25rem !important;\n }\n .mt-lg-1,\n .my-lg-1 {\n margin-top: 0.25rem !important;\n }\n .mr-lg-1,\n .mx-lg-1 {\n margin-right: 0.25rem !important;\n }\n .mb-lg-1,\n .my-lg-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-lg-1,\n .mx-lg-1 {\n margin-left: 0.25rem !important;\n }\n .m-lg-2 {\n margin: 0.5rem !important;\n }\n .mt-lg-2,\n .my-lg-2 {\n margin-top: 0.5rem !important;\n }\n .mr-lg-2,\n .mx-lg-2 {\n margin-right: 0.5rem !important;\n }\n .mb-lg-2,\n .my-lg-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-lg-2,\n .mx-lg-2 {\n margin-left: 0.5rem !important;\n }\n .m-lg-3 {\n margin: 1rem !important;\n }\n .mt-lg-3,\n .my-lg-3 {\n margin-top: 1rem !important;\n }\n .mr-lg-3,\n .mx-lg-3 {\n margin-right: 1rem !important;\n }\n .mb-lg-3,\n .my-lg-3 {\n margin-bottom: 1rem !important;\n }\n .ml-lg-3,\n .mx-lg-3 {\n margin-left: 1rem !important;\n }\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n .mt-lg-4,\n .my-lg-4 {\n margin-top: 1.5rem !important;\n }\n .mr-lg-4,\n .mx-lg-4 {\n margin-right: 1.5rem !important;\n }\n .mb-lg-4,\n .my-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-lg-4,\n .mx-lg-4 {\n margin-left: 1.5rem !important;\n }\n .m-lg-5 {\n margin: 3rem !important;\n }\n .mt-lg-5,\n .my-lg-5 {\n margin-top: 3rem !important;\n }\n .mr-lg-5,\n .mx-lg-5 {\n margin-right: 3rem !important;\n }\n .mb-lg-5,\n .my-lg-5 {\n margin-bottom: 3rem !important;\n }\n .ml-lg-5,\n .mx-lg-5 {\n margin-left: 3rem !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .pt-lg-0,\n .py-lg-0 {\n padding-top: 0 !important;\n }\n .pr-lg-0,\n .px-lg-0 {\n padding-right: 0 !important;\n }\n .pb-lg-0,\n .py-lg-0 {\n padding-bottom: 0 !important;\n }\n .pl-lg-0,\n .px-lg-0 {\n padding-left: 0 !important;\n }\n .p-lg-1 {\n padding: 0.25rem !important;\n }\n .pt-lg-1,\n .py-lg-1 {\n padding-top: 0.25rem !important;\n }\n .pr-lg-1,\n .px-lg-1 {\n padding-right: 0.25rem !important;\n }\n .pb-lg-1,\n .py-lg-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-lg-1,\n .px-lg-1 {\n padding-left: 0.25rem !important;\n }\n .p-lg-2 {\n padding: 0.5rem !important;\n }\n .pt-lg-2,\n .py-lg-2 {\n padding-top: 0.5rem !important;\n }\n .pr-lg-2,\n .px-lg-2 {\n padding-right: 0.5rem !important;\n }\n .pb-lg-2,\n .py-lg-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-lg-2,\n .px-lg-2 {\n padding-left: 0.5rem !important;\n }\n .p-lg-3 {\n padding: 1rem !important;\n }\n .pt-lg-3,\n .py-lg-3 {\n padding-top: 1rem !important;\n }\n .pr-lg-3,\n .px-lg-3 {\n padding-right: 1rem !important;\n }\n .pb-lg-3,\n .py-lg-3 {\n padding-bottom: 1rem !important;\n }\n .pl-lg-3,\n .px-lg-3 {\n padding-left: 1rem !important;\n }\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n .pt-lg-4,\n .py-lg-4 {\n padding-top: 1.5rem !important;\n }\n .pr-lg-4,\n .px-lg-4 {\n padding-right: 1.5rem !important;\n }\n .pb-lg-4,\n .py-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-lg-4,\n .px-lg-4 {\n padding-left: 1.5rem !important;\n }\n .p-lg-5 {\n padding: 3rem !important;\n }\n .pt-lg-5,\n .py-lg-5 {\n padding-top: 3rem !important;\n }\n .pr-lg-5,\n .px-lg-5 {\n padding-right: 3rem !important;\n }\n .pb-lg-5,\n .py-lg-5 {\n padding-bottom: 3rem !important;\n }\n .pl-lg-5,\n .px-lg-5 {\n padding-left: 3rem !important;\n }\n .m-lg-n1 {\n margin: -0.25rem !important;\n }\n .mt-lg-n1,\n .my-lg-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-lg-n1,\n .mx-lg-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-lg-n1,\n .my-lg-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-lg-n1,\n .mx-lg-n1 {\n margin-left: -0.25rem !important;\n }\n .m-lg-n2 {\n margin: -0.5rem !important;\n }\n .mt-lg-n2,\n .my-lg-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-lg-n2,\n .mx-lg-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-lg-n2,\n .my-lg-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-lg-n2,\n .mx-lg-n2 {\n margin-left: -0.5rem !important;\n }\n .m-lg-n3 {\n margin: -1rem !important;\n }\n .mt-lg-n3,\n .my-lg-n3 {\n margin-top: -1rem !important;\n }\n .mr-lg-n3,\n .mx-lg-n3 {\n margin-right: -1rem !important;\n }\n .mb-lg-n3,\n .my-lg-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-lg-n3,\n .mx-lg-n3 {\n margin-left: -1rem !important;\n }\n .m-lg-n4 {\n margin: -1.5rem !important;\n }\n .mt-lg-n4,\n .my-lg-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-lg-n4,\n .mx-lg-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-lg-n4,\n .my-lg-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-lg-n4,\n .mx-lg-n4 {\n margin-left: -1.5rem !important;\n }\n .m-lg-n5 {\n margin: -3rem !important;\n }\n .mt-lg-n5,\n .my-lg-n5 {\n margin-top: -3rem !important;\n }\n .mr-lg-n5,\n .mx-lg-n5 {\n margin-right: -3rem !important;\n }\n .mb-lg-n5,\n .my-lg-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-lg-n5,\n .mx-lg-n5 {\n margin-left: -3rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mt-lg-auto,\n .my-lg-auto {\n margin-top: auto !important;\n }\n .mr-lg-auto,\n .mx-lg-auto {\n margin-right: auto !important;\n }\n .mb-lg-auto,\n .my-lg-auto {\n margin-bottom: auto !important;\n }\n .ml-lg-auto,\n .mx-lg-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 1200px) {\n .m-xl-0 {\n margin: 0 !important;\n }\n .mt-xl-0,\n .my-xl-0 {\n margin-top: 0 !important;\n }\n .mr-xl-0,\n .mx-xl-0 {\n margin-right: 0 !important;\n }\n .mb-xl-0,\n .my-xl-0 {\n margin-bottom: 0 !important;\n }\n .ml-xl-0,\n .mx-xl-0 {\n margin-left: 0 !important;\n }\n .m-xl-1 {\n margin: 0.25rem !important;\n }\n .mt-xl-1,\n .my-xl-1 {\n margin-top: 0.25rem !important;\n }\n .mr-xl-1,\n .mx-xl-1 {\n margin-right: 0.25rem !important;\n }\n .mb-xl-1,\n .my-xl-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-xl-1,\n .mx-xl-1 {\n margin-left: 0.25rem !important;\n }\n .m-xl-2 {\n margin: 0.5rem !important;\n }\n .mt-xl-2,\n .my-xl-2 {\n margin-top: 0.5rem !important;\n }\n .mr-xl-2,\n .mx-xl-2 {\n margin-right: 0.5rem !important;\n }\n .mb-xl-2,\n .my-xl-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-xl-2,\n .mx-xl-2 {\n margin-left: 0.5rem !important;\n }\n .m-xl-3 {\n margin: 1rem !important;\n }\n .mt-xl-3,\n .my-xl-3 {\n margin-top: 1rem !important;\n }\n .mr-xl-3,\n .mx-xl-3 {\n margin-right: 1rem !important;\n }\n .mb-xl-3,\n .my-xl-3 {\n margin-bottom: 1rem !important;\n }\n .ml-xl-3,\n .mx-xl-3 {\n margin-left: 1rem !important;\n }\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n .mt-xl-4,\n .my-xl-4 {\n margin-top: 1.5rem !important;\n }\n .mr-xl-4,\n .mx-xl-4 {\n margin-right: 1.5rem !important;\n }\n .mb-xl-4,\n .my-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-xl-4,\n .mx-xl-4 {\n margin-left: 1.5rem !important;\n }\n .m-xl-5 {\n margin: 3rem !important;\n }\n .mt-xl-5,\n .my-xl-5 {\n margin-top: 3rem !important;\n }\n .mr-xl-5,\n .mx-xl-5 {\n margin-right: 3rem !important;\n }\n .mb-xl-5,\n .my-xl-5 {\n margin-bottom: 3rem !important;\n }\n .ml-xl-5,\n .mx-xl-5 {\n margin-left: 3rem !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .pt-xl-0,\n .py-xl-0 {\n padding-top: 0 !important;\n }\n .pr-xl-0,\n .px-xl-0 {\n padding-right: 0 !important;\n }\n .pb-xl-0,\n .py-xl-0 {\n padding-bottom: 0 !important;\n }\n .pl-xl-0,\n .px-xl-0 {\n padding-left: 0 !important;\n }\n .p-xl-1 {\n padding: 0.25rem !important;\n }\n .pt-xl-1,\n .py-xl-1 {\n padding-top: 0.25rem !important;\n }\n .pr-xl-1,\n .px-xl-1 {\n padding-right: 0.25rem !important;\n }\n .pb-xl-1,\n .py-xl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-xl-1,\n .px-xl-1 {\n padding-left: 0.25rem !important;\n }\n .p-xl-2 {\n padding: 0.5rem !important;\n }\n .pt-xl-2,\n .py-xl-2 {\n padding-top: 0.5rem !important;\n }\n .pr-xl-2,\n .px-xl-2 {\n padding-right: 0.5rem !important;\n }\n .pb-xl-2,\n .py-xl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-xl-2,\n .px-xl-2 {\n padding-left: 0.5rem !important;\n }\n .p-xl-3 {\n padding: 1rem !important;\n }\n .pt-xl-3,\n .py-xl-3 {\n padding-top: 1rem !important;\n }\n .pr-xl-3,\n .px-xl-3 {\n padding-right: 1rem !important;\n }\n .pb-xl-3,\n .py-xl-3 {\n padding-bottom: 1rem !important;\n }\n .pl-xl-3,\n .px-xl-3 {\n padding-left: 1rem !important;\n }\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n .pt-xl-4,\n .py-xl-4 {\n padding-top: 1.5rem !important;\n }\n .pr-xl-4,\n .px-xl-4 {\n padding-right: 1.5rem !important;\n }\n .pb-xl-4,\n .py-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-xl-4,\n .px-xl-4 {\n padding-left: 1.5rem !important;\n }\n .p-xl-5 {\n padding: 3rem !important;\n }\n .pt-xl-5,\n .py-xl-5 {\n padding-top: 3rem !important;\n }\n .pr-xl-5,\n .px-xl-5 {\n padding-right: 3rem !important;\n }\n .pb-xl-5,\n .py-xl-5 {\n padding-bottom: 3rem !important;\n }\n .pl-xl-5,\n .px-xl-5 {\n padding-left: 3rem !important;\n }\n .m-xl-n1 {\n margin: -0.25rem !important;\n }\n .mt-xl-n1,\n .my-xl-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-xl-n1,\n .mx-xl-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-xl-n1,\n .my-xl-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-xl-n1,\n .mx-xl-n1 {\n margin-left: -0.25rem !important;\n }\n .m-xl-n2 {\n margin: -0.5rem !important;\n }\n .mt-xl-n2,\n .my-xl-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-xl-n2,\n .mx-xl-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-xl-n2,\n .my-xl-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-xl-n2,\n .mx-xl-n2 {\n margin-left: -0.5rem !important;\n }\n .m-xl-n3 {\n margin: -1rem !important;\n }\n .mt-xl-n3,\n .my-xl-n3 {\n margin-top: -1rem !important;\n }\n .mr-xl-n3,\n .mx-xl-n3 {\n margin-right: -1rem !important;\n }\n .mb-xl-n3,\n .my-xl-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-xl-n3,\n .mx-xl-n3 {\n margin-left: -1rem !important;\n }\n .m-xl-n4 {\n margin: -1.5rem !important;\n }\n .mt-xl-n4,\n .my-xl-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-xl-n4,\n .mx-xl-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-xl-n4,\n .my-xl-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-xl-n4,\n .mx-xl-n4 {\n margin-left: -1.5rem !important;\n }\n .m-xl-n5 {\n margin: -3rem !important;\n }\n .mt-xl-n5,\n .my-xl-n5 {\n margin-top: -3rem !important;\n }\n .mr-xl-n5,\n .mx-xl-n5 {\n margin-right: -3rem !important;\n }\n .mb-xl-n5,\n .my-xl-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-xl-n5,\n .mx-xl-n5 {\n margin-left: -3rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mt-xl-auto,\n .my-xl-auto {\n margin-top: auto !important;\n }\n .mr-xl-auto,\n .mx-xl-auto {\n margin-right: auto !important;\n }\n .mb-xl-auto,\n .my-xl-auto {\n margin-bottom: auto !important;\n }\n .ml-xl-auto,\n .mx-xl-auto {\n margin-left: auto !important;\n }\n}\n\n/*# sourceMappingURL=bootstrap-grid.css.map */","// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-grid-classes {\n // Single container class with breakpoint max-widths\n .container,\n // 100% wide container at all breakpoints\n .container-fluid {\n @include make-container();\n }\n\n // Responsive containers that are 100% wide until a breakpoint\n @each $breakpoint, $container-max-width in $container-max-widths {\n .container-#{$breakpoint} {\n @extend .container-fluid;\n }\n\n @include media-breakpoint-up($breakpoint, $grid-breakpoints) {\n %responsive-container-#{$breakpoint} {\n max-width: $container-max-width;\n }\n\n // Extend each breakpoint which is smaller or equal to the current breakpoint\n $extend-breakpoint: true;\n\n @each $name, $width in $grid-breakpoints {\n @if ($extend-breakpoint) {\n .container#{breakpoint-infix($name, $grid-breakpoints)} {\n @extend %responsive-container-#{$breakpoint};\n }\n\n // Once the current breakpoint is reached, stop extending\n @if ($breakpoint == $name) {\n $extend-breakpoint: false;\n }\n }\n }\n }\n }\n}\n\n\n// Row\n//\n// Rows contain your columns.\n\n@if $enable-grid-classes {\n .row {\n @include make-row();\n }\n\n // Remove the negative margin from default .row, then the horizontal padding\n // from all immediate children columns (to prevent runaway style inheritance).\n .no-gutters {\n margin-right: 0;\n margin-left: 0;\n\n > .col,\n > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n }\n }\n}\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n @include make-grid-columns();\n}\n","/// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-container($gutter: $grid-gutter-width) {\n width: 100%;\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n margin-right: auto;\n margin-left: auto;\n}\n\n@mixin make-row($gutter: $grid-gutter-width) {\n display: flex;\n flex-wrap: wrap;\n margin-right: -$gutter / 2;\n margin-left: -$gutter / 2;\n}\n\n// For each breakpoint, define the maximum width of the container in a media query\n@mixin make-container-max-widths($max-widths: $container-max-widths, $breakpoints: $grid-breakpoints) {\n @each $breakpoint, $container-max-width in $max-widths {\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n max-width: $container-max-width;\n }\n }\n @include deprecate(\"The `make-container-max-widths` mixin\", \"v4.5.2\", \"v5\");\n}\n\n@mixin make-col-ready($gutter: $grid-gutter-width) {\n position: relative;\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we use `flex` values\n // later on to override this initial width.\n width: 100%;\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n}\n\n@mixin make-col($size, $columns: $grid-columns) {\n flex: 0 0 percentage($size / $columns);\n // Add a `max-width` to ensure content within each column does not blow out\n // the width of the column. Applies to IE10+ and Firefox. Chrome and Safari\n // do not appear to require this.\n max-width: percentage($size / $columns);\n}\n\n@mixin make-col-auto() {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%; // Reset earlier grid tiers\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: $size / $columns;\n margin-left: if($num == 0, 0, percentage($num));\n}\n\n// Row columns\n//\n// Specify on a parent element(e.g., .row) to force immediate children into NN\n// numberof columns. Supports wrapping to new lines, but does not do a Masonry\n// style grid.\n@mixin row-cols($count) {\n > * {\n flex: 0 0 100% / $count;\n max-width: 100% / $count;\n }\n}\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @return if($n != null and $n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width. Null for the largest (last) breakpoint.\n// The maximum value is calculated as the minimum of the next one less 0.02px\n// to work around the limitations of `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $next: breakpoint-next($name, $breakpoints);\n @return if($next, breakpoint-min($next, $breakpoints) - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $max: breakpoint-max($name, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($name, $breakpoints) {\n @content;\n }\n }\n}\n","// Variables\n//\n// Variables should follow the `$component-state-property-size` formula for\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\n\n// Color system\n\n$white: #fff !default;\n$gray-100: #f8f9fa !default;\n$gray-200: #e9ecef !default;\n$gray-300: #dee2e6 !default;\n$gray-400: #ced4da !default;\n$gray-500: #adb5bd !default;\n$gray-600: #6c757d !default;\n$gray-700: #495057 !default;\n$gray-800: #343a40 !default;\n$gray-900: #212529 !default;\n$black: #000 !default;\n\n$grays: () !default;\n$grays: map-merge(\n (\n \"100\": $gray-100,\n \"200\": $gray-200,\n \"300\": $gray-300,\n \"400\": $gray-400,\n \"500\": $gray-500,\n \"600\": $gray-600,\n \"700\": $gray-700,\n \"800\": $gray-800,\n \"900\": $gray-900\n ),\n $grays\n);\n\n$blue: #007bff !default;\n$indigo: #6610f2 !default;\n$purple: #6f42c1 !default;\n$pink: #e83e8c !default;\n$red: #dc3545 !default;\n$orange: #fd7e14 !default;\n$yellow: #ffc107 !default;\n$green: #28a745 !default;\n$teal: #20c997 !default;\n$cyan: #17a2b8 !default;\n\n$colors: () !default;\n$colors: map-merge(\n (\n \"blue\": $blue,\n \"indigo\": $indigo,\n \"purple\": $purple,\n \"pink\": $pink,\n \"red\": $red,\n \"orange\": $orange,\n \"yellow\": $yellow,\n \"green\": $green,\n \"teal\": $teal,\n \"cyan\": $cyan,\n \"white\": $white,\n \"gray\": $gray-600,\n \"gray-dark\": $gray-800\n ),\n $colors\n);\n\n$primary: $blue !default;\n$secondary: $gray-600 !default;\n$success: $green !default;\n$info: $cyan !default;\n$warning: $yellow !default;\n$danger: $red !default;\n$light: $gray-100 !default;\n$dark: $gray-800 !default;\n\n$theme-colors: () !default;\n$theme-colors: map-merge(\n (\n \"primary\": $primary,\n \"secondary\": $secondary,\n \"success\": $success,\n \"info\": $info,\n \"warning\": $warning,\n \"danger\": $danger,\n \"light\": $light,\n \"dark\": $dark\n ),\n $theme-colors\n);\n\n// Set a specific jump point for requesting color jumps\n$theme-color-interval: 8% !default;\n\n// The yiq lightness value that determines when the lightness of color changes from \"dark\" to \"light\". Acceptable values are between 0 and 255.\n$yiq-contrasted-threshold: 150 !default;\n\n// Customize the light and dark text colors for use in our YIQ color contrast function.\n$yiq-text-dark: $gray-900 !default;\n$yiq-text-light: $white !default;\n\n// Characters which are escaped by the escape-svg function\n$escaped-characters: (\n (\"<\", \"%3c\"),\n (\">\", \"%3e\"),\n (\"#\", \"%23\"),\n (\"(\", \"%28\"),\n (\")\", \"%29\"),\n) !default;\n\n\n// Options\n//\n// Quickly modify global styling by enabling or disabling optional features.\n\n$enable-caret: true !default;\n$enable-rounded: true !default;\n$enable-shadows: false !default;\n$enable-gradients: false !default;\n$enable-transitions: true !default;\n$enable-prefers-reduced-motion-media-query: true !default;\n$enable-hover-media-query: false !default; // Deprecated, no longer affects any compiled CSS\n$enable-grid-classes: true !default;\n$enable-pointer-cursor-for-buttons: true !default;\n$enable-print-styles: true !default;\n$enable-responsive-font-sizes: false !default;\n$enable-validation-icons: true !default;\n$enable-deprecation-messages: true !default;\n\n\n// Spacing\n//\n// Control the default styling of most Bootstrap elements by modifying these\n// variables. Mostly focused on spacing.\n// You can add more entries to the $spacers map, should you need more variation.\n\n$spacer: 1rem !default;\n$spacers: () !default;\n$spacers: map-merge(\n (\n 0: 0,\n 1: ($spacer * .25),\n 2: ($spacer * .5),\n 3: $spacer,\n 4: ($spacer * 1.5),\n 5: ($spacer * 3)\n ),\n $spacers\n);\n\n// This variable affects the `.h-*` and `.w-*` classes.\n$sizes: () !default;\n$sizes: map-merge(\n (\n 25: 25%,\n 50: 50%,\n 75: 75%,\n 100: 100%,\n auto: auto\n ),\n $sizes\n);\n\n\n// Body\n//\n// Settings for the `` element.\n\n$body-bg: $white !default;\n$body-color: $gray-900 !default;\n\n\n// Links\n//\n// Style anchor elements.\n\n$link-color: theme-color(\"primary\") !default;\n$link-decoration: none !default;\n$link-hover-color: darken($link-color, 15%) !default;\n$link-hover-decoration: underline !default;\n// Darken percentage for links with `.text-*` class (e.g. `.text-success`)\n$emphasized-link-hover-darken-percentage: 15% !default;\n\n// Paragraphs\n//\n// Style p element.\n\n$paragraph-margin-bottom: 1rem !default;\n\n\n// Grid breakpoints\n//\n// Define the minimum dimensions at which your layout will change,\n// adapting to different screen sizes, for use in media queries.\n\n$grid-breakpoints: (\n xs: 0,\n sm: 576px,\n md: 768px,\n lg: 992px,\n xl: 1200px\n) !default;\n\n@include _assert-ascending($grid-breakpoints, \"$grid-breakpoints\");\n@include _assert-starts-at-zero($grid-breakpoints, \"$grid-breakpoints\");\n\n\n// Grid containers\n//\n// Define the maximum width of `.container` for different screen sizes.\n\n$container-max-widths: (\n sm: 540px,\n md: 720px,\n lg: 960px,\n xl: 1140px\n) !default;\n\n@include _assert-ascending($container-max-widths, \"$container-max-widths\");\n\n\n// Grid columns\n//\n// Set the number of columns and specify the width of the gutters.\n\n$grid-columns: 12 !default;\n$grid-gutter-width: 30px !default;\n$grid-row-columns: 6 !default;\n\n\n// Components\n//\n// Define common padding and border radius sizes and more.\n\n$line-height-lg: 1.5 !default;\n$line-height-sm: 1.5 !default;\n\n$border-width: 1px !default;\n$border-color: $gray-300 !default;\n\n$border-radius: .25rem !default;\n$border-radius-lg: .3rem !default;\n$border-radius-sm: .2rem !default;\n\n$rounded-pill: 50rem !default;\n\n$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;\n$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;\n$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;\n\n$component-active-color: $white !default;\n$component-active-bg: theme-color(\"primary\") !default;\n\n$caret-width: .3em !default;\n$caret-vertical-align: $caret-width * .85 !default;\n$caret-spacing: $caret-width * .85 !default;\n\n$transition-base: all .2s ease-in-out !default;\n$transition-fade: opacity .15s linear !default;\n$transition-collapse: height .35s ease !default;\n\n$embed-responsive-aspect-ratios: () !default;\n$embed-responsive-aspect-ratios: join(\n (\n (21 9),\n (16 9),\n (4 3),\n (1 1),\n ),\n $embed-responsive-aspect-ratios\n);\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// stylelint-disable value-keyword-case\n$font-family-sans-serif: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\" !default;\n$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !default;\n$font-family-base: $font-family-sans-serif !default;\n// stylelint-enable value-keyword-case\n\n$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`\n$font-size-lg: $font-size-base * 1.25 !default;\n$font-size-sm: $font-size-base * .875 !default;\n\n$font-weight-lighter: lighter !default;\n$font-weight-light: 300 !default;\n$font-weight-normal: 400 !default;\n$font-weight-bold: 700 !default;\n$font-weight-bolder: bolder !default;\n\n$font-weight-base: $font-weight-normal !default;\n$line-height-base: 1.5 !default;\n\n$h1-font-size: $font-size-base * 2.5 !default;\n$h2-font-size: $font-size-base * 2 !default;\n$h3-font-size: $font-size-base * 1.75 !default;\n$h4-font-size: $font-size-base * 1.5 !default;\n$h5-font-size: $font-size-base * 1.25 !default;\n$h6-font-size: $font-size-base !default;\n\n$headings-margin-bottom: $spacer / 2 !default;\n$headings-font-family: null !default;\n$headings-font-weight: 500 !default;\n$headings-line-height: 1.2 !default;\n$headings-color: null !default;\n\n$display1-size: 6rem !default;\n$display2-size: 5.5rem !default;\n$display3-size: 4.5rem !default;\n$display4-size: 3.5rem !default;\n\n$display1-weight: 300 !default;\n$display2-weight: 300 !default;\n$display3-weight: 300 !default;\n$display4-weight: 300 !default;\n$display-line-height: $headings-line-height !default;\n\n$lead-font-size: $font-size-base * 1.25 !default;\n$lead-font-weight: 300 !default;\n\n$small-font-size: 80% !default;\n\n$text-muted: $gray-600 !default;\n\n$blockquote-small-color: $gray-600 !default;\n$blockquote-small-font-size: $small-font-size !default;\n$blockquote-font-size: $font-size-base * 1.25 !default;\n\n$hr-border-color: rgba($black, .1) !default;\n$hr-border-width: $border-width !default;\n\n$mark-padding: .2em !default;\n\n$dt-font-weight: $font-weight-bold !default;\n\n$kbd-box-shadow: inset 0 -.1rem 0 rgba($black, .25) !default;\n$nested-kbd-font-weight: $font-weight-bold !default;\n\n$list-inline-padding: .5rem !default;\n\n$mark-bg: #fcf8e3 !default;\n\n$hr-margin-y: $spacer !default;\n\n\n// Tables\n//\n// Customizes the `.table` component with basic values, each used across all table variations.\n\n$table-cell-padding: .75rem !default;\n$table-cell-padding-sm: .3rem !default;\n\n$table-color: $body-color !default;\n$table-bg: null !default;\n$table-accent-bg: rgba($black, .05) !default;\n$table-hover-color: $table-color !default;\n$table-hover-bg: rgba($black, .075) !default;\n$table-active-bg: $table-hover-bg !default;\n\n$table-border-width: $border-width !default;\n$table-border-color: $border-color !default;\n\n$table-head-bg: $gray-200 !default;\n$table-head-color: $gray-700 !default;\n$table-th-font-weight: null !default;\n\n$table-dark-color: $white !default;\n$table-dark-bg: $gray-800 !default;\n$table-dark-accent-bg: rgba($white, .05) !default;\n$table-dark-hover-color: $table-dark-color !default;\n$table-dark-hover-bg: rgba($white, .075) !default;\n$table-dark-border-color: lighten($table-dark-bg, 7.5%) !default;\n\n$table-striped-order: odd !default;\n\n$table-caption-color: $text-muted !default;\n\n$table-bg-level: -9 !default;\n$table-border-level: -6 !default;\n\n\n// Buttons + Forms\n//\n// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.\n\n$input-btn-padding-y: .375rem !default;\n$input-btn-padding-x: .75rem !default;\n$input-btn-font-family: null !default;\n$input-btn-font-size: $font-size-base !default;\n$input-btn-line-height: $line-height-base !default;\n\n$input-btn-focus-width: .2rem !default;\n$input-btn-focus-color: rgba($component-active-bg, .25) !default;\n$input-btn-focus-box-shadow: 0 0 0 $input-btn-focus-width $input-btn-focus-color !default;\n\n$input-btn-padding-y-sm: .25rem !default;\n$input-btn-padding-x-sm: .5rem !default;\n$input-btn-font-size-sm: $font-size-sm !default;\n$input-btn-line-height-sm: $line-height-sm !default;\n\n$input-btn-padding-y-lg: .5rem !default;\n$input-btn-padding-x-lg: 1rem !default;\n$input-btn-font-size-lg: $font-size-lg !default;\n$input-btn-line-height-lg: $line-height-lg !default;\n\n$input-btn-border-width: $border-width !default;\n\n\n// Buttons\n//\n// For each of Bootstrap's buttons, define text, background, and border color.\n\n$btn-padding-y: $input-btn-padding-y !default;\n$btn-padding-x: $input-btn-padding-x !default;\n$btn-font-family: $input-btn-font-family !default;\n$btn-font-size: $input-btn-font-size !default;\n$btn-line-height: $input-btn-line-height !default;\n$btn-white-space: null !default; // Set to `nowrap` to prevent text wrapping\n\n$btn-padding-y-sm: $input-btn-padding-y-sm !default;\n$btn-padding-x-sm: $input-btn-padding-x-sm !default;\n$btn-font-size-sm: $input-btn-font-size-sm !default;\n$btn-line-height-sm: $input-btn-line-height-sm !default;\n\n$btn-padding-y-lg: $input-btn-padding-y-lg !default;\n$btn-padding-x-lg: $input-btn-padding-x-lg !default;\n$btn-font-size-lg: $input-btn-font-size-lg !default;\n$btn-line-height-lg: $input-btn-line-height-lg !default;\n\n$btn-border-width: $input-btn-border-width !default;\n\n$btn-font-weight: $font-weight-normal !default;\n$btn-box-shadow: inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default;\n$btn-focus-width: $input-btn-focus-width !default;\n$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$btn-disabled-opacity: .65 !default;\n$btn-active-box-shadow: inset 0 3px 5px rgba($black, .125) !default;\n\n$btn-link-disabled-color: $gray-600 !default;\n\n$btn-block-spacing-y: .5rem !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius: $border-radius !default;\n$btn-border-radius-lg: $border-radius-lg !default;\n$btn-border-radius-sm: $border-radius-sm !default;\n\n$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n\n// Forms\n\n$label-margin-bottom: .5rem !default;\n\n$input-padding-y: $input-btn-padding-y !default;\n$input-padding-x: $input-btn-padding-x !default;\n$input-font-family: $input-btn-font-family !default;\n$input-font-size: $input-btn-font-size !default;\n$input-font-weight: $font-weight-base !default;\n$input-line-height: $input-btn-line-height !default;\n\n$input-padding-y-sm: $input-btn-padding-y-sm !default;\n$input-padding-x-sm: $input-btn-padding-x-sm !default;\n$input-font-size-sm: $input-btn-font-size-sm !default;\n$input-line-height-sm: $input-btn-line-height-sm !default;\n\n$input-padding-y-lg: $input-btn-padding-y-lg !default;\n$input-padding-x-lg: $input-btn-padding-x-lg !default;\n$input-font-size-lg: $input-btn-font-size-lg !default;\n$input-line-height-lg: $input-btn-line-height-lg !default;\n\n$input-bg: $white !default;\n$input-disabled-bg: $gray-200 !default;\n\n$input-color: $gray-700 !default;\n$input-border-color: $gray-400 !default;\n$input-border-width: $input-btn-border-width !default;\n$input-box-shadow: inset 0 1px 1px rgba($black, .075) !default;\n\n$input-border-radius: $border-radius !default;\n$input-border-radius-lg: $border-radius-lg !default;\n$input-border-radius-sm: $border-radius-sm !default;\n\n$input-focus-bg: $input-bg !default;\n$input-focus-border-color: lighten($component-active-bg, 25%) !default;\n$input-focus-color: $input-color !default;\n$input-focus-width: $input-btn-focus-width !default;\n$input-focus-box-shadow: $input-btn-focus-box-shadow !default;\n\n$input-placeholder-color: $gray-600 !default;\n$input-plaintext-color: $body-color !default;\n\n$input-height-border: $input-border-width * 2 !default;\n\n$input-height-inner: add($input-line-height * 1em, $input-padding-y * 2) !default;\n$input-height-inner-half: add($input-line-height * .5em, $input-padding-y) !default;\n$input-height-inner-quarter: add($input-line-height * .25em, $input-padding-y / 2) !default;\n\n$input-height: add($input-line-height * 1em, add($input-padding-y * 2, $input-height-border, false)) !default;\n$input-height-sm: add($input-line-height-sm * 1em, add($input-padding-y-sm * 2, $input-height-border, false)) !default;\n$input-height-lg: add($input-line-height-lg * 1em, add($input-padding-y-lg * 2, $input-height-border, false)) !default;\n\n$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$form-text-margin-top: .25rem !default;\n\n$form-check-input-gutter: 1.25rem !default;\n$form-check-input-margin-y: .3rem !default;\n$form-check-input-margin-x: .25rem !default;\n\n$form-check-inline-margin-x: .75rem !default;\n$form-check-inline-input-margin-x: .3125rem !default;\n\n$form-grid-gutter-width: 10px !default;\n$form-group-margin-bottom: 1rem !default;\n\n$input-group-addon-color: $input-color !default;\n$input-group-addon-bg: $gray-200 !default;\n$input-group-addon-border-color: $input-border-color !default;\n\n$custom-forms-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$custom-control-gutter: .5rem !default;\n$custom-control-spacer-x: 1rem !default;\n$custom-control-cursor: null !default;\n\n$custom-control-indicator-size: 1rem !default;\n$custom-control-indicator-bg: $input-bg !default;\n\n$custom-control-indicator-bg-size: 50% 50% !default;\n$custom-control-indicator-box-shadow: $input-box-shadow !default;\n$custom-control-indicator-border-color: $gray-500 !default;\n$custom-control-indicator-border-width: $input-border-width !default;\n\n$custom-control-label-color: null !default;\n\n$custom-control-indicator-disabled-bg: $input-disabled-bg !default;\n$custom-control-label-disabled-color: $gray-600 !default;\n\n$custom-control-indicator-checked-color: $component-active-color !default;\n$custom-control-indicator-checked-bg: $component-active-bg !default;\n$custom-control-indicator-checked-disabled-bg: rgba(theme-color(\"primary\"), .5) !default;\n$custom-control-indicator-checked-box-shadow: null !default;\n$custom-control-indicator-checked-border-color: $custom-control-indicator-checked-bg !default;\n\n$custom-control-indicator-focus-box-shadow: $input-focus-box-shadow !default;\n$custom-control-indicator-focus-border-color: $input-focus-border-color !default;\n\n$custom-control-indicator-active-color: $component-active-color !default;\n$custom-control-indicator-active-bg: lighten($component-active-bg, 35%) !default;\n$custom-control-indicator-active-box-shadow: null !default;\n$custom-control-indicator-active-border-color: $custom-control-indicator-active-bg !default;\n\n$custom-checkbox-indicator-border-radius: $border-radius !default;\n$custom-checkbox-indicator-icon-checked: url(\"data:image/svg+xml,\") !default;\n\n$custom-checkbox-indicator-indeterminate-bg: $component-active-bg !default;\n$custom-checkbox-indicator-indeterminate-color: $custom-control-indicator-checked-color !default;\n$custom-checkbox-indicator-icon-indeterminate: url(\"data:image/svg+xml,\") !default;\n$custom-checkbox-indicator-indeterminate-box-shadow: null !default;\n$custom-checkbox-indicator-indeterminate-border-color: $custom-checkbox-indicator-indeterminate-bg !default;\n\n$custom-radio-indicator-border-radius: 50% !default;\n$custom-radio-indicator-icon-checked: url(\"data:image/svg+xml,\") !default;\n\n$custom-switch-width: $custom-control-indicator-size * 1.75 !default;\n$custom-switch-indicator-border-radius: $custom-control-indicator-size / 2 !default;\n$custom-switch-indicator-size: subtract($custom-control-indicator-size, $custom-control-indicator-border-width * 4) !default;\n\n$custom-select-padding-y: $input-padding-y !default;\n$custom-select-padding-x: $input-padding-x !default;\n$custom-select-font-family: $input-font-family !default;\n$custom-select-font-size: $input-font-size !default;\n$custom-select-height: $input-height !default;\n$custom-select-indicator-padding: 1rem !default; // Extra padding to account for the presence of the background-image based indicator\n$custom-select-font-weight: $input-font-weight !default;\n$custom-select-line-height: $input-line-height !default;\n$custom-select-color: $input-color !default;\n$custom-select-disabled-color: $gray-600 !default;\n$custom-select-bg: $input-bg !default;\n$custom-select-disabled-bg: $gray-200 !default;\n$custom-select-bg-size: 8px 10px !default; // In pixels because image dimensions\n$custom-select-indicator-color: $gray-800 !default;\n$custom-select-indicator: url(\"data:image/svg+xml,\") !default;\n$custom-select-background: escape-svg($custom-select-indicator) no-repeat right $custom-select-padding-x center / $custom-select-bg-size !default; // Used so we can have multiple background elements (e.g., arrow and feedback icon)\n\n$custom-select-feedback-icon-padding-right: add(1em * .75, (2 * $custom-select-padding-y * .75) + $custom-select-padding-x + $custom-select-indicator-padding) !default;\n$custom-select-feedback-icon-position: center right ($custom-select-padding-x + $custom-select-indicator-padding) !default;\n$custom-select-feedback-icon-size: $input-height-inner-half $input-height-inner-half !default;\n\n$custom-select-border-width: $input-border-width !default;\n$custom-select-border-color: $input-border-color !default;\n$custom-select-border-radius: $border-radius !default;\n$custom-select-box-shadow: inset 0 1px 2px rgba($black, .075) !default;\n\n$custom-select-focus-border-color: $input-focus-border-color !default;\n$custom-select-focus-width: $input-focus-width !default;\n$custom-select-focus-box-shadow: 0 0 0 $custom-select-focus-width $input-btn-focus-color !default;\n\n$custom-select-padding-y-sm: $input-padding-y-sm !default;\n$custom-select-padding-x-sm: $input-padding-x-sm !default;\n$custom-select-font-size-sm: $input-font-size-sm !default;\n$custom-select-height-sm: $input-height-sm !default;\n\n$custom-select-padding-y-lg: $input-padding-y-lg !default;\n$custom-select-padding-x-lg: $input-padding-x-lg !default;\n$custom-select-font-size-lg: $input-font-size-lg !default;\n$custom-select-height-lg: $input-height-lg !default;\n\n$custom-range-track-width: 100% !default;\n$custom-range-track-height: .5rem !default;\n$custom-range-track-cursor: pointer !default;\n$custom-range-track-bg: $gray-300 !default;\n$custom-range-track-border-radius: 1rem !default;\n$custom-range-track-box-shadow: inset 0 .25rem .25rem rgba($black, .1) !default;\n\n$custom-range-thumb-width: 1rem !default;\n$custom-range-thumb-height: $custom-range-thumb-width !default;\n$custom-range-thumb-bg: $component-active-bg !default;\n$custom-range-thumb-border: 0 !default;\n$custom-range-thumb-border-radius: 1rem !default;\n$custom-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;\n$custom-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, $input-focus-box-shadow !default;\n$custom-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in IE/Edge\n$custom-range-thumb-active-bg: lighten($component-active-bg, 35%) !default;\n$custom-range-thumb-disabled-bg: $gray-500 !default;\n\n$custom-file-height: $input-height !default;\n$custom-file-height-inner: $input-height-inner !default;\n$custom-file-focus-border-color: $input-focus-border-color !default;\n$custom-file-focus-box-shadow: $input-focus-box-shadow !default;\n$custom-file-disabled-bg: $input-disabled-bg !default;\n\n$custom-file-padding-y: $input-padding-y !default;\n$custom-file-padding-x: $input-padding-x !default;\n$custom-file-line-height: $input-line-height !default;\n$custom-file-font-family: $input-font-family !default;\n$custom-file-font-weight: $input-font-weight !default;\n$custom-file-color: $input-color !default;\n$custom-file-bg: $input-bg !default;\n$custom-file-border-width: $input-border-width !default;\n$custom-file-border-color: $input-border-color !default;\n$custom-file-border-radius: $input-border-radius !default;\n$custom-file-box-shadow: $input-box-shadow !default;\n$custom-file-button-color: $custom-file-color !default;\n$custom-file-button-bg: $input-group-addon-bg !default;\n$custom-file-text: (\n en: \"Browse\"\n) !default;\n\n\n// Form validation\n\n$form-feedback-margin-top: $form-text-margin-top !default;\n$form-feedback-font-size: $small-font-size !default;\n$form-feedback-valid-color: theme-color(\"success\") !default;\n$form-feedback-invalid-color: theme-color(\"danger\") !default;\n\n$form-feedback-icon-valid-color: $form-feedback-valid-color !default;\n$form-feedback-icon-valid: url(\"data:image/svg+xml,\") !default;\n$form-feedback-icon-invalid-color: $form-feedback-invalid-color !default;\n$form-feedback-icon-invalid: url(\"data:image/svg+xml,\") !default;\n\n$form-validation-states: () !default;\n$form-validation-states: map-merge(\n (\n \"valid\": (\n \"color\": $form-feedback-valid-color,\n \"icon\": $form-feedback-icon-valid\n ),\n \"invalid\": (\n \"color\": $form-feedback-invalid-color,\n \"icon\": $form-feedback-icon-invalid\n ),\n ),\n $form-validation-states\n);\n\n// Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n\n$zindex-dropdown: 1000 !default;\n$zindex-sticky: 1020 !default;\n$zindex-fixed: 1030 !default;\n$zindex-modal-backdrop: 1040 !default;\n$zindex-modal: 1050 !default;\n$zindex-popover: 1060 !default;\n$zindex-tooltip: 1070 !default;\n\n\n// Navs\n\n$nav-link-padding-y: .5rem !default;\n$nav-link-padding-x: 1rem !default;\n$nav-link-disabled-color: $gray-600 !default;\n\n$nav-tabs-border-color: $gray-300 !default;\n$nav-tabs-border-width: $border-width !default;\n$nav-tabs-border-radius: $border-radius !default;\n$nav-tabs-link-hover-border-color: $gray-200 $gray-200 $nav-tabs-border-color !default;\n$nav-tabs-link-active-color: $gray-700 !default;\n$nav-tabs-link-active-bg: $body-bg !default;\n$nav-tabs-link-active-border-color: $gray-300 $gray-300 $nav-tabs-link-active-bg !default;\n\n$nav-pills-border-radius: $border-radius !default;\n$nav-pills-link-active-color: $component-active-color !default;\n$nav-pills-link-active-bg: $component-active-bg !default;\n\n$nav-divider-color: $gray-200 !default;\n$nav-divider-margin-y: $spacer / 2 !default;\n\n\n// Navbar\n\n$navbar-padding-y: $spacer / 2 !default;\n$navbar-padding-x: $spacer !default;\n\n$navbar-nav-link-padding-x: .5rem !default;\n\n$navbar-brand-font-size: $font-size-lg !default;\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\n$nav-link-height: $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default;\n$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default;\n$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) / 2 !default;\n\n$navbar-toggler-padding-y: .25rem !default;\n$navbar-toggler-padding-x: .75rem !default;\n$navbar-toggler-font-size: $font-size-lg !default;\n$navbar-toggler-border-radius: $btn-border-radius !default;\n\n$navbar-dark-color: rgba($white, .5) !default;\n$navbar-dark-hover-color: rgba($white, .75) !default;\n$navbar-dark-active-color: $white !default;\n$navbar-dark-disabled-color: rgba($white, .25) !default;\n$navbar-dark-toggler-icon-bg: url(\"data:image/svg+xml,\") !default;\n$navbar-dark-toggler-border-color: rgba($white, .1) !default;\n\n$navbar-light-color: rgba($black, .5) !default;\n$navbar-light-hover-color: rgba($black, .7) !default;\n$navbar-light-active-color: rgba($black, .9) !default;\n$navbar-light-disabled-color: rgba($black, .3) !default;\n$navbar-light-toggler-icon-bg: url(\"data:image/svg+xml,\") !default;\n$navbar-light-toggler-border-color: rgba($black, .1) !default;\n\n$navbar-light-brand-color: $navbar-light-active-color !default;\n$navbar-light-brand-hover-color: $navbar-light-active-color !default;\n$navbar-dark-brand-color: $navbar-dark-active-color !default;\n$navbar-dark-brand-hover-color: $navbar-dark-active-color !default;\n\n\n// Dropdowns\n//\n// Dropdown menu container and contents.\n\n$dropdown-min-width: 10rem !default;\n$dropdown-padding-x: 0 !default;\n$dropdown-padding-y: .5rem !default;\n$dropdown-spacer: .125rem !default;\n$dropdown-font-size: $font-size-base !default;\n$dropdown-color: $body-color !default;\n$dropdown-bg: $white !default;\n$dropdown-border-color: rgba($black, .15) !default;\n$dropdown-border-radius: $border-radius !default;\n$dropdown-border-width: $border-width !default;\n$dropdown-inner-border-radius: subtract($dropdown-border-radius, $dropdown-border-width) !default;\n$dropdown-divider-bg: $gray-200 !default;\n$dropdown-divider-margin-y: $nav-divider-margin-y !default;\n$dropdown-box-shadow: 0 .5rem 1rem rgba($black, .175) !default;\n\n$dropdown-link-color: $gray-900 !default;\n$dropdown-link-hover-color: darken($gray-900, 5%) !default;\n$dropdown-link-hover-bg: $gray-100 !default;\n\n$dropdown-link-active-color: $component-active-color !default;\n$dropdown-link-active-bg: $component-active-bg !default;\n\n$dropdown-link-disabled-color: $gray-600 !default;\n\n$dropdown-item-padding-y: .25rem !default;\n$dropdown-item-padding-x: 1.5rem !default;\n\n$dropdown-header-color: $gray-600 !default;\n$dropdown-header-padding: $dropdown-padding-y $dropdown-item-padding-x !default;\n\n\n// Pagination\n\n$pagination-padding-y: .5rem !default;\n$pagination-padding-x: .75rem !default;\n$pagination-padding-y-sm: .25rem !default;\n$pagination-padding-x-sm: .5rem !default;\n$pagination-padding-y-lg: .75rem !default;\n$pagination-padding-x-lg: 1.5rem !default;\n$pagination-line-height: 1.25 !default;\n\n$pagination-color: $link-color !default;\n$pagination-bg: $white !default;\n$pagination-border-width: $border-width !default;\n$pagination-border-color: $gray-300 !default;\n\n$pagination-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$pagination-focus-outline: 0 !default;\n\n$pagination-hover-color: $link-hover-color !default;\n$pagination-hover-bg: $gray-200 !default;\n$pagination-hover-border-color: $gray-300 !default;\n\n$pagination-active-color: $component-active-color !default;\n$pagination-active-bg: $component-active-bg !default;\n$pagination-active-border-color: $pagination-active-bg !default;\n\n$pagination-disabled-color: $gray-600 !default;\n$pagination-disabled-bg: $white !default;\n$pagination-disabled-border-color: $gray-300 !default;\n\n\n// Jumbotron\n\n$jumbotron-padding: 2rem !default;\n$jumbotron-color: null !default;\n$jumbotron-bg: $gray-200 !default;\n\n\n// Cards\n\n$card-spacer-y: .75rem !default;\n$card-spacer-x: 1.25rem !default;\n$card-border-width: $border-width !default;\n$card-border-radius: $border-radius !default;\n$card-border-color: rgba($black, .125) !default;\n$card-inner-border-radius: subtract($card-border-radius, $card-border-width) !default;\n$card-cap-bg: rgba($black, .03) !default;\n$card-cap-color: null !default;\n$card-height: null !default;\n$card-color: null !default;\n$card-bg: $white !default;\n\n$card-img-overlay-padding: 1.25rem !default;\n\n$card-group-margin: $grid-gutter-width / 2 !default;\n$card-deck-margin: $card-group-margin !default;\n\n$card-columns-count: 3 !default;\n$card-columns-gap: 1.25rem !default;\n$card-columns-margin: $card-spacer-y !default;\n\n\n// Tooltips\n\n$tooltip-font-size: $font-size-sm !default;\n$tooltip-max-width: 200px !default;\n$tooltip-color: $white !default;\n$tooltip-bg: $black !default;\n$tooltip-border-radius: $border-radius !default;\n$tooltip-opacity: .9 !default;\n$tooltip-padding-y: .25rem !default;\n$tooltip-padding-x: .5rem !default;\n$tooltip-margin: 0 !default;\n\n$tooltip-arrow-width: .8rem !default;\n$tooltip-arrow-height: .4rem !default;\n$tooltip-arrow-color: $tooltip-bg !default;\n\n// Form tooltips must come after regular tooltips\n$form-feedback-tooltip-padding-y: $tooltip-padding-y !default;\n$form-feedback-tooltip-padding-x: $tooltip-padding-x !default;\n$form-feedback-tooltip-font-size: $tooltip-font-size !default;\n$form-feedback-tooltip-line-height: $line-height-base !default;\n$form-feedback-tooltip-opacity: $tooltip-opacity !default;\n$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;\n\n\n// Popovers\n\n$popover-font-size: $font-size-sm !default;\n$popover-bg: $white !default;\n$popover-max-width: 276px !default;\n$popover-border-width: $border-width !default;\n$popover-border-color: rgba($black, .2) !default;\n$popover-border-radius: $border-radius-lg !default;\n$popover-inner-border-radius: subtract($popover-border-radius, $popover-border-width) !default;\n$popover-box-shadow: 0 .25rem .5rem rgba($black, .2) !default;\n\n$popover-header-bg: darken($popover-bg, 3%) !default;\n$popover-header-color: $headings-color !default;\n$popover-header-padding-y: .5rem !default;\n$popover-header-padding-x: .75rem !default;\n\n$popover-body-color: $body-color !default;\n$popover-body-padding-y: $popover-header-padding-y !default;\n$popover-body-padding-x: $popover-header-padding-x !default;\n\n$popover-arrow-width: 1rem !default;\n$popover-arrow-height: .5rem !default;\n$popover-arrow-color: $popover-bg !default;\n\n$popover-arrow-outer-color: fade-in($popover-border-color, .05) !default;\n\n\n// Toasts\n\n$toast-max-width: 350px !default;\n$toast-padding-x: .75rem !default;\n$toast-padding-y: .25rem !default;\n$toast-font-size: .875rem !default;\n$toast-color: null !default;\n$toast-background-color: rgba($white, .85) !default;\n$toast-border-width: 1px !default;\n$toast-border-color: rgba(0, 0, 0, .1) !default;\n$toast-border-radius: .25rem !default;\n$toast-box-shadow: 0 .25rem .75rem rgba($black, .1) !default;\n\n$toast-header-color: $gray-600 !default;\n$toast-header-background-color: rgba($white, .85) !default;\n$toast-header-border-color: rgba(0, 0, 0, .05) !default;\n\n\n// Badges\n\n$badge-font-size: 75% !default;\n$badge-font-weight: $font-weight-bold !default;\n$badge-padding-y: .25em !default;\n$badge-padding-x: .4em !default;\n$badge-border-radius: $border-radius !default;\n\n$badge-transition: $btn-transition !default;\n$badge-focus-width: $input-btn-focus-width !default;\n\n$badge-pill-padding-x: .6em !default;\n// Use a higher than normal value to ensure completely rounded edges when\n// customizing padding or font-size on labels.\n$badge-pill-border-radius: 10rem !default;\n\n\n// Modals\n\n// Padding applied to the modal body\n$modal-inner-padding: 1rem !default;\n\n// Margin between elements in footer, must be lower than or equal to 2 * $modal-inner-padding\n$modal-footer-margin-between: .5rem !default;\n\n$modal-dialog-margin: .5rem !default;\n$modal-dialog-margin-y-sm-up: 1.75rem !default;\n\n$modal-title-line-height: $line-height-base !default;\n\n$modal-content-color: null !default;\n$modal-content-bg: $white !default;\n$modal-content-border-color: rgba($black, .2) !default;\n$modal-content-border-width: $border-width !default;\n$modal-content-border-radius: $border-radius-lg !default;\n$modal-content-inner-border-radius: subtract($modal-content-border-radius, $modal-content-border-width) !default;\n$modal-content-box-shadow-xs: 0 .25rem .5rem rgba($black, .5) !default;\n$modal-content-box-shadow-sm-up: 0 .5rem 1rem rgba($black, .5) !default;\n\n$modal-backdrop-bg: $black !default;\n$modal-backdrop-opacity: .5 !default;\n$modal-header-border-color: $border-color !default;\n$modal-footer-border-color: $modal-header-border-color !default;\n$modal-header-border-width: $modal-content-border-width !default;\n$modal-footer-border-width: $modal-header-border-width !default;\n$modal-header-padding-y: 1rem !default;\n$modal-header-padding-x: 1rem !default;\n$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility\n\n$modal-xl: 1140px !default;\n$modal-lg: 800px !default;\n$modal-md: 500px !default;\n$modal-sm: 300px !default;\n\n$modal-fade-transform: translate(0, -50px) !default;\n$modal-show-transform: none !default;\n$modal-transition: transform .3s ease-out !default;\n$modal-scale-transform: scale(1.02) !default;\n\n\n// Alerts\n//\n// Define alert colors, border radius, and padding.\n\n$alert-padding-y: .75rem !default;\n$alert-padding-x: 1.25rem !default;\n$alert-margin-bottom: 1rem !default;\n$alert-border-radius: $border-radius !default;\n$alert-link-font-weight: $font-weight-bold !default;\n$alert-border-width: $border-width !default;\n\n$alert-bg-level: -10 !default;\n$alert-border-level: -9 !default;\n$alert-color-level: 6 !default;\n\n\n// Progress bars\n\n$progress-height: 1rem !default;\n$progress-font-size: $font-size-base * .75 !default;\n$progress-bg: $gray-200 !default;\n$progress-border-radius: $border-radius !default;\n$progress-box-shadow: inset 0 .1rem .1rem rgba($black, .1) !default;\n$progress-bar-color: $white !default;\n$progress-bar-bg: theme-color(\"primary\") !default;\n$progress-bar-animation-timing: 1s linear infinite !default;\n$progress-bar-transition: width .6s ease !default;\n\n\n// List group\n\n$list-group-color: null !default;\n$list-group-bg: $white !default;\n$list-group-border-color: rgba($black, .125) !default;\n$list-group-border-width: $border-width !default;\n$list-group-border-radius: $border-radius !default;\n\n$list-group-item-padding-y: .75rem !default;\n$list-group-item-padding-x: 1.25rem !default;\n\n$list-group-hover-bg: $gray-100 !default;\n$list-group-active-color: $component-active-color !default;\n$list-group-active-bg: $component-active-bg !default;\n$list-group-active-border-color: $list-group-active-bg !default;\n\n$list-group-disabled-color: $gray-600 !default;\n$list-group-disabled-bg: $list-group-bg !default;\n\n$list-group-action-color: $gray-700 !default;\n$list-group-action-hover-color: $list-group-action-color !default;\n\n$list-group-action-active-color: $body-color !default;\n$list-group-action-active-bg: $gray-200 !default;\n\n\n// Image thumbnails\n\n$thumbnail-padding: .25rem !default;\n$thumbnail-bg: $body-bg !default;\n$thumbnail-border-width: $border-width !default;\n$thumbnail-border-color: $gray-300 !default;\n$thumbnail-border-radius: $border-radius !default;\n$thumbnail-box-shadow: 0 1px 2px rgba($black, .075) !default;\n\n\n// Figures\n\n$figure-caption-font-size: 90% !default;\n$figure-caption-color: $gray-600 !default;\n\n\n// Breadcrumbs\n\n$breadcrumb-font-size: null !default;\n\n$breadcrumb-padding-y: .75rem !default;\n$breadcrumb-padding-x: 1rem !default;\n$breadcrumb-item-padding: .5rem !default;\n\n$breadcrumb-margin-bottom: 1rem !default;\n\n$breadcrumb-bg: $gray-200 !default;\n$breadcrumb-divider-color: $gray-600 !default;\n$breadcrumb-active-color: $gray-600 !default;\n$breadcrumb-divider: quote(\"/\") !default;\n\n$breadcrumb-border-radius: $border-radius !default;\n\n\n// Carousel\n\n$carousel-control-color: $white !default;\n$carousel-control-width: 15% !default;\n$carousel-control-opacity: .5 !default;\n$carousel-control-hover-opacity: .9 !default;\n$carousel-control-transition: opacity .15s ease !default;\n\n$carousel-indicator-width: 30px !default;\n$carousel-indicator-height: 3px !default;\n$carousel-indicator-hit-area-height: 10px !default;\n$carousel-indicator-spacer: 3px !default;\n$carousel-indicator-active-bg: $white !default;\n$carousel-indicator-transition: opacity .6s ease !default;\n\n$carousel-caption-width: 70% !default;\n$carousel-caption-color: $white !default;\n\n$carousel-control-icon-width: 20px !default;\n\n$carousel-control-prev-icon-bg: url(\"data:image/svg+xml,\") !default;\n$carousel-control-next-icon-bg: url(\"data:image/svg+xml,\") !default;\n\n$carousel-transition-duration: .6s !default;\n$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)\n\n\n// Spinners\n\n$spinner-width: 2rem !default;\n$spinner-height: $spinner-width !default;\n$spinner-border-width: .25em !default;\n\n$spinner-width-sm: 1rem !default;\n$spinner-height-sm: $spinner-width-sm !default;\n$spinner-border-width-sm: .2em !default;\n\n\n// Close\n\n$close-font-size: $font-size-base * 1.5 !default;\n$close-font-weight: $font-weight-bold !default;\n$close-color: $black !default;\n$close-text-shadow: 0 1px 0 $white !default;\n\n\n// Code\n\n$code-font-size: 87.5% !default;\n$code-color: $pink !default;\n\n$kbd-padding-y: .2rem !default;\n$kbd-padding-x: .4rem !default;\n$kbd-font-size: $code-font-size !default;\n$kbd-color: $white !default;\n$kbd-bg: $gray-900 !default;\n\n$pre-color: $gray-900 !default;\n$pre-scrollable-max-height: 340px !default;\n\n\n// Utilities\n\n$displays: none, inline, inline-block, block, table, table-row, table-cell, flex, inline-flex !default;\n$overflows: auto, hidden !default;\n$positions: static, relative, absolute, fixed, sticky !default;\n$user-selects: all, auto, none !default;\n\n\n// Printing\n\n$print-page-size: a3 !default;\n$print-body-min-width: map-get($grid-breakpoints, \"lg\") !default;\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n // Common properties for all breakpoints\n %grid-column {\n position: relative;\n width: 100%;\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n }\n\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @if $columns > 0 {\n // Allow columns to stretch full width below their breakpoints\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @extend %grid-column;\n }\n }\n }\n\n .col#{$infix},\n .col#{$infix}-auto {\n @extend %grid-column;\n }\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n\n @if $grid-row-columns > 0 {\n @for $i from 1 through $grid-row-columns {\n .row-cols#{$infix}-#{$i} {\n @include row-cols($i);\n }\n }\n }\n\n .col#{$infix}-auto {\n @include make-col-auto();\n }\n\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n }\n\n .order#{$infix}-first { order: -1; }\n\n .order#{$infix}-last { order: $columns + 1; }\n\n @for $i from 0 through $columns {\n .order#{$infix}-#{$i} { order: $i; }\n }\n\n @if $columns > 0 {\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n }\n }\n}\n","// stylelint-disable declaration-no-important\n\n//\n// Utilities for common `display` values\n//\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @each $value in $displays {\n .d#{$infix}-#{$value} { display: $value !important; }\n }\n }\n}\n\n\n//\n// Utilities for toggling `display` in print\n//\n\n@media print {\n @each $value in $displays {\n .d-print-#{$value} { display: $value !important; }\n }\n}\n","// stylelint-disable declaration-no-important\n\n// Flex variation\n//\n// Custom styles for additional flex alignment options.\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .flex#{$infix}-row { flex-direction: row !important; }\n .flex#{$infix}-column { flex-direction: column !important; }\n .flex#{$infix}-row-reverse { flex-direction: row-reverse !important; }\n .flex#{$infix}-column-reverse { flex-direction: column-reverse !important; }\n\n .flex#{$infix}-wrap { flex-wrap: wrap !important; }\n .flex#{$infix}-nowrap { flex-wrap: nowrap !important; }\n .flex#{$infix}-wrap-reverse { flex-wrap: wrap-reverse !important; }\n .flex#{$infix}-fill { flex: 1 1 auto !important; }\n .flex#{$infix}-grow-0 { flex-grow: 0 !important; }\n .flex#{$infix}-grow-1 { flex-grow: 1 !important; }\n .flex#{$infix}-shrink-0 { flex-shrink: 0 !important; }\n .flex#{$infix}-shrink-1 { flex-shrink: 1 !important; }\n\n .justify-content#{$infix}-start { justify-content: flex-start !important; }\n .justify-content#{$infix}-end { justify-content: flex-end !important; }\n .justify-content#{$infix}-center { justify-content: center !important; }\n .justify-content#{$infix}-between { justify-content: space-between !important; }\n .justify-content#{$infix}-around { justify-content: space-around !important; }\n\n .align-items#{$infix}-start { align-items: flex-start !important; }\n .align-items#{$infix}-end { align-items: flex-end !important; }\n .align-items#{$infix}-center { align-items: center !important; }\n .align-items#{$infix}-baseline { align-items: baseline !important; }\n .align-items#{$infix}-stretch { align-items: stretch !important; }\n\n .align-content#{$infix}-start { align-content: flex-start !important; }\n .align-content#{$infix}-end { align-content: flex-end !important; }\n .align-content#{$infix}-center { align-content: center !important; }\n .align-content#{$infix}-between { align-content: space-between !important; }\n .align-content#{$infix}-around { align-content: space-around !important; }\n .align-content#{$infix}-stretch { align-content: stretch !important; }\n\n .align-self#{$infix}-auto { align-self: auto !important; }\n .align-self#{$infix}-start { align-self: flex-start !important; }\n .align-self#{$infix}-end { align-self: flex-end !important; }\n .align-self#{$infix}-center { align-self: center !important; }\n .align-self#{$infix}-baseline { align-self: baseline !important; }\n .align-self#{$infix}-stretch { align-self: stretch !important; }\n }\n}\n","// stylelint-disable declaration-no-important\n\n// Margin and Padding\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @each $prop, $abbrev in (margin: m, padding: p) {\n @each $size, $length in $spacers {\n .#{$abbrev}#{$infix}-#{$size} { #{$prop}: $length !important; }\n .#{$abbrev}t#{$infix}-#{$size},\n .#{$abbrev}y#{$infix}-#{$size} {\n #{$prop}-top: $length !important;\n }\n .#{$abbrev}r#{$infix}-#{$size},\n .#{$abbrev}x#{$infix}-#{$size} {\n #{$prop}-right: $length !important;\n }\n .#{$abbrev}b#{$infix}-#{$size},\n .#{$abbrev}y#{$infix}-#{$size} {\n #{$prop}-bottom: $length !important;\n }\n .#{$abbrev}l#{$infix}-#{$size},\n .#{$abbrev}x#{$infix}-#{$size} {\n #{$prop}-left: $length !important;\n }\n }\n }\n\n // Negative margins (e.g., where `.mb-n1` is negative version of `.mb-1`)\n @each $size, $length in $spacers {\n @if $size != 0 {\n .m#{$infix}-n#{$size} { margin: -$length !important; }\n .mt#{$infix}-n#{$size},\n .my#{$infix}-n#{$size} {\n margin-top: -$length !important;\n }\n .mr#{$infix}-n#{$size},\n .mx#{$infix}-n#{$size} {\n margin-right: -$length !important;\n }\n .mb#{$infix}-n#{$size},\n .my#{$infix}-n#{$size} {\n margin-bottom: -$length !important;\n }\n .ml#{$infix}-n#{$size},\n .mx#{$infix}-n#{$size} {\n margin-left: -$length !important;\n }\n }\n }\n\n // Some special margin utils\n .m#{$infix}-auto { margin: auto !important; }\n .mt#{$infix}-auto,\n .my#{$infix}-auto {\n margin-top: auto !important;\n }\n .mr#{$infix}-auto,\n .mx#{$infix}-auto {\n margin-right: auto !important;\n }\n .mb#{$infix}-auto,\n .my#{$infix}-auto {\n margin-bottom: auto !important;\n }\n .ml#{$infix}-auto,\n .mx#{$infix}-auto {\n margin-left: auto !important;\n }\n }\n}\n"]} \ No newline at end of file diff --git a/javascript-practice/simple-side-bar/vendor/bootstrap/css/bootstrap-grid.min.css b/javascript-practice/simple-side-bar/vendor/bootstrap/css/bootstrap-grid.min.css deleted file mode 100644 index d323f93..0000000 --- a/javascript-practice/simple-side-bar/vendor/bootstrap/css/bootstrap-grid.min.css +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap Grid v4.5.3 (https://getbootstrap.com/) - * Copyright 2011-2020 The Bootstrap Authors - * Copyright 2011-2020 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */html{box-sizing:border-box;-ms-overflow-style:scrollbar}*,::after,::before{box-sizing:inherit}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.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-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.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-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.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-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-sm-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-sm-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-md-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-md-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-md-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-md-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-md-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-md-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-lg-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-lg-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-xl-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-xl-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}} -/*# sourceMappingURL=bootstrap-grid.min.css.map */ \ No newline at end of file diff --git a/javascript-practice/simple-side-bar/vendor/bootstrap/css/bootstrap-grid.min.css.map b/javascript-practice/simple-side-bar/vendor/bootstrap/css/bootstrap-grid.min.css.map deleted file mode 100644 index 9c96ff3..0000000 --- a/javascript-practice/simple-side-bar/vendor/bootstrap/css/bootstrap-grid.min.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../../scss/bootstrap-grid.scss","dist/css/bootstrap-grid.css","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_breakpoints.scss","../../scss/mixins/_grid-framework.scss","../../scss/utilities/_display.scss","../../scss/utilities/_flex.scss","../../scss/utilities/_spacing.scss"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Bootstrap Grid v4.5.3 (https://getbootstrap.com/)\n * Copyright 2011-2020 The Bootstrap Authors\n * Copyright 2011-2020 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n\nhtml {\n box-sizing: border-box;\n -ms-overflow-style: scrollbar;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit;\n}\n\n@import \"functions\";\n@import \"variables\";\n\n@import \"mixins/breakpoints\";\n@import \"mixins/grid-framework\";\n@import \"mixins/grid\";\n\n@import \"grid\";\n@import \"utilities/display\";\n@import \"utilities/flex\";\n@import \"utilities/spacing\";\n","/*!\n * Bootstrap Grid v4.5.3 (https://getbootstrap.com/)\n * Copyright 2011-2020 The Bootstrap Authors\n * Copyright 2011-2020 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\nhtml {\n box-sizing: border-box;\n -ms-overflow-style: scrollbar;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit;\n}\n\n.container,\n.container-fluid,\n.container-sm,\n.container-md,\n.container-lg,\n.container-xl {\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 576px) {\n .container, .container-sm {\n max-width: 540px;\n }\n}\n\n@media (min-width: 768px) {\n .container, .container-sm, .container-md {\n max-width: 720px;\n }\n}\n\n@media (min-width: 992px) {\n .container, .container-sm, .container-md, .container-lg {\n max-width: 960px;\n }\n}\n\n@media (min-width: 1200px) {\n .container, .container-sm, .container-md, .container-lg, .container-xl {\n max-width: 1140px;\n }\n}\n\n.row {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n margin-right: -15px;\n margin-left: -15px;\n}\n\n.no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .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, .col-sm,\n.col-sm-auto, .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, .col-md,\n.col-md-auto, .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, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto {\n position: relative;\n width: 100%;\n padding-right: 15px;\n padding-left: 15px;\n}\n\n.col {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n}\n\n.row-cols-1 > * {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n}\n\n.row-cols-2 > * {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n}\n\n.row-cols-3 > * {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n}\n\n.row-cols-4 > * {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n}\n\n.row-cols-5 > * {\n -ms-flex: 0 0 20%;\n flex: 0 0 20%;\n max-width: 20%;\n}\n\n.row-cols-6 > * {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n}\n\n.col-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n}\n\n.col-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n}\n\n.col-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n}\n\n.col-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n}\n\n.col-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n}\n\n.col-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n}\n\n.col-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n}\n\n.col-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n}\n\n.col-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n}\n\n.col-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n}\n\n.col-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n}\n\n.col-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n}\n\n.col-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n}\n\n.order-first {\n -ms-flex-order: -1;\n order: -1;\n}\n\n.order-last {\n -ms-flex-order: 13;\n order: 13;\n}\n\n.order-0 {\n -ms-flex-order: 0;\n order: 0;\n}\n\n.order-1 {\n -ms-flex-order: 1;\n order: 1;\n}\n\n.order-2 {\n -ms-flex-order: 2;\n order: 2;\n}\n\n.order-3 {\n -ms-flex-order: 3;\n order: 3;\n}\n\n.order-4 {\n -ms-flex-order: 4;\n order: 4;\n}\n\n.order-5 {\n -ms-flex-order: 5;\n order: 5;\n}\n\n.order-6 {\n -ms-flex-order: 6;\n order: 6;\n}\n\n.order-7 {\n -ms-flex-order: 7;\n order: 7;\n}\n\n.order-8 {\n -ms-flex-order: 8;\n order: 8;\n}\n\n.order-9 {\n -ms-flex-order: 9;\n order: 9;\n}\n\n.order-10 {\n -ms-flex-order: 10;\n order: 10;\n}\n\n.order-11 {\n -ms-flex-order: 11;\n order: 11;\n}\n\n.order-12 {\n -ms-flex-order: 12;\n order: 12;\n}\n\n.offset-1 {\n margin-left: 8.333333%;\n}\n\n.offset-2 {\n margin-left: 16.666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.333333%;\n}\n\n.offset-5 {\n margin-left: 41.666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.333333%;\n}\n\n.offset-8 {\n margin-left: 66.666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.333333%;\n}\n\n.offset-11 {\n margin-left: 91.666667%;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .row-cols-sm-1 > * {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .row-cols-sm-2 > * {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .row-cols-sm-3 > * {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .row-cols-sm-4 > * {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .row-cols-sm-5 > * {\n -ms-flex: 0 0 20%;\n flex: 0 0 20%;\n max-width: 20%;\n }\n .row-cols-sm-6 > * {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-sm-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-sm-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-sm-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-sm-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-sm-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-sm-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-sm-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-sm-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-sm-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-sm-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-sm-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-sm-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-sm-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-sm-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-sm-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-sm-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-sm-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-sm-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-sm-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-sm-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-sm-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-sm-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-sm-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-sm-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-sm-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-sm-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-sm-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-sm-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-sm-0 {\n margin-left: 0;\n }\n .offset-sm-1 {\n margin-left: 8.333333%;\n }\n .offset-sm-2 {\n margin-left: 16.666667%;\n }\n .offset-sm-3 {\n margin-left: 25%;\n }\n .offset-sm-4 {\n margin-left: 33.333333%;\n }\n .offset-sm-5 {\n margin-left: 41.666667%;\n }\n .offset-sm-6 {\n margin-left: 50%;\n }\n .offset-sm-7 {\n margin-left: 58.333333%;\n }\n .offset-sm-8 {\n margin-left: 66.666667%;\n }\n .offset-sm-9 {\n margin-left: 75%;\n }\n .offset-sm-10 {\n margin-left: 83.333333%;\n }\n .offset-sm-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 768px) {\n .col-md {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .row-cols-md-1 > * {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .row-cols-md-2 > * {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .row-cols-md-3 > * {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .row-cols-md-4 > * {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .row-cols-md-5 > * {\n -ms-flex: 0 0 20%;\n flex: 0 0 20%;\n max-width: 20%;\n }\n .row-cols-md-6 > * {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-md-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-md-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-md-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-md-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-md-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-md-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-md-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-md-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-md-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-md-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-md-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-md-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-md-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-md-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-md-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-md-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-md-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-md-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-md-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-md-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-md-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-md-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-md-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-md-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-md-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-md-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-md-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-md-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-md-0 {\n margin-left: 0;\n }\n .offset-md-1 {\n margin-left: 8.333333%;\n }\n .offset-md-2 {\n margin-left: 16.666667%;\n }\n .offset-md-3 {\n margin-left: 25%;\n }\n .offset-md-4 {\n margin-left: 33.333333%;\n }\n .offset-md-5 {\n margin-left: 41.666667%;\n }\n .offset-md-6 {\n margin-left: 50%;\n }\n .offset-md-7 {\n margin-left: 58.333333%;\n }\n .offset-md-8 {\n margin-left: 66.666667%;\n }\n .offset-md-9 {\n margin-left: 75%;\n }\n .offset-md-10 {\n margin-left: 83.333333%;\n }\n .offset-md-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 992px) {\n .col-lg {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .row-cols-lg-1 > * {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .row-cols-lg-2 > * {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .row-cols-lg-3 > * {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .row-cols-lg-4 > * {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .row-cols-lg-5 > * {\n -ms-flex: 0 0 20%;\n flex: 0 0 20%;\n max-width: 20%;\n }\n .row-cols-lg-6 > * {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-lg-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-lg-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-lg-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-lg-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-lg-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-lg-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-lg-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-lg-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-lg-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-lg-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-lg-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-lg-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-lg-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-lg-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-lg-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-lg-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-lg-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-lg-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-lg-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-lg-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-lg-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-lg-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-lg-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-lg-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-lg-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-lg-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-lg-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-lg-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-lg-0 {\n margin-left: 0;\n }\n .offset-lg-1 {\n margin-left: 8.333333%;\n }\n .offset-lg-2 {\n margin-left: 16.666667%;\n }\n .offset-lg-3 {\n margin-left: 25%;\n }\n .offset-lg-4 {\n margin-left: 33.333333%;\n }\n .offset-lg-5 {\n margin-left: 41.666667%;\n }\n .offset-lg-6 {\n margin-left: 50%;\n }\n .offset-lg-7 {\n margin-left: 58.333333%;\n }\n .offset-lg-8 {\n margin-left: 66.666667%;\n }\n .offset-lg-9 {\n margin-left: 75%;\n }\n .offset-lg-10 {\n margin-left: 83.333333%;\n }\n .offset-lg-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 1200px) {\n .col-xl {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .row-cols-xl-1 > * {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .row-cols-xl-2 > * {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .row-cols-xl-3 > * {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .row-cols-xl-4 > * {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .row-cols-xl-5 > * {\n -ms-flex: 0 0 20%;\n flex: 0 0 20%;\n max-width: 20%;\n }\n .row-cols-xl-6 > * {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xl-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: 100%;\n }\n .col-xl-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-xl-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xl-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-xl-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-xl-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-xl-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-xl-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-xl-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-xl-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-xl-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-xl-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-xl-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-xl-first {\n -ms-flex-order: -1;\n order: -1;\n }\n .order-xl-last {\n -ms-flex-order: 13;\n order: 13;\n }\n .order-xl-0 {\n -ms-flex-order: 0;\n order: 0;\n }\n .order-xl-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-xl-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-xl-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-xl-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-xl-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-xl-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-xl-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-xl-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-xl-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-xl-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-xl-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-xl-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n .offset-xl-0 {\n margin-left: 0;\n }\n .offset-xl-1 {\n margin-left: 8.333333%;\n }\n .offset-xl-2 {\n margin-left: 16.666667%;\n }\n .offset-xl-3 {\n margin-left: 25%;\n }\n .offset-xl-4 {\n margin-left: 33.333333%;\n }\n .offset-xl-5 {\n margin-left: 41.666667%;\n }\n .offset-xl-6 {\n margin-left: 50%;\n }\n .offset-xl-7 {\n margin-left: 58.333333%;\n }\n .offset-xl-8 {\n margin-left: 66.666667%;\n }\n .offset-xl-9 {\n margin-left: 75%;\n }\n .offset-xl-10 {\n margin-left: 83.333333%;\n }\n .offset-xl-11 {\n margin-left: 91.666667%;\n }\n}\n\n.d-none {\n display: none !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n}\n\n.d-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n}\n\n@media (min-width: 576px) {\n .d-sm-none {\n display: none !important;\n }\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 768px) {\n .d-md-none {\n display: none !important;\n }\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-md-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 992px) {\n .d-lg-none {\n display: none !important;\n }\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 1200px) {\n .d-xl-none {\n display: none !important;\n }\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media print {\n .d-print-none {\n display: none !important;\n }\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-print-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n.flex-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n}\n\n.flex-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n}\n\n.flex-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n}\n\n.flex-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n}\n\n.justify-content-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n}\n\n.justify-content-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n}\n\n.align-items-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n}\n\n.align-items-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n}\n\n.align-items-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n}\n\n.align-items-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n}\n\n.align-content-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n}\n\n.align-content-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n}\n\n.align-content-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n}\n\n.align-content-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n}\n\n.align-content-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n}\n\n.align-self-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n}\n\n.align-self-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n}\n\n.align-self-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n}\n\n.align-self-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n}\n\n.align-self-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n}\n\n@media (min-width: 576px) {\n .flex-sm-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-sm-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-sm-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-sm-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-sm-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-sm-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-sm-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-sm-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-sm-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-sm-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-sm-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-sm-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-sm-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-sm-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 768px) {\n .flex-md-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-md-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-md-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-md-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-md-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-md-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-md-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-md-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-md-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-md-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-md-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-md-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-md-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-md-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-md-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-md-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-md-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-md-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-md-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-md-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-md-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 992px) {\n .flex-lg-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-lg-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-lg-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-lg-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-lg-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-lg-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-lg-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-lg-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-lg-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-lg-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-lg-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-lg-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-lg-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-lg-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1200px) {\n .flex-xl-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-xl-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-xl-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .flex-xl-fill {\n -ms-flex: 1 1 auto !important;\n flex: 1 1 auto !important;\n }\n .flex-xl-grow-0 {\n -ms-flex-positive: 0 !important;\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n -ms-flex-positive: 1 !important;\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n -ms-flex-negative: 0 !important;\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n -ms-flex-negative: 1 !important;\n flex-shrink: 1 !important;\n }\n .justify-content-xl-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-xl-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-xl-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-xl-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-xl-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-xl-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-xl-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-xl-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-xl-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.mt-0,\n.my-0 {\n margin-top: 0 !important;\n}\n\n.mr-0,\n.mx-0 {\n margin-right: 0 !important;\n}\n\n.mb-0,\n.my-0 {\n margin-bottom: 0 !important;\n}\n\n.ml-0,\n.mx-0 {\n margin-left: 0 !important;\n}\n\n.m-1 {\n margin: 0.25rem !important;\n}\n\n.mt-1,\n.my-1 {\n margin-top: 0.25rem !important;\n}\n\n.mr-1,\n.mx-1 {\n margin-right: 0.25rem !important;\n}\n\n.mb-1,\n.my-1 {\n margin-bottom: 0.25rem !important;\n}\n\n.ml-1,\n.mx-1 {\n margin-left: 0.25rem !important;\n}\n\n.m-2 {\n margin: 0.5rem !important;\n}\n\n.mt-2,\n.my-2 {\n margin-top: 0.5rem !important;\n}\n\n.mr-2,\n.mx-2 {\n margin-right: 0.5rem !important;\n}\n\n.mb-2,\n.my-2 {\n margin-bottom: 0.5rem !important;\n}\n\n.ml-2,\n.mx-2 {\n margin-left: 0.5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.mt-3,\n.my-3 {\n margin-top: 1rem !important;\n}\n\n.mr-3,\n.mx-3 {\n margin-right: 1rem !important;\n}\n\n.mb-3,\n.my-3 {\n margin-bottom: 1rem !important;\n}\n\n.ml-3,\n.mx-3 {\n margin-left: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.mt-4,\n.my-4 {\n margin-top: 1.5rem !important;\n}\n\n.mr-4,\n.mx-4 {\n margin-right: 1.5rem !important;\n}\n\n.mb-4,\n.my-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.ml-4,\n.mx-4 {\n margin-left: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.mt-5,\n.my-5 {\n margin-top: 3rem !important;\n}\n\n.mr-5,\n.mx-5 {\n margin-right: 3rem !important;\n}\n\n.mb-5,\n.my-5 {\n margin-bottom: 3rem !important;\n}\n\n.ml-5,\n.mx-5 {\n margin-left: 3rem !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.pt-0,\n.py-0 {\n padding-top: 0 !important;\n}\n\n.pr-0,\n.px-0 {\n padding-right: 0 !important;\n}\n\n.pb-0,\n.py-0 {\n padding-bottom: 0 !important;\n}\n\n.pl-0,\n.px-0 {\n padding-left: 0 !important;\n}\n\n.p-1 {\n padding: 0.25rem !important;\n}\n\n.pt-1,\n.py-1 {\n padding-top: 0.25rem !important;\n}\n\n.pr-1,\n.px-1 {\n padding-right: 0.25rem !important;\n}\n\n.pb-1,\n.py-1 {\n padding-bottom: 0.25rem !important;\n}\n\n.pl-1,\n.px-1 {\n padding-left: 0.25rem !important;\n}\n\n.p-2 {\n padding: 0.5rem !important;\n}\n\n.pt-2,\n.py-2 {\n padding-top: 0.5rem !important;\n}\n\n.pr-2,\n.px-2 {\n padding-right: 0.5rem !important;\n}\n\n.pb-2,\n.py-2 {\n padding-bottom: 0.5rem !important;\n}\n\n.pl-2,\n.px-2 {\n padding-left: 0.5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.pt-3,\n.py-3 {\n padding-top: 1rem !important;\n}\n\n.pr-3,\n.px-3 {\n padding-right: 1rem !important;\n}\n\n.pb-3,\n.py-3 {\n padding-bottom: 1rem !important;\n}\n\n.pl-3,\n.px-3 {\n padding-left: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.pt-4,\n.py-4 {\n padding-top: 1.5rem !important;\n}\n\n.pr-4,\n.px-4 {\n padding-right: 1.5rem !important;\n}\n\n.pb-4,\n.py-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pl-4,\n.px-4 {\n padding-left: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.pt-5,\n.py-5 {\n padding-top: 3rem !important;\n}\n\n.pr-5,\n.px-5 {\n padding-right: 3rem !important;\n}\n\n.pb-5,\n.py-5 {\n padding-bottom: 3rem !important;\n}\n\n.pl-5,\n.px-5 {\n padding-left: 3rem !important;\n}\n\n.m-n1 {\n margin: -0.25rem !important;\n}\n\n.mt-n1,\n.my-n1 {\n margin-top: -0.25rem !important;\n}\n\n.mr-n1,\n.mx-n1 {\n margin-right: -0.25rem !important;\n}\n\n.mb-n1,\n.my-n1 {\n margin-bottom: -0.25rem !important;\n}\n\n.ml-n1,\n.mx-n1 {\n margin-left: -0.25rem !important;\n}\n\n.m-n2 {\n margin: -0.5rem !important;\n}\n\n.mt-n2,\n.my-n2 {\n margin-top: -0.5rem !important;\n}\n\n.mr-n2,\n.mx-n2 {\n margin-right: -0.5rem !important;\n}\n\n.mb-n2,\n.my-n2 {\n margin-bottom: -0.5rem !important;\n}\n\n.ml-n2,\n.mx-n2 {\n margin-left: -0.5rem !important;\n}\n\n.m-n3 {\n margin: -1rem !important;\n}\n\n.mt-n3,\n.my-n3 {\n margin-top: -1rem !important;\n}\n\n.mr-n3,\n.mx-n3 {\n margin-right: -1rem !important;\n}\n\n.mb-n3,\n.my-n3 {\n margin-bottom: -1rem !important;\n}\n\n.ml-n3,\n.mx-n3 {\n margin-left: -1rem !important;\n}\n\n.m-n4 {\n margin: -1.5rem !important;\n}\n\n.mt-n4,\n.my-n4 {\n margin-top: -1.5rem !important;\n}\n\n.mr-n4,\n.mx-n4 {\n margin-right: -1.5rem !important;\n}\n\n.mb-n4,\n.my-n4 {\n margin-bottom: -1.5rem !important;\n}\n\n.ml-n4,\n.mx-n4 {\n margin-left: -1.5rem !important;\n}\n\n.m-n5 {\n margin: -3rem !important;\n}\n\n.mt-n5,\n.my-n5 {\n margin-top: -3rem !important;\n}\n\n.mr-n5,\n.mx-n5 {\n margin-right: -3rem !important;\n}\n\n.mb-n5,\n.my-n5 {\n margin-bottom: -3rem !important;\n}\n\n.ml-n5,\n.mx-n5 {\n margin-left: -3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mt-auto,\n.my-auto {\n margin-top: auto !important;\n}\n\n.mr-auto,\n.mx-auto {\n margin-right: auto !important;\n}\n\n.mb-auto,\n.my-auto {\n margin-bottom: auto !important;\n}\n\n.ml-auto,\n.mx-auto {\n margin-left: auto !important;\n}\n\n@media (min-width: 576px) {\n .m-sm-0 {\n margin: 0 !important;\n }\n .mt-sm-0,\n .my-sm-0 {\n margin-top: 0 !important;\n }\n .mr-sm-0,\n .mx-sm-0 {\n margin-right: 0 !important;\n }\n .mb-sm-0,\n .my-sm-0 {\n margin-bottom: 0 !important;\n }\n .ml-sm-0,\n .mx-sm-0 {\n margin-left: 0 !important;\n }\n .m-sm-1 {\n margin: 0.25rem !important;\n }\n .mt-sm-1,\n .my-sm-1 {\n margin-top: 0.25rem !important;\n }\n .mr-sm-1,\n .mx-sm-1 {\n margin-right: 0.25rem !important;\n }\n .mb-sm-1,\n .my-sm-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-sm-1,\n .mx-sm-1 {\n margin-left: 0.25rem !important;\n }\n .m-sm-2 {\n margin: 0.5rem !important;\n }\n .mt-sm-2,\n .my-sm-2 {\n margin-top: 0.5rem !important;\n }\n .mr-sm-2,\n .mx-sm-2 {\n margin-right: 0.5rem !important;\n }\n .mb-sm-2,\n .my-sm-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-sm-2,\n .mx-sm-2 {\n margin-left: 0.5rem !important;\n }\n .m-sm-3 {\n margin: 1rem !important;\n }\n .mt-sm-3,\n .my-sm-3 {\n margin-top: 1rem !important;\n }\n .mr-sm-3,\n .mx-sm-3 {\n margin-right: 1rem !important;\n }\n .mb-sm-3,\n .my-sm-3 {\n margin-bottom: 1rem !important;\n }\n .ml-sm-3,\n .mx-sm-3 {\n margin-left: 1rem !important;\n }\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n .mt-sm-4,\n .my-sm-4 {\n margin-top: 1.5rem !important;\n }\n .mr-sm-4,\n .mx-sm-4 {\n margin-right: 1.5rem !important;\n }\n .mb-sm-4,\n .my-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-sm-4,\n .mx-sm-4 {\n margin-left: 1.5rem !important;\n }\n .m-sm-5 {\n margin: 3rem !important;\n }\n .mt-sm-5,\n .my-sm-5 {\n margin-top: 3rem !important;\n }\n .mr-sm-5,\n .mx-sm-5 {\n margin-right: 3rem !important;\n }\n .mb-sm-5,\n .my-sm-5 {\n margin-bottom: 3rem !important;\n }\n .ml-sm-5,\n .mx-sm-5 {\n margin-left: 3rem !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .pt-sm-0,\n .py-sm-0 {\n padding-top: 0 !important;\n }\n .pr-sm-0,\n .px-sm-0 {\n padding-right: 0 !important;\n }\n .pb-sm-0,\n .py-sm-0 {\n padding-bottom: 0 !important;\n }\n .pl-sm-0,\n .px-sm-0 {\n padding-left: 0 !important;\n }\n .p-sm-1 {\n padding: 0.25rem !important;\n }\n .pt-sm-1,\n .py-sm-1 {\n padding-top: 0.25rem !important;\n }\n .pr-sm-1,\n .px-sm-1 {\n padding-right: 0.25rem !important;\n }\n .pb-sm-1,\n .py-sm-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-sm-1,\n .px-sm-1 {\n padding-left: 0.25rem !important;\n }\n .p-sm-2 {\n padding: 0.5rem !important;\n }\n .pt-sm-2,\n .py-sm-2 {\n padding-top: 0.5rem !important;\n }\n .pr-sm-2,\n .px-sm-2 {\n padding-right: 0.5rem !important;\n }\n .pb-sm-2,\n .py-sm-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-sm-2,\n .px-sm-2 {\n padding-left: 0.5rem !important;\n }\n .p-sm-3 {\n padding: 1rem !important;\n }\n .pt-sm-3,\n .py-sm-3 {\n padding-top: 1rem !important;\n }\n .pr-sm-3,\n .px-sm-3 {\n padding-right: 1rem !important;\n }\n .pb-sm-3,\n .py-sm-3 {\n padding-bottom: 1rem !important;\n }\n .pl-sm-3,\n .px-sm-3 {\n padding-left: 1rem !important;\n }\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n .pt-sm-4,\n .py-sm-4 {\n padding-top: 1.5rem !important;\n }\n .pr-sm-4,\n .px-sm-4 {\n padding-right: 1.5rem !important;\n }\n .pb-sm-4,\n .py-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-sm-4,\n .px-sm-4 {\n padding-left: 1.5rem !important;\n }\n .p-sm-5 {\n padding: 3rem !important;\n }\n .pt-sm-5,\n .py-sm-5 {\n padding-top: 3rem !important;\n }\n .pr-sm-5,\n .px-sm-5 {\n padding-right: 3rem !important;\n }\n .pb-sm-5,\n .py-sm-5 {\n padding-bottom: 3rem !important;\n }\n .pl-sm-5,\n .px-sm-5 {\n padding-left: 3rem !important;\n }\n .m-sm-n1 {\n margin: -0.25rem !important;\n }\n .mt-sm-n1,\n .my-sm-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-sm-n1,\n .mx-sm-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-sm-n1,\n .my-sm-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-sm-n1,\n .mx-sm-n1 {\n margin-left: -0.25rem !important;\n }\n .m-sm-n2 {\n margin: -0.5rem !important;\n }\n .mt-sm-n2,\n .my-sm-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-sm-n2,\n .mx-sm-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-sm-n2,\n .my-sm-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-sm-n2,\n .mx-sm-n2 {\n margin-left: -0.5rem !important;\n }\n .m-sm-n3 {\n margin: -1rem !important;\n }\n .mt-sm-n3,\n .my-sm-n3 {\n margin-top: -1rem !important;\n }\n .mr-sm-n3,\n .mx-sm-n3 {\n margin-right: -1rem !important;\n }\n .mb-sm-n3,\n .my-sm-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-sm-n3,\n .mx-sm-n3 {\n margin-left: -1rem !important;\n }\n .m-sm-n4 {\n margin: -1.5rem !important;\n }\n .mt-sm-n4,\n .my-sm-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-sm-n4,\n .mx-sm-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-sm-n4,\n .my-sm-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-sm-n4,\n .mx-sm-n4 {\n margin-left: -1.5rem !important;\n }\n .m-sm-n5 {\n margin: -3rem !important;\n }\n .mt-sm-n5,\n .my-sm-n5 {\n margin-top: -3rem !important;\n }\n .mr-sm-n5,\n .mx-sm-n5 {\n margin-right: -3rem !important;\n }\n .mb-sm-n5,\n .my-sm-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-sm-n5,\n .mx-sm-n5 {\n margin-left: -3rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mt-sm-auto,\n .my-sm-auto {\n margin-top: auto !important;\n }\n .mr-sm-auto,\n .mx-sm-auto {\n margin-right: auto !important;\n }\n .mb-sm-auto,\n .my-sm-auto {\n margin-bottom: auto !important;\n }\n .ml-sm-auto,\n .mx-sm-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 768px) {\n .m-md-0 {\n margin: 0 !important;\n }\n .mt-md-0,\n .my-md-0 {\n margin-top: 0 !important;\n }\n .mr-md-0,\n .mx-md-0 {\n margin-right: 0 !important;\n }\n .mb-md-0,\n .my-md-0 {\n margin-bottom: 0 !important;\n }\n .ml-md-0,\n .mx-md-0 {\n margin-left: 0 !important;\n }\n .m-md-1 {\n margin: 0.25rem !important;\n }\n .mt-md-1,\n .my-md-1 {\n margin-top: 0.25rem !important;\n }\n .mr-md-1,\n .mx-md-1 {\n margin-right: 0.25rem !important;\n }\n .mb-md-1,\n .my-md-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-md-1,\n .mx-md-1 {\n margin-left: 0.25rem !important;\n }\n .m-md-2 {\n margin: 0.5rem !important;\n }\n .mt-md-2,\n .my-md-2 {\n margin-top: 0.5rem !important;\n }\n .mr-md-2,\n .mx-md-2 {\n margin-right: 0.5rem !important;\n }\n .mb-md-2,\n .my-md-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-md-2,\n .mx-md-2 {\n margin-left: 0.5rem !important;\n }\n .m-md-3 {\n margin: 1rem !important;\n }\n .mt-md-3,\n .my-md-3 {\n margin-top: 1rem !important;\n }\n .mr-md-3,\n .mx-md-3 {\n margin-right: 1rem !important;\n }\n .mb-md-3,\n .my-md-3 {\n margin-bottom: 1rem !important;\n }\n .ml-md-3,\n .mx-md-3 {\n margin-left: 1rem !important;\n }\n .m-md-4 {\n margin: 1.5rem !important;\n }\n .mt-md-4,\n .my-md-4 {\n margin-top: 1.5rem !important;\n }\n .mr-md-4,\n .mx-md-4 {\n margin-right: 1.5rem !important;\n }\n .mb-md-4,\n .my-md-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-md-4,\n .mx-md-4 {\n margin-left: 1.5rem !important;\n }\n .m-md-5 {\n margin: 3rem !important;\n }\n .mt-md-5,\n .my-md-5 {\n margin-top: 3rem !important;\n }\n .mr-md-5,\n .mx-md-5 {\n margin-right: 3rem !important;\n }\n .mb-md-5,\n .my-md-5 {\n margin-bottom: 3rem !important;\n }\n .ml-md-5,\n .mx-md-5 {\n margin-left: 3rem !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .pt-md-0,\n .py-md-0 {\n padding-top: 0 !important;\n }\n .pr-md-0,\n .px-md-0 {\n padding-right: 0 !important;\n }\n .pb-md-0,\n .py-md-0 {\n padding-bottom: 0 !important;\n }\n .pl-md-0,\n .px-md-0 {\n padding-left: 0 !important;\n }\n .p-md-1 {\n padding: 0.25rem !important;\n }\n .pt-md-1,\n .py-md-1 {\n padding-top: 0.25rem !important;\n }\n .pr-md-1,\n .px-md-1 {\n padding-right: 0.25rem !important;\n }\n .pb-md-1,\n .py-md-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-md-1,\n .px-md-1 {\n padding-left: 0.25rem !important;\n }\n .p-md-2 {\n padding: 0.5rem !important;\n }\n .pt-md-2,\n .py-md-2 {\n padding-top: 0.5rem !important;\n }\n .pr-md-2,\n .px-md-2 {\n padding-right: 0.5rem !important;\n }\n .pb-md-2,\n .py-md-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-md-2,\n .px-md-2 {\n padding-left: 0.5rem !important;\n }\n .p-md-3 {\n padding: 1rem !important;\n }\n .pt-md-3,\n .py-md-3 {\n padding-top: 1rem !important;\n }\n .pr-md-3,\n .px-md-3 {\n padding-right: 1rem !important;\n }\n .pb-md-3,\n .py-md-3 {\n padding-bottom: 1rem !important;\n }\n .pl-md-3,\n .px-md-3 {\n padding-left: 1rem !important;\n }\n .p-md-4 {\n padding: 1.5rem !important;\n }\n .pt-md-4,\n .py-md-4 {\n padding-top: 1.5rem !important;\n }\n .pr-md-4,\n .px-md-4 {\n padding-right: 1.5rem !important;\n }\n .pb-md-4,\n .py-md-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-md-4,\n .px-md-4 {\n padding-left: 1.5rem !important;\n }\n .p-md-5 {\n padding: 3rem !important;\n }\n .pt-md-5,\n .py-md-5 {\n padding-top: 3rem !important;\n }\n .pr-md-5,\n .px-md-5 {\n padding-right: 3rem !important;\n }\n .pb-md-5,\n .py-md-5 {\n padding-bottom: 3rem !important;\n }\n .pl-md-5,\n .px-md-5 {\n padding-left: 3rem !important;\n }\n .m-md-n1 {\n margin: -0.25rem !important;\n }\n .mt-md-n1,\n .my-md-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-md-n1,\n .mx-md-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-md-n1,\n .my-md-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-md-n1,\n .mx-md-n1 {\n margin-left: -0.25rem !important;\n }\n .m-md-n2 {\n margin: -0.5rem !important;\n }\n .mt-md-n2,\n .my-md-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-md-n2,\n .mx-md-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-md-n2,\n .my-md-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-md-n2,\n .mx-md-n2 {\n margin-left: -0.5rem !important;\n }\n .m-md-n3 {\n margin: -1rem !important;\n }\n .mt-md-n3,\n .my-md-n3 {\n margin-top: -1rem !important;\n }\n .mr-md-n3,\n .mx-md-n3 {\n margin-right: -1rem !important;\n }\n .mb-md-n3,\n .my-md-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-md-n3,\n .mx-md-n3 {\n margin-left: -1rem !important;\n }\n .m-md-n4 {\n margin: -1.5rem !important;\n }\n .mt-md-n4,\n .my-md-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-md-n4,\n .mx-md-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-md-n4,\n .my-md-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-md-n4,\n .mx-md-n4 {\n margin-left: -1.5rem !important;\n }\n .m-md-n5 {\n margin: -3rem !important;\n }\n .mt-md-n5,\n .my-md-n5 {\n margin-top: -3rem !important;\n }\n .mr-md-n5,\n .mx-md-n5 {\n margin-right: -3rem !important;\n }\n .mb-md-n5,\n .my-md-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-md-n5,\n .mx-md-n5 {\n margin-left: -3rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mt-md-auto,\n .my-md-auto {\n margin-top: auto !important;\n }\n .mr-md-auto,\n .mx-md-auto {\n margin-right: auto !important;\n }\n .mb-md-auto,\n .my-md-auto {\n margin-bottom: auto !important;\n }\n .ml-md-auto,\n .mx-md-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 992px) {\n .m-lg-0 {\n margin: 0 !important;\n }\n .mt-lg-0,\n .my-lg-0 {\n margin-top: 0 !important;\n }\n .mr-lg-0,\n .mx-lg-0 {\n margin-right: 0 !important;\n }\n .mb-lg-0,\n .my-lg-0 {\n margin-bottom: 0 !important;\n }\n .ml-lg-0,\n .mx-lg-0 {\n margin-left: 0 !important;\n }\n .m-lg-1 {\n margin: 0.25rem !important;\n }\n .mt-lg-1,\n .my-lg-1 {\n margin-top: 0.25rem !important;\n }\n .mr-lg-1,\n .mx-lg-1 {\n margin-right: 0.25rem !important;\n }\n .mb-lg-1,\n .my-lg-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-lg-1,\n .mx-lg-1 {\n margin-left: 0.25rem !important;\n }\n .m-lg-2 {\n margin: 0.5rem !important;\n }\n .mt-lg-2,\n .my-lg-2 {\n margin-top: 0.5rem !important;\n }\n .mr-lg-2,\n .mx-lg-2 {\n margin-right: 0.5rem !important;\n }\n .mb-lg-2,\n .my-lg-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-lg-2,\n .mx-lg-2 {\n margin-left: 0.5rem !important;\n }\n .m-lg-3 {\n margin: 1rem !important;\n }\n .mt-lg-3,\n .my-lg-3 {\n margin-top: 1rem !important;\n }\n .mr-lg-3,\n .mx-lg-3 {\n margin-right: 1rem !important;\n }\n .mb-lg-3,\n .my-lg-3 {\n margin-bottom: 1rem !important;\n }\n .ml-lg-3,\n .mx-lg-3 {\n margin-left: 1rem !important;\n }\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n .mt-lg-4,\n .my-lg-4 {\n margin-top: 1.5rem !important;\n }\n .mr-lg-4,\n .mx-lg-4 {\n margin-right: 1.5rem !important;\n }\n .mb-lg-4,\n .my-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-lg-4,\n .mx-lg-4 {\n margin-left: 1.5rem !important;\n }\n .m-lg-5 {\n margin: 3rem !important;\n }\n .mt-lg-5,\n .my-lg-5 {\n margin-top: 3rem !important;\n }\n .mr-lg-5,\n .mx-lg-5 {\n margin-right: 3rem !important;\n }\n .mb-lg-5,\n .my-lg-5 {\n margin-bottom: 3rem !important;\n }\n .ml-lg-5,\n .mx-lg-5 {\n margin-left: 3rem !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .pt-lg-0,\n .py-lg-0 {\n padding-top: 0 !important;\n }\n .pr-lg-0,\n .px-lg-0 {\n padding-right: 0 !important;\n }\n .pb-lg-0,\n .py-lg-0 {\n padding-bottom: 0 !important;\n }\n .pl-lg-0,\n .px-lg-0 {\n padding-left: 0 !important;\n }\n .p-lg-1 {\n padding: 0.25rem !important;\n }\n .pt-lg-1,\n .py-lg-1 {\n padding-top: 0.25rem !important;\n }\n .pr-lg-1,\n .px-lg-1 {\n padding-right: 0.25rem !important;\n }\n .pb-lg-1,\n .py-lg-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-lg-1,\n .px-lg-1 {\n padding-left: 0.25rem !important;\n }\n .p-lg-2 {\n padding: 0.5rem !important;\n }\n .pt-lg-2,\n .py-lg-2 {\n padding-top: 0.5rem !important;\n }\n .pr-lg-2,\n .px-lg-2 {\n padding-right: 0.5rem !important;\n }\n .pb-lg-2,\n .py-lg-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-lg-2,\n .px-lg-2 {\n padding-left: 0.5rem !important;\n }\n .p-lg-3 {\n padding: 1rem !important;\n }\n .pt-lg-3,\n .py-lg-3 {\n padding-top: 1rem !important;\n }\n .pr-lg-3,\n .px-lg-3 {\n padding-right: 1rem !important;\n }\n .pb-lg-3,\n .py-lg-3 {\n padding-bottom: 1rem !important;\n }\n .pl-lg-3,\n .px-lg-3 {\n padding-left: 1rem !important;\n }\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n .pt-lg-4,\n .py-lg-4 {\n padding-top: 1.5rem !important;\n }\n .pr-lg-4,\n .px-lg-4 {\n padding-right: 1.5rem !important;\n }\n .pb-lg-4,\n .py-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-lg-4,\n .px-lg-4 {\n padding-left: 1.5rem !important;\n }\n .p-lg-5 {\n padding: 3rem !important;\n }\n .pt-lg-5,\n .py-lg-5 {\n padding-top: 3rem !important;\n }\n .pr-lg-5,\n .px-lg-5 {\n padding-right: 3rem !important;\n }\n .pb-lg-5,\n .py-lg-5 {\n padding-bottom: 3rem !important;\n }\n .pl-lg-5,\n .px-lg-5 {\n padding-left: 3rem !important;\n }\n .m-lg-n1 {\n margin: -0.25rem !important;\n }\n .mt-lg-n1,\n .my-lg-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-lg-n1,\n .mx-lg-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-lg-n1,\n .my-lg-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-lg-n1,\n .mx-lg-n1 {\n margin-left: -0.25rem !important;\n }\n .m-lg-n2 {\n margin: -0.5rem !important;\n }\n .mt-lg-n2,\n .my-lg-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-lg-n2,\n .mx-lg-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-lg-n2,\n .my-lg-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-lg-n2,\n .mx-lg-n2 {\n margin-left: -0.5rem !important;\n }\n .m-lg-n3 {\n margin: -1rem !important;\n }\n .mt-lg-n3,\n .my-lg-n3 {\n margin-top: -1rem !important;\n }\n .mr-lg-n3,\n .mx-lg-n3 {\n margin-right: -1rem !important;\n }\n .mb-lg-n3,\n .my-lg-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-lg-n3,\n .mx-lg-n3 {\n margin-left: -1rem !important;\n }\n .m-lg-n4 {\n margin: -1.5rem !important;\n }\n .mt-lg-n4,\n .my-lg-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-lg-n4,\n .mx-lg-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-lg-n4,\n .my-lg-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-lg-n4,\n .mx-lg-n4 {\n margin-left: -1.5rem !important;\n }\n .m-lg-n5 {\n margin: -3rem !important;\n }\n .mt-lg-n5,\n .my-lg-n5 {\n margin-top: -3rem !important;\n }\n .mr-lg-n5,\n .mx-lg-n5 {\n margin-right: -3rem !important;\n }\n .mb-lg-n5,\n .my-lg-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-lg-n5,\n .mx-lg-n5 {\n margin-left: -3rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mt-lg-auto,\n .my-lg-auto {\n margin-top: auto !important;\n }\n .mr-lg-auto,\n .mx-lg-auto {\n margin-right: auto !important;\n }\n .mb-lg-auto,\n .my-lg-auto {\n margin-bottom: auto !important;\n }\n .ml-lg-auto,\n .mx-lg-auto {\n margin-left: auto !important;\n }\n}\n\n@media (min-width: 1200px) {\n .m-xl-0 {\n margin: 0 !important;\n }\n .mt-xl-0,\n .my-xl-0 {\n margin-top: 0 !important;\n }\n .mr-xl-0,\n .mx-xl-0 {\n margin-right: 0 !important;\n }\n .mb-xl-0,\n .my-xl-0 {\n margin-bottom: 0 !important;\n }\n .ml-xl-0,\n .mx-xl-0 {\n margin-left: 0 !important;\n }\n .m-xl-1 {\n margin: 0.25rem !important;\n }\n .mt-xl-1,\n .my-xl-1 {\n margin-top: 0.25rem !important;\n }\n .mr-xl-1,\n .mx-xl-1 {\n margin-right: 0.25rem !important;\n }\n .mb-xl-1,\n .my-xl-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-xl-1,\n .mx-xl-1 {\n margin-left: 0.25rem !important;\n }\n .m-xl-2 {\n margin: 0.5rem !important;\n }\n .mt-xl-2,\n .my-xl-2 {\n margin-top: 0.5rem !important;\n }\n .mr-xl-2,\n .mx-xl-2 {\n margin-right: 0.5rem !important;\n }\n .mb-xl-2,\n .my-xl-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-xl-2,\n .mx-xl-2 {\n margin-left: 0.5rem !important;\n }\n .m-xl-3 {\n margin: 1rem !important;\n }\n .mt-xl-3,\n .my-xl-3 {\n margin-top: 1rem !important;\n }\n .mr-xl-3,\n .mx-xl-3 {\n margin-right: 1rem !important;\n }\n .mb-xl-3,\n .my-xl-3 {\n margin-bottom: 1rem !important;\n }\n .ml-xl-3,\n .mx-xl-3 {\n margin-left: 1rem !important;\n }\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n .mt-xl-4,\n .my-xl-4 {\n margin-top: 1.5rem !important;\n }\n .mr-xl-4,\n .mx-xl-4 {\n margin-right: 1.5rem !important;\n }\n .mb-xl-4,\n .my-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-xl-4,\n .mx-xl-4 {\n margin-left: 1.5rem !important;\n }\n .m-xl-5 {\n margin: 3rem !important;\n }\n .mt-xl-5,\n .my-xl-5 {\n margin-top: 3rem !important;\n }\n .mr-xl-5,\n .mx-xl-5 {\n margin-right: 3rem !important;\n }\n .mb-xl-5,\n .my-xl-5 {\n margin-bottom: 3rem !important;\n }\n .ml-xl-5,\n .mx-xl-5 {\n margin-left: 3rem !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .pt-xl-0,\n .py-xl-0 {\n padding-top: 0 !important;\n }\n .pr-xl-0,\n .px-xl-0 {\n padding-right: 0 !important;\n }\n .pb-xl-0,\n .py-xl-0 {\n padding-bottom: 0 !important;\n }\n .pl-xl-0,\n .px-xl-0 {\n padding-left: 0 !important;\n }\n .p-xl-1 {\n padding: 0.25rem !important;\n }\n .pt-xl-1,\n .py-xl-1 {\n padding-top: 0.25rem !important;\n }\n .pr-xl-1,\n .px-xl-1 {\n padding-right: 0.25rem !important;\n }\n .pb-xl-1,\n .py-xl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-xl-1,\n .px-xl-1 {\n padding-left: 0.25rem !important;\n }\n .p-xl-2 {\n padding: 0.5rem !important;\n }\n .pt-xl-2,\n .py-xl-2 {\n padding-top: 0.5rem !important;\n }\n .pr-xl-2,\n .px-xl-2 {\n padding-right: 0.5rem !important;\n }\n .pb-xl-2,\n .py-xl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-xl-2,\n .px-xl-2 {\n padding-left: 0.5rem !important;\n }\n .p-xl-3 {\n padding: 1rem !important;\n }\n .pt-xl-3,\n .py-xl-3 {\n padding-top: 1rem !important;\n }\n .pr-xl-3,\n .px-xl-3 {\n padding-right: 1rem !important;\n }\n .pb-xl-3,\n .py-xl-3 {\n padding-bottom: 1rem !important;\n }\n .pl-xl-3,\n .px-xl-3 {\n padding-left: 1rem !important;\n }\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n .pt-xl-4,\n .py-xl-4 {\n padding-top: 1.5rem !important;\n }\n .pr-xl-4,\n .px-xl-4 {\n padding-right: 1.5rem !important;\n }\n .pb-xl-4,\n .py-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-xl-4,\n .px-xl-4 {\n padding-left: 1.5rem !important;\n }\n .p-xl-5 {\n padding: 3rem !important;\n }\n .pt-xl-5,\n .py-xl-5 {\n padding-top: 3rem !important;\n }\n .pr-xl-5,\n .px-xl-5 {\n padding-right: 3rem !important;\n }\n .pb-xl-5,\n .py-xl-5 {\n padding-bottom: 3rem !important;\n }\n .pl-xl-5,\n .px-xl-5 {\n padding-left: 3rem !important;\n }\n .m-xl-n1 {\n margin: -0.25rem !important;\n }\n .mt-xl-n1,\n .my-xl-n1 {\n margin-top: -0.25rem !important;\n }\n .mr-xl-n1,\n .mx-xl-n1 {\n margin-right: -0.25rem !important;\n }\n .mb-xl-n1,\n .my-xl-n1 {\n margin-bottom: -0.25rem !important;\n }\n .ml-xl-n1,\n .mx-xl-n1 {\n margin-left: -0.25rem !important;\n }\n .m-xl-n2 {\n margin: -0.5rem !important;\n }\n .mt-xl-n2,\n .my-xl-n2 {\n margin-top: -0.5rem !important;\n }\n .mr-xl-n2,\n .mx-xl-n2 {\n margin-right: -0.5rem !important;\n }\n .mb-xl-n2,\n .my-xl-n2 {\n margin-bottom: -0.5rem !important;\n }\n .ml-xl-n2,\n .mx-xl-n2 {\n margin-left: -0.5rem !important;\n }\n .m-xl-n3 {\n margin: -1rem !important;\n }\n .mt-xl-n3,\n .my-xl-n3 {\n margin-top: -1rem !important;\n }\n .mr-xl-n3,\n .mx-xl-n3 {\n margin-right: -1rem !important;\n }\n .mb-xl-n3,\n .my-xl-n3 {\n margin-bottom: -1rem !important;\n }\n .ml-xl-n3,\n .mx-xl-n3 {\n margin-left: -1rem !important;\n }\n .m-xl-n4 {\n margin: -1.5rem !important;\n }\n .mt-xl-n4,\n .my-xl-n4 {\n margin-top: -1.5rem !important;\n }\n .mr-xl-n4,\n .mx-xl-n4 {\n margin-right: -1.5rem !important;\n }\n .mb-xl-n4,\n .my-xl-n4 {\n margin-bottom: -1.5rem !important;\n }\n .ml-xl-n4,\n .mx-xl-n4 {\n margin-left: -1.5rem !important;\n }\n .m-xl-n5 {\n margin: -3rem !important;\n }\n .mt-xl-n5,\n .my-xl-n5 {\n margin-top: -3rem !important;\n }\n .mr-xl-n5,\n .mx-xl-n5 {\n margin-right: -3rem !important;\n }\n .mb-xl-n5,\n .my-xl-n5 {\n margin-bottom: -3rem !important;\n }\n .ml-xl-n5,\n .mx-xl-n5 {\n margin-left: -3rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mt-xl-auto,\n .my-xl-auto {\n margin-top: auto !important;\n }\n .mr-xl-auto,\n .mx-xl-auto {\n margin-right: auto !important;\n }\n .mb-xl-auto,\n .my-xl-auto {\n margin-bottom: auto !important;\n }\n .ml-xl-auto,\n .mx-xl-auto {\n margin-left: auto !important;\n }\n}\n/*# sourceMappingURL=bootstrap-grid.css.map */","// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-grid-classes {\n // Single container class with breakpoint max-widths\n .container,\n // 100% wide container at all breakpoints\n .container-fluid {\n @include make-container();\n }\n\n // Responsive containers that are 100% wide until a breakpoint\n @each $breakpoint, $container-max-width in $container-max-widths {\n .container-#{$breakpoint} {\n @extend .container-fluid;\n }\n\n @include media-breakpoint-up($breakpoint, $grid-breakpoints) {\n %responsive-container-#{$breakpoint} {\n max-width: $container-max-width;\n }\n\n // Extend each breakpoint which is smaller or equal to the current breakpoint\n $extend-breakpoint: true;\n\n @each $name, $width in $grid-breakpoints {\n @if ($extend-breakpoint) {\n .container#{breakpoint-infix($name, $grid-breakpoints)} {\n @extend %responsive-container-#{$breakpoint};\n }\n\n // Once the current breakpoint is reached, stop extending\n @if ($breakpoint == $name) {\n $extend-breakpoint: false;\n }\n }\n }\n }\n }\n}\n\n\n// Row\n//\n// Rows contain your columns.\n\n@if $enable-grid-classes {\n .row {\n @include make-row();\n }\n\n // Remove the negative margin from default .row, then the horizontal padding\n // from all immediate children columns (to prevent runaway style inheritance).\n .no-gutters {\n margin-right: 0;\n margin-left: 0;\n\n > .col,\n > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n }\n }\n}\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n @include make-grid-columns();\n}\n","/// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-container($gutter: $grid-gutter-width) {\n width: 100%;\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n margin-right: auto;\n margin-left: auto;\n}\n\n@mixin make-row($gutter: $grid-gutter-width) {\n display: flex;\n flex-wrap: wrap;\n margin-right: -$gutter / 2;\n margin-left: -$gutter / 2;\n}\n\n// For each breakpoint, define the maximum width of the container in a media query\n@mixin make-container-max-widths($max-widths: $container-max-widths, $breakpoints: $grid-breakpoints) {\n @each $breakpoint, $container-max-width in $max-widths {\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n max-width: $container-max-width;\n }\n }\n @include deprecate(\"The `make-container-max-widths` mixin\", \"v4.5.2\", \"v5\");\n}\n\n@mixin make-col-ready($gutter: $grid-gutter-width) {\n position: relative;\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we use `flex` values\n // later on to override this initial width.\n width: 100%;\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n}\n\n@mixin make-col($size, $columns: $grid-columns) {\n flex: 0 0 percentage($size / $columns);\n // Add a `max-width` to ensure content within each column does not blow out\n // the width of the column. Applies to IE10+ and Firefox. Chrome and Safari\n // do not appear to require this.\n max-width: percentage($size / $columns);\n}\n\n@mixin make-col-auto() {\n flex: 0 0 auto;\n width: auto;\n max-width: 100%; // Reset earlier grid tiers\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: $size / $columns;\n margin-left: if($num == 0, 0, percentage($num));\n}\n\n// Row columns\n//\n// Specify on a parent element(e.g., .row) to force immediate children into NN\n// numberof columns. Supports wrapping to new lines, but does not do a Masonry\n// style grid.\n@mixin row-cols($count) {\n > * {\n flex: 0 0 100% / $count;\n max-width: 100% / $count;\n }\n}\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @return if($n != null and $n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width. Null for the largest (last) breakpoint.\n// The maximum value is calculated as the minimum of the next one less 0.02px\n// to work around the limitations of `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $next: breakpoint-next($name, $breakpoints);\n @return if($next, breakpoint-min($next, $breakpoints) - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $max: breakpoint-max($name, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($name, $breakpoints) {\n @content;\n }\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n // Common properties for all breakpoints\n %grid-column {\n position: relative;\n width: 100%;\n padding-right: $gutter / 2;\n padding-left: $gutter / 2;\n }\n\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @if $columns > 0 {\n // Allow columns to stretch full width below their breakpoints\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @extend %grid-column;\n }\n }\n }\n\n .col#{$infix},\n .col#{$infix}-auto {\n @extend %grid-column;\n }\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n\n @if $grid-row-columns > 0 {\n @for $i from 1 through $grid-row-columns {\n .row-cols#{$infix}-#{$i} {\n @include row-cols($i);\n }\n }\n }\n\n .col#{$infix}-auto {\n @include make-col-auto();\n }\n\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n }\n\n .order#{$infix}-first { order: -1; }\n\n .order#{$infix}-last { order: $columns + 1; }\n\n @for $i from 0 through $columns {\n .order#{$infix}-#{$i} { order: $i; }\n }\n\n @if $columns > 0 {\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n }\n }\n}\n","// stylelint-disable declaration-no-important\n\n//\n// Utilities for common `display` values\n//\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @each $value in $displays {\n .d#{$infix}-#{$value} { display: $value !important; }\n }\n }\n}\n\n\n//\n// Utilities for toggling `display` in print\n//\n\n@media print {\n @each $value in $displays {\n .d-print-#{$value} { display: $value !important; }\n }\n}\n","// stylelint-disable declaration-no-important\n\n// Flex variation\n//\n// Custom styles for additional flex alignment options.\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .flex#{$infix}-row { flex-direction: row !important; }\n .flex#{$infix}-column { flex-direction: column !important; }\n .flex#{$infix}-row-reverse { flex-direction: row-reverse !important; }\n .flex#{$infix}-column-reverse { flex-direction: column-reverse !important; }\n\n .flex#{$infix}-wrap { flex-wrap: wrap !important; }\n .flex#{$infix}-nowrap { flex-wrap: nowrap !important; }\n .flex#{$infix}-wrap-reverse { flex-wrap: wrap-reverse !important; }\n .flex#{$infix}-fill { flex: 1 1 auto !important; }\n .flex#{$infix}-grow-0 { flex-grow: 0 !important; }\n .flex#{$infix}-grow-1 { flex-grow: 1 !important; }\n .flex#{$infix}-shrink-0 { flex-shrink: 0 !important; }\n .flex#{$infix}-shrink-1 { flex-shrink: 1 !important; }\n\n .justify-content#{$infix}-start { justify-content: flex-start !important; }\n .justify-content#{$infix}-end { justify-content: flex-end !important; }\n .justify-content#{$infix}-center { justify-content: center !important; }\n .justify-content#{$infix}-between { justify-content: space-between !important; }\n .justify-content#{$infix}-around { justify-content: space-around !important; }\n\n .align-items#{$infix}-start { align-items: flex-start !important; }\n .align-items#{$infix}-end { align-items: flex-end !important; }\n .align-items#{$infix}-center { align-items: center !important; }\n .align-items#{$infix}-baseline { align-items: baseline !important; }\n .align-items#{$infix}-stretch { align-items: stretch !important; }\n\n .align-content#{$infix}-start { align-content: flex-start !important; }\n .align-content#{$infix}-end { align-content: flex-end !important; }\n .align-content#{$infix}-center { align-content: center !important; }\n .align-content#{$infix}-between { align-content: space-between !important; }\n .align-content#{$infix}-around { align-content: space-around !important; }\n .align-content#{$infix}-stretch { align-content: stretch !important; }\n\n .align-self#{$infix}-auto { align-self: auto !important; }\n .align-self#{$infix}-start { align-self: flex-start !important; }\n .align-self#{$infix}-end { align-self: flex-end !important; }\n .align-self#{$infix}-center { align-self: center !important; }\n .align-self#{$infix}-baseline { align-self: baseline !important; }\n .align-self#{$infix}-stretch { align-self: stretch !important; }\n }\n}\n","// stylelint-disable declaration-no-important\n\n// Margin and Padding\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @each $prop, $abbrev in (margin: m, padding: p) {\n @each $size, $length in $spacers {\n .#{$abbrev}#{$infix}-#{$size} { #{$prop}: $length !important; }\n .#{$abbrev}t#{$infix}-#{$size},\n .#{$abbrev}y#{$infix}-#{$size} {\n #{$prop}-top: $length !important;\n }\n .#{$abbrev}r#{$infix}-#{$size},\n .#{$abbrev}x#{$infix}-#{$size} {\n #{$prop}-right: $length !important;\n }\n .#{$abbrev}b#{$infix}-#{$size},\n .#{$abbrev}y#{$infix}-#{$size} {\n #{$prop}-bottom: $length !important;\n }\n .#{$abbrev}l#{$infix}-#{$size},\n .#{$abbrev}x#{$infix}-#{$size} {\n #{$prop}-left: $length !important;\n }\n }\n }\n\n // Negative margins (e.g., where `.mb-n1` is negative version of `.mb-1`)\n @each $size, $length in $spacers {\n @if $size != 0 {\n .m#{$infix}-n#{$size} { margin: -$length !important; }\n .mt#{$infix}-n#{$size},\n .my#{$infix}-n#{$size} {\n margin-top: -$length !important;\n }\n .mr#{$infix}-n#{$size},\n .mx#{$infix}-n#{$size} {\n margin-right: -$length !important;\n }\n .mb#{$infix}-n#{$size},\n .my#{$infix}-n#{$size} {\n margin-bottom: -$length !important;\n }\n .ml#{$infix}-n#{$size},\n .mx#{$infix}-n#{$size} {\n margin-left: -$length !important;\n }\n }\n }\n\n // Some special margin utils\n .m#{$infix}-auto { margin: auto !important; }\n .mt#{$infix}-auto,\n .my#{$infix}-auto {\n margin-top: auto !important;\n }\n .mr#{$infix}-auto,\n .mx#{$infix}-auto {\n margin-right: auto !important;\n }\n .mb#{$infix}-auto,\n .my#{$infix}-auto {\n margin-bottom: auto !important;\n }\n .ml#{$infix}-auto,\n .mx#{$infix}-auto {\n margin-left: auto !important;\n }\n }\n}\n"]} \ No newline at end of file diff --git a/javascript-practice/simple-side-bar/vendor/bootstrap/css/bootstrap-reboot.css b/javascript-practice/simple-side-bar/vendor/bootstrap/css/bootstrap-reboot.css deleted file mode 100644 index 4c64218..0000000 --- a/javascript-practice/simple-side-bar/vendor/bootstrap/css/bootstrap-reboot.css +++ /dev/null @@ -1,326 +0,0 @@ -/*! - * Bootstrap Reboot v4.5.3 (https://getbootstrap.com/) - * Copyright 2011-2020 The Bootstrap Authors - * Copyright 2011-2020 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) - */ -*, -*::before, -*::after { - box-sizing: border-box; -} - -html { - font-family: sans-serif; - line-height: 1.15; - -webkit-text-size-adjust: 100%; - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -} - -article, aside, figcaption, figure, footer, header, hgroup, main, nav, section { - display: block; -} - -body { - margin: 0; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - font-size: 1rem; - font-weight: 400; - line-height: 1.5; - color: #212529; - text-align: left; - background-color: #fff; -} - -[tabindex="-1"]:focus:not(:focus-visible) { - outline: 0 !important; -} - -hr { - box-sizing: content-box; - height: 0; - overflow: visible; -} - -h1, h2, h3, h4, h5, h6 { - margin-top: 0; - margin-bottom: 0.5rem; -} - -p { - margin-top: 0; - margin-bottom: 1rem; -} - -abbr[title], -abbr[data-original-title] { - text-decoration: underline; - -webkit-text-decoration: underline dotted; - text-decoration: underline dotted; - cursor: help; - border-bottom: 0; - -webkit-text-decoration-skip-ink: none; - text-decoration-skip-ink: none; -} - -address { - margin-bottom: 1rem; - font-style: normal; - line-height: inherit; -} - -ol, -ul, -dl { - margin-top: 0; - margin-bottom: 1rem; -} - -ol ol, -ul ul, -ol ul, -ul ol { - margin-bottom: 0; -} - -dt { - font-weight: 700; -} - -dd { - margin-bottom: .5rem; - margin-left: 0; -} - -blockquote { - margin: 0 0 1rem; -} - -b, -strong { - font-weight: bolder; -} - -small { - font-size: 80%; -} - -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} - -sub { - bottom: -.25em; -} - -sup { - top: -.5em; -} - -a { - color: #007bff; - text-decoration: none; - background-color: transparent; -} - -a:hover { - color: #0056b3; - text-decoration: underline; -} - -a:not([href]):not([class]) { - color: inherit; - text-decoration: none; -} - -a:not([href]):not([class]):hover { - color: inherit; - text-decoration: none; -} - -pre, -code, -kbd, -samp { - font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; - font-size: 1em; -} - -pre { - margin-top: 0; - margin-bottom: 1rem; - overflow: auto; - -ms-overflow-style: scrollbar; -} - -figure { - margin: 0 0 1rem; -} - -img { - vertical-align: middle; - border-style: none; -} - -svg { - overflow: hidden; - vertical-align: middle; -} - -table { - border-collapse: collapse; -} - -caption { - padding-top: 0.75rem; - padding-bottom: 0.75rem; - color: #6c757d; - text-align: left; - caption-side: bottom; -} - -th { - text-align: inherit; - text-align: -webkit-match-parent; -} - -label { - display: inline-block; - margin-bottom: 0.5rem; -} - -button { - border-radius: 0; -} - -button:focus { - outline: 1px dotted; - outline: 5px auto -webkit-focus-ring-color; -} - -input, -button, -select, -optgroup, -textarea { - margin: 0; - font-family: inherit; - font-size: inherit; - line-height: inherit; -} - -button, -input { - overflow: visible; -} - -button, -select { - text-transform: none; -} - -[role="button"] { - cursor: pointer; -} - -select { - word-wrap: normal; -} - -button, -[type="button"], -[type="reset"], -[type="submit"] { - -webkit-appearance: button; -} - -button:not(:disabled), -[type="button"]:not(:disabled), -[type="reset"]:not(:disabled), -[type="submit"]:not(:disabled) { - cursor: pointer; -} - -button::-moz-focus-inner, -[type="button"]::-moz-focus-inner, -[type="reset"]::-moz-focus-inner, -[type="submit"]::-moz-focus-inner { - padding: 0; - border-style: none; -} - -input[type="radio"], -input[type="checkbox"] { - box-sizing: border-box; - padding: 0; -} - -textarea { - overflow: auto; - resize: vertical; -} - -fieldset { - min-width: 0; - padding: 0; - margin: 0; - border: 0; -} - -legend { - display: block; - width: 100%; - max-width: 100%; - padding: 0; - margin-bottom: .5rem; - font-size: 1.5rem; - line-height: inherit; - color: inherit; - white-space: normal; -} - -progress { - vertical-align: baseline; -} - -[type="number"]::-webkit-inner-spin-button, -[type="number"]::-webkit-outer-spin-button { - height: auto; -} - -[type="search"] { - outline-offset: -2px; - -webkit-appearance: none; -} - -[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} - -::-webkit-file-upload-button { - font: inherit; - -webkit-appearance: button; -} - -output { - display: inline-block; -} - -summary { - display: list-item; - cursor: pointer; -} - -template { - display: none; -} - -[hidden] { - display: none !important; -} -/*# sourceMappingURL=bootstrap-reboot.css.map */ \ No newline at end of file diff --git a/javascript-practice/simple-side-bar/vendor/bootstrap/css/bootstrap-reboot.css.map b/javascript-practice/simple-side-bar/vendor/bootstrap/css/bootstrap-reboot.css.map deleted file mode 100644 index e79cab0..0000000 --- a/javascript-practice/simple-side-bar/vendor/bootstrap/css/bootstrap-reboot.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../../scss/bootstrap-reboot.scss","bootstrap-reboot.css","../../scss/_reboot.scss","../../scss/_variables.scss","../../scss/vendor/_rfs.scss","../../scss/mixins/_hover.scss"],"names":[],"mappings":"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","file":"bootstrap-reboot.css","sourcesContent":["/*!\n * Bootstrap Reboot v4.5.3 (https://getbootstrap.com/)\n * Copyright 2011-2020 The Bootstrap Authors\n * Copyright 2011-2020 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)\n */\n\n@import \"functions\";\n@import \"variables\";\n@import \"mixins\";\n@import \"reboot\";\n","/*!\n * Bootstrap Reboot v4.5.3 (https://getbootstrap.com/)\n * Copyright 2011-2020 The Bootstrap Authors\n * Copyright 2011-2020 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)\n */\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\nhtml {\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\nbody {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #212529;\n text-align: left;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus:not(:focus-visible) {\n outline: 0 !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: 0.5rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n text-decoration-skip-ink: none;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #007bff;\n text-decoration: none;\n background-color: transparent;\n}\n\na:hover {\n color: #0056b3;\n text-decoration: underline;\n}\n\na:not([href]):not([class]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([class]):hover {\n color: inherit;\n text-decoration: none;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n -ms-overflow-style: scrollbar;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg {\n overflow: hidden;\n vertical-align: middle;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n color: #6c757d;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: inherit;\n text-align: -webkit-match-parent;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: 0.5rem;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\n[role=\"button\"] {\n cursor: pointer;\n}\n\nselect {\n word-wrap: normal;\n}\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton:not(:disabled),\n[type=\"button\"]:not(:disabled),\n[type=\"reset\"]:not(:disabled),\n[type=\"submit\"]:not(:disabled) {\n cursor: pointer;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n cursor: pointer;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n\n/*# sourceMappingURL=bootstrap-reboot.css.map */","// stylelint-disable at-rule-no-vendor-prefix, declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// 1. Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n// 2. Change the default font family in all browsers.\n// 3. Correct the line height in all browsers.\n// 4. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS.\n// 5. Change the default tap highlight to be completely transparent in iOS.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box; // 1\n}\n\nhtml {\n font-family: sans-serif; // 2\n line-height: 1.15; // 3\n -webkit-text-size-adjust: 100%; // 4\n -webkit-tap-highlight-color: rgba($black, 0); // 5\n}\n\n// Shim for \"new\" HTML5 structural elements to display correctly (IE10, older browsers)\n// TODO: remove in v5\n// stylelint-disable-next-line selector-list-comma-newline-after\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Set an explicit initial text-align value so that we can later use\n// the `inherit` value on things like `` elements.\n\nbody {\n margin: 0; // 1\n font-family: $font-family-base;\n @include font-size($font-size-base);\n font-weight: $font-weight-base;\n line-height: $line-height-base;\n color: $body-color;\n text-align: left; // 3\n background-color: $body-bg; // 2\n}\n\n// Future-proof rule: in browsers that support :focus-visible, suppress the focus outline\n// on elements that programmatically receive focus but wouldn't normally show a visible\n// focus outline. In general, this would mean that the outline is only applied if the\n// interaction that led to the element receiving programmatic focus was a keyboard interaction,\n// or the browser has somehow determined that the user is primarily a keyboard user and/or\n// wants focus outlines to always be presented.\n//\n// See https://developer.mozilla.org/en-US/docs/Web/CSS/:focus-visible\n// and https://developer.paciellogroup.com/blog/2018/03/focus-visible-and-backwards-compatibility/\n[tabindex=\"-1\"]:focus:not(:focus-visible) {\n outline: 0 !important;\n}\n\n\n// Content grouping\n//\n// 1. Add the correct box sizing in Firefox.\n// 2. Show the overflow in Edge and IE.\n\nhr {\n box-sizing: content-box; // 1\n height: 0; // 1\n overflow: visible; // 2\n}\n\n\n//\n// Typography\n//\n\n// Remove top margins from headings\n//\n// By default, `

`-`

` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n// stylelint-disable-next-line selector-list-comma-newline-after\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: $headings-margin-bottom;\n}\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `

`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n// Abbreviations\n//\n// 1. Duplicate behavior to the data-* attribute for our tooltip plugin\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Remove the bottom border in Firefox 39-.\n// 5. Prevent the text-decoration to be skipped.\n\nabbr[title],\nabbr[data-original-title] { // 1\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n border-bottom: 0; // 4\n text-decoration-skip-ink: none; // 5\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // Undo browser default\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: $font-weight-bolder; // Add the correct font weight in Chrome, Edge, and Safari\n}\n\nsmall {\n @include font-size(80%); // Add the correct font size in all browsers\n}\n\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n//\n\nsub,\nsup {\n position: relative;\n @include font-size(75%);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n//\n// Links\n//\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n background-color: transparent; // Remove the gray background on active links in IE 10.\n\n @include hover() {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([class]) {\n color: inherit;\n text-decoration: none;\n\n @include hover() {\n color: inherit;\n text-decoration: none;\n }\n}\n\n\n//\n// Code\n//\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-monospace;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\npre {\n // Remove browser default top margin\n margin-top: 0;\n // Reset browser default of `1em` to use `rem`s\n margin-bottom: 1rem;\n // Don't allow content to break outside\n overflow: auto;\n // Disable auto-hiding scrollbar in IE & legacy Edge to avoid overlap,\n // making it impossible to interact with the content\n -ms-overflow-style: scrollbar;\n}\n\n\n//\n// Figures\n//\n\nfigure {\n // Apply a consistent margin strategy (matches our type styles).\n margin: 0 0 1rem;\n}\n\n\n//\n// Images and content\n//\n\nimg {\n vertical-align: middle;\n border-style: none; // Remove the border on images inside links in IE 10-.\n}\n\nsvg {\n // Workaround for the SVG overflow bug in IE10/11 is still required.\n // See https://github.com/twbs/bootstrap/issues/26878\n overflow: hidden;\n vertical-align: middle;\n}\n\n\n//\n// Tables\n//\n\ntable {\n border-collapse: collapse; // Prevent double borders\n}\n\ncaption {\n padding-top: $table-cell-padding;\n padding-bottom: $table-cell-padding;\n color: $table-caption-color;\n text-align: left;\n caption-side: bottom;\n}\n\n// 1. Removes font-weight bold by inheriting\n// 2. Matches default `` alignment by inheriting `text-align`.\n// 3. Fix alignment for Safari\n\nth {\n font-weight: $table-th-font-weight; // 1\n text-align: inherit; // 2\n text-align: -webkit-match-parent; // 3\n}\n\n\n//\n// Forms\n//\n\nlabel {\n // Allow labels to use `margin` for spacing.\n display: inline-block;\n margin-bottom: $label-margin-bottom;\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24093\nbutton {\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 0;\n}\n\n// Work around a Firefox/IE bug where the transparent `button` background\n// results in a loss of the default `button` focus styles.\n//\n// Credit: https://github.com/suitcss/base/\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // Remove the margin in Firefox and Safari\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible; // Show the overflow in Edge\n}\n\nbutton,\nselect {\n text-transform: none; // Remove the inheritance of text transform in Firefox\n}\n\n// Set the cursor for non-`

',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",sanitize:!0,sanitizeFn:null,whiteList:Qt,popperConfig:null},Zt={HIDE:"hide.bs.tooltip",HIDDEN:"hidden.bs.tooltip",SHOW:"show.bs.tooltip",SHOWN:"shown.bs.tooltip",INSERTED:"inserted.bs.tooltip",CLICK:"click.bs.tooltip",FOCUSIN:"focusin.bs.tooltip",FOCUSOUT:"focusout.bs.tooltip",MOUSEENTER:"mouseenter.bs.tooltip",MOUSELEAVE:"mouseleave.bs.tooltip"},te=function(){function t(t,e){if("undefined"==typeof It)throw new TypeError("Bootstrap's tooltips require Popper.js (https://popper.js.org/)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var e=t.prototype;return e.enable=function(){this._isEnabled=!0},e.disable=function(){this._isEnabled=!1},e.toggleEnabled=function(){this._isEnabled=!this._isEnabled},e.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=i.default(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),i.default(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(i.default(this.getTipElement()).hasClass("show"))return void this._leave(null,this);this._enter(null,this)}},e.dispose=function(){clearTimeout(this._timeout),i.default.removeData(this.element,this.constructor.DATA_KEY),i.default(this.element).off(this.constructor.EVENT_KEY),i.default(this.element).closest(".modal").off("hide.bs.modal",this._hideModalHandler),this.tip&&i.default(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},e.show=function(){var t=this;if("none"===i.default(this.element).css("display"))throw new Error("Please use show on visible elements");var e=i.default.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){i.default(this.element).trigger(e);var n=l.findShadowRoot(this.element),o=i.default.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(e.isDefaultPrevented()||!o)return;var r=this.getTipElement(),a=l.getUID(this.constructor.NAME);r.setAttribute("id",a),this.element.setAttribute("aria-describedby",a),this.setContent(),this.config.animation&&i.default(r).addClass("fade");var s="function"==typeof this.config.placement?this.config.placement.call(this,r,this.element):this.config.placement,u=this._getAttachment(s);this.addAttachmentClass(u);var f=this._getContainer();i.default(r).data(this.constructor.DATA_KEY,this),i.default.contains(this.element.ownerDocument.documentElement,this.tip)||i.default(r).appendTo(f),i.default(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new It(this.element,r,this._getPopperConfig(u)),i.default(r).addClass("show"),"ontouchstart"in document.documentElement&&i.default(document.body).children().on("mouseover",null,i.default.noop);var d=function(){t.config.animation&&t._fixTransition();var e=t._hoverState;t._hoverState=null,i.default(t.element).trigger(t.constructor.Event.SHOWN),"out"===e&&t._leave(null,t)};if(i.default(this.tip).hasClass("fade")){var c=l.getTransitionDurationFromElement(this.tip);i.default(this.tip).one(l.TRANSITION_END,d).emulateTransitionEnd(c)}else d()}},e.hide=function(t){var e=this,n=this.getTipElement(),o=i.default.Event(this.constructor.Event.HIDE),r=function(){"show"!==e._hoverState&&n.parentNode&&n.parentNode.removeChild(n),e._cleanTipClass(),e.element.removeAttribute("aria-describedby"),i.default(e.element).trigger(e.constructor.Event.HIDDEN),null!==e._popper&&e._popper.destroy(),t&&t()};if(i.default(this.element).trigger(o),!o.isDefaultPrevented()){if(i.default(n).removeClass("show"),"ontouchstart"in document.documentElement&&i.default(document.body).children().off("mouseover",null,i.default.noop),this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1,i.default(this.tip).hasClass("fade")){var a=l.getTransitionDurationFromElement(n);i.default(n).one(l.TRANSITION_END,r).emulateTransitionEnd(a)}else r();this._hoverState=""}},e.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},e.isWithContent=function(){return Boolean(this.getTitle())},e.addAttachmentClass=function(t){i.default(this.getTipElement()).addClass("bs-tooltip-"+t)},e.getTipElement=function(){return this.tip=this.tip||i.default(this.config.template)[0],this.tip},e.setContent=function(){var t=this.getTipElement();this.setElementContent(i.default(t.querySelectorAll(".tooltip-inner")),this.getTitle()),i.default(t).removeClass("fade show")},e.setElementContent=function(t,e){"object"!=typeof e||!e.nodeType&&!e.jquery?this.config.html?(this.config.sanitize&&(e=Vt(e,this.config.whiteList,this.config.sanitizeFn)),t.html(e)):t.text(e):this.config.html?i.default(e).parent().is(t)||t.empty().append(e):t.text(i.default(e).text())},e.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},e._getPopperConfig=function(t){var e=this;return a({},{placement:t,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:".arrow"},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}},this.config.popperConfig)},e._getOffset=function(){var t=this,e={};return"function"==typeof this.config.offset?e.fn=function(e){return e.offsets=a({},e.offsets,t.config.offset(e.offsets,t.element)||{}),e}:e.offset=this.config.offset,e},e._getContainer=function(){return!1===this.config.container?document.body:l.isElement(this.config.container)?i.default(this.config.container):i.default(document).find(this.config.container)},e._getAttachment=function(t){return $t[t.toUpperCase()]},e._setListeners=function(){var t=this;this.config.trigger.split(" ").forEach((function(e){if("click"===e)i.default(t.element).on(t.constructor.Event.CLICK,t.config.selector,(function(e){return t.toggle(e)}));else if("manual"!==e){var n="hover"===e?t.constructor.Event.MOUSEENTER:t.constructor.Event.FOCUSIN,o="hover"===e?t.constructor.Event.MOUSELEAVE:t.constructor.Event.FOCUSOUT;i.default(t.element).on(n,t.config.selector,(function(e){return t._enter(e)})).on(o,t.config.selector,(function(e){return t._leave(e)}))}})),this._hideModalHandler=function(){t.element&&t.hide()},i.default(this.element).closest(".modal").on("hide.bs.modal",this._hideModalHandler),this.config.selector?this.config=a({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},e._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},e._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||i.default(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),i.default(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusin"===t.type?"focus":"hover"]=!0),i.default(e.getTipElement()).hasClass("show")||"show"===e._hoverState?e._hoverState="show":(clearTimeout(e._timeout),e._hoverState="show",e.config.delay&&e.config.delay.show?e._timeout=setTimeout((function(){"show"===e._hoverState&&e.show()}),e.config.delay.show):e.show())},e._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||i.default(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),i.default(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusout"===t.type?"focus":"hover"]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState="out",e.config.delay&&e.config.delay.hide?e._timeout=setTimeout((function(){"out"===e._hoverState&&e.hide()}),e.config.delay.hide):e.hide())},e._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},e._getConfig=function(t){var e=i.default(this.element).data();return Object.keys(e).forEach((function(t){-1!==Kt.indexOf(t)&&delete e[t]})),"number"==typeof(t=a({},this.constructor.Default,e,"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),l.typeCheckConfig(Yt,t,this.constructor.DefaultType),t.sanitize&&(t.template=Vt(t.template,t.whiteList,t.sanitizeFn)),t},e._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},e._cleanTipClass=function(){var t=i.default(this.getTipElement()),e=t.attr("class").match(Xt);null!==e&&e.length&&t.removeClass(e.join(""))},e._handlePopperPlacementChange=function(t){this.tip=t.instance.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},e._fixTransition=function(){var t=this.getTipElement(),e=this.config.animation;null===t.getAttribute("x-placement")&&(i.default(t).removeClass("fade"),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},t._jQueryInterface=function(e){return this.each((function(){var n=i.default(this),o=n.data("bs.tooltip"),r="object"==typeof e&&e;if((o||!/dispose|hide/.test(e))&&(o||(o=new t(this,r),n.data("bs.tooltip",o)),"string"==typeof e)){if("undefined"==typeof o[e])throw new TypeError('No method named "'+e+'"');o[e]()}}))},r(t,null,[{key:"VERSION",get:function(){return"4.5.3"}},{key:"Default",get:function(){return Jt}},{key:"NAME",get:function(){return Yt}},{key:"DATA_KEY",get:function(){return"bs.tooltip"}},{key:"Event",get:function(){return Zt}},{key:"EVENT_KEY",get:function(){return".bs.tooltip"}},{key:"DefaultType",get:function(){return Gt}}]),t}();i.default.fn[Yt]=te._jQueryInterface,i.default.fn[Yt].Constructor=te,i.default.fn[Yt].noConflict=function(){return i.default.fn[Yt]=zt,te._jQueryInterface};var ee="popover",ne=i.default.fn[ee],ie=new RegExp("(^|\\s)bs-popover\\S+","g"),oe=a({},te.Default,{placement:"right",trigger:"click",content:"",template:''}),re=a({},te.DefaultType,{content:"(string|element|function)"}),ae={HIDE:"hide.bs.popover",HIDDEN:"hidden.bs.popover",SHOW:"show.bs.popover",SHOWN:"shown.bs.popover",INSERTED:"inserted.bs.popover",CLICK:"click.bs.popover",FOCUSIN:"focusin.bs.popover",FOCUSOUT:"focusout.bs.popover",MOUSEENTER:"mouseenter.bs.popover",MOUSELEAVE:"mouseleave.bs.popover"},se=function(t){var e,n;function o(){return t.apply(this,arguments)||this}n=t,(e=o).prototype=Object.create(n.prototype),e.prototype.constructor=e,e.__proto__=n;var a=o.prototype;return a.isWithContent=function(){return this.getTitle()||this._getContent()},a.addAttachmentClass=function(t){i.default(this.getTipElement()).addClass("bs-popover-"+t)},a.getTipElement=function(){return this.tip=this.tip||i.default(this.config.template)[0],this.tip},a.setContent=function(){var t=i.default(this.getTipElement());this.setElementContent(t.find(".popover-header"),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(".popover-body"),e),t.removeClass("fade show")},a._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},a._cleanTipClass=function(){var t=i.default(this.getTipElement()),e=t.attr("class").match(ie);null!==e&&e.length>0&&t.removeClass(e.join(""))},o._jQueryInterface=function(t){return this.each((function(){var e=i.default(this).data("bs.popover"),n="object"==typeof t?t:null;if((e||!/dispose|hide/.test(t))&&(e||(e=new o(this,n),i.default(this).data("bs.popover",e)),"string"==typeof t)){if("undefined"==typeof e[t])throw new TypeError('No method named "'+t+'"');e[t]()}}))},r(o,null,[{key:"VERSION",get:function(){return"4.5.3"}},{key:"Default",get:function(){return oe}},{key:"NAME",get:function(){return ee}},{key:"DATA_KEY",get:function(){return"bs.popover"}},{key:"Event",get:function(){return ae}},{key:"EVENT_KEY",get:function(){return".bs.popover"}},{key:"DefaultType",get:function(){return re}}]),o}(te);i.default.fn[ee]=se._jQueryInterface,i.default.fn[ee].Constructor=se,i.default.fn[ee].noConflict=function(){return i.default.fn[ee]=ne,se._jQueryInterface};var le="scrollspy",ue=i.default.fn[le],fe={offset:10,method:"auto",target:""},de={offset:"number",method:"string",target:"(string|element)"},ce=function(){function t(t,e){var n=this;this._element=t,this._scrollElement="BODY"===t.tagName?window:t,this._config=this._getConfig(e),this._selector=this._config.target+" .nav-link,"+this._config.target+" .list-group-item,"+this._config.target+" .dropdown-item",this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,i.default(this._scrollElement).on("scroll.bs.scrollspy",(function(t){return n._process(t)})),this.refresh(),this._process()}var e=t.prototype;return e.refresh=function(){var t=this,e=this._scrollElement===this._scrollElement.window?"offset":"position",n="auto"===this._config.method?e:this._config.method,o="position"===n?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),[].slice.call(document.querySelectorAll(this._selector)).map((function(t){var e,r=l.getSelectorFromElement(t);if(r&&(e=document.querySelector(r)),e){var a=e.getBoundingClientRect();if(a.width||a.height)return[i.default(e)[n]().top+o,r]}return null})).filter((function(t){return t})).sort((function(t,e){return t[0]-e[0]})).forEach((function(e){t._offsets.push(e[0]),t._targets.push(e[1])}))},e.dispose=function(){i.default.removeData(this._element,"bs.scrollspy"),i.default(this._scrollElement).off(".bs.scrollspy"),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},e._getConfig=function(t){if("string"!=typeof(t=a({},fe,"object"==typeof t&&t?t:{})).target&&l.isElement(t.target)){var e=i.default(t.target).attr("id");e||(e=l.getUID(le),i.default(t.target).attr("id",e)),t.target="#"+e}return l.typeCheckConfig(le,t,de),t},e._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},e._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},e._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},e._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=n){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t0)return this._activeTarget=null,void this._clear();for(var o=this._offsets.length;o--;){this._activeTarget!==this._targets[o]&&t>=this._offsets[o]&&("undefined"==typeof this._offsets[o+1]||t li > .active":".active";n=(n=i.default.makeArray(i.default(o).find(a)))[n.length-1]}var s=i.default.Event("hide.bs.tab",{relatedTarget:this._element}),u=i.default.Event("show.bs.tab",{relatedTarget:n});if(n&&i.default(n).trigger(s),i.default(this._element).trigger(u),!u.isDefaultPrevented()&&!s.isDefaultPrevented()){r&&(e=document.querySelector(r)),this._activate(this._element,o);var f=function(){var e=i.default.Event("hidden.bs.tab",{relatedTarget:t._element}),o=i.default.Event("shown.bs.tab",{relatedTarget:n});i.default(n).trigger(e),i.default(t._element).trigger(o)};e?this._activate(e,e.parentNode,f):f()}}},e.dispose=function(){i.default.removeData(this._element,"bs.tab"),this._element=null},e._activate=function(t,e,n){var o=this,r=(!e||"UL"!==e.nodeName&&"OL"!==e.nodeName?i.default(e).children(".active"):i.default(e).find("> li > .active"))[0],a=n&&r&&i.default(r).hasClass("fade"),s=function(){return o._transitionComplete(t,r,n)};if(r&&a){var u=l.getTransitionDurationFromElement(r);i.default(r).removeClass("show").one(l.TRANSITION_END,s).emulateTransitionEnd(u)}else s()},e._transitionComplete=function(t,e,n){if(e){i.default(e).removeClass("active");var o=i.default(e.parentNode).find("> .dropdown-menu .active")[0];o&&i.default(o).removeClass("active"),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!1)}if(i.default(t).addClass("active"),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),l.reflow(t),t.classList.contains("fade")&&t.classList.add("show"),t.parentNode&&i.default(t.parentNode).hasClass("dropdown-menu")){var r=i.default(t).closest(".dropdown")[0];if(r){var a=[].slice.call(r.querySelectorAll(".dropdown-toggle"));i.default(a).addClass("active")}t.setAttribute("aria-expanded",!0)}n&&n()},t._jQueryInterface=function(e){return this.each((function(){var n=i.default(this),o=n.data("bs.tab");if(o||(o=new t(this),n.data("bs.tab",o)),"string"==typeof e){if("undefined"==typeof o[e])throw new TypeError('No method named "'+e+'"');o[e]()}}))},r(t,null,[{key:"VERSION",get:function(){return"4.5.3"}}]),t}();i.default(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',(function(t){t.preventDefault(),pe._jQueryInterface.call(i.default(this),"show")})),i.default.fn.tab=pe._jQueryInterface,i.default.fn.tab.Constructor=pe,i.default.fn.tab.noConflict=function(){return i.default.fn.tab=he,pe._jQueryInterface};var me=i.default.fn.toast,ge={animation:"boolean",autohide:"boolean",delay:"number"},ve={animation:!0,autohide:!0,delay:500},_e=function(){function t(t,e){this._element=t,this._config=this._getConfig(e),this._timeout=null,this._setListeners()}var e=t.prototype;return e.show=function(){var t=this,e=i.default.Event("show.bs.toast");if(i.default(this._element).trigger(e),!e.isDefaultPrevented()){this._clearTimeout(),this._config.animation&&this._element.classList.add("fade");var n=function(){t._element.classList.remove("showing"),t._element.classList.add("show"),i.default(t._element).trigger("shown.bs.toast"),t._config.autohide&&(t._timeout=setTimeout((function(){t.hide()}),t._config.delay))};if(this._element.classList.remove("hide"),l.reflow(this._element),this._element.classList.add("showing"),this._config.animation){var o=l.getTransitionDurationFromElement(this._element);i.default(this._element).one(l.TRANSITION_END,n).emulateTransitionEnd(o)}else n()}},e.hide=function(){if(this._element.classList.contains("show")){var t=i.default.Event("hide.bs.toast");i.default(this._element).trigger(t),t.isDefaultPrevented()||this._close()}},e.dispose=function(){this._clearTimeout(),this._element.classList.contains("show")&&this._element.classList.remove("show"),i.default(this._element).off("click.dismiss.bs.toast"),i.default.removeData(this._element,"bs.toast"),this._element=null,this._config=null},e._getConfig=function(t){return t=a({},ve,i.default(this._element).data(),"object"==typeof t&&t?t:{}),l.typeCheckConfig("toast",t,this.constructor.DefaultType),t},e._setListeners=function(){var t=this;i.default(this._element).on("click.dismiss.bs.toast",'[data-dismiss="toast"]',(function(){return t.hide()}))},e._close=function(){var t=this,e=function(){t._element.classList.add("hide"),i.default(t._element).trigger("hidden.bs.toast")};if(this._element.classList.remove("show"),this._config.animation){var n=l.getTransitionDurationFromElement(this._element);i.default(this._element).one(l.TRANSITION_END,e).emulateTransitionEnd(n)}else e()},e._clearTimeout=function(){clearTimeout(this._timeout),this._timeout=null},t._jQueryInterface=function(e){return this.each((function(){var n=i.default(this),o=n.data("bs.toast");if(o||(o=new t(this,"object"==typeof e&&e),n.data("bs.toast",o)),"string"==typeof e){if("undefined"==typeof o[e])throw new TypeError('No method named "'+e+'"');o[e](this)}}))},r(t,null,[{key:"VERSION",get:function(){return"4.5.3"}},{key:"DefaultType",get:function(){return ge}},{key:"Default",get:function(){return ve}}]),t}();i.default.fn.toast=_e._jQueryInterface,i.default.fn.toast.Constructor=_e,i.default.fn.toast.noConflict=function(){return i.default.fn.toast=me,_e._jQueryInterface},t.Alert=d,t.Button=h,t.Carousel=y,t.Collapse=S,t.Dropdown=Ft,t.Modal=Bt,t.Popover=se,t.Scrollspy=ce,t.Tab=pe,t.Toast=_e,t.Tooltip=te,t.Util=l,Object.defineProperty(t,"__esModule",{value:!0})})); -//# sourceMappingURL=bootstrap.bundle.min.js.map \ No newline at end of file diff --git a/javascript-practice/simple-side-bar/vendor/bootstrap/js/bootstrap.bundle.min.js.map b/javascript-practice/simple-side-bar/vendor/bootstrap/js/bootstrap.bundle.min.js.map deleted file mode 100644 index 4146d43..0000000 --- a/javascript-practice/simple-side-bar/vendor/bootstrap/js/bootstrap.bundle.min.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../../js/src/util.js","../../js/src/alert.js","../../js/src/button.js","../../js/src/carousel.js","../../js/src/collapse.js","../../node_modules/popper.js/dist/esm/popper.js","../../js/src/dropdown.js","../../js/src/modal.js","../../js/src/tools/sanitizer.js","../../js/src/tooltip.js","../../js/src/popover.js","../../js/src/scrollspy.js","../../js/src/tab.js","../../js/src/toast.js"],"names":["transitionEndEmulator","duration","_this","this","called","$","one","Util","TRANSITION_END","setTimeout","triggerTransitionEnd","getUID","prefix","Math","random","document","getElementById","getSelectorFromElement","element","selector","getAttribute","hrefAttr","trim","querySelector","_","getTransitionDurationFromElement","transitionDuration","css","transitionDelay","floatTransitionDuration","parseFloat","floatTransitionDelay","split","reflow","offsetHeight","trigger","supportsTransitionEnd","Boolean","isElement","obj","nodeType","typeCheckConfig","componentName","config","configTypes","property","Object","prototype","hasOwnProperty","call","expectedTypes","value","valueType","toString","match","toLowerCase","RegExp","test","Error","toUpperCase","findShadowRoot","documentElement","attachShadow","getRootNode","root","ShadowRoot","parentNode","jQueryDetection","TypeError","version","fn","jquery","emulateTransitionEnd","event","special","bindType","delegateType","handle","target","is","handleObj","handler","apply","arguments","NAME","JQUERY_NO_CONFLICT","Alert","_element","close","rootElement","_getRootElement","_triggerCloseEvent","isDefaultPrevented","_removeElement","dispose","removeData","parent","closest","closeEvent","Event","removeClass","hasClass","_destroyElement","detach","remove","_jQueryInterface","each","$element","data","_handleDismiss","alertInstance","preventDefault","on","Constructor","noConflict","Button","shouldAvoidTriggerChange","toggle","triggerChangeEvent","addAriaPressed","input","type","checked","classList","contains","activeElement","focus","hasAttribute","setAttribute","toggleClass","avoidTriggerChange","button","initialButton","inputBtn","tagName","window","buttons","slice","querySelectorAll","i","len","length","add","EVENT_KEY","Default","interval","keyboard","slide","pause","wrap","touch","DefaultType","PointerType","TOUCH","PEN","Carousel","_items","_interval","_activeElement","_isPaused","_isSliding","touchTimeout","touchStartX","touchDeltaX","_config","_getConfig","_indicatorsElement","_touchSupported","navigator","maxTouchPoints","_pointerEvent","PointerEvent","MSPointerEvent","_addEventListeners","next","_slide","nextWhenVisible","hidden","prev","cycle","clearInterval","setInterval","visibilityState","bind","to","index","activeIndex","_getItemIndex","direction","off","_extends","_handleSwipe","absDeltax","abs","_this2","_keydown","_addTouchEventListeners","_this3","start","originalEvent","pointerType","clientX","touches","end","clearTimeout","e","move","which","indexOf","_getItemByDirection","isNextDirection","isPrevDirection","lastItemIndex","itemIndex","_triggerSlideEvent","relatedTarget","eventDirectionName","targetIndex","fromIndex","slideEvent","from","_setActiveIndicatorElement","indicators","nextIndicator","children","addClass","directionalClassName","orderClassName","_this4","activeElementIndex","nextElement","nextElementIndex","isCycling","slidEvent","nextElementInterval","parseInt","defaultInterval","CLASS_NAME_ACTIVE","action","ride","_dataApiClickHandler","slideIndex","carousels","$carousel","Collapse","_isTransitioning","_triggerArray","id","toggleList","elem","filterElement","filter","foundElem","_selector","push","_parent","_getParent","_addAriaAndCollapsedClass","hide","show","actives","activesData","not","startEvent","dimension","_getDimension","style","attr","setTransitioning","scrollSize","CLASS_NAME_COLLAPSE","getBoundingClientRect","triggerArrayLength","isTransitioning","_getTargetFromElement","triggerArray","isOpen","currentTarget","$trigger","selectors","$target","isBrowser","timeoutDuration","longerTimeoutBrowsers","userAgent","debounce","Promise","resolve","then","scheduled","isFunction","functionToCheck","getStyleComputedProperty","ownerDocument","defaultView","getComputedStyle","getParentNode","nodeName","host","getScrollParent","body","_getStyleComputedProp","overflow","overflowX","overflowY","getReferenceNode","reference","referenceNode","isIE11","MSInputMethodContext","documentMode","isIE10","isIE","getOffsetParent","noOffsetParent","offsetParent","nextElementSibling","getRoot","node","findCommonOffsetParent","element1","element2","order","compareDocumentPosition","Node","DOCUMENT_POSITION_FOLLOWING","range","createRange","setStart","setEnd","commonAncestorContainer","firstElementChild","element1root","getScroll","side","undefined","upperSide","html","scrollingElement","includeScroll","rect","subtract","scrollTop","scrollLeft","modifier","top","bottom","left","right","getBordersSize","styles","axis","sideA","sideB","getSize","computedStyle","max","getWindowSizes","height","width","classCallCheck","instance","createClass","defineProperties","props","descriptor","enumerable","configurable","writable","defineProperty","key","protoProps","staticProps","assign","source","getClientRect","offsets","result","sizes","clientWidth","clientHeight","horizScrollbar","offsetWidth","vertScrollbar","getOffsetRectRelativeToArbitraryNode","fixedPosition","isHTML","childrenRect","parentRect","scrollParent","borderTopWidth","borderLeftWidth","marginTop","marginLeft","getViewportOffsetRectRelativeToArtbitraryNode","excludeScroll","relativeOffset","innerWidth","innerHeight","offset","isFixed","getFixedPositionOffsetParent","parentElement","el","getBoundaries","popper","padding","boundariesElement","boundaries","boundariesNode","_getWindowSizes","isPaddingNumber","getArea","_ref","computeAutoPlacement","placement","refRect","rects","sortedAreas","keys","map","area","sort","a","b","filteredAreas","_ref2","computedPlacement","variation","getReferenceOffsets","state","commonOffsetParent","getOuterSizes","x","marginBottom","y","marginRight","getOppositePlacement","hash","replace","matched","getPopperOffsets","referenceOffsets","popperRect","popperOffsets","isHoriz","mainSide","secondarySide","measurement","secondaryMeasurement","find","arr","check","Array","runModifiers","modifiers","ends","prop","findIndex","cur","forEach","console","warn","enabled","update","isDestroyed","arrowStyles","attributes","flipped","options","positionFixed","flip","originalPlacement","position","isCreated","onUpdate","onCreate","isModifierEnabled","modifierName","some","name","getSupportedPropertyName","prefixes","upperProp","charAt","toCheck","destroy","removeAttribute","willChange","disableEventListeners","removeOnDestroy","removeChild","getWindow","setupEventListeners","updateBound","addEventListener","passive","scrollElement","attachToScrollParents","callback","scrollParents","isBody","eventsEnabled","enableEventListeners","scheduleUpdate","cancelAnimationFrame","removeEventListener","isNumeric","n","isNaN","isFinite","setStyles","unit","isFirefox","isModifierRequired","requestingName","requestedName","requesting","isRequired","_requesting","requested","placements","validPlacements","clockwise","counter","concat","reverse","BEHAVIORS","parseOffset","basePlacement","useHeight","fragments","frag","divider","search","splitRegex","ops","op","mergeWithPrevious","reduce","str","toValue","index2","Defaults","shift","shiftvariation","_data$offsets","isVertical","shiftOffsets","preventOverflow","transformProp","popperStyles","transform","priority","primary","escapeWithReference","secondary","min","keepTogether","floor","opSide","arrow","_data$offsets$arrow","arrowElement","sideCapitalized","altSide","arrowElementSize","center","popperMarginSide","popperBorderSide","sideValue","round","placementOpposite","flipOrder","behavior","step","refOffsets","overlapsRef","overflowsLeft","overflowsRight","overflowsTop","overflowsBottom","overflowsBoundaries","flippedVariationByRef","flipVariations","flippedVariationByContent","flipVariationsByContent","flippedVariation","getOppositeVariation","inner","subtractLength","bound","computeStyle","legacyGpuAccelerationOption","gpuAcceleration","offsetParentRect","shouldRound","noRound","v","referenceWidth","popperWidth","isVariation","horizontalToInteger","verticalToInteger","getRoundedOffsets","devicePixelRatio","prefixedProperty","invertTop","invertLeft","x-placement","applyStyle","onLoad","modifierOptions","Popper","requestAnimationFrame","Utils","global","PopperUtils","REGEXP_KEYDOWN","ARROW_UP_KEYCODE","boundary","display","popperConfig","Dropdown","_popper","_menu","_getMenuElement","_inNavbar","_detectNavbar","disabled","isActive","_clearMenus","usePopper","showEvent","_getParentFromElement","referenceElement","_getPopperConfig","noop","hideEvent","stopPropagation","constructor","_getPlacement","$parentDropdown","_getOffset","toggles","context","clickEvent","dropdownMenu","_dataApiKeydownHandler","items","item","EVENT_CLICK_DATA_API","backdrop","Modal","_dialog","_backdrop","_isShown","_isBodyOverflowing","_ignoreBackdropClick","_scrollbarWidth","_checkScrollbar","_setScrollbar","_adjustDialog","_setEscapeEvent","_setResizeEvent","_showBackdrop","_showElement","transition","_hideModal","htmlElement","handleUpdate","_triggerBackdropTransition","hideEventPrevented","isModalOverflowing","scrollHeight","modalTransitionDuration","modalBody","ELEMENT_NODE","appendChild","_enforceFocus","shownEvent","transitionComplete","_this5","has","_this6","_this7","_this8","_resetAdjustments","_resetScrollbar","_removeBackdrop","_this9","animate","createElement","className","appendTo","backdropTransitionDuration","callbackRemove","paddingLeft","paddingRight","_getScrollbarWidth","_this10","fixedContent","stickyContent","actualPadding","calculatedPadding","actualMargin","calculatedMargin","elements","margin","scrollDiv","scrollbarWidth","_this11","uriAttrs","DefaultWhitelist","*","br","col","code","div","em","hr","h1","h2","h3","h4","h5","h6","img","li","ol","p","pre","s","small","span","sub","sup","strong","u","ul","SAFE_URL_PATTERN","DATA_URL_PATTERN","sanitizeHtml","unsafeHtml","whiteList","sanitizeFn","createdDocument","DOMParser","parseFromString","whitelistKeys","_loop","elName","attributeList","whitelistedAttributes","allowedAttributeList","attrName","nodeValue","regExp","attrRegex","allowedAttribute","innerHTML","BSCLS_PREFIX_REGEX","DISALLOWED_ATTRIBUTES","animation","template","title","delay","container","fallbackPlacement","sanitize","AttachmentMap","AUTO","TOP","RIGHT","BOTTOM","LEFT","HIDE","HIDDEN","SHOW","SHOWN","INSERTED","CLICK","FOCUSIN","FOCUSOUT","MOUSEENTER","MOUSELEAVE","Tooltip","_isEnabled","_timeout","_hoverState","_activeTrigger","tip","_setListeners","enable","disable","toggleEnabled","dataKey","DATA_KEY","_getDelegateConfig","click","_isWithActiveTrigger","_enter","_leave","getTipElement","_hideModalHandler","isWithContent","shadowRoot","isInTheDom","tipId","setContent","attachment","_getAttachment","addAttachmentClass","_getContainer","complete","_fixTransition","prevHoverState","_cleanTipClass","getTitle","CLASS_PREFIX","setElementContent","CLASS_NAME_FADE","content","text","empty","append","_handlePopperPlacementChange","eventIn","eventOut","_fixTitle","titleType","dataAttributes","dataAttr","$tip","tabClass","join","popperData","initConfigAnimation","Popover","_getContent","method","ScrollSpy","_scrollElement","_offsets","_targets","_activeTarget","_scrollHeight","_process","refresh","autoMethod","offsetMethod","offsetBase","_getScrollTop","_getScrollHeight","targetSelector","targetBCR","pageYOffset","_getOffsetHeight","maxScroll","_activate","_clear","queries","$link","parents","SELECTOR_NAV_LINKS","scrollSpys","$spy","Tab","previous","listElement","itemSelector","makeArray","hiddenEvent","active","_transitionComplete","dropdownChild","dropdownElement","dropdownToggleList","$this","autohide","Toast","_clearTimeout","_close"],"mappings":"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","sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.5.3): util.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\n\n/**\n * ------------------------------------------------------------------------\n * Private TransitionEnd Helpers\n * ------------------------------------------------------------------------\n */\n\nconst TRANSITION_END = 'transitionend'\nconst MAX_UID = 1000000\nconst MILLISECONDS_MULTIPLIER = 1000\n\n// Shoutout AngusCroll (https://goo.gl/pxwQGp)\nfunction toType(obj) {\n if (obj === null || typeof obj === 'undefined') {\n return `${obj}`\n }\n\n return {}.toString.call(obj).match(/\\s([a-z]+)/i)[1].toLowerCase()\n}\n\nfunction getSpecialTransitionEndEvent() {\n return {\n bindType: TRANSITION_END,\n delegateType: TRANSITION_END,\n handle(event) {\n if ($(event.target).is(this)) {\n return event.handleObj.handler.apply(this, arguments) // eslint-disable-line prefer-rest-params\n }\n\n return undefined\n }\n }\n}\n\nfunction transitionEndEmulator(duration) {\n let called = false\n\n $(this).one(Util.TRANSITION_END, () => {\n called = true\n })\n\n setTimeout(() => {\n if (!called) {\n Util.triggerTransitionEnd(this)\n }\n }, duration)\n\n return this\n}\n\nfunction setTransitionEndSupport() {\n $.fn.emulateTransitionEnd = transitionEndEmulator\n $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent()\n}\n\n/**\n * --------------------------------------------------------------------------\n * Public Util Api\n * --------------------------------------------------------------------------\n */\n\nconst Util = {\n TRANSITION_END: 'bsTransitionEnd',\n\n getUID(prefix) {\n do {\n prefix += ~~(Math.random() * MAX_UID) // \"~~\" acts like a faster Math.floor() here\n } while (document.getElementById(prefix))\n\n return prefix\n },\n\n getSelectorFromElement(element) {\n let selector = element.getAttribute('data-target')\n\n if (!selector || selector === '#') {\n const hrefAttr = element.getAttribute('href')\n selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : ''\n }\n\n try {\n return document.querySelector(selector) ? selector : null\n } catch (_) {\n return null\n }\n },\n\n getTransitionDurationFromElement(element) {\n if (!element) {\n return 0\n }\n\n // Get transition-duration of the element\n let transitionDuration = $(element).css('transition-duration')\n let transitionDelay = $(element).css('transition-delay')\n\n const floatTransitionDuration = parseFloat(transitionDuration)\n const floatTransitionDelay = parseFloat(transitionDelay)\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0]\n transitionDelay = transitionDelay.split(',')[0]\n\n return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\n },\n\n reflow(element) {\n return element.offsetHeight\n },\n\n triggerTransitionEnd(element) {\n $(element).trigger(TRANSITION_END)\n },\n\n supportsTransitionEnd() {\n return Boolean(TRANSITION_END)\n },\n\n isElement(obj) {\n return (obj[0] || obj).nodeType\n },\n\n typeCheckConfig(componentName, config, configTypes) {\n for (const property in configTypes) {\n if (Object.prototype.hasOwnProperty.call(configTypes, property)) {\n const expectedTypes = configTypes[property]\n const value = config[property]\n const valueType = value && Util.isElement(value) ?\n 'element' : toType(value)\n\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new Error(\n `${componentName.toUpperCase()}: ` +\n `Option \"${property}\" provided type \"${valueType}\" ` +\n `but expected type \"${expectedTypes}\".`)\n }\n }\n }\n },\n\n findShadowRoot(element) {\n if (!document.documentElement.attachShadow) {\n return null\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode()\n return root instanceof ShadowRoot ? root : null\n }\n\n if (element instanceof ShadowRoot) {\n return element\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null\n }\n\n return Util.findShadowRoot(element.parentNode)\n },\n\n jQueryDetection() {\n if (typeof $ === 'undefined') {\n throw new TypeError('Bootstrap\\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\\'s JavaScript.')\n }\n\n const version = $.fn.jquery.split(' ')[0].split('.')\n const minMajor = 1\n const ltMajor = 2\n const minMinor = 9\n const minPatch = 1\n const maxMajor = 4\n\n if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) {\n throw new Error('Bootstrap\\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0')\n }\n }\n}\n\nUtil.jQueryDetection()\nsetTransitionEndSupport()\n\nexport default Util\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.5.3): alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'alert'\nconst VERSION = '4.5.3'\nconst DATA_KEY = 'bs.alert'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst SELECTOR_DISMISS = '[data-dismiss=\"alert\"]'\n\nconst EVENT_CLOSE = `close${EVENT_KEY}`\nconst EVENT_CLOSED = `closed${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_ALERT = 'alert'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Alert {\n constructor(element) {\n this._element = element\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n // Public\n\n close(element) {\n let rootElement = this._element\n if (element) {\n rootElement = this._getRootElement(element)\n }\n\n const customEvent = this._triggerCloseEvent(rootElement)\n\n if (customEvent.isDefaultPrevented()) {\n return\n }\n\n this._removeElement(rootElement)\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n this._element = null\n }\n\n // Private\n\n _getRootElement(element) {\n const selector = Util.getSelectorFromElement(element)\n let parent = false\n\n if (selector) {\n parent = document.querySelector(selector)\n }\n\n if (!parent) {\n parent = $(element).closest(`.${CLASS_NAME_ALERT}`)[0]\n }\n\n return parent\n }\n\n _triggerCloseEvent(element) {\n const closeEvent = $.Event(EVENT_CLOSE)\n\n $(element).trigger(closeEvent)\n return closeEvent\n }\n\n _removeElement(element) {\n $(element).removeClass(CLASS_NAME_SHOW)\n\n if (!$(element).hasClass(CLASS_NAME_FADE)) {\n this._destroyElement(element)\n return\n }\n\n const transitionDuration = Util.getTransitionDurationFromElement(element)\n\n $(element)\n .one(Util.TRANSITION_END, event => this._destroyElement(element, event))\n .emulateTransitionEnd(transitionDuration)\n }\n\n _destroyElement(element) {\n $(element)\n .detach()\n .trigger(EVENT_CLOSED)\n .remove()\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n const $element = $(this)\n let data = $element.data(DATA_KEY)\n\n if (!data) {\n data = new Alert(this)\n $element.data(DATA_KEY, data)\n }\n\n if (config === 'close') {\n data[config](this)\n }\n })\n }\n\n static _handleDismiss(alertInstance) {\n return function (event) {\n if (event) {\n event.preventDefault()\n }\n\n alertInstance.close(this)\n }\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document).on(\n EVENT_CLICK_DATA_API,\n SELECTOR_DISMISS,\n Alert._handleDismiss(new Alert())\n)\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Alert._jQueryInterface\n$.fn[NAME].Constructor = Alert\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Alert._jQueryInterface\n}\n\nexport default Alert\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.5.3): button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'button'\nconst VERSION = '4.5.3'\nconst DATA_KEY = 'bs.button'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_BUTTON = 'btn'\nconst CLASS_NAME_FOCUS = 'focus'\n\nconst SELECTOR_DATA_TOGGLE_CARROT = '[data-toggle^=\"button\"]'\nconst SELECTOR_DATA_TOGGLES = '[data-toggle=\"buttons\"]'\nconst SELECTOR_DATA_TOGGLE = '[data-toggle=\"button\"]'\nconst SELECTOR_DATA_TOGGLES_BUTTONS = '[data-toggle=\"buttons\"] .btn'\nconst SELECTOR_INPUT = 'input:not([type=\"hidden\"])'\nconst SELECTOR_ACTIVE = '.active'\nconst SELECTOR_BUTTON = '.btn'\n\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_FOCUS_BLUR_DATA_API = `focus${EVENT_KEY}${DATA_API_KEY} ` +\n `blur${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Button {\n constructor(element) {\n this._element = element\n this.shouldAvoidTriggerChange = false\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n // Public\n\n toggle() {\n let triggerChangeEvent = true\n let addAriaPressed = true\n const rootElement = $(this._element).closest(SELECTOR_DATA_TOGGLES)[0]\n\n if (rootElement) {\n const input = this._element.querySelector(SELECTOR_INPUT)\n\n if (input) {\n if (input.type === 'radio') {\n if (input.checked && this._element.classList.contains(CLASS_NAME_ACTIVE)) {\n triggerChangeEvent = false\n } else {\n const activeElement = rootElement.querySelector(SELECTOR_ACTIVE)\n\n if (activeElement) {\n $(activeElement).removeClass(CLASS_NAME_ACTIVE)\n }\n }\n }\n\n if (triggerChangeEvent) {\n // if it's not a radio button or checkbox don't add a pointless/invalid checked property to the input\n if (input.type === 'checkbox' || input.type === 'radio') {\n input.checked = !this._element.classList.contains(CLASS_NAME_ACTIVE)\n }\n\n if (!this.shouldAvoidTriggerChange) {\n $(input).trigger('change')\n }\n }\n\n input.focus()\n addAriaPressed = false\n }\n }\n\n if (!(this._element.hasAttribute('disabled') || this._element.classList.contains('disabled'))) {\n if (addAriaPressed) {\n this._element.setAttribute('aria-pressed', !this._element.classList.contains(CLASS_NAME_ACTIVE))\n }\n\n if (triggerChangeEvent) {\n $(this._element).toggleClass(CLASS_NAME_ACTIVE)\n }\n }\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n this._element = null\n }\n\n // Static\n\n static _jQueryInterface(config, avoidTriggerChange) {\n return this.each(function () {\n const $element = $(this)\n let data = $element.data(DATA_KEY)\n\n if (!data) {\n data = new Button(this)\n $element.data(DATA_KEY, data)\n }\n\n data.shouldAvoidTriggerChange = avoidTriggerChange\n\n if (config === 'toggle') {\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document)\n .on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE_CARROT, event => {\n let button = event.target\n const initialButton = button\n\n if (!$(button).hasClass(CLASS_NAME_BUTTON)) {\n button = $(button).closest(SELECTOR_BUTTON)[0]\n }\n\n if (!button || button.hasAttribute('disabled') || button.classList.contains('disabled')) {\n event.preventDefault() // work around Firefox bug #1540995\n } else {\n const inputBtn = button.querySelector(SELECTOR_INPUT)\n\n if (inputBtn && (inputBtn.hasAttribute('disabled') || inputBtn.classList.contains('disabled'))) {\n event.preventDefault() // work around Firefox bug #1540995\n return\n }\n\n if (initialButton.tagName === 'INPUT' || button.tagName !== 'LABEL') {\n Button._jQueryInterface.call($(button), 'toggle', initialButton.tagName === 'INPUT')\n }\n }\n })\n .on(EVENT_FOCUS_BLUR_DATA_API, SELECTOR_DATA_TOGGLE_CARROT, event => {\n const button = $(event.target).closest(SELECTOR_BUTTON)[0]\n $(button).toggleClass(CLASS_NAME_FOCUS, /^focus(in)?$/.test(event.type))\n })\n\n$(window).on(EVENT_LOAD_DATA_API, () => {\n // ensure correct active class is set to match the controls' actual values/states\n\n // find all checkboxes/readio buttons inside data-toggle groups\n let buttons = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLES_BUTTONS))\n for (let i = 0, len = buttons.length; i < len; i++) {\n const button = buttons[i]\n const input = button.querySelector(SELECTOR_INPUT)\n if (input.checked || input.hasAttribute('checked')) {\n button.classList.add(CLASS_NAME_ACTIVE)\n } else {\n button.classList.remove(CLASS_NAME_ACTIVE)\n }\n }\n\n // find all button toggles\n buttons = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE))\n for (let i = 0, len = buttons.length; i < len; i++) {\n const button = buttons[i]\n if (button.getAttribute('aria-pressed') === 'true') {\n button.classList.add(CLASS_NAME_ACTIVE)\n } else {\n button.classList.remove(CLASS_NAME_ACTIVE)\n }\n }\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Button._jQueryInterface\n$.fn[NAME].Constructor = Button\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Button._jQueryInterface\n}\n\nexport default Button\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.5.3): carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'carousel'\nconst VERSION = '4.5.3'\nconst DATA_KEY = 'bs.carousel'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst ARROW_LEFT_KEYCODE = 37 // KeyboardEvent.which value for left arrow key\nconst ARROW_RIGHT_KEYCODE = 39 // KeyboardEvent.which value for right arrow key\nconst TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fire after touch\nconst SWIPE_THRESHOLD = 40\n\nconst Default = {\n interval: 5000,\n keyboard: true,\n slide: false,\n pause: 'hover',\n wrap: true,\n touch: true\n}\n\nconst DefaultType = {\n interval: '(number|boolean)',\n keyboard: 'boolean',\n slide: '(boolean|string)',\n pause: '(string|boolean)',\n wrap: 'boolean',\n touch: 'boolean'\n}\n\nconst DIRECTION_NEXT = 'next'\nconst DIRECTION_PREV = 'prev'\nconst DIRECTION_LEFT = 'left'\nconst DIRECTION_RIGHT = 'right'\n\nconst EVENT_SLIDE = `slide${EVENT_KEY}`\nconst EVENT_SLID = `slid${EVENT_KEY}`\nconst EVENT_KEYDOWN = `keydown${EVENT_KEY}`\nconst EVENT_MOUSEENTER = `mouseenter${EVENT_KEY}`\nconst EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY}`\nconst EVENT_TOUCHSTART = `touchstart${EVENT_KEY}`\nconst EVENT_TOUCHMOVE = `touchmove${EVENT_KEY}`\nconst EVENT_TOUCHEND = `touchend${EVENT_KEY}`\nconst EVENT_POINTERDOWN = `pointerdown${EVENT_KEY}`\nconst EVENT_POINTERUP = `pointerup${EVENT_KEY}`\nconst EVENT_DRAG_START = `dragstart${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_CAROUSEL = 'carousel'\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_SLIDE = 'slide'\nconst CLASS_NAME_RIGHT = 'carousel-item-right'\nconst CLASS_NAME_LEFT = 'carousel-item-left'\nconst CLASS_NAME_NEXT = 'carousel-item-next'\nconst CLASS_NAME_PREV = 'carousel-item-prev'\nconst CLASS_NAME_POINTER_EVENT = 'pointer-event'\n\nconst SELECTOR_ACTIVE = '.active'\nconst SELECTOR_ACTIVE_ITEM = '.active.carousel-item'\nconst SELECTOR_ITEM = '.carousel-item'\nconst SELECTOR_ITEM_IMG = '.carousel-item img'\nconst SELECTOR_NEXT_PREV = '.carousel-item-next, .carousel-item-prev'\nconst SELECTOR_INDICATORS = '.carousel-indicators'\nconst SELECTOR_DATA_SLIDE = '[data-slide], [data-slide-to]'\nconst SELECTOR_DATA_RIDE = '[data-ride=\"carousel\"]'\n\nconst PointerType = {\n TOUCH: 'touch',\n PEN: 'pen'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\nclass Carousel {\n constructor(element, config) {\n this._items = null\n this._interval = null\n this._activeElement = null\n this._isPaused = false\n this._isSliding = false\n this.touchTimeout = null\n this.touchStartX = 0\n this.touchDeltaX = 0\n\n this._config = this._getConfig(config)\n this._element = element\n this._indicatorsElement = this._element.querySelector(SELECTOR_INDICATORS)\n this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0\n this._pointerEvent = Boolean(window.PointerEvent || window.MSPointerEvent)\n\n this._addEventListeners()\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n next() {\n if (!this._isSliding) {\n this._slide(DIRECTION_NEXT)\n }\n }\n\n nextWhenVisible() {\n const $element = $(this._element)\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden &&\n ($element.is(':visible') && $element.css('visibility') !== 'hidden')) {\n this.next()\n }\n }\n\n prev() {\n if (!this._isSliding) {\n this._slide(DIRECTION_PREV)\n }\n }\n\n pause(event) {\n if (!event) {\n this._isPaused = true\n }\n\n if (this._element.querySelector(SELECTOR_NEXT_PREV)) {\n Util.triggerTransitionEnd(this._element)\n this.cycle(true)\n }\n\n clearInterval(this._interval)\n this._interval = null\n }\n\n cycle(event) {\n if (!event) {\n this._isPaused = false\n }\n\n if (this._interval) {\n clearInterval(this._interval)\n this._interval = null\n }\n\n if (this._config.interval && !this._isPaused) {\n this._interval = setInterval(\n (document.visibilityState ? this.nextWhenVisible : this.next).bind(this),\n this._config.interval\n )\n }\n }\n\n to(index) {\n this._activeElement = this._element.querySelector(SELECTOR_ACTIVE_ITEM)\n\n const activeIndex = this._getItemIndex(this._activeElement)\n\n if (index > this._items.length - 1 || index < 0) {\n return\n }\n\n if (this._isSliding) {\n $(this._element).one(EVENT_SLID, () => this.to(index))\n return\n }\n\n if (activeIndex === index) {\n this.pause()\n this.cycle()\n return\n }\n\n const direction = index > activeIndex ?\n DIRECTION_NEXT :\n DIRECTION_PREV\n\n this._slide(direction, this._items[index])\n }\n\n dispose() {\n $(this._element).off(EVENT_KEY)\n $.removeData(this._element, DATA_KEY)\n\n this._items = null\n this._config = null\n this._element = null\n this._interval = null\n this._isPaused = null\n this._isSliding = null\n this._activeElement = null\n this._indicatorsElement = null\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...config\n }\n Util.typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _handleSwipe() {\n const absDeltax = Math.abs(this.touchDeltaX)\n\n if (absDeltax <= SWIPE_THRESHOLD) {\n return\n }\n\n const direction = absDeltax / this.touchDeltaX\n\n this.touchDeltaX = 0\n\n // swipe left\n if (direction > 0) {\n this.prev()\n }\n\n // swipe right\n if (direction < 0) {\n this.next()\n }\n }\n\n _addEventListeners() {\n if (this._config.keyboard) {\n $(this._element).on(EVENT_KEYDOWN, event => this._keydown(event))\n }\n\n if (this._config.pause === 'hover') {\n $(this._element)\n .on(EVENT_MOUSEENTER, event => this.pause(event))\n .on(EVENT_MOUSELEAVE, event => this.cycle(event))\n }\n\n if (this._config.touch) {\n this._addTouchEventListeners()\n }\n }\n\n _addTouchEventListeners() {\n if (!this._touchSupported) {\n return\n }\n\n const start = event => {\n if (this._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\n this.touchStartX = event.originalEvent.clientX\n } else if (!this._pointerEvent) {\n this.touchStartX = event.originalEvent.touches[0].clientX\n }\n }\n\n const move = event => {\n // ensure swiping with one touch and not pinching\n if (event.originalEvent.touches && event.originalEvent.touches.length > 1) {\n this.touchDeltaX = 0\n } else {\n this.touchDeltaX = event.originalEvent.touches[0].clientX - this.touchStartX\n }\n }\n\n const end = event => {\n if (this._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\n this.touchDeltaX = event.originalEvent.clientX - this.touchStartX\n }\n\n this._handleSwipe()\n if (this._config.pause === 'hover') {\n // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n\n this.pause()\n if (this.touchTimeout) {\n clearTimeout(this.touchTimeout)\n }\n\n this.touchTimeout = setTimeout(event => this.cycle(event), TOUCHEVENT_COMPAT_WAIT + this._config.interval)\n }\n }\n\n $(this._element.querySelectorAll(SELECTOR_ITEM_IMG))\n .on(EVENT_DRAG_START, e => e.preventDefault())\n\n if (this._pointerEvent) {\n $(this._element).on(EVENT_POINTERDOWN, event => start(event))\n $(this._element).on(EVENT_POINTERUP, event => end(event))\n\n this._element.classList.add(CLASS_NAME_POINTER_EVENT)\n } else {\n $(this._element).on(EVENT_TOUCHSTART, event => start(event))\n $(this._element).on(EVENT_TOUCHMOVE, event => move(event))\n $(this._element).on(EVENT_TOUCHEND, event => end(event))\n }\n }\n\n _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return\n }\n\n switch (event.which) {\n case ARROW_LEFT_KEYCODE:\n event.preventDefault()\n this.prev()\n break\n case ARROW_RIGHT_KEYCODE:\n event.preventDefault()\n this.next()\n break\n default:\n }\n }\n\n _getItemIndex(element) {\n this._items = element && element.parentNode ?\n [].slice.call(element.parentNode.querySelectorAll(SELECTOR_ITEM)) :\n []\n return this._items.indexOf(element)\n }\n\n _getItemByDirection(direction, activeElement) {\n const isNextDirection = direction === DIRECTION_NEXT\n const isPrevDirection = direction === DIRECTION_PREV\n const activeIndex = this._getItemIndex(activeElement)\n const lastItemIndex = this._items.length - 1\n const isGoingToWrap = isPrevDirection && activeIndex === 0 ||\n isNextDirection && activeIndex === lastItemIndex\n\n if (isGoingToWrap && !this._config.wrap) {\n return activeElement\n }\n\n const delta = direction === DIRECTION_PREV ? -1 : 1\n const itemIndex = (activeIndex + delta) % this._items.length\n\n return itemIndex === -1 ?\n this._items[this._items.length - 1] : this._items[itemIndex]\n }\n\n _triggerSlideEvent(relatedTarget, eventDirectionName) {\n const targetIndex = this._getItemIndex(relatedTarget)\n const fromIndex = this._getItemIndex(this._element.querySelector(SELECTOR_ACTIVE_ITEM))\n const slideEvent = $.Event(EVENT_SLIDE, {\n relatedTarget,\n direction: eventDirectionName,\n from: fromIndex,\n to: targetIndex\n })\n\n $(this._element).trigger(slideEvent)\n\n return slideEvent\n }\n\n _setActiveIndicatorElement(element) {\n if (this._indicatorsElement) {\n const indicators = [].slice.call(this._indicatorsElement.querySelectorAll(SELECTOR_ACTIVE))\n $(indicators).removeClass(CLASS_NAME_ACTIVE)\n\n const nextIndicator = this._indicatorsElement.children[\n this._getItemIndex(element)\n ]\n\n if (nextIndicator) {\n $(nextIndicator).addClass(CLASS_NAME_ACTIVE)\n }\n }\n }\n\n _slide(direction, element) {\n const activeElement = this._element.querySelector(SELECTOR_ACTIVE_ITEM)\n const activeElementIndex = this._getItemIndex(activeElement)\n const nextElement = element || activeElement &&\n this._getItemByDirection(direction, activeElement)\n const nextElementIndex = this._getItemIndex(nextElement)\n const isCycling = Boolean(this._interval)\n\n let directionalClassName\n let orderClassName\n let eventDirectionName\n\n if (direction === DIRECTION_NEXT) {\n directionalClassName = CLASS_NAME_LEFT\n orderClassName = CLASS_NAME_NEXT\n eventDirectionName = DIRECTION_LEFT\n } else {\n directionalClassName = CLASS_NAME_RIGHT\n orderClassName = CLASS_NAME_PREV\n eventDirectionName = DIRECTION_RIGHT\n }\n\n if (nextElement && $(nextElement).hasClass(CLASS_NAME_ACTIVE)) {\n this._isSliding = false\n return\n }\n\n const slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName)\n if (slideEvent.isDefaultPrevented()) {\n return\n }\n\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n return\n }\n\n this._isSliding = true\n\n if (isCycling) {\n this.pause()\n }\n\n this._setActiveIndicatorElement(nextElement)\n\n const slidEvent = $.Event(EVENT_SLID, {\n relatedTarget: nextElement,\n direction: eventDirectionName,\n from: activeElementIndex,\n to: nextElementIndex\n })\n\n if ($(this._element).hasClass(CLASS_NAME_SLIDE)) {\n $(nextElement).addClass(orderClassName)\n\n Util.reflow(nextElement)\n\n $(activeElement).addClass(directionalClassName)\n $(nextElement).addClass(directionalClassName)\n\n const nextElementInterval = parseInt(nextElement.getAttribute('data-interval'), 10)\n if (nextElementInterval) {\n this._config.defaultInterval = this._config.defaultInterval || this._config.interval\n this._config.interval = nextElementInterval\n } else {\n this._config.interval = this._config.defaultInterval || this._config.interval\n }\n\n const transitionDuration = Util.getTransitionDurationFromElement(activeElement)\n\n $(activeElement)\n .one(Util.TRANSITION_END, () => {\n $(nextElement)\n .removeClass(`${directionalClassName} ${orderClassName}`)\n .addClass(CLASS_NAME_ACTIVE)\n\n $(activeElement).removeClass(`${CLASS_NAME_ACTIVE} ${orderClassName} ${directionalClassName}`)\n\n this._isSliding = false\n\n setTimeout(() => $(this._element).trigger(slidEvent), 0)\n })\n .emulateTransitionEnd(transitionDuration)\n } else {\n $(activeElement).removeClass(CLASS_NAME_ACTIVE)\n $(nextElement).addClass(CLASS_NAME_ACTIVE)\n\n this._isSliding = false\n $(this._element).trigger(slidEvent)\n }\n\n if (isCycling) {\n this.cycle()\n }\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n let _config = {\n ...Default,\n ...$(this).data()\n }\n\n if (typeof config === 'object') {\n _config = {\n ..._config,\n ...config\n }\n }\n\n const action = typeof config === 'string' ? config : _config.slide\n\n if (!data) {\n data = new Carousel(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'number') {\n data.to(config)\n } else if (typeof action === 'string') {\n if (typeof data[action] === 'undefined') {\n throw new TypeError(`No method named \"${action}\"`)\n }\n\n data[action]()\n } else if (_config.interval && _config.ride) {\n data.pause()\n data.cycle()\n }\n })\n }\n\n static _dataApiClickHandler(event) {\n const selector = Util.getSelectorFromElement(this)\n\n if (!selector) {\n return\n }\n\n const target = $(selector)[0]\n\n if (!target || !$(target).hasClass(CLASS_NAME_CAROUSEL)) {\n return\n }\n\n const config = {\n ...$(target).data(),\n ...$(this).data()\n }\n const slideIndex = this.getAttribute('data-slide-to')\n\n if (slideIndex) {\n config.interval = false\n }\n\n Carousel._jQueryInterface.call($(target), config)\n\n if (slideIndex) {\n $(target).data(DATA_KEY).to(slideIndex)\n }\n\n event.preventDefault()\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document).on(EVENT_CLICK_DATA_API, SELECTOR_DATA_SLIDE, Carousel._dataApiClickHandler)\n\n$(window).on(EVENT_LOAD_DATA_API, () => {\n const carousels = [].slice.call(document.querySelectorAll(SELECTOR_DATA_RIDE))\n for (let i = 0, len = carousels.length; i < len; i++) {\n const $carousel = $(carousels[i])\n Carousel._jQueryInterface.call($carousel, $carousel.data())\n }\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Carousel._jQueryInterface\n$.fn[NAME].Constructor = Carousel\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Carousel._jQueryInterface\n}\n\nexport default Carousel\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.5.3): collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'collapse'\nconst VERSION = '4.5.3'\nconst DATA_KEY = 'bs.collapse'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst Default = {\n toggle: true,\n parent: ''\n}\n\nconst DefaultType = {\n toggle: 'boolean',\n parent: '(string|element)'\n}\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_COLLAPSE = 'collapse'\nconst CLASS_NAME_COLLAPSING = 'collapsing'\nconst CLASS_NAME_COLLAPSED = 'collapsed'\n\nconst DIMENSION_WIDTH = 'width'\nconst DIMENSION_HEIGHT = 'height'\n\nconst SELECTOR_ACTIVES = '.show, .collapsing'\nconst SELECTOR_DATA_TOGGLE = '[data-toggle=\"collapse\"]'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Collapse {\n constructor(element, config) {\n this._isTransitioning = false\n this._element = element\n this._config = this._getConfig(config)\n this._triggerArray = [].slice.call(document.querySelectorAll(\n `[data-toggle=\"collapse\"][href=\"#${element.id}\"],` +\n `[data-toggle=\"collapse\"][data-target=\"#${element.id}\"]`\n ))\n\n const toggleList = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE))\n for (let i = 0, len = toggleList.length; i < len; i++) {\n const elem = toggleList[i]\n const selector = Util.getSelectorFromElement(elem)\n const filterElement = [].slice.call(document.querySelectorAll(selector))\n .filter(foundElem => foundElem === element)\n\n if (selector !== null && filterElement.length > 0) {\n this._selector = selector\n this._triggerArray.push(elem)\n }\n }\n\n this._parent = this._config.parent ? this._getParent() : null\n\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._element, this._triggerArray)\n }\n\n if (this._config.toggle) {\n this.toggle()\n }\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n toggle() {\n if ($(this._element).hasClass(CLASS_NAME_SHOW)) {\n this.hide()\n } else {\n this.show()\n }\n }\n\n show() {\n if (this._isTransitioning ||\n $(this._element).hasClass(CLASS_NAME_SHOW)) {\n return\n }\n\n let actives\n let activesData\n\n if (this._parent) {\n actives = [].slice.call(this._parent.querySelectorAll(SELECTOR_ACTIVES))\n .filter(elem => {\n if (typeof this._config.parent === 'string') {\n return elem.getAttribute('data-parent') === this._config.parent\n }\n\n return elem.classList.contains(CLASS_NAME_COLLAPSE)\n })\n\n if (actives.length === 0) {\n actives = null\n }\n }\n\n if (actives) {\n activesData = $(actives).not(this._selector).data(DATA_KEY)\n if (activesData && activesData._isTransitioning) {\n return\n }\n }\n\n const startEvent = $.Event(EVENT_SHOW)\n $(this._element).trigger(startEvent)\n if (startEvent.isDefaultPrevented()) {\n return\n }\n\n if (actives) {\n Collapse._jQueryInterface.call($(actives).not(this._selector), 'hide')\n if (!activesData) {\n $(actives).data(DATA_KEY, null)\n }\n }\n\n const dimension = this._getDimension()\n\n $(this._element)\n .removeClass(CLASS_NAME_COLLAPSE)\n .addClass(CLASS_NAME_COLLAPSING)\n\n this._element.style[dimension] = 0\n\n if (this._triggerArray.length) {\n $(this._triggerArray)\n .removeClass(CLASS_NAME_COLLAPSED)\n .attr('aria-expanded', true)\n }\n\n this.setTransitioning(true)\n\n const complete = () => {\n $(this._element)\n .removeClass(CLASS_NAME_COLLAPSING)\n .addClass(`${CLASS_NAME_COLLAPSE} ${CLASS_NAME_SHOW}`)\n\n this._element.style[dimension] = ''\n\n this.setTransitioning(false)\n\n $(this._element).trigger(EVENT_SHOWN)\n }\n\n const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)\n const scrollSize = `scroll${capitalizedDimension}`\n const transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n $(this._element)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n\n this._element.style[dimension] = `${this._element[scrollSize]}px`\n }\n\n hide() {\n if (this._isTransitioning ||\n !$(this._element).hasClass(CLASS_NAME_SHOW)) {\n return\n }\n\n const startEvent = $.Event(EVENT_HIDE)\n $(this._element).trigger(startEvent)\n if (startEvent.isDefaultPrevented()) {\n return\n }\n\n const dimension = this._getDimension()\n\n this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`\n\n Util.reflow(this._element)\n\n $(this._element)\n .addClass(CLASS_NAME_COLLAPSING)\n .removeClass(`${CLASS_NAME_COLLAPSE} ${CLASS_NAME_SHOW}`)\n\n const triggerArrayLength = this._triggerArray.length\n if (triggerArrayLength > 0) {\n for (let i = 0; i < triggerArrayLength; i++) {\n const trigger = this._triggerArray[i]\n const selector = Util.getSelectorFromElement(trigger)\n\n if (selector !== null) {\n const $elem = $([].slice.call(document.querySelectorAll(selector)))\n if (!$elem.hasClass(CLASS_NAME_SHOW)) {\n $(trigger).addClass(CLASS_NAME_COLLAPSED)\n .attr('aria-expanded', false)\n }\n }\n }\n }\n\n this.setTransitioning(true)\n\n const complete = () => {\n this.setTransitioning(false)\n $(this._element)\n .removeClass(CLASS_NAME_COLLAPSING)\n .addClass(CLASS_NAME_COLLAPSE)\n .trigger(EVENT_HIDDEN)\n }\n\n this._element.style[dimension] = ''\n const transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n $(this._element)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n }\n\n setTransitioning(isTransitioning) {\n this._isTransitioning = isTransitioning\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n\n this._config = null\n this._parent = null\n this._element = null\n this._triggerArray = null\n this._isTransitioning = null\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...config\n }\n config.toggle = Boolean(config.toggle) // Coerce string values\n Util.typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _getDimension() {\n const hasWidth = $(this._element).hasClass(DIMENSION_WIDTH)\n return hasWidth ? DIMENSION_WIDTH : DIMENSION_HEIGHT\n }\n\n _getParent() {\n let parent\n\n if (Util.isElement(this._config.parent)) {\n parent = this._config.parent\n\n // It's a jQuery object\n if (typeof this._config.parent.jquery !== 'undefined') {\n parent = this._config.parent[0]\n }\n } else {\n parent = document.querySelector(this._config.parent)\n }\n\n const selector = `[data-toggle=\"collapse\"][data-parent=\"${this._config.parent}\"]`\n const children = [].slice.call(parent.querySelectorAll(selector))\n\n $(children).each((i, element) => {\n this._addAriaAndCollapsedClass(\n Collapse._getTargetFromElement(element),\n [element]\n )\n })\n\n return parent\n }\n\n _addAriaAndCollapsedClass(element, triggerArray) {\n const isOpen = $(element).hasClass(CLASS_NAME_SHOW)\n\n if (triggerArray.length) {\n $(triggerArray)\n .toggleClass(CLASS_NAME_COLLAPSED, !isOpen)\n .attr('aria-expanded', isOpen)\n }\n }\n\n // Static\n\n static _getTargetFromElement(element) {\n const selector = Util.getSelectorFromElement(element)\n return selector ? document.querySelector(selector) : null\n }\n\n static _jQueryInterface(config) {\n return this.each(function () {\n const $element = $(this)\n let data = $element.data(DATA_KEY)\n const _config = {\n ...Default,\n ...$element.data(),\n ...(typeof config === 'object' && config ? config : {})\n }\n\n if (!data && _config.toggle && typeof config === 'string' && /show|hide/.test(config)) {\n _config.toggle = false\n }\n\n if (!data) {\n data = new Collapse(this, _config)\n $element.data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document).on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n // preventDefault only for elements (which change the URL) not inside the collapsible element\n if (event.currentTarget.tagName === 'A') {\n event.preventDefault()\n }\n\n const $trigger = $(this)\n const selector = Util.getSelectorFromElement(this)\n const selectors = [].slice.call(document.querySelectorAll(selector))\n\n $(selectors).each(function () {\n const $target = $(this)\n const data = $target.data(DATA_KEY)\n const config = data ? 'toggle' : $trigger.data()\n Collapse._jQueryInterface.call($target, config)\n })\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Collapse._jQueryInterface\n$.fn[NAME].Constructor = Collapse\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Collapse._jQueryInterface\n}\n\nexport default Collapse\n","/**!\n * @fileOverview Kickass library to create and place poppers near their reference elements.\n * @version 1.16.1\n * @license\n * Copyright (c) 2016 Federico Zivolo and contributors\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\nvar isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined' && typeof navigator !== 'undefined';\n\nvar timeoutDuration = function () {\n var longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox'];\n for (var i = 0; i < longerTimeoutBrowsers.length; i += 1) {\n if (isBrowser && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) {\n return 1;\n }\n }\n return 0;\n}();\n\nfunction microtaskDebounce(fn) {\n var called = false;\n return function () {\n if (called) {\n return;\n }\n called = true;\n window.Promise.resolve().then(function () {\n called = false;\n fn();\n });\n };\n}\n\nfunction taskDebounce(fn) {\n var scheduled = false;\n return function () {\n if (!scheduled) {\n scheduled = true;\n setTimeout(function () {\n scheduled = false;\n fn();\n }, timeoutDuration);\n }\n };\n}\n\nvar supportsMicroTasks = isBrowser && window.Promise;\n\n/**\n* Create a debounced version of a method, that's asynchronously deferred\n* but called in the minimum time possible.\n*\n* @method\n* @memberof Popper.Utils\n* @argument {Function} fn\n* @returns {Function}\n*/\nvar debounce = supportsMicroTasks ? microtaskDebounce : taskDebounce;\n\n/**\n * Check if the given variable is a function\n * @method\n * @memberof Popper.Utils\n * @argument {Any} functionToCheck - variable to check\n * @returns {Boolean} answer to: is a function?\n */\nfunction isFunction(functionToCheck) {\n var getType = {};\n return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';\n}\n\n/**\n * Get CSS computed property of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Eement} element\n * @argument {String} property\n */\nfunction getStyleComputedProperty(element, property) {\n if (element.nodeType !== 1) {\n return [];\n }\n // NOTE: 1 DOM access here\n var window = element.ownerDocument.defaultView;\n var css = window.getComputedStyle(element, null);\n return property ? css[property] : css;\n}\n\n/**\n * Returns the parentNode or the host of the element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} parent\n */\nfunction getParentNode(element) {\n if (element.nodeName === 'HTML') {\n return element;\n }\n return element.parentNode || element.host;\n}\n\n/**\n * Returns the scrolling parent of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} scroll parent\n */\nfunction getScrollParent(element) {\n // Return body, `getScroll` will take care to get the correct `scrollTop` from it\n if (!element) {\n return document.body;\n }\n\n switch (element.nodeName) {\n case 'HTML':\n case 'BODY':\n return element.ownerDocument.body;\n case '#document':\n return element.body;\n }\n\n // Firefox want us to check `-x` and `-y` variations as well\n\n var _getStyleComputedProp = getStyleComputedProperty(element),\n overflow = _getStyleComputedProp.overflow,\n overflowX = _getStyleComputedProp.overflowX,\n overflowY = _getStyleComputedProp.overflowY;\n\n if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) {\n return element;\n }\n\n return getScrollParent(getParentNode(element));\n}\n\n/**\n * Returns the reference node of the reference object, or the reference object itself.\n * @method\n * @memberof Popper.Utils\n * @param {Element|Object} reference - the reference element (the popper will be relative to this)\n * @returns {Element} parent\n */\nfunction getReferenceNode(reference) {\n return reference && reference.referenceNode ? reference.referenceNode : reference;\n}\n\nvar isIE11 = isBrowser && !!(window.MSInputMethodContext && document.documentMode);\nvar isIE10 = isBrowser && /MSIE 10/.test(navigator.userAgent);\n\n/**\n * Determines if the browser is Internet Explorer\n * @method\n * @memberof Popper.Utils\n * @param {Number} version to check\n * @returns {Boolean} isIE\n */\nfunction isIE(version) {\n if (version === 11) {\n return isIE11;\n }\n if (version === 10) {\n return isIE10;\n }\n return isIE11 || isIE10;\n}\n\n/**\n * Returns the offset parent of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} offset parent\n */\nfunction getOffsetParent(element) {\n if (!element) {\n return document.documentElement;\n }\n\n var noOffsetParent = isIE(10) ? document.body : null;\n\n // NOTE: 1 DOM access here\n var offsetParent = element.offsetParent || null;\n // Skip hidden elements which don't have an offsetParent\n while (offsetParent === noOffsetParent && element.nextElementSibling) {\n offsetParent = (element = element.nextElementSibling).offsetParent;\n }\n\n var nodeName = offsetParent && offsetParent.nodeName;\n\n if (!nodeName || nodeName === 'BODY' || nodeName === 'HTML') {\n return element ? element.ownerDocument.documentElement : document.documentElement;\n }\n\n // .offsetParent will return the closest TH, TD or TABLE in case\n // no offsetParent is present, I hate this job...\n if (['TH', 'TD', 'TABLE'].indexOf(offsetParent.nodeName) !== -1 && getStyleComputedProperty(offsetParent, 'position') === 'static') {\n return getOffsetParent(offsetParent);\n }\n\n return offsetParent;\n}\n\nfunction isOffsetContainer(element) {\n var nodeName = element.nodeName;\n\n if (nodeName === 'BODY') {\n return false;\n }\n return nodeName === 'HTML' || getOffsetParent(element.firstElementChild) === element;\n}\n\n/**\n * Finds the root node (document, shadowDOM root) of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} node\n * @returns {Element} root node\n */\nfunction getRoot(node) {\n if (node.parentNode !== null) {\n return getRoot(node.parentNode);\n }\n\n return node;\n}\n\n/**\n * Finds the offset parent common to the two provided nodes\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element1\n * @argument {Element} element2\n * @returns {Element} common offset parent\n */\nfunction findCommonOffsetParent(element1, element2) {\n // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n if (!element1 || !element1.nodeType || !element2 || !element2.nodeType) {\n return document.documentElement;\n }\n\n // Here we make sure to give as \"start\" the element that comes first in the DOM\n var order = element1.compareDocumentPosition(element2) & Node.DOCUMENT_POSITION_FOLLOWING;\n var start = order ? element1 : element2;\n var end = order ? element2 : element1;\n\n // Get common ancestor container\n var range = document.createRange();\n range.setStart(start, 0);\n range.setEnd(end, 0);\n var commonAncestorContainer = range.commonAncestorContainer;\n\n // Both nodes are inside #document\n\n if (element1 !== commonAncestorContainer && element2 !== commonAncestorContainer || start.contains(end)) {\n if (isOffsetContainer(commonAncestorContainer)) {\n return commonAncestorContainer;\n }\n\n return getOffsetParent(commonAncestorContainer);\n }\n\n // one of the nodes is inside shadowDOM, find which one\n var element1root = getRoot(element1);\n if (element1root.host) {\n return findCommonOffsetParent(element1root.host, element2);\n } else {\n return findCommonOffsetParent(element1, getRoot(element2).host);\n }\n}\n\n/**\n * Gets the scroll value of the given element in the given side (top and left)\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @argument {String} side `top` or `left`\n * @returns {number} amount of scrolled pixels\n */\nfunction getScroll(element) {\n var side = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'top';\n\n var upperSide = side === 'top' ? 'scrollTop' : 'scrollLeft';\n var nodeName = element.nodeName;\n\n if (nodeName === 'BODY' || nodeName === 'HTML') {\n var html = element.ownerDocument.documentElement;\n var scrollingElement = element.ownerDocument.scrollingElement || html;\n return scrollingElement[upperSide];\n }\n\n return element[upperSide];\n}\n\n/*\n * Sum or subtract the element scroll values (left and top) from a given rect object\n * @method\n * @memberof Popper.Utils\n * @param {Object} rect - Rect object you want to change\n * @param {HTMLElement} element - The element from the function reads the scroll values\n * @param {Boolean} subtract - set to true if you want to subtract the scroll values\n * @return {Object} rect - The modifier rect object\n */\nfunction includeScroll(rect, element) {\n var subtract = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n var scrollTop = getScroll(element, 'top');\n var scrollLeft = getScroll(element, 'left');\n var modifier = subtract ? -1 : 1;\n rect.top += scrollTop * modifier;\n rect.bottom += scrollTop * modifier;\n rect.left += scrollLeft * modifier;\n rect.right += scrollLeft * modifier;\n return rect;\n}\n\n/*\n * Helper to detect borders of a given element\n * @method\n * @memberof Popper.Utils\n * @param {CSSStyleDeclaration} styles\n * Result of `getStyleComputedProperty` on the given element\n * @param {String} axis - `x` or `y`\n * @return {number} borders - The borders size of the given axis\n */\n\nfunction getBordersSize(styles, axis) {\n var sideA = axis === 'x' ? 'Left' : 'Top';\n var sideB = sideA === 'Left' ? 'Right' : 'Bottom';\n\n return parseFloat(styles['border' + sideA + 'Width']) + parseFloat(styles['border' + sideB + 'Width']);\n}\n\nfunction getSize(axis, body, html, computedStyle) {\n return Math.max(body['offset' + axis], body['scroll' + axis], html['client' + axis], html['offset' + axis], html['scroll' + axis], isIE(10) ? parseInt(html['offset' + axis]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Top' : 'Left')]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Bottom' : 'Right')]) : 0);\n}\n\nfunction getWindowSizes(document) {\n var body = document.body;\n var html = document.documentElement;\n var computedStyle = isIE(10) && getComputedStyle(html);\n\n return {\n height: getSize('Height', body, html, computedStyle),\n width: getSize('Width', body, html, computedStyle)\n };\n}\n\nvar classCallCheck = function (instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n};\n\nvar createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n}();\n\n\n\n\n\nvar defineProperty = function (obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n};\n\nvar _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n};\n\n/**\n * Given element offsets, generate an output similar to getBoundingClientRect\n * @method\n * @memberof Popper.Utils\n * @argument {Object} offsets\n * @returns {Object} ClientRect like output\n */\nfunction getClientRect(offsets) {\n return _extends({}, offsets, {\n right: offsets.left + offsets.width,\n bottom: offsets.top + offsets.height\n });\n}\n\n/**\n * Get bounding client rect of given element\n * @method\n * @memberof Popper.Utils\n * @param {HTMLElement} element\n * @return {Object} client rect\n */\nfunction getBoundingClientRect(element) {\n var rect = {};\n\n // IE10 10 FIX: Please, don't ask, the element isn't\n // considered in DOM in some circumstances...\n // This isn't reproducible in IE10 compatibility mode of IE11\n try {\n if (isIE(10)) {\n rect = element.getBoundingClientRect();\n var scrollTop = getScroll(element, 'top');\n var scrollLeft = getScroll(element, 'left');\n rect.top += scrollTop;\n rect.left += scrollLeft;\n rect.bottom += scrollTop;\n rect.right += scrollLeft;\n } else {\n rect = element.getBoundingClientRect();\n }\n } catch (e) {}\n\n var result = {\n left: rect.left,\n top: rect.top,\n width: rect.right - rect.left,\n height: rect.bottom - rect.top\n };\n\n // subtract scrollbar size from sizes\n var sizes = element.nodeName === 'HTML' ? getWindowSizes(element.ownerDocument) : {};\n var width = sizes.width || element.clientWidth || result.width;\n var height = sizes.height || element.clientHeight || result.height;\n\n var horizScrollbar = element.offsetWidth - width;\n var vertScrollbar = element.offsetHeight - height;\n\n // if an hypothetical scrollbar is detected, we must be sure it's not a `border`\n // we make this check conditional for performance reasons\n if (horizScrollbar || vertScrollbar) {\n var styles = getStyleComputedProperty(element);\n horizScrollbar -= getBordersSize(styles, 'x');\n vertScrollbar -= getBordersSize(styles, 'y');\n\n result.width -= horizScrollbar;\n result.height -= vertScrollbar;\n }\n\n return getClientRect(result);\n}\n\nfunction getOffsetRectRelativeToArbitraryNode(children, parent) {\n var fixedPosition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n var isIE10 = isIE(10);\n var isHTML = parent.nodeName === 'HTML';\n var childrenRect = getBoundingClientRect(children);\n var parentRect = getBoundingClientRect(parent);\n var scrollParent = getScrollParent(children);\n\n var styles = getStyleComputedProperty(parent);\n var borderTopWidth = parseFloat(styles.borderTopWidth);\n var borderLeftWidth = parseFloat(styles.borderLeftWidth);\n\n // In cases where the parent is fixed, we must ignore negative scroll in offset calc\n if (fixedPosition && isHTML) {\n parentRect.top = Math.max(parentRect.top, 0);\n parentRect.left = Math.max(parentRect.left, 0);\n }\n var offsets = getClientRect({\n top: childrenRect.top - parentRect.top - borderTopWidth,\n left: childrenRect.left - parentRect.left - borderLeftWidth,\n width: childrenRect.width,\n height: childrenRect.height\n });\n offsets.marginTop = 0;\n offsets.marginLeft = 0;\n\n // Subtract margins of documentElement in case it's being used as parent\n // we do this only on HTML because it's the only element that behaves\n // differently when margins are applied to it. The margins are included in\n // the box of the documentElement, in the other cases not.\n if (!isIE10 && isHTML) {\n var marginTop = parseFloat(styles.marginTop);\n var marginLeft = parseFloat(styles.marginLeft);\n\n offsets.top -= borderTopWidth - marginTop;\n offsets.bottom -= borderTopWidth - marginTop;\n offsets.left -= borderLeftWidth - marginLeft;\n offsets.right -= borderLeftWidth - marginLeft;\n\n // Attach marginTop and marginLeft because in some circumstances we may need them\n offsets.marginTop = marginTop;\n offsets.marginLeft = marginLeft;\n }\n\n if (isIE10 && !fixedPosition ? parent.contains(scrollParent) : parent === scrollParent && scrollParent.nodeName !== 'BODY') {\n offsets = includeScroll(offsets, parent);\n }\n\n return offsets;\n}\n\nfunction getViewportOffsetRectRelativeToArtbitraryNode(element) {\n var excludeScroll = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n var html = element.ownerDocument.documentElement;\n var relativeOffset = getOffsetRectRelativeToArbitraryNode(element, html);\n var width = Math.max(html.clientWidth, window.innerWidth || 0);\n var height = Math.max(html.clientHeight, window.innerHeight || 0);\n\n var scrollTop = !excludeScroll ? getScroll(html) : 0;\n var scrollLeft = !excludeScroll ? getScroll(html, 'left') : 0;\n\n var offset = {\n top: scrollTop - relativeOffset.top + relativeOffset.marginTop,\n left: scrollLeft - relativeOffset.left + relativeOffset.marginLeft,\n width: width,\n height: height\n };\n\n return getClientRect(offset);\n}\n\n/**\n * Check if the given element is fixed or is inside a fixed parent\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @argument {Element} customContainer\n * @returns {Boolean} answer to \"isFixed?\"\n */\nfunction isFixed(element) {\n var nodeName = element.nodeName;\n if (nodeName === 'BODY' || nodeName === 'HTML') {\n return false;\n }\n if (getStyleComputedProperty(element, 'position') === 'fixed') {\n return true;\n }\n var parentNode = getParentNode(element);\n if (!parentNode) {\n return false;\n }\n return isFixed(parentNode);\n}\n\n/**\n * Finds the first parent of an element that has a transformed property defined\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} first transformed parent or documentElement\n */\n\nfunction getFixedPositionOffsetParent(element) {\n // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n if (!element || !element.parentElement || isIE()) {\n return document.documentElement;\n }\n var el = element.parentElement;\n while (el && getStyleComputedProperty(el, 'transform') === 'none') {\n el = el.parentElement;\n }\n return el || document.documentElement;\n}\n\n/**\n * Computed the boundaries limits and return them\n * @method\n * @memberof Popper.Utils\n * @param {HTMLElement} popper\n * @param {HTMLElement} reference\n * @param {number} padding\n * @param {HTMLElement} boundariesElement - Element used to define the boundaries\n * @param {Boolean} fixedPosition - Is in fixed position mode\n * @returns {Object} Coordinates of the boundaries\n */\nfunction getBoundaries(popper, reference, padding, boundariesElement) {\n var fixedPosition = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n\n // NOTE: 1 DOM access here\n\n var boundaries = { top: 0, left: 0 };\n var offsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, getReferenceNode(reference));\n\n // Handle viewport case\n if (boundariesElement === 'viewport') {\n boundaries = getViewportOffsetRectRelativeToArtbitraryNode(offsetParent, fixedPosition);\n } else {\n // Handle other cases based on DOM element used as boundaries\n var boundariesNode = void 0;\n if (boundariesElement === 'scrollParent') {\n boundariesNode = getScrollParent(getParentNode(reference));\n if (boundariesNode.nodeName === 'BODY') {\n boundariesNode = popper.ownerDocument.documentElement;\n }\n } else if (boundariesElement === 'window') {\n boundariesNode = popper.ownerDocument.documentElement;\n } else {\n boundariesNode = boundariesElement;\n }\n\n var offsets = getOffsetRectRelativeToArbitraryNode(boundariesNode, offsetParent, fixedPosition);\n\n // In case of HTML, we need a different computation\n if (boundariesNode.nodeName === 'HTML' && !isFixed(offsetParent)) {\n var _getWindowSizes = getWindowSizes(popper.ownerDocument),\n height = _getWindowSizes.height,\n width = _getWindowSizes.width;\n\n boundaries.top += offsets.top - offsets.marginTop;\n boundaries.bottom = height + offsets.top;\n boundaries.left += offsets.left - offsets.marginLeft;\n boundaries.right = width + offsets.left;\n } else {\n // for all the other DOM elements, this one is good\n boundaries = offsets;\n }\n }\n\n // Add paddings\n padding = padding || 0;\n var isPaddingNumber = typeof padding === 'number';\n boundaries.left += isPaddingNumber ? padding : padding.left || 0;\n boundaries.top += isPaddingNumber ? padding : padding.top || 0;\n boundaries.right -= isPaddingNumber ? padding : padding.right || 0;\n boundaries.bottom -= isPaddingNumber ? padding : padding.bottom || 0;\n\n return boundaries;\n}\n\nfunction getArea(_ref) {\n var width = _ref.width,\n height = _ref.height;\n\n return width * height;\n}\n\n/**\n * Utility used to transform the `auto` placement to the placement with more\n * available space.\n * @method\n * @memberof Popper.Utils\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction computeAutoPlacement(placement, refRect, popper, reference, boundariesElement) {\n var padding = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0;\n\n if (placement.indexOf('auto') === -1) {\n return placement;\n }\n\n var boundaries = getBoundaries(popper, reference, padding, boundariesElement);\n\n var rects = {\n top: {\n width: boundaries.width,\n height: refRect.top - boundaries.top\n },\n right: {\n width: boundaries.right - refRect.right,\n height: boundaries.height\n },\n bottom: {\n width: boundaries.width,\n height: boundaries.bottom - refRect.bottom\n },\n left: {\n width: refRect.left - boundaries.left,\n height: boundaries.height\n }\n };\n\n var sortedAreas = Object.keys(rects).map(function (key) {\n return _extends({\n key: key\n }, rects[key], {\n area: getArea(rects[key])\n });\n }).sort(function (a, b) {\n return b.area - a.area;\n });\n\n var filteredAreas = sortedAreas.filter(function (_ref2) {\n var width = _ref2.width,\n height = _ref2.height;\n return width >= popper.clientWidth && height >= popper.clientHeight;\n });\n\n var computedPlacement = filteredAreas.length > 0 ? filteredAreas[0].key : sortedAreas[0].key;\n\n var variation = placement.split('-')[1];\n\n return computedPlacement + (variation ? '-' + variation : '');\n}\n\n/**\n * Get offsets to the reference element\n * @method\n * @memberof Popper.Utils\n * @param {Object} state\n * @param {Element} popper - the popper element\n * @param {Element} reference - the reference element (the popper will be relative to this)\n * @param {Element} fixedPosition - is in fixed position mode\n * @returns {Object} An object containing the offsets which will be applied to the popper\n */\nfunction getReferenceOffsets(state, popper, reference) {\n var fixedPosition = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n\n var commonOffsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, getReferenceNode(reference));\n return getOffsetRectRelativeToArbitraryNode(reference, commonOffsetParent, fixedPosition);\n}\n\n/**\n * Get the outer sizes of the given element (offset size + margins)\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Object} object containing width and height properties\n */\nfunction getOuterSizes(element) {\n var window = element.ownerDocument.defaultView;\n var styles = window.getComputedStyle(element);\n var x = parseFloat(styles.marginTop || 0) + parseFloat(styles.marginBottom || 0);\n var y = parseFloat(styles.marginLeft || 0) + parseFloat(styles.marginRight || 0);\n var result = {\n width: element.offsetWidth + y,\n height: element.offsetHeight + x\n };\n return result;\n}\n\n/**\n * Get the opposite placement of the given one\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement\n * @returns {String} flipped placement\n */\nfunction getOppositePlacement(placement) {\n var hash = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' };\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}\n\n/**\n * Get offsets to the popper\n * @method\n * @memberof Popper.Utils\n * @param {Object} position - CSS position the Popper will get applied\n * @param {HTMLElement} popper - the popper element\n * @param {Object} referenceOffsets - the reference offsets (the popper will be relative to this)\n * @param {String} placement - one of the valid placement options\n * @returns {Object} popperOffsets - An object containing the offsets which will be applied to the popper\n */\nfunction getPopperOffsets(popper, referenceOffsets, placement) {\n placement = placement.split('-')[0];\n\n // Get popper node sizes\n var popperRect = getOuterSizes(popper);\n\n // Add position, width and height to our offsets object\n var popperOffsets = {\n width: popperRect.width,\n height: popperRect.height\n };\n\n // depending by the popper placement we have to compute its offsets slightly differently\n var isHoriz = ['right', 'left'].indexOf(placement) !== -1;\n var mainSide = isHoriz ? 'top' : 'left';\n var secondarySide = isHoriz ? 'left' : 'top';\n var measurement = isHoriz ? 'height' : 'width';\n var secondaryMeasurement = !isHoriz ? 'height' : 'width';\n\n popperOffsets[mainSide] = referenceOffsets[mainSide] + referenceOffsets[measurement] / 2 - popperRect[measurement] / 2;\n if (placement === secondarySide) {\n popperOffsets[secondarySide] = referenceOffsets[secondarySide] - popperRect[secondaryMeasurement];\n } else {\n popperOffsets[secondarySide] = referenceOffsets[getOppositePlacement(secondarySide)];\n }\n\n return popperOffsets;\n}\n\n/**\n * Mimics the `find` method of Array\n * @method\n * @memberof Popper.Utils\n * @argument {Array} arr\n * @argument prop\n * @argument value\n * @returns index or -1\n */\nfunction find(arr, check) {\n // use native find if supported\n if (Array.prototype.find) {\n return arr.find(check);\n }\n\n // use `filter` to obtain the same behavior of `find`\n return arr.filter(check)[0];\n}\n\n/**\n * Return the index of the matching object\n * @method\n * @memberof Popper.Utils\n * @argument {Array} arr\n * @argument prop\n * @argument value\n * @returns index or -1\n */\nfunction findIndex(arr, prop, value) {\n // use native findIndex if supported\n if (Array.prototype.findIndex) {\n return arr.findIndex(function (cur) {\n return cur[prop] === value;\n });\n }\n\n // use `find` + `indexOf` if `findIndex` isn't supported\n var match = find(arr, function (obj) {\n return obj[prop] === value;\n });\n return arr.indexOf(match);\n}\n\n/**\n * Loop trough the list of modifiers and run them in order,\n * each of them will then edit the data object.\n * @method\n * @memberof Popper.Utils\n * @param {dataObject} data\n * @param {Array} modifiers\n * @param {String} ends - Optional modifier name used as stopper\n * @returns {dataObject}\n */\nfunction runModifiers(modifiers, data, ends) {\n var modifiersToRun = ends === undefined ? modifiers : modifiers.slice(0, findIndex(modifiers, 'name', ends));\n\n modifiersToRun.forEach(function (modifier) {\n if (modifier['function']) {\n // eslint-disable-line dot-notation\n console.warn('`modifier.function` is deprecated, use `modifier.fn`!');\n }\n var fn = modifier['function'] || modifier.fn; // eslint-disable-line dot-notation\n if (modifier.enabled && isFunction(fn)) {\n // Add properties to offsets to make them a complete clientRect object\n // we do this before each modifier to make sure the previous one doesn't\n // mess with these values\n data.offsets.popper = getClientRect(data.offsets.popper);\n data.offsets.reference = getClientRect(data.offsets.reference);\n\n data = fn(data, modifier);\n }\n });\n\n return data;\n}\n\n/**\n * Updates the position of the popper, computing the new offsets and applying\n * the new style.
\n * Prefer `scheduleUpdate` over `update` because of performance reasons.\n * @method\n * @memberof Popper\n */\nfunction update() {\n // if popper is destroyed, don't perform any further update\n if (this.state.isDestroyed) {\n return;\n }\n\n var data = {\n instance: this,\n styles: {},\n arrowStyles: {},\n attributes: {},\n flipped: false,\n offsets: {}\n };\n\n // compute reference element offsets\n data.offsets.reference = getReferenceOffsets(this.state, this.popper, this.reference, this.options.positionFixed);\n\n // compute auto placement, store placement inside the data object,\n // modifiers will be able to edit `placement` if needed\n // and refer to originalPlacement to know the original value\n data.placement = computeAutoPlacement(this.options.placement, data.offsets.reference, this.popper, this.reference, this.options.modifiers.flip.boundariesElement, this.options.modifiers.flip.padding);\n\n // store the computed placement inside `originalPlacement`\n data.originalPlacement = data.placement;\n\n data.positionFixed = this.options.positionFixed;\n\n // compute the popper offsets\n data.offsets.popper = getPopperOffsets(this.popper, data.offsets.reference, data.placement);\n\n data.offsets.popper.position = this.options.positionFixed ? 'fixed' : 'absolute';\n\n // run the modifiers\n data = runModifiers(this.modifiers, data);\n\n // the first `update` will call `onCreate` callback\n // the other ones will call `onUpdate` callback\n if (!this.state.isCreated) {\n this.state.isCreated = true;\n this.options.onCreate(data);\n } else {\n this.options.onUpdate(data);\n }\n}\n\n/**\n * Helper used to know if the given modifier is enabled.\n * @method\n * @memberof Popper.Utils\n * @returns {Boolean}\n */\nfunction isModifierEnabled(modifiers, modifierName) {\n return modifiers.some(function (_ref) {\n var name = _ref.name,\n enabled = _ref.enabled;\n return enabled && name === modifierName;\n });\n}\n\n/**\n * Get the prefixed supported property name\n * @method\n * @memberof Popper.Utils\n * @argument {String} property (camelCase)\n * @returns {String} prefixed property (camelCase or PascalCase, depending on the vendor prefix)\n */\nfunction getSupportedPropertyName(property) {\n var prefixes = [false, 'ms', 'Webkit', 'Moz', 'O'];\n var upperProp = property.charAt(0).toUpperCase() + property.slice(1);\n\n for (var i = 0; i < prefixes.length; i++) {\n var prefix = prefixes[i];\n var toCheck = prefix ? '' + prefix + upperProp : property;\n if (typeof document.body.style[toCheck] !== 'undefined') {\n return toCheck;\n }\n }\n return null;\n}\n\n/**\n * Destroys the popper.\n * @method\n * @memberof Popper\n */\nfunction destroy() {\n this.state.isDestroyed = true;\n\n // touch DOM only if `applyStyle` modifier is enabled\n if (isModifierEnabled(this.modifiers, 'applyStyle')) {\n this.popper.removeAttribute('x-placement');\n this.popper.style.position = '';\n this.popper.style.top = '';\n this.popper.style.left = '';\n this.popper.style.right = '';\n this.popper.style.bottom = '';\n this.popper.style.willChange = '';\n this.popper.style[getSupportedPropertyName('transform')] = '';\n }\n\n this.disableEventListeners();\n\n // remove the popper if user explicitly asked for the deletion on destroy\n // do not use `remove` because IE11 doesn't support it\n if (this.options.removeOnDestroy) {\n this.popper.parentNode.removeChild(this.popper);\n }\n return this;\n}\n\n/**\n * Get the window associated with the element\n * @argument {Element} element\n * @returns {Window}\n */\nfunction getWindow(element) {\n var ownerDocument = element.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView : window;\n}\n\nfunction attachToScrollParents(scrollParent, event, callback, scrollParents) {\n var isBody = scrollParent.nodeName === 'BODY';\n var target = isBody ? scrollParent.ownerDocument.defaultView : scrollParent;\n target.addEventListener(event, callback, { passive: true });\n\n if (!isBody) {\n attachToScrollParents(getScrollParent(target.parentNode), event, callback, scrollParents);\n }\n scrollParents.push(target);\n}\n\n/**\n * Setup needed event listeners used to update the popper position\n * @method\n * @memberof Popper.Utils\n * @private\n */\nfunction setupEventListeners(reference, options, state, updateBound) {\n // Resize event listener on window\n state.updateBound = updateBound;\n getWindow(reference).addEventListener('resize', state.updateBound, { passive: true });\n\n // Scroll event listener on scroll parents\n var scrollElement = getScrollParent(reference);\n attachToScrollParents(scrollElement, 'scroll', state.updateBound, state.scrollParents);\n state.scrollElement = scrollElement;\n state.eventsEnabled = true;\n\n return state;\n}\n\n/**\n * It will add resize/scroll events and start recalculating\n * position of the popper element when they are triggered.\n * @method\n * @memberof Popper\n */\nfunction enableEventListeners() {\n if (!this.state.eventsEnabled) {\n this.state = setupEventListeners(this.reference, this.options, this.state, this.scheduleUpdate);\n }\n}\n\n/**\n * Remove event listeners used to update the popper position\n * @method\n * @memberof Popper.Utils\n * @private\n */\nfunction removeEventListeners(reference, state) {\n // Remove resize event listener on window\n getWindow(reference).removeEventListener('resize', state.updateBound);\n\n // Remove scroll event listener on scroll parents\n state.scrollParents.forEach(function (target) {\n target.removeEventListener('scroll', state.updateBound);\n });\n\n // Reset state\n state.updateBound = null;\n state.scrollParents = [];\n state.scrollElement = null;\n state.eventsEnabled = false;\n return state;\n}\n\n/**\n * It will remove resize/scroll events and won't recalculate popper position\n * when they are triggered. It also won't trigger `onUpdate` callback anymore,\n * unless you call `update` method manually.\n * @method\n * @memberof Popper\n */\nfunction disableEventListeners() {\n if (this.state.eventsEnabled) {\n cancelAnimationFrame(this.scheduleUpdate);\n this.state = removeEventListeners(this.reference, this.state);\n }\n}\n\n/**\n * Tells if a given input is a number\n * @method\n * @memberof Popper.Utils\n * @param {*} input to check\n * @return {Boolean}\n */\nfunction isNumeric(n) {\n return n !== '' && !isNaN(parseFloat(n)) && isFinite(n);\n}\n\n/**\n * Set the style to the given popper\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element - Element to apply the style to\n * @argument {Object} styles\n * Object with a list of properties and values which will be applied to the element\n */\nfunction setStyles(element, styles) {\n Object.keys(styles).forEach(function (prop) {\n var unit = '';\n // add unit if the value is numeric and is one of the following\n if (['width', 'height', 'top', 'right', 'bottom', 'left'].indexOf(prop) !== -1 && isNumeric(styles[prop])) {\n unit = 'px';\n }\n element.style[prop] = styles[prop] + unit;\n });\n}\n\n/**\n * Set the attributes to the given popper\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element - Element to apply the attributes to\n * @argument {Object} styles\n * Object with a list of properties and values which will be applied to the element\n */\nfunction setAttributes(element, attributes) {\n Object.keys(attributes).forEach(function (prop) {\n var value = attributes[prop];\n if (value !== false) {\n element.setAttribute(prop, attributes[prop]);\n } else {\n element.removeAttribute(prop);\n }\n });\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} data.styles - List of style properties - values to apply to popper element\n * @argument {Object} data.attributes - List of attribute properties - values to apply to popper element\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The same data object\n */\nfunction applyStyle(data) {\n // any property present in `data.styles` will be applied to the popper,\n // in this way we can make the 3rd party modifiers add custom styles to it\n // Be aware, modifiers could override the properties defined in the previous\n // lines of this modifier!\n setStyles(data.instance.popper, data.styles);\n\n // any property present in `data.attributes` will be applied to the popper,\n // they will be set as HTML attributes of the element\n setAttributes(data.instance.popper, data.attributes);\n\n // if arrowElement is defined and arrowStyles has some properties\n if (data.arrowElement && Object.keys(data.arrowStyles).length) {\n setStyles(data.arrowElement, data.arrowStyles);\n }\n\n return data;\n}\n\n/**\n * Set the x-placement attribute before everything else because it could be used\n * to add margins to the popper margins needs to be calculated to get the\n * correct popper offsets.\n * @method\n * @memberof Popper.modifiers\n * @param {HTMLElement} reference - The reference element used to position the popper\n * @param {HTMLElement} popper - The HTML element used as popper\n * @param {Object} options - Popper.js options\n */\nfunction applyStyleOnLoad(reference, popper, options, modifierOptions, state) {\n // compute reference element offsets\n var referenceOffsets = getReferenceOffsets(state, popper, reference, options.positionFixed);\n\n // compute auto placement, store placement inside the data object,\n // modifiers will be able to edit `placement` if needed\n // and refer to originalPlacement to know the original value\n var placement = computeAutoPlacement(options.placement, referenceOffsets, popper, reference, options.modifiers.flip.boundariesElement, options.modifiers.flip.padding);\n\n popper.setAttribute('x-placement', placement);\n\n // Apply `position` to popper before anything else because\n // without the position applied we can't guarantee correct computations\n setStyles(popper, { position: options.positionFixed ? 'fixed' : 'absolute' });\n\n return options;\n}\n\n/**\n * @function\n * @memberof Popper.Utils\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Boolean} shouldRound - If the offsets should be rounded at all\n * @returns {Object} The popper's position offsets rounded\n *\n * The tale of pixel-perfect positioning. It's still not 100% perfect, but as\n * good as it can be within reason.\n * Discussion here: https://github.com/FezVrasta/popper.js/pull/715\n *\n * Low DPI screens cause a popper to be blurry if not using full pixels (Safari\n * as well on High DPI screens).\n *\n * Firefox prefers no rounding for positioning and does not have blurriness on\n * high DPI screens.\n *\n * Only horizontal placement and left/right values need to be considered.\n */\nfunction getRoundedOffsets(data, shouldRound) {\n var _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n var round = Math.round,\n floor = Math.floor;\n\n var noRound = function noRound(v) {\n return v;\n };\n\n var referenceWidth = round(reference.width);\n var popperWidth = round(popper.width);\n\n var isVertical = ['left', 'right'].indexOf(data.placement) !== -1;\n var isVariation = data.placement.indexOf('-') !== -1;\n var sameWidthParity = referenceWidth % 2 === popperWidth % 2;\n var bothOddWidth = referenceWidth % 2 === 1 && popperWidth % 2 === 1;\n\n var horizontalToInteger = !shouldRound ? noRound : isVertical || isVariation || sameWidthParity ? round : floor;\n var verticalToInteger = !shouldRound ? noRound : round;\n\n return {\n left: horizontalToInteger(bothOddWidth && !isVariation && shouldRound ? popper.left - 1 : popper.left),\n top: verticalToInteger(popper.top),\n bottom: verticalToInteger(popper.bottom),\n right: horizontalToInteger(popper.right)\n };\n}\n\nvar isFirefox = isBrowser && /Firefox/i.test(navigator.userAgent);\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction computeStyle(data, options) {\n var x = options.x,\n y = options.y;\n var popper = data.offsets.popper;\n\n // Remove this legacy support in Popper.js v2\n\n var legacyGpuAccelerationOption = find(data.instance.modifiers, function (modifier) {\n return modifier.name === 'applyStyle';\n }).gpuAcceleration;\n if (legacyGpuAccelerationOption !== undefined) {\n console.warn('WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!');\n }\n var gpuAcceleration = legacyGpuAccelerationOption !== undefined ? legacyGpuAccelerationOption : options.gpuAcceleration;\n\n var offsetParent = getOffsetParent(data.instance.popper);\n var offsetParentRect = getBoundingClientRect(offsetParent);\n\n // Styles\n var styles = {\n position: popper.position\n };\n\n var offsets = getRoundedOffsets(data, window.devicePixelRatio < 2 || !isFirefox);\n\n var sideA = x === 'bottom' ? 'top' : 'bottom';\n var sideB = y === 'right' ? 'left' : 'right';\n\n // if gpuAcceleration is set to `true` and transform is supported,\n // we use `translate3d` to apply the position to the popper we\n // automatically use the supported prefixed version if needed\n var prefixedProperty = getSupportedPropertyName('transform');\n\n // now, let's make a step back and look at this code closely (wtf?)\n // If the content of the popper grows once it's been positioned, it\n // may happen that the popper gets misplaced because of the new content\n // overflowing its reference element\n // To avoid this problem, we provide two options (x and y), which allow\n // the consumer to define the offset origin.\n // If we position a popper on top of a reference element, we can set\n // `x` to `top` to make the popper grow towards its top instead of\n // its bottom.\n var left = void 0,\n top = void 0;\n if (sideA === 'bottom') {\n // when offsetParent is the positioning is relative to the bottom of the screen (excluding the scrollbar)\n // and not the bottom of the html element\n if (offsetParent.nodeName === 'HTML') {\n top = -offsetParent.clientHeight + offsets.bottom;\n } else {\n top = -offsetParentRect.height + offsets.bottom;\n }\n } else {\n top = offsets.top;\n }\n if (sideB === 'right') {\n if (offsetParent.nodeName === 'HTML') {\n left = -offsetParent.clientWidth + offsets.right;\n } else {\n left = -offsetParentRect.width + offsets.right;\n }\n } else {\n left = offsets.left;\n }\n if (gpuAcceleration && prefixedProperty) {\n styles[prefixedProperty] = 'translate3d(' + left + 'px, ' + top + 'px, 0)';\n styles[sideA] = 0;\n styles[sideB] = 0;\n styles.willChange = 'transform';\n } else {\n // othwerise, we use the standard `top`, `left`, `bottom` and `right` properties\n var invertTop = sideA === 'bottom' ? -1 : 1;\n var invertLeft = sideB === 'right' ? -1 : 1;\n styles[sideA] = top * invertTop;\n styles[sideB] = left * invertLeft;\n styles.willChange = sideA + ', ' + sideB;\n }\n\n // Attributes\n var attributes = {\n 'x-placement': data.placement\n };\n\n // Update `data` attributes, styles and arrowStyles\n data.attributes = _extends({}, attributes, data.attributes);\n data.styles = _extends({}, styles, data.styles);\n data.arrowStyles = _extends({}, data.offsets.arrow, data.arrowStyles);\n\n return data;\n}\n\n/**\n * Helper used to know if the given modifier depends from another one.
\n * It checks if the needed modifier is listed and enabled.\n * @method\n * @memberof Popper.Utils\n * @param {Array} modifiers - list of modifiers\n * @param {String} requestingName - name of requesting modifier\n * @param {String} requestedName - name of requested modifier\n * @returns {Boolean}\n */\nfunction isModifierRequired(modifiers, requestingName, requestedName) {\n var requesting = find(modifiers, function (_ref) {\n var name = _ref.name;\n return name === requestingName;\n });\n\n var isRequired = !!requesting && modifiers.some(function (modifier) {\n return modifier.name === requestedName && modifier.enabled && modifier.order < requesting.order;\n });\n\n if (!isRequired) {\n var _requesting = '`' + requestingName + '`';\n var requested = '`' + requestedName + '`';\n console.warn(requested + ' modifier is required by ' + _requesting + ' modifier in order to work, be sure to include it before ' + _requesting + '!');\n }\n return isRequired;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction arrow(data, options) {\n var _data$offsets$arrow;\n\n // arrow depends on keepTogether in order to work\n if (!isModifierRequired(data.instance.modifiers, 'arrow', 'keepTogether')) {\n return data;\n }\n\n var arrowElement = options.element;\n\n // if arrowElement is a string, suppose it's a CSS selector\n if (typeof arrowElement === 'string') {\n arrowElement = data.instance.popper.querySelector(arrowElement);\n\n // if arrowElement is not found, don't run the modifier\n if (!arrowElement) {\n return data;\n }\n } else {\n // if the arrowElement isn't a query selector we must check that the\n // provided DOM node is child of its popper node\n if (!data.instance.popper.contains(arrowElement)) {\n console.warn('WARNING: `arrow.element` must be child of its popper element!');\n return data;\n }\n }\n\n var placement = data.placement.split('-')[0];\n var _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n\n var isVertical = ['left', 'right'].indexOf(placement) !== -1;\n\n var len = isVertical ? 'height' : 'width';\n var sideCapitalized = isVertical ? 'Top' : 'Left';\n var side = sideCapitalized.toLowerCase();\n var altSide = isVertical ? 'left' : 'top';\n var opSide = isVertical ? 'bottom' : 'right';\n var arrowElementSize = getOuterSizes(arrowElement)[len];\n\n //\n // extends keepTogether behavior making sure the popper and its\n // reference have enough pixels in conjunction\n //\n\n // top/left side\n if (reference[opSide] - arrowElementSize < popper[side]) {\n data.offsets.popper[side] -= popper[side] - (reference[opSide] - arrowElementSize);\n }\n // bottom/right side\n if (reference[side] + arrowElementSize > popper[opSide]) {\n data.offsets.popper[side] += reference[side] + arrowElementSize - popper[opSide];\n }\n data.offsets.popper = getClientRect(data.offsets.popper);\n\n // compute center of the popper\n var center = reference[side] + reference[len] / 2 - arrowElementSize / 2;\n\n // Compute the sideValue using the updated popper offsets\n // take popper margin in account because we don't have this info available\n var css = getStyleComputedProperty(data.instance.popper);\n var popperMarginSide = parseFloat(css['margin' + sideCapitalized]);\n var popperBorderSide = parseFloat(css['border' + sideCapitalized + 'Width']);\n var sideValue = center - data.offsets.popper[side] - popperMarginSide - popperBorderSide;\n\n // prevent arrowElement from being placed not contiguously to its popper\n sideValue = Math.max(Math.min(popper[len] - arrowElementSize, sideValue), 0);\n\n data.arrowElement = arrowElement;\n data.offsets.arrow = (_data$offsets$arrow = {}, defineProperty(_data$offsets$arrow, side, Math.round(sideValue)), defineProperty(_data$offsets$arrow, altSide, ''), _data$offsets$arrow);\n\n return data;\n}\n\n/**\n * Get the opposite placement variation of the given one\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement variation\n * @returns {String} flipped placement variation\n */\nfunction getOppositeVariation(variation) {\n if (variation === 'end') {\n return 'start';\n } else if (variation === 'start') {\n return 'end';\n }\n return variation;\n}\n\n/**\n * List of accepted placements to use as values of the `placement` option.
\n * Valid placements are:\n * - `auto`\n * - `top`\n * - `right`\n * - `bottom`\n * - `left`\n *\n * Each placement can have a variation from this list:\n * - `-start`\n * - `-end`\n *\n * Variations are interpreted easily if you think of them as the left to right\n * written languages. Horizontally (`top` and `bottom`), `start` is left and `end`\n * is right.
\n * Vertically (`left` and `right`), `start` is top and `end` is bottom.\n *\n * Some valid examples are:\n * - `top-end` (on top of reference, right aligned)\n * - `right-start` (on right of reference, top aligned)\n * - `bottom` (on bottom, centered)\n * - `auto-end` (on the side with more space available, alignment depends by placement)\n *\n * @static\n * @type {Array}\n * @enum {String}\n * @readonly\n * @method placements\n * @memberof Popper\n */\nvar placements = ['auto-start', 'auto', 'auto-end', 'top-start', 'top', 'top-end', 'right-start', 'right', 'right-end', 'bottom-end', 'bottom', 'bottom-start', 'left-end', 'left', 'left-start'];\n\n// Get rid of `auto` `auto-start` and `auto-end`\nvar validPlacements = placements.slice(3);\n\n/**\n * Given an initial placement, returns all the subsequent placements\n * clockwise (or counter-clockwise).\n *\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement - A valid placement (it accepts variations)\n * @argument {Boolean} counter - Set to true to walk the placements counterclockwise\n * @returns {Array} placements including their variations\n */\nfunction clockwise(placement) {\n var counter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n var index = validPlacements.indexOf(placement);\n var arr = validPlacements.slice(index + 1).concat(validPlacements.slice(0, index));\n return counter ? arr.reverse() : arr;\n}\n\nvar BEHAVIORS = {\n FLIP: 'flip',\n CLOCKWISE: 'clockwise',\n COUNTERCLOCKWISE: 'counterclockwise'\n};\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction flip(data, options) {\n // if `inner` modifier is enabled, we can't use the `flip` modifier\n if (isModifierEnabled(data.instance.modifiers, 'inner')) {\n return data;\n }\n\n if (data.flipped && data.placement === data.originalPlacement) {\n // seems like flip is trying to loop, probably there's not enough space on any of the flippable sides\n return data;\n }\n\n var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, options.boundariesElement, data.positionFixed);\n\n var placement = data.placement.split('-')[0];\n var placementOpposite = getOppositePlacement(placement);\n var variation = data.placement.split('-')[1] || '';\n\n var flipOrder = [];\n\n switch (options.behavior) {\n case BEHAVIORS.FLIP:\n flipOrder = [placement, placementOpposite];\n break;\n case BEHAVIORS.CLOCKWISE:\n flipOrder = clockwise(placement);\n break;\n case BEHAVIORS.COUNTERCLOCKWISE:\n flipOrder = clockwise(placement, true);\n break;\n default:\n flipOrder = options.behavior;\n }\n\n flipOrder.forEach(function (step, index) {\n if (placement !== step || flipOrder.length === index + 1) {\n return data;\n }\n\n placement = data.placement.split('-')[0];\n placementOpposite = getOppositePlacement(placement);\n\n var popperOffsets = data.offsets.popper;\n var refOffsets = data.offsets.reference;\n\n // using floor because the reference offsets may contain decimals we are not going to consider here\n var floor = Math.floor;\n var overlapsRef = placement === 'left' && floor(popperOffsets.right) > floor(refOffsets.left) || placement === 'right' && floor(popperOffsets.left) < floor(refOffsets.right) || placement === 'top' && floor(popperOffsets.bottom) > floor(refOffsets.top) || placement === 'bottom' && floor(popperOffsets.top) < floor(refOffsets.bottom);\n\n var overflowsLeft = floor(popperOffsets.left) < floor(boundaries.left);\n var overflowsRight = floor(popperOffsets.right) > floor(boundaries.right);\n var overflowsTop = floor(popperOffsets.top) < floor(boundaries.top);\n var overflowsBottom = floor(popperOffsets.bottom) > floor(boundaries.bottom);\n\n var overflowsBoundaries = placement === 'left' && overflowsLeft || placement === 'right' && overflowsRight || placement === 'top' && overflowsTop || placement === 'bottom' && overflowsBottom;\n\n // flip the variation if required\n var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\n\n // flips variation if reference element overflows boundaries\n var flippedVariationByRef = !!options.flipVariations && (isVertical && variation === 'start' && overflowsLeft || isVertical && variation === 'end' && overflowsRight || !isVertical && variation === 'start' && overflowsTop || !isVertical && variation === 'end' && overflowsBottom);\n\n // flips variation if popper content overflows boundaries\n var flippedVariationByContent = !!options.flipVariationsByContent && (isVertical && variation === 'start' && overflowsRight || isVertical && variation === 'end' && overflowsLeft || !isVertical && variation === 'start' && overflowsBottom || !isVertical && variation === 'end' && overflowsTop);\n\n var flippedVariation = flippedVariationByRef || flippedVariationByContent;\n\n if (overlapsRef || overflowsBoundaries || flippedVariation) {\n // this boolean to detect any flip loop\n data.flipped = true;\n\n if (overlapsRef || overflowsBoundaries) {\n placement = flipOrder[index + 1];\n }\n\n if (flippedVariation) {\n variation = getOppositeVariation(variation);\n }\n\n data.placement = placement + (variation ? '-' + variation : '');\n\n // this object contains `position`, we want to preserve it along with\n // any additional property we may add in the future\n data.offsets.popper = _extends({}, data.offsets.popper, getPopperOffsets(data.instance.popper, data.offsets.reference, data.placement));\n\n data = runModifiers(data.instance.modifiers, data, 'flip');\n }\n });\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction keepTogether(data) {\n var _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n\n var placement = data.placement.split('-')[0];\n var floor = Math.floor;\n var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\n var side = isVertical ? 'right' : 'bottom';\n var opSide = isVertical ? 'left' : 'top';\n var measurement = isVertical ? 'width' : 'height';\n\n if (popper[side] < floor(reference[opSide])) {\n data.offsets.popper[opSide] = floor(reference[opSide]) - popper[measurement];\n }\n if (popper[opSide] > floor(reference[side])) {\n data.offsets.popper[opSide] = floor(reference[side]);\n }\n\n return data;\n}\n\n/**\n * Converts a string containing value + unit into a px value number\n * @function\n * @memberof {modifiers~offset}\n * @private\n * @argument {String} str - Value + unit string\n * @argument {String} measurement - `height` or `width`\n * @argument {Object} popperOffsets\n * @argument {Object} referenceOffsets\n * @returns {Number|String}\n * Value in pixels, or original string if no values were extracted\n */\nfunction toValue(str, measurement, popperOffsets, referenceOffsets) {\n // separate value from unit\n var split = str.match(/((?:\\-|\\+)?\\d*\\.?\\d*)(.*)/);\n var value = +split[1];\n var unit = split[2];\n\n // If it's not a number it's an operator, I guess\n if (!value) {\n return str;\n }\n\n if (unit.indexOf('%') === 0) {\n var element = void 0;\n switch (unit) {\n case '%p':\n element = popperOffsets;\n break;\n case '%':\n case '%r':\n default:\n element = referenceOffsets;\n }\n\n var rect = getClientRect(element);\n return rect[measurement] / 100 * value;\n } else if (unit === 'vh' || unit === 'vw') {\n // if is a vh or vw, we calculate the size based on the viewport\n var size = void 0;\n if (unit === 'vh') {\n size = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);\n } else {\n size = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);\n }\n return size / 100 * value;\n } else {\n // if is an explicit pixel unit, we get rid of the unit and keep the value\n // if is an implicit unit, it's px, and we return just the value\n return value;\n }\n}\n\n/**\n * Parse an `offset` string to extrapolate `x` and `y` numeric offsets.\n * @function\n * @memberof {modifiers~offset}\n * @private\n * @argument {String} offset\n * @argument {Object} popperOffsets\n * @argument {Object} referenceOffsets\n * @argument {String} basePlacement\n * @returns {Array} a two cells array with x and y offsets in numbers\n */\nfunction parseOffset(offset, popperOffsets, referenceOffsets, basePlacement) {\n var offsets = [0, 0];\n\n // Use height if placement is left or right and index is 0 otherwise use width\n // in this way the first offset will use an axis and the second one\n // will use the other one\n var useHeight = ['right', 'left'].indexOf(basePlacement) !== -1;\n\n // Split the offset string to obtain a list of values and operands\n // The regex addresses values with the plus or minus sign in front (+10, -20, etc)\n var fragments = offset.split(/(\\+|\\-)/).map(function (frag) {\n return frag.trim();\n });\n\n // Detect if the offset string contains a pair of values or a single one\n // they could be separated by comma or space\n var divider = fragments.indexOf(find(fragments, function (frag) {\n return frag.search(/,|\\s/) !== -1;\n }));\n\n if (fragments[divider] && fragments[divider].indexOf(',') === -1) {\n console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.');\n }\n\n // If divider is found, we divide the list of values and operands to divide\n // them by ofset X and Y.\n var splitRegex = /\\s*,\\s*|\\s+/;\n var ops = divider !== -1 ? [fragments.slice(0, divider).concat([fragments[divider].split(splitRegex)[0]]), [fragments[divider].split(splitRegex)[1]].concat(fragments.slice(divider + 1))] : [fragments];\n\n // Convert the values with units to absolute pixels to allow our computations\n ops = ops.map(function (op, index) {\n // Most of the units rely on the orientation of the popper\n var measurement = (index === 1 ? !useHeight : useHeight) ? 'height' : 'width';\n var mergeWithPrevious = false;\n return op\n // This aggregates any `+` or `-` sign that aren't considered operators\n // e.g.: 10 + +5 => [10, +, +5]\n .reduce(function (a, b) {\n if (a[a.length - 1] === '' && ['+', '-'].indexOf(b) !== -1) {\n a[a.length - 1] = b;\n mergeWithPrevious = true;\n return a;\n } else if (mergeWithPrevious) {\n a[a.length - 1] += b;\n mergeWithPrevious = false;\n return a;\n } else {\n return a.concat(b);\n }\n }, [])\n // Here we convert the string values into number values (in px)\n .map(function (str) {\n return toValue(str, measurement, popperOffsets, referenceOffsets);\n });\n });\n\n // Loop trough the offsets arrays and execute the operations\n ops.forEach(function (op, index) {\n op.forEach(function (frag, index2) {\n if (isNumeric(frag)) {\n offsets[index] += frag * (op[index2 - 1] === '-' ? -1 : 1);\n }\n });\n });\n return offsets;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @argument {Number|String} options.offset=0\n * The offset value as described in the modifier description\n * @returns {Object} The data object, properly modified\n */\nfunction offset(data, _ref) {\n var offset = _ref.offset;\n var placement = data.placement,\n _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n\n var basePlacement = placement.split('-')[0];\n\n var offsets = void 0;\n if (isNumeric(+offset)) {\n offsets = [+offset, 0];\n } else {\n offsets = parseOffset(offset, popper, reference, basePlacement);\n }\n\n if (basePlacement === 'left') {\n popper.top += offsets[0];\n popper.left -= offsets[1];\n } else if (basePlacement === 'right') {\n popper.top += offsets[0];\n popper.left += offsets[1];\n } else if (basePlacement === 'top') {\n popper.left += offsets[0];\n popper.top -= offsets[1];\n } else if (basePlacement === 'bottom') {\n popper.left += offsets[0];\n popper.top += offsets[1];\n }\n\n data.popper = popper;\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction preventOverflow(data, options) {\n var boundariesElement = options.boundariesElement || getOffsetParent(data.instance.popper);\n\n // If offsetParent is the reference element, we really want to\n // go one step up and use the next offsetParent as reference to\n // avoid to make this modifier completely useless and look like broken\n if (data.instance.reference === boundariesElement) {\n boundariesElement = getOffsetParent(boundariesElement);\n }\n\n // NOTE: DOM access here\n // resets the popper's position so that the document size can be calculated excluding\n // the size of the popper element itself\n var transformProp = getSupportedPropertyName('transform');\n var popperStyles = data.instance.popper.style; // assignment to help minification\n var top = popperStyles.top,\n left = popperStyles.left,\n transform = popperStyles[transformProp];\n\n popperStyles.top = '';\n popperStyles.left = '';\n popperStyles[transformProp] = '';\n\n var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, boundariesElement, data.positionFixed);\n\n // NOTE: DOM access here\n // restores the original style properties after the offsets have been computed\n popperStyles.top = top;\n popperStyles.left = left;\n popperStyles[transformProp] = transform;\n\n options.boundaries = boundaries;\n\n var order = options.priority;\n var popper = data.offsets.popper;\n\n var check = {\n primary: function primary(placement) {\n var value = popper[placement];\n if (popper[placement] < boundaries[placement] && !options.escapeWithReference) {\n value = Math.max(popper[placement], boundaries[placement]);\n }\n return defineProperty({}, placement, value);\n },\n secondary: function secondary(placement) {\n var mainSide = placement === 'right' ? 'left' : 'top';\n var value = popper[mainSide];\n if (popper[placement] > boundaries[placement] && !options.escapeWithReference) {\n value = Math.min(popper[mainSide], boundaries[placement] - (placement === 'right' ? popper.width : popper.height));\n }\n return defineProperty({}, mainSide, value);\n }\n };\n\n order.forEach(function (placement) {\n var side = ['left', 'top'].indexOf(placement) !== -1 ? 'primary' : 'secondary';\n popper = _extends({}, popper, check[side](placement));\n });\n\n data.offsets.popper = popper;\n\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction shift(data) {\n var placement = data.placement;\n var basePlacement = placement.split('-')[0];\n var shiftvariation = placement.split('-')[1];\n\n // if shift shiftvariation is specified, run the modifier\n if (shiftvariation) {\n var _data$offsets = data.offsets,\n reference = _data$offsets.reference,\n popper = _data$offsets.popper;\n\n var isVertical = ['bottom', 'top'].indexOf(basePlacement) !== -1;\n var side = isVertical ? 'left' : 'top';\n var measurement = isVertical ? 'width' : 'height';\n\n var shiftOffsets = {\n start: defineProperty({}, side, reference[side]),\n end: defineProperty({}, side, reference[side] + reference[measurement] - popper[measurement])\n };\n\n data.offsets.popper = _extends({}, popper, shiftOffsets[shiftvariation]);\n }\n\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction hide(data) {\n if (!isModifierRequired(data.instance.modifiers, 'hide', 'preventOverflow')) {\n return data;\n }\n\n var refRect = data.offsets.reference;\n var bound = find(data.instance.modifiers, function (modifier) {\n return modifier.name === 'preventOverflow';\n }).boundaries;\n\n if (refRect.bottom < bound.top || refRect.left > bound.right || refRect.top > bound.bottom || refRect.right < bound.left) {\n // Avoid unnecessary DOM access if visibility hasn't changed\n if (data.hide === true) {\n return data;\n }\n\n data.hide = true;\n data.attributes['x-out-of-boundaries'] = '';\n } else {\n // Avoid unnecessary DOM access if visibility hasn't changed\n if (data.hide === false) {\n return data;\n }\n\n data.hide = false;\n data.attributes['x-out-of-boundaries'] = false;\n }\n\n return data;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nfunction inner(data) {\n var placement = data.placement;\n var basePlacement = placement.split('-')[0];\n var _data$offsets = data.offsets,\n popper = _data$offsets.popper,\n reference = _data$offsets.reference;\n\n var isHoriz = ['left', 'right'].indexOf(basePlacement) !== -1;\n\n var subtractLength = ['top', 'left'].indexOf(basePlacement) === -1;\n\n popper[isHoriz ? 'left' : 'top'] = reference[basePlacement] - (subtractLength ? popper[isHoriz ? 'width' : 'height'] : 0);\n\n data.placement = getOppositePlacement(placement);\n data.offsets.popper = getClientRect(popper);\n\n return data;\n}\n\n/**\n * Modifier function, each modifier can have a function of this type assigned\n * to its `fn` property.
\n * These functions will be called on each update, this means that you must\n * make sure they are performant enough to avoid performance bottlenecks.\n *\n * @function ModifierFn\n * @argument {dataObject} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {dataObject} The data object, properly modified\n */\n\n/**\n * Modifiers are plugins used to alter the behavior of your poppers.
\n * Popper.js uses a set of 9 modifiers to provide all the basic functionalities\n * needed by the library.\n *\n * Usually you don't want to override the `order`, `fn` and `onLoad` props.\n * All the other properties are configurations that could be tweaked.\n * @namespace modifiers\n */\nvar modifiers = {\n /**\n * Modifier used to shift the popper on the start or end of its reference\n * element.
\n * It will read the variation of the `placement` property.
\n * It can be one either `-end` or `-start`.\n * @memberof modifiers\n * @inner\n */\n shift: {\n /** @prop {number} order=100 - Index used to define the order of execution */\n order: 100,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: shift\n },\n\n /**\n * The `offset` modifier can shift your popper on both its axis.\n *\n * It accepts the following units:\n * - `px` or unit-less, interpreted as pixels\n * - `%` or `%r`, percentage relative to the length of the reference element\n * - `%p`, percentage relative to the length of the popper element\n * - `vw`, CSS viewport width unit\n * - `vh`, CSS viewport height unit\n *\n * For length is intended the main axis relative to the placement of the popper.
\n * This means that if the placement is `top` or `bottom`, the length will be the\n * `width`. In case of `left` or `right`, it will be the `height`.\n *\n * You can provide a single value (as `Number` or `String`), or a pair of values\n * as `String` divided by a comma or one (or more) white spaces.
\n * The latter is a deprecated method because it leads to confusion and will be\n * removed in v2.
\n * Additionally, it accepts additions and subtractions between different units.\n * Note that multiplications and divisions aren't supported.\n *\n * Valid examples are:\n * ```\n * 10\n * '10%'\n * '10, 10'\n * '10%, 10'\n * '10 + 10%'\n * '10 - 5vh + 3%'\n * '-10px + 5vh, 5px - 6%'\n * ```\n * > **NB**: If you desire to apply offsets to your poppers in a way that may make them overlap\n * > with their reference element, unfortunately, you will have to disable the `flip` modifier.\n * > You can read more on this at this [issue](https://github.com/FezVrasta/popper.js/issues/373).\n *\n * @memberof modifiers\n * @inner\n */\n offset: {\n /** @prop {number} order=200 - Index used to define the order of execution */\n order: 200,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: offset,\n /** @prop {Number|String} offset=0\n * The offset value as described in the modifier description\n */\n offset: 0\n },\n\n /**\n * Modifier used to prevent the popper from being positioned outside the boundary.\n *\n * A scenario exists where the reference itself is not within the boundaries.
\n * We can say it has \"escaped the boundaries\" — or just \"escaped\".
\n * In this case we need to decide whether the popper should either:\n *\n * - detach from the reference and remain \"trapped\" in the boundaries, or\n * - if it should ignore the boundary and \"escape with its reference\"\n *\n * When `escapeWithReference` is set to`true` and reference is completely\n * outside its boundaries, the popper will overflow (or completely leave)\n * the boundaries in order to remain attached to the edge of the reference.\n *\n * @memberof modifiers\n * @inner\n */\n preventOverflow: {\n /** @prop {number} order=300 - Index used to define the order of execution */\n order: 300,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: preventOverflow,\n /**\n * @prop {Array} [priority=['left','right','top','bottom']]\n * Popper will try to prevent overflow following these priorities by default,\n * then, it could overflow on the left and on top of the `boundariesElement`\n */\n priority: ['left', 'right', 'top', 'bottom'],\n /**\n * @prop {number} padding=5\n * Amount of pixel used to define a minimum distance between the boundaries\n * and the popper. This makes sure the popper always has a little padding\n * between the edges of its container\n */\n padding: 5,\n /**\n * @prop {String|HTMLElement} boundariesElement='scrollParent'\n * Boundaries used by the modifier. Can be `scrollParent`, `window`,\n * `viewport` or any DOM element.\n */\n boundariesElement: 'scrollParent'\n },\n\n /**\n * Modifier used to make sure the reference and its popper stay near each other\n * without leaving any gap between the two. Especially useful when the arrow is\n * enabled and you want to ensure that it points to its reference element.\n * It cares only about the first axis. You can still have poppers with margin\n * between the popper and its reference element.\n * @memberof modifiers\n * @inner\n */\n keepTogether: {\n /** @prop {number} order=400 - Index used to define the order of execution */\n order: 400,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: keepTogether\n },\n\n /**\n * This modifier is used to move the `arrowElement` of the popper to make\n * sure it is positioned between the reference element and its popper element.\n * It will read the outer size of the `arrowElement` node to detect how many\n * pixels of conjunction are needed.\n *\n * It has no effect if no `arrowElement` is provided.\n * @memberof modifiers\n * @inner\n */\n arrow: {\n /** @prop {number} order=500 - Index used to define the order of execution */\n order: 500,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: arrow,\n /** @prop {String|HTMLElement} element='[x-arrow]' - Selector or node used as arrow */\n element: '[x-arrow]'\n },\n\n /**\n * Modifier used to flip the popper's placement when it starts to overlap its\n * reference element.\n *\n * Requires the `preventOverflow` modifier before it in order to work.\n *\n * **NOTE:** this modifier will interrupt the current update cycle and will\n * restart it if it detects the need to flip the placement.\n * @memberof modifiers\n * @inner\n */\n flip: {\n /** @prop {number} order=600 - Index used to define the order of execution */\n order: 600,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: flip,\n /**\n * @prop {String|Array} behavior='flip'\n * The behavior used to change the popper's placement. It can be one of\n * `flip`, `clockwise`, `counterclockwise` or an array with a list of valid\n * placements (with optional variations)\n */\n behavior: 'flip',\n /**\n * @prop {number} padding=5\n * The popper will flip if it hits the edges of the `boundariesElement`\n */\n padding: 5,\n /**\n * @prop {String|HTMLElement} boundariesElement='viewport'\n * The element which will define the boundaries of the popper position.\n * The popper will never be placed outside of the defined boundaries\n * (except if `keepTogether` is enabled)\n */\n boundariesElement: 'viewport',\n /**\n * @prop {Boolean} flipVariations=false\n * The popper will switch placement variation between `-start` and `-end` when\n * the reference element overlaps its boundaries.\n *\n * The original placement should have a set variation.\n */\n flipVariations: false,\n /**\n * @prop {Boolean} flipVariationsByContent=false\n * The popper will switch placement variation between `-start` and `-end` when\n * the popper element overlaps its reference boundaries.\n *\n * The original placement should have a set variation.\n */\n flipVariationsByContent: false\n },\n\n /**\n * Modifier used to make the popper flow toward the inner of the reference element.\n * By default, when this modifier is disabled, the popper will be placed outside\n * the reference element.\n * @memberof modifiers\n * @inner\n */\n inner: {\n /** @prop {number} order=700 - Index used to define the order of execution */\n order: 700,\n /** @prop {Boolean} enabled=false - Whether the modifier is enabled or not */\n enabled: false,\n /** @prop {ModifierFn} */\n fn: inner\n },\n\n /**\n * Modifier used to hide the popper when its reference element is outside of the\n * popper boundaries. It will set a `x-out-of-boundaries` attribute which can\n * be used to hide with a CSS selector the popper when its reference is\n * out of boundaries.\n *\n * Requires the `preventOverflow` modifier before it in order to work.\n * @memberof modifiers\n * @inner\n */\n hide: {\n /** @prop {number} order=800 - Index used to define the order of execution */\n order: 800,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: hide\n },\n\n /**\n * Computes the style that will be applied to the popper element to gets\n * properly positioned.\n *\n * Note that this modifier will not touch the DOM, it just prepares the styles\n * so that `applyStyle` modifier can apply it. This separation is useful\n * in case you need to replace `applyStyle` with a custom implementation.\n *\n * This modifier has `850` as `order` value to maintain backward compatibility\n * with previous versions of Popper.js. Expect the modifiers ordering method\n * to change in future major versions of the library.\n *\n * @memberof modifiers\n * @inner\n */\n computeStyle: {\n /** @prop {number} order=850 - Index used to define the order of execution */\n order: 850,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: computeStyle,\n /**\n * @prop {Boolean} gpuAcceleration=true\n * If true, it uses the CSS 3D transformation to position the popper.\n * Otherwise, it will use the `top` and `left` properties\n */\n gpuAcceleration: true,\n /**\n * @prop {string} [x='bottom']\n * Where to anchor the X axis (`bottom` or `top`). AKA X offset origin.\n * Change this if your popper should grow in a direction different from `bottom`\n */\n x: 'bottom',\n /**\n * @prop {string} [x='left']\n * Where to anchor the Y axis (`left` or `right`). AKA Y offset origin.\n * Change this if your popper should grow in a direction different from `right`\n */\n y: 'right'\n },\n\n /**\n * Applies the computed styles to the popper element.\n *\n * All the DOM manipulations are limited to this modifier. This is useful in case\n * you want to integrate Popper.js inside a framework or view library and you\n * want to delegate all the DOM manipulations to it.\n *\n * Note that if you disable this modifier, you must make sure the popper element\n * has its position set to `absolute` before Popper.js can do its work!\n *\n * Just disable this modifier and define your own to achieve the desired effect.\n *\n * @memberof modifiers\n * @inner\n */\n applyStyle: {\n /** @prop {number} order=900 - Index used to define the order of execution */\n order: 900,\n /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n enabled: true,\n /** @prop {ModifierFn} */\n fn: applyStyle,\n /** @prop {Function} */\n onLoad: applyStyleOnLoad,\n /**\n * @deprecated since version 1.10.0, the property moved to `computeStyle` modifier\n * @prop {Boolean} gpuAcceleration=true\n * If true, it uses the CSS 3D transformation to position the popper.\n * Otherwise, it will use the `top` and `left` properties\n */\n gpuAcceleration: undefined\n }\n};\n\n/**\n * The `dataObject` is an object containing all the information used by Popper.js.\n * This object is passed to modifiers and to the `onCreate` and `onUpdate` callbacks.\n * @name dataObject\n * @property {Object} data.instance The Popper.js instance\n * @property {String} data.placement Placement applied to popper\n * @property {String} data.originalPlacement Placement originally defined on init\n * @property {Boolean} data.flipped True if popper has been flipped by flip modifier\n * @property {Boolean} data.hide True if the reference element is out of boundaries, useful to know when to hide the popper\n * @property {HTMLElement} data.arrowElement Node used as arrow by arrow modifier\n * @property {Object} data.styles Any CSS property defined here will be applied to the popper. It expects the JavaScript nomenclature (eg. `marginBottom`)\n * @property {Object} data.arrowStyles Any CSS property defined here will be applied to the popper arrow. It expects the JavaScript nomenclature (eg. `marginBottom`)\n * @property {Object} data.boundaries Offsets of the popper boundaries\n * @property {Object} data.offsets The measurements of popper, reference and arrow elements\n * @property {Object} data.offsets.popper `top`, `left`, `width`, `height` values\n * @property {Object} data.offsets.reference `top`, `left`, `width`, `height` values\n * @property {Object} data.offsets.arrow] `top` and `left` offsets, only one of them will be different from 0\n */\n\n/**\n * Default options provided to Popper.js constructor.
\n * These can be overridden using the `options` argument of Popper.js.
\n * To override an option, simply pass an object with the same\n * structure of the `options` object, as the 3rd argument. For example:\n * ```\n * new Popper(ref, pop, {\n * modifiers: {\n * preventOverflow: { enabled: false }\n * }\n * })\n * ```\n * @type {Object}\n * @static\n * @memberof Popper\n */\nvar Defaults = {\n /**\n * Popper's placement.\n * @prop {Popper.placements} placement='bottom'\n */\n placement: 'bottom',\n\n /**\n * Set this to true if you want popper to position it self in 'fixed' mode\n * @prop {Boolean} positionFixed=false\n */\n positionFixed: false,\n\n /**\n * Whether events (resize, scroll) are initially enabled.\n * @prop {Boolean} eventsEnabled=true\n */\n eventsEnabled: true,\n\n /**\n * Set to true if you want to automatically remove the popper when\n * you call the `destroy` method.\n * @prop {Boolean} removeOnDestroy=false\n */\n removeOnDestroy: false,\n\n /**\n * Callback called when the popper is created.
\n * By default, it is set to no-op.
\n * Access Popper.js instance with `data.instance`.\n * @prop {onCreate}\n */\n onCreate: function onCreate() {},\n\n /**\n * Callback called when the popper is updated. This callback is not called\n * on the initialization/creation of the popper, but only on subsequent\n * updates.
\n * By default, it is set to no-op.
\n * Access Popper.js instance with `data.instance`.\n * @prop {onUpdate}\n */\n onUpdate: function onUpdate() {},\n\n /**\n * List of modifiers used to modify the offsets before they are applied to the popper.\n * They provide most of the functionalities of Popper.js.\n * @prop {modifiers}\n */\n modifiers: modifiers\n};\n\n/**\n * @callback onCreate\n * @param {dataObject} data\n */\n\n/**\n * @callback onUpdate\n * @param {dataObject} data\n */\n\n// Utils\n// Methods\nvar Popper = function () {\n /**\n * Creates a new Popper.js instance.\n * @class Popper\n * @param {Element|referenceObject} reference - The reference element used to position the popper\n * @param {Element} popper - The HTML / XML element used as the popper\n * @param {Object} options - Your custom options to override the ones defined in [Defaults](#defaults)\n * @return {Object} instance - The generated Popper.js instance\n */\n function Popper(reference, popper) {\n var _this = this;\n\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n classCallCheck(this, Popper);\n\n this.scheduleUpdate = function () {\n return requestAnimationFrame(_this.update);\n };\n\n // make update() debounced, so that it only runs at most once-per-tick\n this.update = debounce(this.update.bind(this));\n\n // with {} we create a new object with the options inside it\n this.options = _extends({}, Popper.Defaults, options);\n\n // init state\n this.state = {\n isDestroyed: false,\n isCreated: false,\n scrollParents: []\n };\n\n // get reference and popper elements (allow jQuery wrappers)\n this.reference = reference && reference.jquery ? reference[0] : reference;\n this.popper = popper && popper.jquery ? popper[0] : popper;\n\n // Deep merge modifiers options\n this.options.modifiers = {};\n Object.keys(_extends({}, Popper.Defaults.modifiers, options.modifiers)).forEach(function (name) {\n _this.options.modifiers[name] = _extends({}, Popper.Defaults.modifiers[name] || {}, options.modifiers ? options.modifiers[name] : {});\n });\n\n // Refactoring modifiers' list (Object => Array)\n this.modifiers = Object.keys(this.options.modifiers).map(function (name) {\n return _extends({\n name: name\n }, _this.options.modifiers[name]);\n })\n // sort the modifiers by order\n .sort(function (a, b) {\n return a.order - b.order;\n });\n\n // modifiers have the ability to execute arbitrary code when Popper.js get inited\n // such code is executed in the same order of its modifier\n // they could add new properties to their options configuration\n // BE AWARE: don't add options to `options.modifiers.name` but to `modifierOptions`!\n this.modifiers.forEach(function (modifierOptions) {\n if (modifierOptions.enabled && isFunction(modifierOptions.onLoad)) {\n modifierOptions.onLoad(_this.reference, _this.popper, _this.options, modifierOptions, _this.state);\n }\n });\n\n // fire the first update to position the popper in the right place\n this.update();\n\n var eventsEnabled = this.options.eventsEnabled;\n if (eventsEnabled) {\n // setup event listeners, they will take care of update the position in specific situations\n this.enableEventListeners();\n }\n\n this.state.eventsEnabled = eventsEnabled;\n }\n\n // We can't use class properties because they don't get listed in the\n // class prototype and break stuff like Sinon stubs\n\n\n createClass(Popper, [{\n key: 'update',\n value: function update$$1() {\n return update.call(this);\n }\n }, {\n key: 'destroy',\n value: function destroy$$1() {\n return destroy.call(this);\n }\n }, {\n key: 'enableEventListeners',\n value: function enableEventListeners$$1() {\n return enableEventListeners.call(this);\n }\n }, {\n key: 'disableEventListeners',\n value: function disableEventListeners$$1() {\n return disableEventListeners.call(this);\n }\n\n /**\n * Schedules an update. It will run on the next UI update available.\n * @method scheduleUpdate\n * @memberof Popper\n */\n\n\n /**\n * Collection of utilities useful when writing custom modifiers.\n * Starting from version 1.7, this method is available only if you\n * include `popper-utils.js` before `popper.js`.\n *\n * **DEPRECATION**: This way to access PopperUtils is deprecated\n * and will be removed in v2! Use the PopperUtils module directly instead.\n * Due to the high instability of the methods contained in Utils, we can't\n * guarantee them to follow semver. Use them at your own risk!\n * @static\n * @private\n * @type {Object}\n * @deprecated since version 1.8\n * @member Utils\n * @memberof Popper\n */\n\n }]);\n return Popper;\n}();\n\n/**\n * The `referenceObject` is an object that provides an interface compatible with Popper.js\n * and lets you use it as replacement of a real DOM node.
\n * You can use this method to position a popper relatively to a set of coordinates\n * in case you don't have a DOM node to use as reference.\n *\n * ```\n * new Popper(referenceObject, popperNode);\n * ```\n *\n * NB: This feature isn't supported in Internet Explorer 10.\n * @name referenceObject\n * @property {Function} data.getBoundingClientRect\n * A function that returns a set of coordinates compatible with the native `getBoundingClientRect` method.\n * @property {number} data.clientWidth\n * An ES6 getter that will return the width of the virtual reference element.\n * @property {number} data.clientHeight\n * An ES6 getter that will return the height of the virtual reference element.\n */\n\n\nPopper.Utils = (typeof window !== 'undefined' ? window : global).PopperUtils;\nPopper.placements = placements;\nPopper.Defaults = Defaults;\n\nexport default Popper;\n//# sourceMappingURL=popper.js.map\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.5.3): dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Popper from 'popper.js'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'dropdown'\nconst VERSION = '4.5.3'\nconst DATA_KEY = 'bs.dropdown'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst ESCAPE_KEYCODE = 27 // KeyboardEvent.which value for Escape (Esc) key\nconst SPACE_KEYCODE = 32 // KeyboardEvent.which value for space key\nconst TAB_KEYCODE = 9 // KeyboardEvent.which value for tab key\nconst ARROW_UP_KEYCODE = 38 // KeyboardEvent.which value for up arrow key\nconst ARROW_DOWN_KEYCODE = 40 // KeyboardEvent.which value for down arrow key\nconst RIGHT_MOUSE_BUTTON_WHICH = 3 // MouseEvent.which value for the right button (assuming a right-handed mouse)\nconst REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEYCODE}|${ARROW_DOWN_KEYCODE}|${ESCAPE_KEYCODE}`)\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_CLICK = `click${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_DISABLED = 'disabled'\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_DROPUP = 'dropup'\nconst CLASS_NAME_DROPRIGHT = 'dropright'\nconst CLASS_NAME_DROPLEFT = 'dropleft'\nconst CLASS_NAME_MENURIGHT = 'dropdown-menu-right'\nconst CLASS_NAME_POSITION_STATIC = 'position-static'\n\nconst SELECTOR_DATA_TOGGLE = '[data-toggle=\"dropdown\"]'\nconst SELECTOR_FORM_CHILD = '.dropdown form'\nconst SELECTOR_MENU = '.dropdown-menu'\nconst SELECTOR_NAVBAR_NAV = '.navbar-nav'\nconst SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n\nconst PLACEMENT_TOP = 'top-start'\nconst PLACEMENT_TOPEND = 'top-end'\nconst PLACEMENT_BOTTOM = 'bottom-start'\nconst PLACEMENT_BOTTOMEND = 'bottom-end'\nconst PLACEMENT_RIGHT = 'right-start'\nconst PLACEMENT_LEFT = 'left-start'\n\nconst Default = {\n offset: 0,\n flip: true,\n boundary: 'scrollParent',\n reference: 'toggle',\n display: 'dynamic',\n popperConfig: null\n}\n\nconst DefaultType = {\n offset: '(number|string|function)',\n flip: 'boolean',\n boundary: '(string|element)',\n reference: '(string|element)',\n display: 'string',\n popperConfig: '(null|object)'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Dropdown {\n constructor(element, config) {\n this._element = element\n this._popper = null\n this._config = this._getConfig(config)\n this._menu = this._getMenuElement()\n this._inNavbar = this._detectNavbar()\n\n this._addEventListeners()\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n // Public\n\n toggle() {\n if (this._element.disabled || $(this._element).hasClass(CLASS_NAME_DISABLED)) {\n return\n }\n\n const isActive = $(this._menu).hasClass(CLASS_NAME_SHOW)\n\n Dropdown._clearMenus()\n\n if (isActive) {\n return\n }\n\n this.show(true)\n }\n\n show(usePopper = false) {\n if (this._element.disabled || $(this._element).hasClass(CLASS_NAME_DISABLED) || $(this._menu).hasClass(CLASS_NAME_SHOW)) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n const showEvent = $.Event(EVENT_SHOW, relatedTarget)\n const parent = Dropdown._getParentFromElement(this._element)\n\n $(parent).trigger(showEvent)\n\n if (showEvent.isDefaultPrevented()) {\n return\n }\n\n // Disable totally Popper.js for Dropdown in Navbar\n if (!this._inNavbar && usePopper) {\n /**\n * Check for Popper dependency\n * Popper - https://popper.js.org\n */\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s dropdowns require Popper.js (https://popper.js.org/)')\n }\n\n let referenceElement = this._element\n\n if (this._config.reference === 'parent') {\n referenceElement = parent\n } else if (Util.isElement(this._config.reference)) {\n referenceElement = this._config.reference\n\n // Check if it's jQuery element\n if (typeof this._config.reference.jquery !== 'undefined') {\n referenceElement = this._config.reference[0]\n }\n }\n\n // If boundary is not `scrollParent`, then set position to `static`\n // to allow the menu to \"escape\" the scroll parent's boundaries\n // https://github.com/twbs/bootstrap/issues/24251\n if (this._config.boundary !== 'scrollParent') {\n $(parent).addClass(CLASS_NAME_POSITION_STATIC)\n }\n\n this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig())\n }\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement &&\n $(parent).closest(SELECTOR_NAVBAR_NAV).length === 0) {\n $(document.body).children().on('mouseover', null, $.noop)\n }\n\n this._element.focus()\n this._element.setAttribute('aria-expanded', true)\n\n $(this._menu).toggleClass(CLASS_NAME_SHOW)\n $(parent)\n .toggleClass(CLASS_NAME_SHOW)\n .trigger($.Event(EVENT_SHOWN, relatedTarget))\n }\n\n hide() {\n if (this._element.disabled || $(this._element).hasClass(CLASS_NAME_DISABLED) || !$(this._menu).hasClass(CLASS_NAME_SHOW)) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n const hideEvent = $.Event(EVENT_HIDE, relatedTarget)\n const parent = Dropdown._getParentFromElement(this._element)\n\n $(parent).trigger(hideEvent)\n\n if (hideEvent.isDefaultPrevented()) {\n return\n }\n\n if (this._popper) {\n this._popper.destroy()\n }\n\n $(this._menu).toggleClass(CLASS_NAME_SHOW)\n $(parent)\n .toggleClass(CLASS_NAME_SHOW)\n .trigger($.Event(EVENT_HIDDEN, relatedTarget))\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n $(this._element).off(EVENT_KEY)\n this._element = null\n this._menu = null\n if (this._popper !== null) {\n this._popper.destroy()\n this._popper = null\n }\n }\n\n update() {\n this._inNavbar = this._detectNavbar()\n if (this._popper !== null) {\n this._popper.scheduleUpdate()\n }\n }\n\n // Private\n\n _addEventListeners() {\n $(this._element).on(EVENT_CLICK, event => {\n event.preventDefault()\n event.stopPropagation()\n this.toggle()\n })\n }\n\n _getConfig(config) {\n config = {\n ...this.constructor.Default,\n ...$(this._element).data(),\n ...config\n }\n\n Util.typeCheckConfig(\n NAME,\n config,\n this.constructor.DefaultType\n )\n\n return config\n }\n\n _getMenuElement() {\n if (!this._menu) {\n const parent = Dropdown._getParentFromElement(this._element)\n\n if (parent) {\n this._menu = parent.querySelector(SELECTOR_MENU)\n }\n }\n\n return this._menu\n }\n\n _getPlacement() {\n const $parentDropdown = $(this._element.parentNode)\n let placement = PLACEMENT_BOTTOM\n\n // Handle dropup\n if ($parentDropdown.hasClass(CLASS_NAME_DROPUP)) {\n placement = $(this._menu).hasClass(CLASS_NAME_MENURIGHT) ?\n PLACEMENT_TOPEND :\n PLACEMENT_TOP\n } else if ($parentDropdown.hasClass(CLASS_NAME_DROPRIGHT)) {\n placement = PLACEMENT_RIGHT\n } else if ($parentDropdown.hasClass(CLASS_NAME_DROPLEFT)) {\n placement = PLACEMENT_LEFT\n } else if ($(this._menu).hasClass(CLASS_NAME_MENURIGHT)) {\n placement = PLACEMENT_BOTTOMEND\n }\n\n return placement\n }\n\n _detectNavbar() {\n return $(this._element).closest('.navbar').length > 0\n }\n\n _getOffset() {\n const offset = {}\n\n if (typeof this._config.offset === 'function') {\n offset.fn = data => {\n data.offsets = {\n ...data.offsets,\n ...(this._config.offset(data.offsets, this._element) || {})\n }\n\n return data\n }\n } else {\n offset.offset = this._config.offset\n }\n\n return offset\n }\n\n _getPopperConfig() {\n const popperConfig = {\n placement: this._getPlacement(),\n modifiers: {\n offset: this._getOffset(),\n flip: {\n enabled: this._config.flip\n },\n preventOverflow: {\n boundariesElement: this._config.boundary\n }\n }\n }\n\n // Disable Popper.js if we have a static display\n if (this._config.display === 'static') {\n popperConfig.modifiers.applyStyle = {\n enabled: false\n }\n }\n\n return {\n ...popperConfig,\n ...this._config.popperConfig\n }\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = typeof config === 'object' ? config : null\n\n if (!data) {\n data = new Dropdown(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n\n static _clearMenus(event) {\n if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH ||\n event.type === 'keyup' && event.which !== TAB_KEYCODE)) {\n return\n }\n\n const toggles = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE))\n\n for (let i = 0, len = toggles.length; i < len; i++) {\n const parent = Dropdown._getParentFromElement(toggles[i])\n const context = $(toggles[i]).data(DATA_KEY)\n const relatedTarget = {\n relatedTarget: toggles[i]\n }\n\n if (event && event.type === 'click') {\n relatedTarget.clickEvent = event\n }\n\n if (!context) {\n continue\n }\n\n const dropdownMenu = context._menu\n if (!$(parent).hasClass(CLASS_NAME_SHOW)) {\n continue\n }\n\n if (event && (event.type === 'click' &&\n /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) &&\n $.contains(parent, event.target)) {\n continue\n }\n\n const hideEvent = $.Event(EVENT_HIDE, relatedTarget)\n $(parent).trigger(hideEvent)\n if (hideEvent.isDefaultPrevented()) {\n continue\n }\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n $(document.body).children().off('mouseover', null, $.noop)\n }\n\n toggles[i].setAttribute('aria-expanded', 'false')\n\n if (context._popper) {\n context._popper.destroy()\n }\n\n $(dropdownMenu).removeClass(CLASS_NAME_SHOW)\n $(parent)\n .removeClass(CLASS_NAME_SHOW)\n .trigger($.Event(EVENT_HIDDEN, relatedTarget))\n }\n }\n\n static _getParentFromElement(element) {\n let parent\n const selector = Util.getSelectorFromElement(element)\n\n if (selector) {\n parent = document.querySelector(selector)\n }\n\n return parent || element.parentNode\n }\n\n // eslint-disable-next-line complexity\n static _dataApiKeydownHandler(event) {\n // If not input/textarea:\n // - And not a key in REGEXP_KEYDOWN => not a dropdown command\n // If input/textarea:\n // - If space key => not a dropdown command\n // - If key is other than escape\n // - If key is not up or down => not a dropdown command\n // - If trigger inside the menu => not a dropdown command\n if (/input|textarea/i.test(event.target.tagName) ?\n event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE &&\n (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE ||\n $(event.target).closest(SELECTOR_MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {\n return\n }\n\n if (this.disabled || $(this).hasClass(CLASS_NAME_DISABLED)) {\n return\n }\n\n const parent = Dropdown._getParentFromElement(this)\n const isActive = $(parent).hasClass(CLASS_NAME_SHOW)\n\n if (!isActive && event.which === ESCAPE_KEYCODE) {\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n\n if (!isActive || (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {\n if (event.which === ESCAPE_KEYCODE) {\n $(parent.querySelector(SELECTOR_DATA_TOGGLE)).trigger('focus')\n }\n\n $(this).trigger('click')\n return\n }\n\n const items = [].slice.call(parent.querySelectorAll(SELECTOR_VISIBLE_ITEMS))\n .filter(item => $(item).is(':visible'))\n\n if (items.length === 0) {\n return\n }\n\n let index = items.indexOf(event.target)\n\n if (event.which === ARROW_UP_KEYCODE && index > 0) { // Up\n index--\n }\n\n if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) { // Down\n index++\n }\n\n if (index < 0) {\n index = 0\n }\n\n items[index].focus()\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document)\n .on(EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown._dataApiKeydownHandler)\n .on(EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown._dataApiKeydownHandler)\n .on(`${EVENT_CLICK_DATA_API} ${EVENT_KEYUP_DATA_API}`, Dropdown._clearMenus)\n .on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n event.preventDefault()\n event.stopPropagation()\n Dropdown._jQueryInterface.call($(this), 'toggle')\n })\n .on(EVENT_CLICK_DATA_API, SELECTOR_FORM_CHILD, e => {\n e.stopPropagation()\n })\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Dropdown._jQueryInterface\n$.fn[NAME].Constructor = Dropdown\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Dropdown._jQueryInterface\n}\n\nexport default Dropdown\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.5.3): modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'modal'\nconst VERSION = '4.5.3'\nconst DATA_KEY = 'bs.modal'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst ESCAPE_KEYCODE = 27 // KeyboardEvent.which value for Escape (Esc) key\n\nconst Default = {\n backdrop: true,\n keyboard: true,\n focus: true,\n show: true\n}\n\nconst DefaultType = {\n backdrop: '(boolean|string)',\n keyboard: 'boolean',\n focus: 'boolean',\n show: 'boolean'\n}\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\nconst EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\nconst EVENT_MOUSEUP_DISMISS = `mouseup.dismiss${EVENT_KEY}`\nconst EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SCROLLABLE = 'modal-dialog-scrollable'\nconst CLASS_NAME_SCROLLBAR_MEASURER = 'modal-scrollbar-measure'\nconst CLASS_NAME_BACKDROP = 'modal-backdrop'\nconst CLASS_NAME_OPEN = 'modal-open'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_STATIC = 'modal-static'\n\nconst SELECTOR_DIALOG = '.modal-dialog'\nconst SELECTOR_MODAL_BODY = '.modal-body'\nconst SELECTOR_DATA_TOGGLE = '[data-toggle=\"modal\"]'\nconst SELECTOR_DATA_DISMISS = '[data-dismiss=\"modal\"]'\nconst SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'\nconst SELECTOR_STICKY_CONTENT = '.sticky-top'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Modal {\n constructor(element, config) {\n this._config = this._getConfig(config)\n this._element = element\n this._dialog = element.querySelector(SELECTOR_DIALOG)\n this._backdrop = null\n this._isShown = false\n this._isBodyOverflowing = false\n this._ignoreBackdropClick = false\n this._isTransitioning = false\n this._scrollbarWidth = 0\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return\n }\n\n if ($(this._element).hasClass(CLASS_NAME_FADE)) {\n this._isTransitioning = true\n }\n\n const showEvent = $.Event(EVENT_SHOW, {\n relatedTarget\n })\n\n $(this._element).trigger(showEvent)\n\n if (this._isShown || showEvent.isDefaultPrevented()) {\n return\n }\n\n this._isShown = true\n\n this._checkScrollbar()\n this._setScrollbar()\n\n this._adjustDialog()\n\n this._setEscapeEvent()\n this._setResizeEvent()\n\n $(this._element).on(\n EVENT_CLICK_DISMISS,\n SELECTOR_DATA_DISMISS,\n event => this.hide(event)\n )\n\n $(this._dialog).on(EVENT_MOUSEDOWN_DISMISS, () => {\n $(this._element).one(EVENT_MOUSEUP_DISMISS, event => {\n if ($(event.target).is(this._element)) {\n this._ignoreBackdropClick = true\n }\n })\n })\n\n this._showBackdrop(() => this._showElement(relatedTarget))\n }\n\n hide(event) {\n if (event) {\n event.preventDefault()\n }\n\n if (!this._isShown || this._isTransitioning) {\n return\n }\n\n const hideEvent = $.Event(EVENT_HIDE)\n\n $(this._element).trigger(hideEvent)\n\n if (!this._isShown || hideEvent.isDefaultPrevented()) {\n return\n }\n\n this._isShown = false\n const transition = $(this._element).hasClass(CLASS_NAME_FADE)\n\n if (transition) {\n this._isTransitioning = true\n }\n\n this._setEscapeEvent()\n this._setResizeEvent()\n\n $(document).off(EVENT_FOCUSIN)\n\n $(this._element).removeClass(CLASS_NAME_SHOW)\n\n $(this._element).off(EVENT_CLICK_DISMISS)\n $(this._dialog).off(EVENT_MOUSEDOWN_DISMISS)\n\n if (transition) {\n const transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n $(this._element)\n .one(Util.TRANSITION_END, event => this._hideModal(event))\n .emulateTransitionEnd(transitionDuration)\n } else {\n this._hideModal()\n }\n }\n\n dispose() {\n [window, this._element, this._dialog]\n .forEach(htmlElement => $(htmlElement).off(EVENT_KEY))\n\n /**\n * `document` has 2 events `EVENT_FOCUSIN` and `EVENT_CLICK_DATA_API`\n * Do not move `document` in `htmlElements` array\n * It will remove `EVENT_CLICK_DATA_API` event that should remain\n */\n $(document).off(EVENT_FOCUSIN)\n\n $.removeData(this._element, DATA_KEY)\n\n this._config = null\n this._element = null\n this._dialog = null\n this._backdrop = null\n this._isShown = null\n this._isBodyOverflowing = null\n this._ignoreBackdropClick = null\n this._isTransitioning = null\n this._scrollbarWidth = null\n }\n\n handleUpdate() {\n this._adjustDialog()\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...config\n }\n Util.typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _triggerBackdropTransition() {\n if (this._config.backdrop === 'static') {\n const hideEventPrevented = $.Event(EVENT_HIDE_PREVENTED)\n\n $(this._element).trigger(hideEventPrevented)\n if (hideEventPrevented.isDefaultPrevented()) {\n return\n }\n\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n\n if (!isModalOverflowing) {\n this._element.style.overflowY = 'hidden'\n }\n\n this._element.classList.add(CLASS_NAME_STATIC)\n\n const modalTransitionDuration = Util.getTransitionDurationFromElement(this._dialog)\n $(this._element).off(Util.TRANSITION_END)\n\n $(this._element).one(Util.TRANSITION_END, () => {\n this._element.classList.remove(CLASS_NAME_STATIC)\n if (!isModalOverflowing) {\n $(this._element).one(Util.TRANSITION_END, () => {\n this._element.style.overflowY = ''\n })\n .emulateTransitionEnd(this._element, modalTransitionDuration)\n }\n })\n .emulateTransitionEnd(modalTransitionDuration)\n this._element.focus()\n } else {\n this.hide()\n }\n }\n\n _showElement(relatedTarget) {\n const transition = $(this._element).hasClass(CLASS_NAME_FADE)\n const modalBody = this._dialog ? this._dialog.querySelector(SELECTOR_MODAL_BODY) : null\n\n if (!this._element.parentNode ||\n this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {\n // Don't move modal's DOM position\n document.body.appendChild(this._element)\n }\n\n this._element.style.display = 'block'\n this._element.removeAttribute('aria-hidden')\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n\n if ($(this._dialog).hasClass(CLASS_NAME_SCROLLABLE) && modalBody) {\n modalBody.scrollTop = 0\n } else {\n this._element.scrollTop = 0\n }\n\n if (transition) {\n Util.reflow(this._element)\n }\n\n $(this._element).addClass(CLASS_NAME_SHOW)\n\n if (this._config.focus) {\n this._enforceFocus()\n }\n\n const shownEvent = $.Event(EVENT_SHOWN, {\n relatedTarget\n })\n\n const transitionComplete = () => {\n if (this._config.focus) {\n this._element.focus()\n }\n\n this._isTransitioning = false\n $(this._element).trigger(shownEvent)\n }\n\n if (transition) {\n const transitionDuration = Util.getTransitionDurationFromElement(this._dialog)\n\n $(this._dialog)\n .one(Util.TRANSITION_END, transitionComplete)\n .emulateTransitionEnd(transitionDuration)\n } else {\n transitionComplete()\n }\n }\n\n _enforceFocus() {\n $(document)\n .off(EVENT_FOCUSIN) // Guard against infinite focus loop\n .on(EVENT_FOCUSIN, event => {\n if (document !== event.target &&\n this._element !== event.target &&\n $(this._element).has(event.target).length === 0) {\n this._element.focus()\n }\n })\n }\n\n _setEscapeEvent() {\n if (this._isShown) {\n $(this._element).on(EVENT_KEYDOWN_DISMISS, event => {\n if (this._config.keyboard && event.which === ESCAPE_KEYCODE) {\n event.preventDefault()\n this.hide()\n } else if (!this._config.keyboard && event.which === ESCAPE_KEYCODE) {\n this._triggerBackdropTransition()\n }\n })\n } else if (!this._isShown) {\n $(this._element).off(EVENT_KEYDOWN_DISMISS)\n }\n }\n\n _setResizeEvent() {\n if (this._isShown) {\n $(window).on(EVENT_RESIZE, event => this.handleUpdate(event))\n } else {\n $(window).off(EVENT_RESIZE)\n }\n }\n\n _hideModal() {\n this._element.style.display = 'none'\n this._element.setAttribute('aria-hidden', true)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n this._isTransitioning = false\n this._showBackdrop(() => {\n $(document.body).removeClass(CLASS_NAME_OPEN)\n this._resetAdjustments()\n this._resetScrollbar()\n $(this._element).trigger(EVENT_HIDDEN)\n })\n }\n\n _removeBackdrop() {\n if (this._backdrop) {\n $(this._backdrop).remove()\n this._backdrop = null\n }\n }\n\n _showBackdrop(callback) {\n const animate = $(this._element).hasClass(CLASS_NAME_FADE) ?\n CLASS_NAME_FADE : ''\n\n if (this._isShown && this._config.backdrop) {\n this._backdrop = document.createElement('div')\n this._backdrop.className = CLASS_NAME_BACKDROP\n\n if (animate) {\n this._backdrop.classList.add(animate)\n }\n\n $(this._backdrop).appendTo(document.body)\n\n $(this._element).on(EVENT_CLICK_DISMISS, event => {\n if (this._ignoreBackdropClick) {\n this._ignoreBackdropClick = false\n return\n }\n\n if (event.target !== event.currentTarget) {\n return\n }\n\n this._triggerBackdropTransition()\n })\n\n if (animate) {\n Util.reflow(this._backdrop)\n }\n\n $(this._backdrop).addClass(CLASS_NAME_SHOW)\n\n if (!callback) {\n return\n }\n\n if (!animate) {\n callback()\n return\n }\n\n const backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop)\n\n $(this._backdrop)\n .one(Util.TRANSITION_END, callback)\n .emulateTransitionEnd(backdropTransitionDuration)\n } else if (!this._isShown && this._backdrop) {\n $(this._backdrop).removeClass(CLASS_NAME_SHOW)\n\n const callbackRemove = () => {\n this._removeBackdrop()\n if (callback) {\n callback()\n }\n }\n\n if ($(this._element).hasClass(CLASS_NAME_FADE)) {\n const backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop)\n\n $(this._backdrop)\n .one(Util.TRANSITION_END, callbackRemove)\n .emulateTransitionEnd(backdropTransitionDuration)\n } else {\n callbackRemove()\n }\n } else if (callback) {\n callback()\n }\n }\n\n // ----------------------------------------------------------------------\n // the following methods are used to handle overflowing modals\n // todo (fat): these should probably be refactored out of modal.js\n // ----------------------------------------------------------------------\n\n _adjustDialog() {\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n\n if (!this._isBodyOverflowing && isModalOverflowing) {\n this._element.style.paddingLeft = `${this._scrollbarWidth}px`\n }\n\n if (this._isBodyOverflowing && !isModalOverflowing) {\n this._element.style.paddingRight = `${this._scrollbarWidth}px`\n }\n }\n\n _resetAdjustments() {\n this._element.style.paddingLeft = ''\n this._element.style.paddingRight = ''\n }\n\n _checkScrollbar() {\n const rect = document.body.getBoundingClientRect()\n this._isBodyOverflowing = Math.round(rect.left + rect.right) < window.innerWidth\n this._scrollbarWidth = this._getScrollbarWidth()\n }\n\n _setScrollbar() {\n if (this._isBodyOverflowing) {\n // Note: DOMNode.style.paddingRight returns the actual value or '' if not set\n // while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set\n const fixedContent = [].slice.call(document.querySelectorAll(SELECTOR_FIXED_CONTENT))\n const stickyContent = [].slice.call(document.querySelectorAll(SELECTOR_STICKY_CONTENT))\n\n // Adjust fixed content padding\n $(fixedContent).each((index, element) => {\n const actualPadding = element.style.paddingRight\n const calculatedPadding = $(element).css('padding-right')\n $(element)\n .data('padding-right', actualPadding)\n .css('padding-right', `${parseFloat(calculatedPadding) + this._scrollbarWidth}px`)\n })\n\n // Adjust sticky content margin\n $(stickyContent).each((index, element) => {\n const actualMargin = element.style.marginRight\n const calculatedMargin = $(element).css('margin-right')\n $(element)\n .data('margin-right', actualMargin)\n .css('margin-right', `${parseFloat(calculatedMargin) - this._scrollbarWidth}px`)\n })\n\n // Adjust body padding\n const actualPadding = document.body.style.paddingRight\n const calculatedPadding = $(document.body).css('padding-right')\n $(document.body)\n .data('padding-right', actualPadding)\n .css('padding-right', `${parseFloat(calculatedPadding) + this._scrollbarWidth}px`)\n }\n\n $(document.body).addClass(CLASS_NAME_OPEN)\n }\n\n _resetScrollbar() {\n // Restore fixed content padding\n const fixedContent = [].slice.call(document.querySelectorAll(SELECTOR_FIXED_CONTENT))\n $(fixedContent).each((index, element) => {\n const padding = $(element).data('padding-right')\n $(element).removeData('padding-right')\n element.style.paddingRight = padding ? padding : ''\n })\n\n // Restore sticky content\n const elements = [].slice.call(document.querySelectorAll(`${SELECTOR_STICKY_CONTENT}`))\n $(elements).each((index, element) => {\n const margin = $(element).data('margin-right')\n if (typeof margin !== 'undefined') {\n $(element).css('margin-right', margin).removeData('margin-right')\n }\n })\n\n // Restore body padding\n const padding = $(document.body).data('padding-right')\n $(document.body).removeData('padding-right')\n document.body.style.paddingRight = padding ? padding : ''\n }\n\n _getScrollbarWidth() { // thx d.walsh\n const scrollDiv = document.createElement('div')\n scrollDiv.className = CLASS_NAME_SCROLLBAR_MEASURER\n document.body.appendChild(scrollDiv)\n const scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth\n document.body.removeChild(scrollDiv)\n return scrollbarWidth\n }\n\n // Static\n\n static _jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = {\n ...Default,\n ...$(this).data(),\n ...(typeof config === 'object' && config ? config : {})\n }\n\n if (!data) {\n data = new Modal(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](relatedTarget)\n } else if (_config.show) {\n data.show(relatedTarget)\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document).on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n let target\n const selector = Util.getSelectorFromElement(this)\n\n if (selector) {\n target = document.querySelector(selector)\n }\n\n const config = $(target).data(DATA_KEY) ?\n 'toggle' : {\n ...$(target).data(),\n ...$(this).data()\n }\n\n if (this.tagName === 'A' || this.tagName === 'AREA') {\n event.preventDefault()\n }\n\n const $target = $(target).one(EVENT_SHOW, showEvent => {\n if (showEvent.isDefaultPrevented()) {\n // Only register focus restorer if modal will actually get shown\n return\n }\n\n $target.one(EVENT_HIDDEN, () => {\n if ($(this).is(':visible')) {\n this.focus()\n }\n })\n })\n\n Modal._jQueryInterface.call($(target), config, this)\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Modal._jQueryInterface\n$.fn[NAME].Constructor = Modal\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Modal._jQueryInterface\n}\n\nexport default Modal\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.5.3): tools/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst uriAttrs = [\n 'background',\n 'cite',\n 'href',\n 'itemtype',\n 'longdesc',\n 'poster',\n 'src',\n 'xlink:href'\n]\n\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i\n\nexport const DefaultWhitelist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n div: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n}\n\n/**\n * A pattern that recognizes a commonly useful subset of URLs that are safe.\n *\n * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n */\nconst SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^#&/:?]*(?:[#/?]|$))/gi\n\n/**\n * A pattern that matches safe data URLs. Only matches image, video and audio types.\n *\n * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n */\nconst DATA_URL_PATTERN = /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[\\d+/a-z]+=*$/i\n\nfunction allowedAttribute(attr, allowedAttributeList) {\n const attrName = attr.nodeName.toLowerCase()\n\n if (allowedAttributeList.indexOf(attrName) !== -1) {\n if (uriAttrs.indexOf(attrName) !== -1) {\n return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN))\n }\n\n return true\n }\n\n const regExp = allowedAttributeList.filter(attrRegex => attrRegex instanceof RegExp)\n\n // Check if a regular expression validates the attribute.\n for (let i = 0, len = regExp.length; i < len; i++) {\n if (attrName.match(regExp[i])) {\n return true\n }\n }\n\n return false\n}\n\nexport function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {\n if (unsafeHtml.length === 0) {\n return unsafeHtml\n }\n\n if (sanitizeFn && typeof sanitizeFn === 'function') {\n return sanitizeFn(unsafeHtml)\n }\n\n const domParser = new window.DOMParser()\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html')\n const whitelistKeys = Object.keys(whiteList)\n const elements = [].slice.call(createdDocument.body.querySelectorAll('*'))\n\n for (let i = 0, len = elements.length; i < len; i++) {\n const el = elements[i]\n const elName = el.nodeName.toLowerCase()\n\n if (whitelistKeys.indexOf(el.nodeName.toLowerCase()) === -1) {\n el.parentNode.removeChild(el)\n\n continue\n }\n\n const attributeList = [].slice.call(el.attributes)\n const whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || [])\n\n attributeList.forEach(attr => {\n if (!allowedAttribute(attr, whitelistedAttributes)) {\n el.removeAttribute(attr.nodeName)\n }\n })\n }\n\n return createdDocument.body.innerHTML\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.5.3): tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n DefaultWhitelist,\n sanitizeHtml\n} from './tools/sanitizer'\nimport $ from 'jquery'\nimport Popper from 'popper.js'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'tooltip'\nconst VERSION = '4.5.3'\nconst DATA_KEY = 'bs.tooltip'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst CLASS_PREFIX = 'bs-tooltip'\nconst BSCLS_PREFIX_REGEX = new RegExp(`(^|\\\\s)${CLASS_PREFIX}\\\\S+`, 'g')\nconst DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn']\n\nconst DefaultType = {\n animation: 'boolean',\n template: 'string',\n title: '(string|element|function)',\n trigger: 'string',\n delay: '(number|object)',\n html: 'boolean',\n selector: '(string|boolean)',\n placement: '(string|function)',\n offset: '(number|string|function)',\n container: '(string|element|boolean)',\n fallbackPlacement: '(string|array)',\n boundary: '(string|element)',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n whiteList: 'object',\n popperConfig: '(null|object)'\n}\n\nconst AttachmentMap = {\n AUTO: 'auto',\n TOP: 'top',\n RIGHT: 'right',\n BOTTOM: 'bottom',\n LEFT: 'left'\n}\n\nconst Default = {\n animation: true,\n template: '
' +\n '
' +\n '
',\n trigger: 'hover focus',\n title: '',\n delay: 0,\n html: false,\n selector: false,\n placement: 'top',\n offset: 0,\n container: false,\n fallbackPlacement: 'flip',\n boundary: 'scrollParent',\n sanitize: true,\n sanitizeFn: null,\n whiteList: DefaultWhitelist,\n popperConfig: null\n}\n\nconst HOVER_STATE_SHOW = 'show'\nconst HOVER_STATE_OUT = 'out'\n\nconst Event = {\n HIDE: `hide${EVENT_KEY}`,\n HIDDEN: `hidden${EVENT_KEY}`,\n SHOW: `show${EVENT_KEY}`,\n SHOWN: `shown${EVENT_KEY}`,\n INSERTED: `inserted${EVENT_KEY}`,\n CLICK: `click${EVENT_KEY}`,\n FOCUSIN: `focusin${EVENT_KEY}`,\n FOCUSOUT: `focusout${EVENT_KEY}`,\n MOUSEENTER: `mouseenter${EVENT_KEY}`,\n MOUSELEAVE: `mouseleave${EVENT_KEY}`\n}\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\nconst SELECTOR_TOOLTIP_INNER = '.tooltip-inner'\nconst SELECTOR_ARROW = '.arrow'\n\nconst TRIGGER_HOVER = 'hover'\nconst TRIGGER_FOCUS = 'focus'\nconst TRIGGER_CLICK = 'click'\nconst TRIGGER_MANUAL = 'manual'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Tooltip {\n constructor(element, config) {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s tooltips require Popper.js (https://popper.js.org/)')\n }\n\n // private\n this._isEnabled = true\n this._timeout = 0\n this._hoverState = ''\n this._activeTrigger = {}\n this._popper = null\n\n // Protected\n this.element = element\n this.config = this._getConfig(config)\n this.tip = null\n\n this._setListeners()\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n static get DATA_KEY() {\n return DATA_KEY\n }\n\n static get Event() {\n return Event\n }\n\n static get EVENT_KEY() {\n return EVENT_KEY\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n // Public\n\n enable() {\n this._isEnabled = true\n }\n\n disable() {\n this._isEnabled = false\n }\n\n toggleEnabled() {\n this._isEnabled = !this._isEnabled\n }\n\n toggle(event) {\n if (!this._isEnabled) {\n return\n }\n\n if (event) {\n const dataKey = this.constructor.DATA_KEY\n let context = $(event.currentTarget).data(dataKey)\n\n if (!context) {\n context = new this.constructor(\n event.currentTarget,\n this._getDelegateConfig()\n )\n $(event.currentTarget).data(dataKey, context)\n }\n\n context._activeTrigger.click = !context._activeTrigger.click\n\n if (context._isWithActiveTrigger()) {\n context._enter(null, context)\n } else {\n context._leave(null, context)\n }\n } else {\n if ($(this.getTipElement()).hasClass(CLASS_NAME_SHOW)) {\n this._leave(null, this)\n return\n }\n\n this._enter(null, this)\n }\n }\n\n dispose() {\n clearTimeout(this._timeout)\n\n $.removeData(this.element, this.constructor.DATA_KEY)\n\n $(this.element).off(this.constructor.EVENT_KEY)\n $(this.element).closest('.modal').off('hide.bs.modal', this._hideModalHandler)\n\n if (this.tip) {\n $(this.tip).remove()\n }\n\n this._isEnabled = null\n this._timeout = null\n this._hoverState = null\n this._activeTrigger = null\n if (this._popper) {\n this._popper.destroy()\n }\n\n this._popper = null\n this.element = null\n this.config = null\n this.tip = null\n }\n\n show() {\n if ($(this.element).css('display') === 'none') {\n throw new Error('Please use show on visible elements')\n }\n\n const showEvent = $.Event(this.constructor.Event.SHOW)\n if (this.isWithContent() && this._isEnabled) {\n $(this.element).trigger(showEvent)\n\n const shadowRoot = Util.findShadowRoot(this.element)\n const isInTheDom = $.contains(\n shadowRoot !== null ? shadowRoot : this.element.ownerDocument.documentElement,\n this.element\n )\n\n if (showEvent.isDefaultPrevented() || !isInTheDom) {\n return\n }\n\n const tip = this.getTipElement()\n const tipId = Util.getUID(this.constructor.NAME)\n\n tip.setAttribute('id', tipId)\n this.element.setAttribute('aria-describedby', tipId)\n\n this.setContent()\n\n if (this.config.animation) {\n $(tip).addClass(CLASS_NAME_FADE)\n }\n\n const placement = typeof this.config.placement === 'function' ?\n this.config.placement.call(this, tip, this.element) :\n this.config.placement\n\n const attachment = this._getAttachment(placement)\n this.addAttachmentClass(attachment)\n\n const container = this._getContainer()\n $(tip).data(this.constructor.DATA_KEY, this)\n\n if (!$.contains(this.element.ownerDocument.documentElement, this.tip)) {\n $(tip).appendTo(container)\n }\n\n $(this.element).trigger(this.constructor.Event.INSERTED)\n\n this._popper = new Popper(this.element, tip, this._getPopperConfig(attachment))\n\n $(tip).addClass(CLASS_NAME_SHOW)\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement) {\n $(document.body).children().on('mouseover', null, $.noop)\n }\n\n const complete = () => {\n if (this.config.animation) {\n this._fixTransition()\n }\n\n const prevHoverState = this._hoverState\n this._hoverState = null\n\n $(this.element).trigger(this.constructor.Event.SHOWN)\n\n if (prevHoverState === HOVER_STATE_OUT) {\n this._leave(null, this)\n }\n }\n\n if ($(this.tip).hasClass(CLASS_NAME_FADE)) {\n const transitionDuration = Util.getTransitionDurationFromElement(this.tip)\n\n $(this.tip)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n } else {\n complete()\n }\n }\n }\n\n hide(callback) {\n const tip = this.getTipElement()\n const hideEvent = $.Event(this.constructor.Event.HIDE)\n const complete = () => {\n if (this._hoverState !== HOVER_STATE_SHOW && tip.parentNode) {\n tip.parentNode.removeChild(tip)\n }\n\n this._cleanTipClass()\n this.element.removeAttribute('aria-describedby')\n $(this.element).trigger(this.constructor.Event.HIDDEN)\n if (this._popper !== null) {\n this._popper.destroy()\n }\n\n if (callback) {\n callback()\n }\n }\n\n $(this.element).trigger(hideEvent)\n\n if (hideEvent.isDefaultPrevented()) {\n return\n }\n\n $(tip).removeClass(CLASS_NAME_SHOW)\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n $(document.body).children().off('mouseover', null, $.noop)\n }\n\n this._activeTrigger[TRIGGER_CLICK] = false\n this._activeTrigger[TRIGGER_FOCUS] = false\n this._activeTrigger[TRIGGER_HOVER] = false\n\n if ($(this.tip).hasClass(CLASS_NAME_FADE)) {\n const transitionDuration = Util.getTransitionDurationFromElement(tip)\n\n $(tip)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n } else {\n complete()\n }\n\n this._hoverState = ''\n }\n\n update() {\n if (this._popper !== null) {\n this._popper.scheduleUpdate()\n }\n }\n\n // Protected\n\n isWithContent() {\n return Boolean(this.getTitle())\n }\n\n addAttachmentClass(attachment) {\n $(this.getTipElement()).addClass(`${CLASS_PREFIX}-${attachment}`)\n }\n\n getTipElement() {\n this.tip = this.tip || $(this.config.template)[0]\n return this.tip\n }\n\n setContent() {\n const tip = this.getTipElement()\n this.setElementContent($(tip.querySelectorAll(SELECTOR_TOOLTIP_INNER)), this.getTitle())\n $(tip).removeClass(`${CLASS_NAME_FADE} ${CLASS_NAME_SHOW}`)\n }\n\n setElementContent($element, content) {\n if (typeof content === 'object' && (content.nodeType || content.jquery)) {\n // Content is a DOM node or a jQuery\n if (this.config.html) {\n if (!$(content).parent().is($element)) {\n $element.empty().append(content)\n }\n } else {\n $element.text($(content).text())\n }\n\n return\n }\n\n if (this.config.html) {\n if (this.config.sanitize) {\n content = sanitizeHtml(content, this.config.whiteList, this.config.sanitizeFn)\n }\n\n $element.html(content)\n } else {\n $element.text(content)\n }\n }\n\n getTitle() {\n let title = this.element.getAttribute('data-original-title')\n\n if (!title) {\n title = typeof this.config.title === 'function' ?\n this.config.title.call(this.element) :\n this.config.title\n }\n\n return title\n }\n\n // Private\n\n _getPopperConfig(attachment) {\n const defaultBsConfig = {\n placement: attachment,\n modifiers: {\n offset: this._getOffset(),\n flip: {\n behavior: this.config.fallbackPlacement\n },\n arrow: {\n element: SELECTOR_ARROW\n },\n preventOverflow: {\n boundariesElement: this.config.boundary\n }\n },\n onCreate: data => {\n if (data.originalPlacement !== data.placement) {\n this._handlePopperPlacementChange(data)\n }\n },\n onUpdate: data => this._handlePopperPlacementChange(data)\n }\n\n return {\n ...defaultBsConfig,\n ...this.config.popperConfig\n }\n }\n\n _getOffset() {\n const offset = {}\n\n if (typeof this.config.offset === 'function') {\n offset.fn = data => {\n data.offsets = {\n ...data.offsets,\n ...(this.config.offset(data.offsets, this.element) || {})\n }\n\n return data\n }\n } else {\n offset.offset = this.config.offset\n }\n\n return offset\n }\n\n _getContainer() {\n if (this.config.container === false) {\n return document.body\n }\n\n if (Util.isElement(this.config.container)) {\n return $(this.config.container)\n }\n\n return $(document).find(this.config.container)\n }\n\n _getAttachment(placement) {\n return AttachmentMap[placement.toUpperCase()]\n }\n\n _setListeners() {\n const triggers = this.config.trigger.split(' ')\n\n triggers.forEach(trigger => {\n if (trigger === 'click') {\n $(this.element).on(\n this.constructor.Event.CLICK,\n this.config.selector,\n event => this.toggle(event)\n )\n } else if (trigger !== TRIGGER_MANUAL) {\n const eventIn = trigger === TRIGGER_HOVER ?\n this.constructor.Event.MOUSEENTER :\n this.constructor.Event.FOCUSIN\n const eventOut = trigger === TRIGGER_HOVER ?\n this.constructor.Event.MOUSELEAVE :\n this.constructor.Event.FOCUSOUT\n\n $(this.element)\n .on(eventIn, this.config.selector, event => this._enter(event))\n .on(eventOut, this.config.selector, event => this._leave(event))\n }\n })\n\n this._hideModalHandler = () => {\n if (this.element) {\n this.hide()\n }\n }\n\n $(this.element).closest('.modal').on('hide.bs.modal', this._hideModalHandler)\n\n if (this.config.selector) {\n this.config = {\n ...this.config,\n trigger: 'manual',\n selector: ''\n }\n } else {\n this._fixTitle()\n }\n }\n\n _fixTitle() {\n const titleType = typeof this.element.getAttribute('data-original-title')\n\n if (this.element.getAttribute('title') || titleType !== 'string') {\n this.element.setAttribute(\n 'data-original-title',\n this.element.getAttribute('title') || ''\n )\n\n this.element.setAttribute('title', '')\n }\n }\n\n _enter(event, context) {\n const dataKey = this.constructor.DATA_KEY\n context = context || $(event.currentTarget).data(dataKey)\n\n if (!context) {\n context = new this.constructor(\n event.currentTarget,\n this._getDelegateConfig()\n )\n $(event.currentTarget).data(dataKey, context)\n }\n\n if (event) {\n context._activeTrigger[\n event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER\n ] = true\n }\n\n if ($(context.getTipElement()).hasClass(CLASS_NAME_SHOW) || context._hoverState === HOVER_STATE_SHOW) {\n context._hoverState = HOVER_STATE_SHOW\n return\n }\n\n clearTimeout(context._timeout)\n\n context._hoverState = HOVER_STATE_SHOW\n\n if (!context.config.delay || !context.config.delay.show) {\n context.show()\n return\n }\n\n context._timeout = setTimeout(() => {\n if (context._hoverState === HOVER_STATE_SHOW) {\n context.show()\n }\n }, context.config.delay.show)\n }\n\n _leave(event, context) {\n const dataKey = this.constructor.DATA_KEY\n context = context || $(event.currentTarget).data(dataKey)\n\n if (!context) {\n context = new this.constructor(\n event.currentTarget,\n this._getDelegateConfig()\n )\n $(event.currentTarget).data(dataKey, context)\n }\n\n if (event) {\n context._activeTrigger[\n event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER\n ] = false\n }\n\n if (context._isWithActiveTrigger()) {\n return\n }\n\n clearTimeout(context._timeout)\n\n context._hoverState = HOVER_STATE_OUT\n\n if (!context.config.delay || !context.config.delay.hide) {\n context.hide()\n return\n }\n\n context._timeout = setTimeout(() => {\n if (context._hoverState === HOVER_STATE_OUT) {\n context.hide()\n }\n }, context.config.delay.hide)\n }\n\n _isWithActiveTrigger() {\n for (const trigger in this._activeTrigger) {\n if (this._activeTrigger[trigger]) {\n return true\n }\n }\n\n return false\n }\n\n _getConfig(config) {\n const dataAttributes = $(this.element).data()\n\n Object.keys(dataAttributes)\n .forEach(dataAttr => {\n if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) {\n delete dataAttributes[dataAttr]\n }\n })\n\n config = {\n ...this.constructor.Default,\n ...dataAttributes,\n ...(typeof config === 'object' && config ? config : {})\n }\n\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n }\n }\n\n if (typeof config.title === 'number') {\n config.title = config.title.toString()\n }\n\n if (typeof config.content === 'number') {\n config.content = config.content.toString()\n }\n\n Util.typeCheckConfig(\n NAME,\n config,\n this.constructor.DefaultType\n )\n\n if (config.sanitize) {\n config.template = sanitizeHtml(config.template, config.whiteList, config.sanitizeFn)\n }\n\n return config\n }\n\n _getDelegateConfig() {\n const config = {}\n\n if (this.config) {\n for (const key in this.config) {\n if (this.constructor.Default[key] !== this.config[key]) {\n config[key] = this.config[key]\n }\n }\n }\n\n return config\n }\n\n _cleanTipClass() {\n const $tip = $(this.getTipElement())\n const tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX)\n if (tabClass !== null && tabClass.length) {\n $tip.removeClass(tabClass.join(''))\n }\n }\n\n _handlePopperPlacementChange(popperData) {\n this.tip = popperData.instance.popper\n this._cleanTipClass()\n this.addAttachmentClass(this._getAttachment(popperData.placement))\n }\n\n _fixTransition() {\n const tip = this.getTipElement()\n const initConfigAnimation = this.config.animation\n\n if (tip.getAttribute('x-placement') !== null) {\n return\n }\n\n $(tip).removeClass(CLASS_NAME_FADE)\n this.config.animation = false\n this.hide()\n this.show()\n this.config.animation = initConfigAnimation\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n const $element = $(this)\n let data = $element.data(DATA_KEY)\n const _config = typeof config === 'object' && config\n\n if (!data && /dispose|hide/.test(config)) {\n return\n }\n\n if (!data) {\n data = new Tooltip(this, _config)\n $element.data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Tooltip._jQueryInterface\n$.fn[NAME].Constructor = Tooltip\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Tooltip._jQueryInterface\n}\n\nexport default Tooltip\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.5.3): popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Tooltip from './tooltip'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'popover'\nconst VERSION = '4.5.3'\nconst DATA_KEY = 'bs.popover'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst CLASS_PREFIX = 'bs-popover'\nconst BSCLS_PREFIX_REGEX = new RegExp(`(^|\\\\s)${CLASS_PREFIX}\\\\S+`, 'g')\n\nconst Default = {\n ...Tooltip.Default,\n placement: 'right',\n trigger: 'click',\n content: '',\n template: '
' +\n '
' +\n '

' +\n '
'\n}\n\nconst DefaultType = {\n ...Tooltip.DefaultType,\n content: '(string|element|function)'\n}\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\nconst SELECTOR_TITLE = '.popover-header'\nconst SELECTOR_CONTENT = '.popover-body'\n\nconst Event = {\n HIDE: `hide${EVENT_KEY}`,\n HIDDEN: `hidden${EVENT_KEY}`,\n SHOW: `show${EVENT_KEY}`,\n SHOWN: `shown${EVENT_KEY}`,\n INSERTED: `inserted${EVENT_KEY}`,\n CLICK: `click${EVENT_KEY}`,\n FOCUSIN: `focusin${EVENT_KEY}`,\n FOCUSOUT: `focusout${EVENT_KEY}`,\n MOUSEENTER: `mouseenter${EVENT_KEY}`,\n MOUSELEAVE: `mouseleave${EVENT_KEY}`\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Popover extends Tooltip {\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n static get DATA_KEY() {\n return DATA_KEY\n }\n\n static get Event() {\n return Event\n }\n\n static get EVENT_KEY() {\n return EVENT_KEY\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n // Overrides\n\n isWithContent() {\n return this.getTitle() || this._getContent()\n }\n\n addAttachmentClass(attachment) {\n $(this.getTipElement()).addClass(`${CLASS_PREFIX}-${attachment}`)\n }\n\n getTipElement() {\n this.tip = this.tip || $(this.config.template)[0]\n return this.tip\n }\n\n setContent() {\n const $tip = $(this.getTipElement())\n\n // We use append for html objects to maintain js events\n this.setElementContent($tip.find(SELECTOR_TITLE), this.getTitle())\n let content = this._getContent()\n if (typeof content === 'function') {\n content = content.call(this.element)\n }\n\n this.setElementContent($tip.find(SELECTOR_CONTENT), content)\n\n $tip.removeClass(`${CLASS_NAME_FADE} ${CLASS_NAME_SHOW}`)\n }\n\n // Private\n\n _getContent() {\n return this.element.getAttribute('data-content') ||\n this.config.content\n }\n\n _cleanTipClass() {\n const $tip = $(this.getTipElement())\n const tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX)\n if (tabClass !== null && tabClass.length > 0) {\n $tip.removeClass(tabClass.join(''))\n }\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = typeof config === 'object' ? config : null\n\n if (!data && /dispose|hide/.test(config)) {\n return\n }\n\n if (!data) {\n data = new Popover(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Popover._jQueryInterface\n$.fn[NAME].Constructor = Popover\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Popover._jQueryInterface\n}\n\nexport default Popover\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.5.3): scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'scrollspy'\nconst VERSION = '4.5.3'\nconst DATA_KEY = 'bs.scrollspy'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst Default = {\n offset: 10,\n method: 'auto',\n target: ''\n}\n\nconst DefaultType = {\n offset: 'number',\n method: 'string',\n target: '(string|element)'\n}\n\nconst EVENT_ACTIVATE = `activate${EVENT_KEY}`\nconst EVENT_SCROLL = `scroll${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'\nconst CLASS_NAME_ACTIVE = 'active'\n\nconst SELECTOR_DATA_SPY = '[data-spy=\"scroll\"]'\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'\nconst SELECTOR_NAV_LINKS = '.nav-link'\nconst SELECTOR_NAV_ITEMS = '.nav-item'\nconst SELECTOR_LIST_ITEMS = '.list-group-item'\nconst SELECTOR_DROPDOWN = '.dropdown'\nconst SELECTOR_DROPDOWN_ITEMS = '.dropdown-item'\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\n\nconst METHOD_OFFSET = 'offset'\nconst METHOD_POSITION = 'position'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass ScrollSpy {\n constructor(element, config) {\n this._element = element\n this._scrollElement = element.tagName === 'BODY' ? window : element\n this._config = this._getConfig(config)\n this._selector = `${this._config.target} ${SELECTOR_NAV_LINKS},` +\n `${this._config.target} ${SELECTOR_LIST_ITEMS},` +\n `${this._config.target} ${SELECTOR_DROPDOWN_ITEMS}`\n this._offsets = []\n this._targets = []\n this._activeTarget = null\n this._scrollHeight = 0\n\n $(this._scrollElement).on(EVENT_SCROLL, event => this._process(event))\n\n this.refresh()\n this._process()\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n refresh() {\n const autoMethod = this._scrollElement === this._scrollElement.window ?\n METHOD_OFFSET : METHOD_POSITION\n\n const offsetMethod = this._config.method === 'auto' ?\n autoMethod : this._config.method\n\n const offsetBase = offsetMethod === METHOD_POSITION ?\n this._getScrollTop() : 0\n\n this._offsets = []\n this._targets = []\n\n this._scrollHeight = this._getScrollHeight()\n\n const targets = [].slice.call(document.querySelectorAll(this._selector))\n\n targets\n .map(element => {\n let target\n const targetSelector = Util.getSelectorFromElement(element)\n\n if (targetSelector) {\n target = document.querySelector(targetSelector)\n }\n\n if (target) {\n const targetBCR = target.getBoundingClientRect()\n if (targetBCR.width || targetBCR.height) {\n // TODO (fat): remove sketch reliance on jQuery position/offset\n return [\n $(target)[offsetMethod]().top + offsetBase,\n targetSelector\n ]\n }\n }\n\n return null\n })\n .filter(item => item)\n .sort((a, b) => a[0] - b[0])\n .forEach(item => {\n this._offsets.push(item[0])\n this._targets.push(item[1])\n })\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n $(this._scrollElement).off(EVENT_KEY)\n\n this._element = null\n this._scrollElement = null\n this._config = null\n this._selector = null\n this._offsets = null\n this._targets = null\n this._activeTarget = null\n this._scrollHeight = null\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...(typeof config === 'object' && config ? config : {})\n }\n\n if (typeof config.target !== 'string' && Util.isElement(config.target)) {\n let id = $(config.target).attr('id')\n if (!id) {\n id = Util.getUID(NAME)\n $(config.target).attr('id', id)\n }\n\n config.target = `#${id}`\n }\n\n Util.typeCheckConfig(NAME, config, DefaultType)\n\n return config\n }\n\n _getScrollTop() {\n return this._scrollElement === window ?\n this._scrollElement.pageYOffset : this._scrollElement.scrollTop\n }\n\n _getScrollHeight() {\n return this._scrollElement.scrollHeight || Math.max(\n document.body.scrollHeight,\n document.documentElement.scrollHeight\n )\n }\n\n _getOffsetHeight() {\n return this._scrollElement === window ?\n window.innerHeight : this._scrollElement.getBoundingClientRect().height\n }\n\n _process() {\n const scrollTop = this._getScrollTop() + this._config.offset\n const scrollHeight = this._getScrollHeight()\n const maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight()\n\n if (this._scrollHeight !== scrollHeight) {\n this.refresh()\n }\n\n if (scrollTop >= maxScroll) {\n const target = this._targets[this._targets.length - 1]\n\n if (this._activeTarget !== target) {\n this._activate(target)\n }\n\n return\n }\n\n if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\n this._activeTarget = null\n this._clear()\n return\n }\n\n for (let i = this._offsets.length; i--;) {\n const isActiveTarget = this._activeTarget !== this._targets[i] &&\n scrollTop >= this._offsets[i] &&\n (typeof this._offsets[i + 1] === 'undefined' ||\n scrollTop < this._offsets[i + 1])\n\n if (isActiveTarget) {\n this._activate(this._targets[i])\n }\n }\n }\n\n _activate(target) {\n this._activeTarget = target\n\n this._clear()\n\n const queries = this._selector\n .split(',')\n .map(selector => `${selector}[data-target=\"${target}\"],${selector}[href=\"${target}\"]`)\n\n const $link = $([].slice.call(document.querySelectorAll(queries.join(','))))\n\n if ($link.hasClass(CLASS_NAME_DROPDOWN_ITEM)) {\n $link.closest(SELECTOR_DROPDOWN)\n .find(SELECTOR_DROPDOWN_TOGGLE)\n .addClass(CLASS_NAME_ACTIVE)\n $link.addClass(CLASS_NAME_ACTIVE)\n } else {\n // Set triggered link as active\n $link.addClass(CLASS_NAME_ACTIVE)\n // Set triggered links parents as active\n // With both
',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",sanitize:!0,sanitizeFn:null,whiteList:Q,popperConfig:null},$={HIDE:"hide.bs.tooltip",HIDDEN:"hidden.bs.tooltip",SHOW:"show.bs.tooltip",SHOWN:"shown.bs.tooltip",INSERTED:"inserted.bs.tooltip",CLICK:"click.bs.tooltip",FOCUSIN:"focusin.bs.tooltip",FOCUSOUT:"focusout.bs.tooltip",MOUSEENTER:"mouseenter.bs.tooltip",MOUSELEAVE:"mouseleave.bs.tooltip"},J=function(){function t(t,e){if("undefined"==typeof a.default)throw new TypeError("Bootstrap's tooltips require Popper.js (https://popper.js.org/)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var e=t.prototype;return e.enable=function(){this._isEnabled=!0},e.disable=function(){this._isEnabled=!1},e.toggleEnabled=function(){this._isEnabled=!this._isEnabled},e.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=o.default(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),o.default(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(o.default(this.getTipElement()).hasClass("show"))return void this._leave(null,this);this._enter(null,this)}},e.dispose=function(){clearTimeout(this._timeout),o.default.removeData(this.element,this.constructor.DATA_KEY),o.default(this.element).off(this.constructor.EVENT_KEY),o.default(this.element).closest(".modal").off("hide.bs.modal",this._hideModalHandler),this.tip&&o.default(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},e.show=function(){var t=this;if("none"===o.default(this.element).css("display"))throw new Error("Please use show on visible elements");var e=o.default.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){o.default(this.element).trigger(e);var n=d.findShadowRoot(this.element),i=o.default.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(e.isDefaultPrevented()||!i)return;var s=this.getTipElement(),l=d.getUID(this.constructor.NAME);s.setAttribute("id",l),this.element.setAttribute("aria-describedby",l),this.setContent(),this.config.animation&&o.default(s).addClass("fade");var r="function"==typeof this.config.placement?this.config.placement.call(this,s,this.element):this.config.placement,u=this._getAttachment(r);this.addAttachmentClass(u);var f=this._getContainer();o.default(s).data(this.constructor.DATA_KEY,this),o.default.contains(this.element.ownerDocument.documentElement,this.tip)||o.default(s).appendTo(f),o.default(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new a.default(this.element,s,this._getPopperConfig(u)),o.default(s).addClass("show"),"ontouchstart"in document.documentElement&&o.default(document.body).children().on("mouseover",null,o.default.noop);var c=function(){t.config.animation&&t._fixTransition();var e=t._hoverState;t._hoverState=null,o.default(t.element).trigger(t.constructor.Event.SHOWN),"out"===e&&t._leave(null,t)};if(o.default(this.tip).hasClass("fade")){var h=d.getTransitionDurationFromElement(this.tip);o.default(this.tip).one(d.TRANSITION_END,c).emulateTransitionEnd(h)}else c()}},e.hide=function(t){var e=this,n=this.getTipElement(),i=o.default.Event(this.constructor.Event.HIDE),a=function(){"show"!==e._hoverState&&n.parentNode&&n.parentNode.removeChild(n),e._cleanTipClass(),e.element.removeAttribute("aria-describedby"),o.default(e.element).trigger(e.constructor.Event.HIDDEN),null!==e._popper&&e._popper.destroy(),t&&t()};if(o.default(this.element).trigger(i),!i.isDefaultPrevented()){if(o.default(n).removeClass("show"),"ontouchstart"in document.documentElement&&o.default(document.body).children().off("mouseover",null,o.default.noop),this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1,o.default(this.tip).hasClass("fade")){var s=d.getTransitionDurationFromElement(n);o.default(n).one(d.TRANSITION_END,a).emulateTransitionEnd(s)}else a();this._hoverState=""}},e.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},e.isWithContent=function(){return Boolean(this.getTitle())},e.addAttachmentClass=function(t){o.default(this.getTipElement()).addClass("bs-tooltip-"+t)},e.getTipElement=function(){return this.tip=this.tip||o.default(this.config.template)[0],this.tip},e.setContent=function(){var t=this.getTipElement();this.setElementContent(o.default(t.querySelectorAll(".tooltip-inner")),this.getTitle()),o.default(t).removeClass("fade show")},e.setElementContent=function(t,e){"object"!=typeof e||!e.nodeType&&!e.jquery?this.config.html?(this.config.sanitize&&(e=U(e,this.config.whiteList,this.config.sanitizeFn)),t.html(e)):t.text(e):this.config.html?o.default(e).parent().is(t)||t.empty().append(e):t.text(o.default(e).text())},e.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},e._getPopperConfig=function(t){var e=this;return r({},{placement:t,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:".arrow"},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}},this.config.popperConfig)},e._getOffset=function(){var t=this,e={};return"function"==typeof this.config.offset?e.fn=function(e){return e.offsets=r({},e.offsets,t.config.offset(e.offsets,t.element)||{}),e}:e.offset=this.config.offset,e},e._getContainer=function(){return!1===this.config.container?document.body:d.isElement(this.config.container)?o.default(this.config.container):o.default(document).find(this.config.container)},e._getAttachment=function(t){return X[t.toUpperCase()]},e._setListeners=function(){var t=this;this.config.trigger.split(" ").forEach((function(e){if("click"===e)o.default(t.element).on(t.constructor.Event.CLICK,t.config.selector,(function(e){return t.toggle(e)}));else if("manual"!==e){var n="hover"===e?t.constructor.Event.MOUSEENTER:t.constructor.Event.FOCUSIN,i="hover"===e?t.constructor.Event.MOUSELEAVE:t.constructor.Event.FOCUSOUT;o.default(t.element).on(n,t.config.selector,(function(e){return t._enter(e)})).on(i,t.config.selector,(function(e){return t._leave(e)}))}})),this._hideModalHandler=function(){t.element&&t.hide()},o.default(this.element).closest(".modal").on("hide.bs.modal",this._hideModalHandler),this.config.selector?this.config=r({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},e._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},e._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||o.default(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),o.default(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusin"===t.type?"focus":"hover"]=!0),o.default(e.getTipElement()).hasClass("show")||"show"===e._hoverState?e._hoverState="show":(clearTimeout(e._timeout),e._hoverState="show",e.config.delay&&e.config.delay.show?e._timeout=setTimeout((function(){"show"===e._hoverState&&e.show()}),e.config.delay.show):e.show())},e._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||o.default(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),o.default(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusout"===t.type?"focus":"hover"]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState="out",e.config.delay&&e.config.delay.hide?e._timeout=setTimeout((function(){"out"===e._hoverState&&e.hide()}),e.config.delay.hide):e.hide())},e._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},e._getConfig=function(t){var e=o.default(this.element).data();return Object.keys(e).forEach((function(t){-1!==z.indexOf(t)&&delete e[t]})),"number"==typeof(t=r({},this.constructor.Default,e,"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),d.typeCheckConfig(M,t,this.constructor.DefaultType),t.sanitize&&(t.template=U(t.template,t.whiteList,t.sanitizeFn)),t},e._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},e._cleanTipClass=function(){var t=o.default(this.getTipElement()),e=t.attr("class").match(V);null!==e&&e.length&&t.removeClass(e.join(""))},e._handlePopperPlacementChange=function(t){this.tip=t.instance.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},e._fixTransition=function(){var t=this.getTipElement(),e=this.config.animation;null===t.getAttribute("x-placement")&&(o.default(t).removeClass("fade"),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},t._jQueryInterface=function(e){return this.each((function(){var n=o.default(this),i=n.data("bs.tooltip"),a="object"==typeof e&&e;if((i||!/dispose|hide/.test(e))&&(i||(i=new t(this,a),n.data("bs.tooltip",i)),"string"==typeof e)){if("undefined"==typeof i[e])throw new TypeError('No method named "'+e+'"');i[e]()}}))},l(t,null,[{key:"VERSION",get:function(){return"4.5.3"}},{key:"Default",get:function(){return Y}},{key:"NAME",get:function(){return M}},{key:"DATA_KEY",get:function(){return"bs.tooltip"}},{key:"Event",get:function(){return $}},{key:"EVENT_KEY",get:function(){return".bs.tooltip"}},{key:"DefaultType",get:function(){return K}}]),t}();o.default.fn[M]=J._jQueryInterface,o.default.fn[M].Constructor=J,o.default.fn[M].noConflict=function(){return o.default.fn[M]=W,J._jQueryInterface};var G="popover",Z=o.default.fn[G],tt=new RegExp("(^|\\s)bs-popover\\S+","g"),et=r({},J.Default,{placement:"right",trigger:"click",content:"",template:''}),nt=r({},J.DefaultType,{content:"(string|element|function)"}),it={HIDE:"hide.bs.popover",HIDDEN:"hidden.bs.popover",SHOW:"show.bs.popover",SHOWN:"shown.bs.popover",INSERTED:"inserted.bs.popover",CLICK:"click.bs.popover",FOCUSIN:"focusin.bs.popover",FOCUSOUT:"focusout.bs.popover",MOUSEENTER:"mouseenter.bs.popover",MOUSELEAVE:"mouseleave.bs.popover"},ot=function(t){var e,n;function i(){return t.apply(this,arguments)||this}n=t,(e=i).prototype=Object.create(n.prototype),e.prototype.constructor=e,e.__proto__=n;var a=i.prototype;return a.isWithContent=function(){return this.getTitle()||this._getContent()},a.addAttachmentClass=function(t){o.default(this.getTipElement()).addClass("bs-popover-"+t)},a.getTipElement=function(){return this.tip=this.tip||o.default(this.config.template)[0],this.tip},a.setContent=function(){var t=o.default(this.getTipElement());this.setElementContent(t.find(".popover-header"),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(".popover-body"),e),t.removeClass("fade show")},a._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},a._cleanTipClass=function(){var t=o.default(this.getTipElement()),e=t.attr("class").match(tt);null!==e&&e.length>0&&t.removeClass(e.join(""))},i._jQueryInterface=function(t){return this.each((function(){var e=o.default(this).data("bs.popover"),n="object"==typeof t?t:null;if((e||!/dispose|hide/.test(t))&&(e||(e=new i(this,n),o.default(this).data("bs.popover",e)),"string"==typeof t)){if("undefined"==typeof e[t])throw new TypeError('No method named "'+t+'"');e[t]()}}))},l(i,null,[{key:"VERSION",get:function(){return"4.5.3"}},{key:"Default",get:function(){return et}},{key:"NAME",get:function(){return G}},{key:"DATA_KEY",get:function(){return"bs.popover"}},{key:"Event",get:function(){return it}},{key:"EVENT_KEY",get:function(){return".bs.popover"}},{key:"DefaultType",get:function(){return nt}}]),i}(J);o.default.fn[G]=ot._jQueryInterface,o.default.fn[G].Constructor=ot,o.default.fn[G].noConflict=function(){return o.default.fn[G]=Z,ot._jQueryInterface};var at="scrollspy",st=o.default.fn[at],lt={offset:10,method:"auto",target:""},rt={offset:"number",method:"string",target:"(string|element)"},ut=function(){function t(t,e){var n=this;this._element=t,this._scrollElement="BODY"===t.tagName?window:t,this._config=this._getConfig(e),this._selector=this._config.target+" .nav-link,"+this._config.target+" .list-group-item,"+this._config.target+" .dropdown-item",this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,o.default(this._scrollElement).on("scroll.bs.scrollspy",(function(t){return n._process(t)})),this.refresh(),this._process()}var e=t.prototype;return e.refresh=function(){var t=this,e=this._scrollElement===this._scrollElement.window?"offset":"position",n="auto"===this._config.method?e:this._config.method,i="position"===n?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),[].slice.call(document.querySelectorAll(this._selector)).map((function(t){var e,a=d.getSelectorFromElement(t);if(a&&(e=document.querySelector(a)),e){var s=e.getBoundingClientRect();if(s.width||s.height)return[o.default(e)[n]().top+i,a]}return null})).filter((function(t){return t})).sort((function(t,e){return t[0]-e[0]})).forEach((function(e){t._offsets.push(e[0]),t._targets.push(e[1])}))},e.dispose=function(){o.default.removeData(this._element,"bs.scrollspy"),o.default(this._scrollElement).off(".bs.scrollspy"),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},e._getConfig=function(t){if("string"!=typeof(t=r({},lt,"object"==typeof t&&t?t:{})).target&&d.isElement(t.target)){var e=o.default(t.target).attr("id");e||(e=d.getUID(at),o.default(t.target).attr("id",e)),t.target="#"+e}return d.typeCheckConfig(at,t,rt),t},e._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},e._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},e._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},e._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=n){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t0)return this._activeTarget=null,void this._clear();for(var o=this._offsets.length;o--;){this._activeTarget!==this._targets[o]&&t>=this._offsets[o]&&("undefined"==typeof this._offsets[o+1]||t li > .active":".active";n=(n=o.default.makeArray(o.default(i).find(s)))[n.length-1]}var l=o.default.Event("hide.bs.tab",{relatedTarget:this._element}),r=o.default.Event("show.bs.tab",{relatedTarget:n});if(n&&o.default(n).trigger(l),o.default(this._element).trigger(r),!r.isDefaultPrevented()&&!l.isDefaultPrevented()){a&&(e=document.querySelector(a)),this._activate(this._element,i);var u=function(){var e=o.default.Event("hidden.bs.tab",{relatedTarget:t._element}),i=o.default.Event("shown.bs.tab",{relatedTarget:n});o.default(n).trigger(e),o.default(t._element).trigger(i)};e?this._activate(e,e.parentNode,u):u()}}},e.dispose=function(){o.default.removeData(this._element,"bs.tab"),this._element=null},e._activate=function(t,e,n){var i=this,a=(!e||"UL"!==e.nodeName&&"OL"!==e.nodeName?o.default(e).children(".active"):o.default(e).find("> li > .active"))[0],s=n&&a&&o.default(a).hasClass("fade"),l=function(){return i._transitionComplete(t,a,n)};if(a&&s){var r=d.getTransitionDurationFromElement(a);o.default(a).removeClass("show").one(d.TRANSITION_END,l).emulateTransitionEnd(r)}else l()},e._transitionComplete=function(t,e,n){if(e){o.default(e).removeClass("active");var i=o.default(e.parentNode).find("> .dropdown-menu .active")[0];i&&o.default(i).removeClass("active"),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!1)}if(o.default(t).addClass("active"),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),d.reflow(t),t.classList.contains("fade")&&t.classList.add("show"),t.parentNode&&o.default(t.parentNode).hasClass("dropdown-menu")){var a=o.default(t).closest(".dropdown")[0];if(a){var s=[].slice.call(a.querySelectorAll(".dropdown-toggle"));o.default(s).addClass("active")}t.setAttribute("aria-expanded",!0)}n&&n()},t._jQueryInterface=function(e){return this.each((function(){var n=o.default(this),i=n.data("bs.tab");if(i||(i=new t(this),n.data("bs.tab",i)),"string"==typeof e){if("undefined"==typeof i[e])throw new TypeError('No method named "'+e+'"');i[e]()}}))},l(t,null,[{key:"VERSION",get:function(){return"4.5.3"}}]),t}();o.default(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',(function(t){t.preventDefault(),ft._jQueryInterface.call(o.default(this),"show")})),o.default.fn.tab=ft._jQueryInterface,o.default.fn.tab.Constructor=ft,o.default.fn.tab.noConflict=function(){return o.default.fn.tab=dt,ft._jQueryInterface};var ct=o.default.fn.toast,ht={animation:"boolean",autohide:"boolean",delay:"number"},gt={animation:!0,autohide:!0,delay:500},mt=function(){function t(t,e){this._element=t,this._config=this._getConfig(e),this._timeout=null,this._setListeners()}var e=t.prototype;return e.show=function(){var t=this,e=o.default.Event("show.bs.toast");if(o.default(this._element).trigger(e),!e.isDefaultPrevented()){this._clearTimeout(),this._config.animation&&this._element.classList.add("fade");var n=function(){t._element.classList.remove("showing"),t._element.classList.add("show"),o.default(t._element).trigger("shown.bs.toast"),t._config.autohide&&(t._timeout=setTimeout((function(){t.hide()}),t._config.delay))};if(this._element.classList.remove("hide"),d.reflow(this._element),this._element.classList.add("showing"),this._config.animation){var i=d.getTransitionDurationFromElement(this._element);o.default(this._element).one(d.TRANSITION_END,n).emulateTransitionEnd(i)}else n()}},e.hide=function(){if(this._element.classList.contains("show")){var t=o.default.Event("hide.bs.toast");o.default(this._element).trigger(t),t.isDefaultPrevented()||this._close()}},e.dispose=function(){this._clearTimeout(),this._element.classList.contains("show")&&this._element.classList.remove("show"),o.default(this._element).off("click.dismiss.bs.toast"),o.default.removeData(this._element,"bs.toast"),this._element=null,this._config=null},e._getConfig=function(t){return t=r({},gt,o.default(this._element).data(),"object"==typeof t&&t?t:{}),d.typeCheckConfig("toast",t,this.constructor.DefaultType),t},e._setListeners=function(){var t=this;o.default(this._element).on("click.dismiss.bs.toast",'[data-dismiss="toast"]',(function(){return t.hide()}))},e._close=function(){var t=this,e=function(){t._element.classList.add("hide"),o.default(t._element).trigger("hidden.bs.toast")};if(this._element.classList.remove("show"),this._config.animation){var n=d.getTransitionDurationFromElement(this._element);o.default(this._element).one(d.TRANSITION_END,e).emulateTransitionEnd(n)}else e()},e._clearTimeout=function(){clearTimeout(this._timeout),this._timeout=null},t._jQueryInterface=function(e){return this.each((function(){var n=o.default(this),i=n.data("bs.toast");if(i||(i=new t(this,"object"==typeof e&&e),n.data("bs.toast",i)),"string"==typeof e){if("undefined"==typeof i[e])throw new TypeError('No method named "'+e+'"');i[e](this)}}))},l(t,null,[{key:"VERSION",get:function(){return"4.5.3"}},{key:"DefaultType",get:function(){return ht}},{key:"Default",get:function(){return gt}}]),t}();o.default.fn.toast=mt._jQueryInterface,o.default.fn.toast.Constructor=mt,o.default.fn.toast.noConflict=function(){return o.default.fn.toast=ct,mt._jQueryInterface},t.Alert=h,t.Button=m,t.Carousel=w,t.Collapse=D,t.Dropdown=x,t.Modal=q,t.Popover=ot,t.Scrollspy=ut,t.Tab=ft,t.Toast=mt,t.Tooltip=J,t.Util=d,Object.defineProperty(t,"__esModule",{value:!0})})); -//# sourceMappingURL=bootstrap.min.js.map \ No newline at end of file diff --git a/javascript-practice/simple-side-bar/vendor/bootstrap/js/bootstrap.min.js.map b/javascript-practice/simple-side-bar/vendor/bootstrap/js/bootstrap.min.js.map deleted file mode 100644 index 69c2736..0000000 --- a/javascript-practice/simple-side-bar/vendor/bootstrap/js/bootstrap.min.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../../js/src/util.js","../../js/src/alert.js","../../js/src/button.js","../../js/src/carousel.js","../../js/src/collapse.js","../../js/src/dropdown.js","../../js/src/modal.js","../../js/src/tools/sanitizer.js","../../js/src/tooltip.js","../../js/src/popover.js","../../js/src/scrollspy.js","../../js/src/tab.js","../../js/src/toast.js"],"names":["transitionEndEmulator","duration","_this","this","called","$","one","Util","TRANSITION_END","setTimeout","triggerTransitionEnd","getUID","prefix","Math","random","document","getElementById","getSelectorFromElement","element","selector","getAttribute","hrefAttr","trim","querySelector","_","getTransitionDurationFromElement","transitionDuration","css","transitionDelay","floatTransitionDuration","parseFloat","floatTransitionDelay","split","reflow","offsetHeight","trigger","supportsTransitionEnd","Boolean","isElement","obj","nodeType","typeCheckConfig","componentName","config","configTypes","property","Object","prototype","hasOwnProperty","call","expectedTypes","value","valueType","toString","match","toLowerCase","RegExp","test","Error","toUpperCase","findShadowRoot","documentElement","attachShadow","getRootNode","root","ShadowRoot","parentNode","jQueryDetection","TypeError","version","fn","jquery","emulateTransitionEnd","event","special","bindType","delegateType","handle","target","is","handleObj","handler","apply","arguments","NAME","JQUERY_NO_CONFLICT","Alert","_element","close","rootElement","_getRootElement","_triggerCloseEvent","isDefaultPrevented","_removeElement","dispose","removeData","parent","closest","closeEvent","Event","removeClass","hasClass","_destroyElement","detach","remove","_jQueryInterface","each","$element","data","_handleDismiss","alertInstance","preventDefault","on","Constructor","noConflict","Button","shouldAvoidTriggerChange","toggle","triggerChangeEvent","addAriaPressed","input","type","checked","classList","contains","activeElement","focus","hasAttribute","setAttribute","toggleClass","avoidTriggerChange","button","initialButton","inputBtn","tagName","window","buttons","slice","querySelectorAll","i","len","length","add","EVENT_KEY","Default","interval","keyboard","slide","pause","wrap","touch","DefaultType","PointerType","TOUCH","PEN","Carousel","_items","_interval","_activeElement","_isPaused","_isSliding","touchTimeout","touchStartX","touchDeltaX","_config","_getConfig","_indicatorsElement","_touchSupported","navigator","maxTouchPoints","_pointerEvent","PointerEvent","MSPointerEvent","_addEventListeners","next","_slide","nextWhenVisible","hidden","prev","cycle","clearInterval","setInterval","visibilityState","bind","to","index","activeIndex","_getItemIndex","direction","off","_extends","_handleSwipe","absDeltax","abs","_this2","_keydown","_addTouchEventListeners","_this3","start","originalEvent","pointerType","clientX","touches","end","clearTimeout","e","move","which","indexOf","_getItemByDirection","isNextDirection","isPrevDirection","lastItemIndex","itemIndex","_triggerSlideEvent","relatedTarget","eventDirectionName","targetIndex","fromIndex","slideEvent","from","_setActiveIndicatorElement","indicators","nextIndicator","children","addClass","directionalClassName","orderClassName","_this4","activeElementIndex","nextElement","nextElementIndex","isCycling","slidEvent","nextElementInterval","parseInt","defaultInterval","CLASS_NAME_ACTIVE","action","ride","_dataApiClickHandler","slideIndex","carousels","$carousel","Collapse","_isTransitioning","_triggerArray","id","toggleList","elem","filterElement","filter","foundElem","_selector","push","_parent","_getParent","_addAriaAndCollapsedClass","hide","show","actives","activesData","not","startEvent","dimension","_getDimension","style","attr","setTransitioning","scrollSize","CLASS_NAME_COLLAPSE","getBoundingClientRect","triggerArrayLength","isTransitioning","_getTargetFromElement","triggerArray","isOpen","currentTarget","$trigger","selectors","$target","REGEXP_KEYDOWN","ARROW_UP_KEYCODE","offset","flip","boundary","reference","display","popperConfig","Dropdown","_popper","_menu","_getMenuElement","_inNavbar","_detectNavbar","disabled","isActive","_clearMenus","usePopper","showEvent","_getParentFromElement","Popper","referenceElement","_getPopperConfig","body","noop","hideEvent","destroy","update","scheduleUpdate","stopPropagation","constructor","_getPlacement","$parentDropdown","placement","_getOffset","offsets","modifiers","enabled","preventOverflow","boundariesElement","applyStyle","toggles","context","clickEvent","dropdownMenu","_dataApiKeydownHandler","items","item","EVENT_CLICK_DATA_API","backdrop","Modal","_dialog","_backdrop","_isShown","_isBodyOverflowing","_ignoreBackdropClick","_scrollbarWidth","_checkScrollbar","_setScrollbar","_adjustDialog","_setEscapeEvent","_setResizeEvent","_showBackdrop","_showElement","transition","_hideModal","forEach","htmlElement","handleUpdate","_triggerBackdropTransition","hideEventPrevented","isModalOverflowing","scrollHeight","clientHeight","overflowY","modalTransitionDuration","modalBody","Node","ELEMENT_NODE","appendChild","removeAttribute","scrollTop","_enforceFocus","shownEvent","transitionComplete","_this5","has","_this6","_this7","_this8","_resetAdjustments","_resetScrollbar","_removeBackdrop","callback","_this9","animate","createElement","className","appendTo","backdropTransitionDuration","callbackRemove","paddingLeft","paddingRight","rect","round","left","right","innerWidth","_getScrollbarWidth","_this10","fixedContent","stickyContent","actualPadding","calculatedPadding","actualMargin","marginRight","calculatedMargin","padding","elements","margin","scrollDiv","scrollbarWidth","width","clientWidth","removeChild","_this11","uriAttrs","DefaultWhitelist","*","a","area","b","br","col","code","div","em","hr","h1","h2","h3","h4","h5","h6","img","li","ol","p","pre","s","small","span","sub","sup","strong","u","ul","SAFE_URL_PATTERN","DATA_URL_PATTERN","sanitizeHtml","unsafeHtml","whiteList","sanitizeFn","createdDocument","DOMParser","parseFromString","whitelistKeys","keys","_loop","el","elName","nodeName","attributeList","attributes","whitelistedAttributes","concat","allowedAttributeList","attrName","nodeValue","regExp","attrRegex","allowedAttribute","innerHTML","BSCLS_PREFIX_REGEX","DISALLOWED_ATTRIBUTES","animation","template","title","delay","html","container","fallbackPlacement","sanitize","AttachmentMap","AUTO","TOP","RIGHT","BOTTOM","LEFT","HIDE","HIDDEN","SHOW","SHOWN","INSERTED","CLICK","FOCUSIN","FOCUSOUT","MOUSEENTER","MOUSELEAVE","Tooltip","_isEnabled","_timeout","_hoverState","_activeTrigger","tip","_setListeners","enable","disable","toggleEnabled","dataKey","DATA_KEY","_getDelegateConfig","click","_isWithActiveTrigger","_enter","_leave","getTipElement","_hideModalHandler","isWithContent","shadowRoot","isInTheDom","ownerDocument","tipId","setContent","attachment","_getAttachment","addAttachmentClass","_getContainer","complete","_fixTransition","prevHoverState","_cleanTipClass","getTitle","CLASS_PREFIX","setElementContent","CLASS_NAME_FADE","content","text","empty","append","behavior","arrow","onCreate","originalPlacement","_handlePopperPlacementChange","onUpdate","find","eventIn","eventOut","_fixTitle","titleType","dataAttributes","dataAttr","key","$tip","tabClass","join","popperData","instance","popper","initConfigAnimation","Popover","_getContent","method","ScrollSpy","_scrollElement","_offsets","_targets","_activeTarget","_scrollHeight","_process","refresh","autoMethod","offsetMethod","offsetBase","_getScrollTop","_getScrollHeight","map","targetSelector","targetBCR","height","top","sort","pageYOffset","max","_getOffsetHeight","innerHeight","maxScroll","_activate","_clear","queries","$link","parents","SELECTOR_NAV_LINKS","node","scrollSpys","$spy","Tab","previous","listElement","itemSelector","makeArray","hiddenEvent","active","_transitionComplete","dropdownChild","dropdownElement","dropdownToggleList","$this","autohide","Toast","_clearTimeout","_close"],"mappings":"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","sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.5.3): util.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\n\n/**\n * ------------------------------------------------------------------------\n * Private TransitionEnd Helpers\n * ------------------------------------------------------------------------\n */\n\nconst TRANSITION_END = 'transitionend'\nconst MAX_UID = 1000000\nconst MILLISECONDS_MULTIPLIER = 1000\n\n// Shoutout AngusCroll (https://goo.gl/pxwQGp)\nfunction toType(obj) {\n if (obj === null || typeof obj === 'undefined') {\n return `${obj}`\n }\n\n return {}.toString.call(obj).match(/\\s([a-z]+)/i)[1].toLowerCase()\n}\n\nfunction getSpecialTransitionEndEvent() {\n return {\n bindType: TRANSITION_END,\n delegateType: TRANSITION_END,\n handle(event) {\n if ($(event.target).is(this)) {\n return event.handleObj.handler.apply(this, arguments) // eslint-disable-line prefer-rest-params\n }\n\n return undefined\n }\n }\n}\n\nfunction transitionEndEmulator(duration) {\n let called = false\n\n $(this).one(Util.TRANSITION_END, () => {\n called = true\n })\n\n setTimeout(() => {\n if (!called) {\n Util.triggerTransitionEnd(this)\n }\n }, duration)\n\n return this\n}\n\nfunction setTransitionEndSupport() {\n $.fn.emulateTransitionEnd = transitionEndEmulator\n $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent()\n}\n\n/**\n * --------------------------------------------------------------------------\n * Public Util Api\n * --------------------------------------------------------------------------\n */\n\nconst Util = {\n TRANSITION_END: 'bsTransitionEnd',\n\n getUID(prefix) {\n do {\n prefix += ~~(Math.random() * MAX_UID) // \"~~\" acts like a faster Math.floor() here\n } while (document.getElementById(prefix))\n\n return prefix\n },\n\n getSelectorFromElement(element) {\n let selector = element.getAttribute('data-target')\n\n if (!selector || selector === '#') {\n const hrefAttr = element.getAttribute('href')\n selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : ''\n }\n\n try {\n return document.querySelector(selector) ? selector : null\n } catch (_) {\n return null\n }\n },\n\n getTransitionDurationFromElement(element) {\n if (!element) {\n return 0\n }\n\n // Get transition-duration of the element\n let transitionDuration = $(element).css('transition-duration')\n let transitionDelay = $(element).css('transition-delay')\n\n const floatTransitionDuration = parseFloat(transitionDuration)\n const floatTransitionDelay = parseFloat(transitionDelay)\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0]\n transitionDelay = transitionDelay.split(',')[0]\n\n return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\n },\n\n reflow(element) {\n return element.offsetHeight\n },\n\n triggerTransitionEnd(element) {\n $(element).trigger(TRANSITION_END)\n },\n\n supportsTransitionEnd() {\n return Boolean(TRANSITION_END)\n },\n\n isElement(obj) {\n return (obj[0] || obj).nodeType\n },\n\n typeCheckConfig(componentName, config, configTypes) {\n for (const property in configTypes) {\n if (Object.prototype.hasOwnProperty.call(configTypes, property)) {\n const expectedTypes = configTypes[property]\n const value = config[property]\n const valueType = value && Util.isElement(value) ?\n 'element' : toType(value)\n\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new Error(\n `${componentName.toUpperCase()}: ` +\n `Option \"${property}\" provided type \"${valueType}\" ` +\n `but expected type \"${expectedTypes}\".`)\n }\n }\n }\n },\n\n findShadowRoot(element) {\n if (!document.documentElement.attachShadow) {\n return null\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode()\n return root instanceof ShadowRoot ? root : null\n }\n\n if (element instanceof ShadowRoot) {\n return element\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null\n }\n\n return Util.findShadowRoot(element.parentNode)\n },\n\n jQueryDetection() {\n if (typeof $ === 'undefined') {\n throw new TypeError('Bootstrap\\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\\'s JavaScript.')\n }\n\n const version = $.fn.jquery.split(' ')[0].split('.')\n const minMajor = 1\n const ltMajor = 2\n const minMinor = 9\n const minPatch = 1\n const maxMajor = 4\n\n if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) {\n throw new Error('Bootstrap\\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0')\n }\n }\n}\n\nUtil.jQueryDetection()\nsetTransitionEndSupport()\n\nexport default Util\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.5.3): alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'alert'\nconst VERSION = '4.5.3'\nconst DATA_KEY = 'bs.alert'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst SELECTOR_DISMISS = '[data-dismiss=\"alert\"]'\n\nconst EVENT_CLOSE = `close${EVENT_KEY}`\nconst EVENT_CLOSED = `closed${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_ALERT = 'alert'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Alert {\n constructor(element) {\n this._element = element\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n // Public\n\n close(element) {\n let rootElement = this._element\n if (element) {\n rootElement = this._getRootElement(element)\n }\n\n const customEvent = this._triggerCloseEvent(rootElement)\n\n if (customEvent.isDefaultPrevented()) {\n return\n }\n\n this._removeElement(rootElement)\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n this._element = null\n }\n\n // Private\n\n _getRootElement(element) {\n const selector = Util.getSelectorFromElement(element)\n let parent = false\n\n if (selector) {\n parent = document.querySelector(selector)\n }\n\n if (!parent) {\n parent = $(element).closest(`.${CLASS_NAME_ALERT}`)[0]\n }\n\n return parent\n }\n\n _triggerCloseEvent(element) {\n const closeEvent = $.Event(EVENT_CLOSE)\n\n $(element).trigger(closeEvent)\n return closeEvent\n }\n\n _removeElement(element) {\n $(element).removeClass(CLASS_NAME_SHOW)\n\n if (!$(element).hasClass(CLASS_NAME_FADE)) {\n this._destroyElement(element)\n return\n }\n\n const transitionDuration = Util.getTransitionDurationFromElement(element)\n\n $(element)\n .one(Util.TRANSITION_END, event => this._destroyElement(element, event))\n .emulateTransitionEnd(transitionDuration)\n }\n\n _destroyElement(element) {\n $(element)\n .detach()\n .trigger(EVENT_CLOSED)\n .remove()\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n const $element = $(this)\n let data = $element.data(DATA_KEY)\n\n if (!data) {\n data = new Alert(this)\n $element.data(DATA_KEY, data)\n }\n\n if (config === 'close') {\n data[config](this)\n }\n })\n }\n\n static _handleDismiss(alertInstance) {\n return function (event) {\n if (event) {\n event.preventDefault()\n }\n\n alertInstance.close(this)\n }\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document).on(\n EVENT_CLICK_DATA_API,\n SELECTOR_DISMISS,\n Alert._handleDismiss(new Alert())\n)\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Alert._jQueryInterface\n$.fn[NAME].Constructor = Alert\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Alert._jQueryInterface\n}\n\nexport default Alert\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.5.3): button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'button'\nconst VERSION = '4.5.3'\nconst DATA_KEY = 'bs.button'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_BUTTON = 'btn'\nconst CLASS_NAME_FOCUS = 'focus'\n\nconst SELECTOR_DATA_TOGGLE_CARROT = '[data-toggle^=\"button\"]'\nconst SELECTOR_DATA_TOGGLES = '[data-toggle=\"buttons\"]'\nconst SELECTOR_DATA_TOGGLE = '[data-toggle=\"button\"]'\nconst SELECTOR_DATA_TOGGLES_BUTTONS = '[data-toggle=\"buttons\"] .btn'\nconst SELECTOR_INPUT = 'input:not([type=\"hidden\"])'\nconst SELECTOR_ACTIVE = '.active'\nconst SELECTOR_BUTTON = '.btn'\n\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_FOCUS_BLUR_DATA_API = `focus${EVENT_KEY}${DATA_API_KEY} ` +\n `blur${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Button {\n constructor(element) {\n this._element = element\n this.shouldAvoidTriggerChange = false\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n // Public\n\n toggle() {\n let triggerChangeEvent = true\n let addAriaPressed = true\n const rootElement = $(this._element).closest(SELECTOR_DATA_TOGGLES)[0]\n\n if (rootElement) {\n const input = this._element.querySelector(SELECTOR_INPUT)\n\n if (input) {\n if (input.type === 'radio') {\n if (input.checked && this._element.classList.contains(CLASS_NAME_ACTIVE)) {\n triggerChangeEvent = false\n } else {\n const activeElement = rootElement.querySelector(SELECTOR_ACTIVE)\n\n if (activeElement) {\n $(activeElement).removeClass(CLASS_NAME_ACTIVE)\n }\n }\n }\n\n if (triggerChangeEvent) {\n // if it's not a radio button or checkbox don't add a pointless/invalid checked property to the input\n if (input.type === 'checkbox' || input.type === 'radio') {\n input.checked = !this._element.classList.contains(CLASS_NAME_ACTIVE)\n }\n\n if (!this.shouldAvoidTriggerChange) {\n $(input).trigger('change')\n }\n }\n\n input.focus()\n addAriaPressed = false\n }\n }\n\n if (!(this._element.hasAttribute('disabled') || this._element.classList.contains('disabled'))) {\n if (addAriaPressed) {\n this._element.setAttribute('aria-pressed', !this._element.classList.contains(CLASS_NAME_ACTIVE))\n }\n\n if (triggerChangeEvent) {\n $(this._element).toggleClass(CLASS_NAME_ACTIVE)\n }\n }\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n this._element = null\n }\n\n // Static\n\n static _jQueryInterface(config, avoidTriggerChange) {\n return this.each(function () {\n const $element = $(this)\n let data = $element.data(DATA_KEY)\n\n if (!data) {\n data = new Button(this)\n $element.data(DATA_KEY, data)\n }\n\n data.shouldAvoidTriggerChange = avoidTriggerChange\n\n if (config === 'toggle') {\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document)\n .on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE_CARROT, event => {\n let button = event.target\n const initialButton = button\n\n if (!$(button).hasClass(CLASS_NAME_BUTTON)) {\n button = $(button).closest(SELECTOR_BUTTON)[0]\n }\n\n if (!button || button.hasAttribute('disabled') || button.classList.contains('disabled')) {\n event.preventDefault() // work around Firefox bug #1540995\n } else {\n const inputBtn = button.querySelector(SELECTOR_INPUT)\n\n if (inputBtn && (inputBtn.hasAttribute('disabled') || inputBtn.classList.contains('disabled'))) {\n event.preventDefault() // work around Firefox bug #1540995\n return\n }\n\n if (initialButton.tagName === 'INPUT' || button.tagName !== 'LABEL') {\n Button._jQueryInterface.call($(button), 'toggle', initialButton.tagName === 'INPUT')\n }\n }\n })\n .on(EVENT_FOCUS_BLUR_DATA_API, SELECTOR_DATA_TOGGLE_CARROT, event => {\n const button = $(event.target).closest(SELECTOR_BUTTON)[0]\n $(button).toggleClass(CLASS_NAME_FOCUS, /^focus(in)?$/.test(event.type))\n })\n\n$(window).on(EVENT_LOAD_DATA_API, () => {\n // ensure correct active class is set to match the controls' actual values/states\n\n // find all checkboxes/readio buttons inside data-toggle groups\n let buttons = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLES_BUTTONS))\n for (let i = 0, len = buttons.length; i < len; i++) {\n const button = buttons[i]\n const input = button.querySelector(SELECTOR_INPUT)\n if (input.checked || input.hasAttribute('checked')) {\n button.classList.add(CLASS_NAME_ACTIVE)\n } else {\n button.classList.remove(CLASS_NAME_ACTIVE)\n }\n }\n\n // find all button toggles\n buttons = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE))\n for (let i = 0, len = buttons.length; i < len; i++) {\n const button = buttons[i]\n if (button.getAttribute('aria-pressed') === 'true') {\n button.classList.add(CLASS_NAME_ACTIVE)\n } else {\n button.classList.remove(CLASS_NAME_ACTIVE)\n }\n }\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Button._jQueryInterface\n$.fn[NAME].Constructor = Button\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Button._jQueryInterface\n}\n\nexport default Button\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.5.3): carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'carousel'\nconst VERSION = '4.5.3'\nconst DATA_KEY = 'bs.carousel'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst ARROW_LEFT_KEYCODE = 37 // KeyboardEvent.which value for left arrow key\nconst ARROW_RIGHT_KEYCODE = 39 // KeyboardEvent.which value for right arrow key\nconst TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fire after touch\nconst SWIPE_THRESHOLD = 40\n\nconst Default = {\n interval: 5000,\n keyboard: true,\n slide: false,\n pause: 'hover',\n wrap: true,\n touch: true\n}\n\nconst DefaultType = {\n interval: '(number|boolean)',\n keyboard: 'boolean',\n slide: '(boolean|string)',\n pause: '(string|boolean)',\n wrap: 'boolean',\n touch: 'boolean'\n}\n\nconst DIRECTION_NEXT = 'next'\nconst DIRECTION_PREV = 'prev'\nconst DIRECTION_LEFT = 'left'\nconst DIRECTION_RIGHT = 'right'\n\nconst EVENT_SLIDE = `slide${EVENT_KEY}`\nconst EVENT_SLID = `slid${EVENT_KEY}`\nconst EVENT_KEYDOWN = `keydown${EVENT_KEY}`\nconst EVENT_MOUSEENTER = `mouseenter${EVENT_KEY}`\nconst EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY}`\nconst EVENT_TOUCHSTART = `touchstart${EVENT_KEY}`\nconst EVENT_TOUCHMOVE = `touchmove${EVENT_KEY}`\nconst EVENT_TOUCHEND = `touchend${EVENT_KEY}`\nconst EVENT_POINTERDOWN = `pointerdown${EVENT_KEY}`\nconst EVENT_POINTERUP = `pointerup${EVENT_KEY}`\nconst EVENT_DRAG_START = `dragstart${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_CAROUSEL = 'carousel'\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_SLIDE = 'slide'\nconst CLASS_NAME_RIGHT = 'carousel-item-right'\nconst CLASS_NAME_LEFT = 'carousel-item-left'\nconst CLASS_NAME_NEXT = 'carousel-item-next'\nconst CLASS_NAME_PREV = 'carousel-item-prev'\nconst CLASS_NAME_POINTER_EVENT = 'pointer-event'\n\nconst SELECTOR_ACTIVE = '.active'\nconst SELECTOR_ACTIVE_ITEM = '.active.carousel-item'\nconst SELECTOR_ITEM = '.carousel-item'\nconst SELECTOR_ITEM_IMG = '.carousel-item img'\nconst SELECTOR_NEXT_PREV = '.carousel-item-next, .carousel-item-prev'\nconst SELECTOR_INDICATORS = '.carousel-indicators'\nconst SELECTOR_DATA_SLIDE = '[data-slide], [data-slide-to]'\nconst SELECTOR_DATA_RIDE = '[data-ride=\"carousel\"]'\n\nconst PointerType = {\n TOUCH: 'touch',\n PEN: 'pen'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\nclass Carousel {\n constructor(element, config) {\n this._items = null\n this._interval = null\n this._activeElement = null\n this._isPaused = false\n this._isSliding = false\n this.touchTimeout = null\n this.touchStartX = 0\n this.touchDeltaX = 0\n\n this._config = this._getConfig(config)\n this._element = element\n this._indicatorsElement = this._element.querySelector(SELECTOR_INDICATORS)\n this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0\n this._pointerEvent = Boolean(window.PointerEvent || window.MSPointerEvent)\n\n this._addEventListeners()\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n next() {\n if (!this._isSliding) {\n this._slide(DIRECTION_NEXT)\n }\n }\n\n nextWhenVisible() {\n const $element = $(this._element)\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden &&\n ($element.is(':visible') && $element.css('visibility') !== 'hidden')) {\n this.next()\n }\n }\n\n prev() {\n if (!this._isSliding) {\n this._slide(DIRECTION_PREV)\n }\n }\n\n pause(event) {\n if (!event) {\n this._isPaused = true\n }\n\n if (this._element.querySelector(SELECTOR_NEXT_PREV)) {\n Util.triggerTransitionEnd(this._element)\n this.cycle(true)\n }\n\n clearInterval(this._interval)\n this._interval = null\n }\n\n cycle(event) {\n if (!event) {\n this._isPaused = false\n }\n\n if (this._interval) {\n clearInterval(this._interval)\n this._interval = null\n }\n\n if (this._config.interval && !this._isPaused) {\n this._interval = setInterval(\n (document.visibilityState ? this.nextWhenVisible : this.next).bind(this),\n this._config.interval\n )\n }\n }\n\n to(index) {\n this._activeElement = this._element.querySelector(SELECTOR_ACTIVE_ITEM)\n\n const activeIndex = this._getItemIndex(this._activeElement)\n\n if (index > this._items.length - 1 || index < 0) {\n return\n }\n\n if (this._isSliding) {\n $(this._element).one(EVENT_SLID, () => this.to(index))\n return\n }\n\n if (activeIndex === index) {\n this.pause()\n this.cycle()\n return\n }\n\n const direction = index > activeIndex ?\n DIRECTION_NEXT :\n DIRECTION_PREV\n\n this._slide(direction, this._items[index])\n }\n\n dispose() {\n $(this._element).off(EVENT_KEY)\n $.removeData(this._element, DATA_KEY)\n\n this._items = null\n this._config = null\n this._element = null\n this._interval = null\n this._isPaused = null\n this._isSliding = null\n this._activeElement = null\n this._indicatorsElement = null\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...config\n }\n Util.typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _handleSwipe() {\n const absDeltax = Math.abs(this.touchDeltaX)\n\n if (absDeltax <= SWIPE_THRESHOLD) {\n return\n }\n\n const direction = absDeltax / this.touchDeltaX\n\n this.touchDeltaX = 0\n\n // swipe left\n if (direction > 0) {\n this.prev()\n }\n\n // swipe right\n if (direction < 0) {\n this.next()\n }\n }\n\n _addEventListeners() {\n if (this._config.keyboard) {\n $(this._element).on(EVENT_KEYDOWN, event => this._keydown(event))\n }\n\n if (this._config.pause === 'hover') {\n $(this._element)\n .on(EVENT_MOUSEENTER, event => this.pause(event))\n .on(EVENT_MOUSELEAVE, event => this.cycle(event))\n }\n\n if (this._config.touch) {\n this._addTouchEventListeners()\n }\n }\n\n _addTouchEventListeners() {\n if (!this._touchSupported) {\n return\n }\n\n const start = event => {\n if (this._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\n this.touchStartX = event.originalEvent.clientX\n } else if (!this._pointerEvent) {\n this.touchStartX = event.originalEvent.touches[0].clientX\n }\n }\n\n const move = event => {\n // ensure swiping with one touch and not pinching\n if (event.originalEvent.touches && event.originalEvent.touches.length > 1) {\n this.touchDeltaX = 0\n } else {\n this.touchDeltaX = event.originalEvent.touches[0].clientX - this.touchStartX\n }\n }\n\n const end = event => {\n if (this._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\n this.touchDeltaX = event.originalEvent.clientX - this.touchStartX\n }\n\n this._handleSwipe()\n if (this._config.pause === 'hover') {\n // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n\n this.pause()\n if (this.touchTimeout) {\n clearTimeout(this.touchTimeout)\n }\n\n this.touchTimeout = setTimeout(event => this.cycle(event), TOUCHEVENT_COMPAT_WAIT + this._config.interval)\n }\n }\n\n $(this._element.querySelectorAll(SELECTOR_ITEM_IMG))\n .on(EVENT_DRAG_START, e => e.preventDefault())\n\n if (this._pointerEvent) {\n $(this._element).on(EVENT_POINTERDOWN, event => start(event))\n $(this._element).on(EVENT_POINTERUP, event => end(event))\n\n this._element.classList.add(CLASS_NAME_POINTER_EVENT)\n } else {\n $(this._element).on(EVENT_TOUCHSTART, event => start(event))\n $(this._element).on(EVENT_TOUCHMOVE, event => move(event))\n $(this._element).on(EVENT_TOUCHEND, event => end(event))\n }\n }\n\n _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return\n }\n\n switch (event.which) {\n case ARROW_LEFT_KEYCODE:\n event.preventDefault()\n this.prev()\n break\n case ARROW_RIGHT_KEYCODE:\n event.preventDefault()\n this.next()\n break\n default:\n }\n }\n\n _getItemIndex(element) {\n this._items = element && element.parentNode ?\n [].slice.call(element.parentNode.querySelectorAll(SELECTOR_ITEM)) :\n []\n return this._items.indexOf(element)\n }\n\n _getItemByDirection(direction, activeElement) {\n const isNextDirection = direction === DIRECTION_NEXT\n const isPrevDirection = direction === DIRECTION_PREV\n const activeIndex = this._getItemIndex(activeElement)\n const lastItemIndex = this._items.length - 1\n const isGoingToWrap = isPrevDirection && activeIndex === 0 ||\n isNextDirection && activeIndex === lastItemIndex\n\n if (isGoingToWrap && !this._config.wrap) {\n return activeElement\n }\n\n const delta = direction === DIRECTION_PREV ? -1 : 1\n const itemIndex = (activeIndex + delta) % this._items.length\n\n return itemIndex === -1 ?\n this._items[this._items.length - 1] : this._items[itemIndex]\n }\n\n _triggerSlideEvent(relatedTarget, eventDirectionName) {\n const targetIndex = this._getItemIndex(relatedTarget)\n const fromIndex = this._getItemIndex(this._element.querySelector(SELECTOR_ACTIVE_ITEM))\n const slideEvent = $.Event(EVENT_SLIDE, {\n relatedTarget,\n direction: eventDirectionName,\n from: fromIndex,\n to: targetIndex\n })\n\n $(this._element).trigger(slideEvent)\n\n return slideEvent\n }\n\n _setActiveIndicatorElement(element) {\n if (this._indicatorsElement) {\n const indicators = [].slice.call(this._indicatorsElement.querySelectorAll(SELECTOR_ACTIVE))\n $(indicators).removeClass(CLASS_NAME_ACTIVE)\n\n const nextIndicator = this._indicatorsElement.children[\n this._getItemIndex(element)\n ]\n\n if (nextIndicator) {\n $(nextIndicator).addClass(CLASS_NAME_ACTIVE)\n }\n }\n }\n\n _slide(direction, element) {\n const activeElement = this._element.querySelector(SELECTOR_ACTIVE_ITEM)\n const activeElementIndex = this._getItemIndex(activeElement)\n const nextElement = element || activeElement &&\n this._getItemByDirection(direction, activeElement)\n const nextElementIndex = this._getItemIndex(nextElement)\n const isCycling = Boolean(this._interval)\n\n let directionalClassName\n let orderClassName\n let eventDirectionName\n\n if (direction === DIRECTION_NEXT) {\n directionalClassName = CLASS_NAME_LEFT\n orderClassName = CLASS_NAME_NEXT\n eventDirectionName = DIRECTION_LEFT\n } else {\n directionalClassName = CLASS_NAME_RIGHT\n orderClassName = CLASS_NAME_PREV\n eventDirectionName = DIRECTION_RIGHT\n }\n\n if (nextElement && $(nextElement).hasClass(CLASS_NAME_ACTIVE)) {\n this._isSliding = false\n return\n }\n\n const slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName)\n if (slideEvent.isDefaultPrevented()) {\n return\n }\n\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n return\n }\n\n this._isSliding = true\n\n if (isCycling) {\n this.pause()\n }\n\n this._setActiveIndicatorElement(nextElement)\n\n const slidEvent = $.Event(EVENT_SLID, {\n relatedTarget: nextElement,\n direction: eventDirectionName,\n from: activeElementIndex,\n to: nextElementIndex\n })\n\n if ($(this._element).hasClass(CLASS_NAME_SLIDE)) {\n $(nextElement).addClass(orderClassName)\n\n Util.reflow(nextElement)\n\n $(activeElement).addClass(directionalClassName)\n $(nextElement).addClass(directionalClassName)\n\n const nextElementInterval = parseInt(nextElement.getAttribute('data-interval'), 10)\n if (nextElementInterval) {\n this._config.defaultInterval = this._config.defaultInterval || this._config.interval\n this._config.interval = nextElementInterval\n } else {\n this._config.interval = this._config.defaultInterval || this._config.interval\n }\n\n const transitionDuration = Util.getTransitionDurationFromElement(activeElement)\n\n $(activeElement)\n .one(Util.TRANSITION_END, () => {\n $(nextElement)\n .removeClass(`${directionalClassName} ${orderClassName}`)\n .addClass(CLASS_NAME_ACTIVE)\n\n $(activeElement).removeClass(`${CLASS_NAME_ACTIVE} ${orderClassName} ${directionalClassName}`)\n\n this._isSliding = false\n\n setTimeout(() => $(this._element).trigger(slidEvent), 0)\n })\n .emulateTransitionEnd(transitionDuration)\n } else {\n $(activeElement).removeClass(CLASS_NAME_ACTIVE)\n $(nextElement).addClass(CLASS_NAME_ACTIVE)\n\n this._isSliding = false\n $(this._element).trigger(slidEvent)\n }\n\n if (isCycling) {\n this.cycle()\n }\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n let _config = {\n ...Default,\n ...$(this).data()\n }\n\n if (typeof config === 'object') {\n _config = {\n ..._config,\n ...config\n }\n }\n\n const action = typeof config === 'string' ? config : _config.slide\n\n if (!data) {\n data = new Carousel(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'number') {\n data.to(config)\n } else if (typeof action === 'string') {\n if (typeof data[action] === 'undefined') {\n throw new TypeError(`No method named \"${action}\"`)\n }\n\n data[action]()\n } else if (_config.interval && _config.ride) {\n data.pause()\n data.cycle()\n }\n })\n }\n\n static _dataApiClickHandler(event) {\n const selector = Util.getSelectorFromElement(this)\n\n if (!selector) {\n return\n }\n\n const target = $(selector)[0]\n\n if (!target || !$(target).hasClass(CLASS_NAME_CAROUSEL)) {\n return\n }\n\n const config = {\n ...$(target).data(),\n ...$(this).data()\n }\n const slideIndex = this.getAttribute('data-slide-to')\n\n if (slideIndex) {\n config.interval = false\n }\n\n Carousel._jQueryInterface.call($(target), config)\n\n if (slideIndex) {\n $(target).data(DATA_KEY).to(slideIndex)\n }\n\n event.preventDefault()\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document).on(EVENT_CLICK_DATA_API, SELECTOR_DATA_SLIDE, Carousel._dataApiClickHandler)\n\n$(window).on(EVENT_LOAD_DATA_API, () => {\n const carousels = [].slice.call(document.querySelectorAll(SELECTOR_DATA_RIDE))\n for (let i = 0, len = carousels.length; i < len; i++) {\n const $carousel = $(carousels[i])\n Carousel._jQueryInterface.call($carousel, $carousel.data())\n }\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Carousel._jQueryInterface\n$.fn[NAME].Constructor = Carousel\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Carousel._jQueryInterface\n}\n\nexport default Carousel\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.5.3): collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'collapse'\nconst VERSION = '4.5.3'\nconst DATA_KEY = 'bs.collapse'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst Default = {\n toggle: true,\n parent: ''\n}\n\nconst DefaultType = {\n toggle: 'boolean',\n parent: '(string|element)'\n}\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_COLLAPSE = 'collapse'\nconst CLASS_NAME_COLLAPSING = 'collapsing'\nconst CLASS_NAME_COLLAPSED = 'collapsed'\n\nconst DIMENSION_WIDTH = 'width'\nconst DIMENSION_HEIGHT = 'height'\n\nconst SELECTOR_ACTIVES = '.show, .collapsing'\nconst SELECTOR_DATA_TOGGLE = '[data-toggle=\"collapse\"]'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Collapse {\n constructor(element, config) {\n this._isTransitioning = false\n this._element = element\n this._config = this._getConfig(config)\n this._triggerArray = [].slice.call(document.querySelectorAll(\n `[data-toggle=\"collapse\"][href=\"#${element.id}\"],` +\n `[data-toggle=\"collapse\"][data-target=\"#${element.id}\"]`\n ))\n\n const toggleList = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE))\n for (let i = 0, len = toggleList.length; i < len; i++) {\n const elem = toggleList[i]\n const selector = Util.getSelectorFromElement(elem)\n const filterElement = [].slice.call(document.querySelectorAll(selector))\n .filter(foundElem => foundElem === element)\n\n if (selector !== null && filterElement.length > 0) {\n this._selector = selector\n this._triggerArray.push(elem)\n }\n }\n\n this._parent = this._config.parent ? this._getParent() : null\n\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._element, this._triggerArray)\n }\n\n if (this._config.toggle) {\n this.toggle()\n }\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n toggle() {\n if ($(this._element).hasClass(CLASS_NAME_SHOW)) {\n this.hide()\n } else {\n this.show()\n }\n }\n\n show() {\n if (this._isTransitioning ||\n $(this._element).hasClass(CLASS_NAME_SHOW)) {\n return\n }\n\n let actives\n let activesData\n\n if (this._parent) {\n actives = [].slice.call(this._parent.querySelectorAll(SELECTOR_ACTIVES))\n .filter(elem => {\n if (typeof this._config.parent === 'string') {\n return elem.getAttribute('data-parent') === this._config.parent\n }\n\n return elem.classList.contains(CLASS_NAME_COLLAPSE)\n })\n\n if (actives.length === 0) {\n actives = null\n }\n }\n\n if (actives) {\n activesData = $(actives).not(this._selector).data(DATA_KEY)\n if (activesData && activesData._isTransitioning) {\n return\n }\n }\n\n const startEvent = $.Event(EVENT_SHOW)\n $(this._element).trigger(startEvent)\n if (startEvent.isDefaultPrevented()) {\n return\n }\n\n if (actives) {\n Collapse._jQueryInterface.call($(actives).not(this._selector), 'hide')\n if (!activesData) {\n $(actives).data(DATA_KEY, null)\n }\n }\n\n const dimension = this._getDimension()\n\n $(this._element)\n .removeClass(CLASS_NAME_COLLAPSE)\n .addClass(CLASS_NAME_COLLAPSING)\n\n this._element.style[dimension] = 0\n\n if (this._triggerArray.length) {\n $(this._triggerArray)\n .removeClass(CLASS_NAME_COLLAPSED)\n .attr('aria-expanded', true)\n }\n\n this.setTransitioning(true)\n\n const complete = () => {\n $(this._element)\n .removeClass(CLASS_NAME_COLLAPSING)\n .addClass(`${CLASS_NAME_COLLAPSE} ${CLASS_NAME_SHOW}`)\n\n this._element.style[dimension] = ''\n\n this.setTransitioning(false)\n\n $(this._element).trigger(EVENT_SHOWN)\n }\n\n const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)\n const scrollSize = `scroll${capitalizedDimension}`\n const transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n $(this._element)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n\n this._element.style[dimension] = `${this._element[scrollSize]}px`\n }\n\n hide() {\n if (this._isTransitioning ||\n !$(this._element).hasClass(CLASS_NAME_SHOW)) {\n return\n }\n\n const startEvent = $.Event(EVENT_HIDE)\n $(this._element).trigger(startEvent)\n if (startEvent.isDefaultPrevented()) {\n return\n }\n\n const dimension = this._getDimension()\n\n this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`\n\n Util.reflow(this._element)\n\n $(this._element)\n .addClass(CLASS_NAME_COLLAPSING)\n .removeClass(`${CLASS_NAME_COLLAPSE} ${CLASS_NAME_SHOW}`)\n\n const triggerArrayLength = this._triggerArray.length\n if (triggerArrayLength > 0) {\n for (let i = 0; i < triggerArrayLength; i++) {\n const trigger = this._triggerArray[i]\n const selector = Util.getSelectorFromElement(trigger)\n\n if (selector !== null) {\n const $elem = $([].slice.call(document.querySelectorAll(selector)))\n if (!$elem.hasClass(CLASS_NAME_SHOW)) {\n $(trigger).addClass(CLASS_NAME_COLLAPSED)\n .attr('aria-expanded', false)\n }\n }\n }\n }\n\n this.setTransitioning(true)\n\n const complete = () => {\n this.setTransitioning(false)\n $(this._element)\n .removeClass(CLASS_NAME_COLLAPSING)\n .addClass(CLASS_NAME_COLLAPSE)\n .trigger(EVENT_HIDDEN)\n }\n\n this._element.style[dimension] = ''\n const transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n $(this._element)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n }\n\n setTransitioning(isTransitioning) {\n this._isTransitioning = isTransitioning\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n\n this._config = null\n this._parent = null\n this._element = null\n this._triggerArray = null\n this._isTransitioning = null\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...config\n }\n config.toggle = Boolean(config.toggle) // Coerce string values\n Util.typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _getDimension() {\n const hasWidth = $(this._element).hasClass(DIMENSION_WIDTH)\n return hasWidth ? DIMENSION_WIDTH : DIMENSION_HEIGHT\n }\n\n _getParent() {\n let parent\n\n if (Util.isElement(this._config.parent)) {\n parent = this._config.parent\n\n // It's a jQuery object\n if (typeof this._config.parent.jquery !== 'undefined') {\n parent = this._config.parent[0]\n }\n } else {\n parent = document.querySelector(this._config.parent)\n }\n\n const selector = `[data-toggle=\"collapse\"][data-parent=\"${this._config.parent}\"]`\n const children = [].slice.call(parent.querySelectorAll(selector))\n\n $(children).each((i, element) => {\n this._addAriaAndCollapsedClass(\n Collapse._getTargetFromElement(element),\n [element]\n )\n })\n\n return parent\n }\n\n _addAriaAndCollapsedClass(element, triggerArray) {\n const isOpen = $(element).hasClass(CLASS_NAME_SHOW)\n\n if (triggerArray.length) {\n $(triggerArray)\n .toggleClass(CLASS_NAME_COLLAPSED, !isOpen)\n .attr('aria-expanded', isOpen)\n }\n }\n\n // Static\n\n static _getTargetFromElement(element) {\n const selector = Util.getSelectorFromElement(element)\n return selector ? document.querySelector(selector) : null\n }\n\n static _jQueryInterface(config) {\n return this.each(function () {\n const $element = $(this)\n let data = $element.data(DATA_KEY)\n const _config = {\n ...Default,\n ...$element.data(),\n ...(typeof config === 'object' && config ? config : {})\n }\n\n if (!data && _config.toggle && typeof config === 'string' && /show|hide/.test(config)) {\n _config.toggle = false\n }\n\n if (!data) {\n data = new Collapse(this, _config)\n $element.data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document).on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n // preventDefault only for elements (which change the URL) not inside the collapsible element\n if (event.currentTarget.tagName === 'A') {\n event.preventDefault()\n }\n\n const $trigger = $(this)\n const selector = Util.getSelectorFromElement(this)\n const selectors = [].slice.call(document.querySelectorAll(selector))\n\n $(selectors).each(function () {\n const $target = $(this)\n const data = $target.data(DATA_KEY)\n const config = data ? 'toggle' : $trigger.data()\n Collapse._jQueryInterface.call($target, config)\n })\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Collapse._jQueryInterface\n$.fn[NAME].Constructor = Collapse\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Collapse._jQueryInterface\n}\n\nexport default Collapse\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.5.3): dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Popper from 'popper.js'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'dropdown'\nconst VERSION = '4.5.3'\nconst DATA_KEY = 'bs.dropdown'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst ESCAPE_KEYCODE = 27 // KeyboardEvent.which value for Escape (Esc) key\nconst SPACE_KEYCODE = 32 // KeyboardEvent.which value for space key\nconst TAB_KEYCODE = 9 // KeyboardEvent.which value for tab key\nconst ARROW_UP_KEYCODE = 38 // KeyboardEvent.which value for up arrow key\nconst ARROW_DOWN_KEYCODE = 40 // KeyboardEvent.which value for down arrow key\nconst RIGHT_MOUSE_BUTTON_WHICH = 3 // MouseEvent.which value for the right button (assuming a right-handed mouse)\nconst REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEYCODE}|${ARROW_DOWN_KEYCODE}|${ESCAPE_KEYCODE}`)\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_CLICK = `click${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_DISABLED = 'disabled'\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_DROPUP = 'dropup'\nconst CLASS_NAME_DROPRIGHT = 'dropright'\nconst CLASS_NAME_DROPLEFT = 'dropleft'\nconst CLASS_NAME_MENURIGHT = 'dropdown-menu-right'\nconst CLASS_NAME_POSITION_STATIC = 'position-static'\n\nconst SELECTOR_DATA_TOGGLE = '[data-toggle=\"dropdown\"]'\nconst SELECTOR_FORM_CHILD = '.dropdown form'\nconst SELECTOR_MENU = '.dropdown-menu'\nconst SELECTOR_NAVBAR_NAV = '.navbar-nav'\nconst SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n\nconst PLACEMENT_TOP = 'top-start'\nconst PLACEMENT_TOPEND = 'top-end'\nconst PLACEMENT_BOTTOM = 'bottom-start'\nconst PLACEMENT_BOTTOMEND = 'bottom-end'\nconst PLACEMENT_RIGHT = 'right-start'\nconst PLACEMENT_LEFT = 'left-start'\n\nconst Default = {\n offset: 0,\n flip: true,\n boundary: 'scrollParent',\n reference: 'toggle',\n display: 'dynamic',\n popperConfig: null\n}\n\nconst DefaultType = {\n offset: '(number|string|function)',\n flip: 'boolean',\n boundary: '(string|element)',\n reference: '(string|element)',\n display: 'string',\n popperConfig: '(null|object)'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Dropdown {\n constructor(element, config) {\n this._element = element\n this._popper = null\n this._config = this._getConfig(config)\n this._menu = this._getMenuElement()\n this._inNavbar = this._detectNavbar()\n\n this._addEventListeners()\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n // Public\n\n toggle() {\n if (this._element.disabled || $(this._element).hasClass(CLASS_NAME_DISABLED)) {\n return\n }\n\n const isActive = $(this._menu).hasClass(CLASS_NAME_SHOW)\n\n Dropdown._clearMenus()\n\n if (isActive) {\n return\n }\n\n this.show(true)\n }\n\n show(usePopper = false) {\n if (this._element.disabled || $(this._element).hasClass(CLASS_NAME_DISABLED) || $(this._menu).hasClass(CLASS_NAME_SHOW)) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n const showEvent = $.Event(EVENT_SHOW, relatedTarget)\n const parent = Dropdown._getParentFromElement(this._element)\n\n $(parent).trigger(showEvent)\n\n if (showEvent.isDefaultPrevented()) {\n return\n }\n\n // Disable totally Popper.js for Dropdown in Navbar\n if (!this._inNavbar && usePopper) {\n /**\n * Check for Popper dependency\n * Popper - https://popper.js.org\n */\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s dropdowns require Popper.js (https://popper.js.org/)')\n }\n\n let referenceElement = this._element\n\n if (this._config.reference === 'parent') {\n referenceElement = parent\n } else if (Util.isElement(this._config.reference)) {\n referenceElement = this._config.reference\n\n // Check if it's jQuery element\n if (typeof this._config.reference.jquery !== 'undefined') {\n referenceElement = this._config.reference[0]\n }\n }\n\n // If boundary is not `scrollParent`, then set position to `static`\n // to allow the menu to \"escape\" the scroll parent's boundaries\n // https://github.com/twbs/bootstrap/issues/24251\n if (this._config.boundary !== 'scrollParent') {\n $(parent).addClass(CLASS_NAME_POSITION_STATIC)\n }\n\n this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig())\n }\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement &&\n $(parent).closest(SELECTOR_NAVBAR_NAV).length === 0) {\n $(document.body).children().on('mouseover', null, $.noop)\n }\n\n this._element.focus()\n this._element.setAttribute('aria-expanded', true)\n\n $(this._menu).toggleClass(CLASS_NAME_SHOW)\n $(parent)\n .toggleClass(CLASS_NAME_SHOW)\n .trigger($.Event(EVENT_SHOWN, relatedTarget))\n }\n\n hide() {\n if (this._element.disabled || $(this._element).hasClass(CLASS_NAME_DISABLED) || !$(this._menu).hasClass(CLASS_NAME_SHOW)) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n const hideEvent = $.Event(EVENT_HIDE, relatedTarget)\n const parent = Dropdown._getParentFromElement(this._element)\n\n $(parent).trigger(hideEvent)\n\n if (hideEvent.isDefaultPrevented()) {\n return\n }\n\n if (this._popper) {\n this._popper.destroy()\n }\n\n $(this._menu).toggleClass(CLASS_NAME_SHOW)\n $(parent)\n .toggleClass(CLASS_NAME_SHOW)\n .trigger($.Event(EVENT_HIDDEN, relatedTarget))\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n $(this._element).off(EVENT_KEY)\n this._element = null\n this._menu = null\n if (this._popper !== null) {\n this._popper.destroy()\n this._popper = null\n }\n }\n\n update() {\n this._inNavbar = this._detectNavbar()\n if (this._popper !== null) {\n this._popper.scheduleUpdate()\n }\n }\n\n // Private\n\n _addEventListeners() {\n $(this._element).on(EVENT_CLICK, event => {\n event.preventDefault()\n event.stopPropagation()\n this.toggle()\n })\n }\n\n _getConfig(config) {\n config = {\n ...this.constructor.Default,\n ...$(this._element).data(),\n ...config\n }\n\n Util.typeCheckConfig(\n NAME,\n config,\n this.constructor.DefaultType\n )\n\n return config\n }\n\n _getMenuElement() {\n if (!this._menu) {\n const parent = Dropdown._getParentFromElement(this._element)\n\n if (parent) {\n this._menu = parent.querySelector(SELECTOR_MENU)\n }\n }\n\n return this._menu\n }\n\n _getPlacement() {\n const $parentDropdown = $(this._element.parentNode)\n let placement = PLACEMENT_BOTTOM\n\n // Handle dropup\n if ($parentDropdown.hasClass(CLASS_NAME_DROPUP)) {\n placement = $(this._menu).hasClass(CLASS_NAME_MENURIGHT) ?\n PLACEMENT_TOPEND :\n PLACEMENT_TOP\n } else if ($parentDropdown.hasClass(CLASS_NAME_DROPRIGHT)) {\n placement = PLACEMENT_RIGHT\n } else if ($parentDropdown.hasClass(CLASS_NAME_DROPLEFT)) {\n placement = PLACEMENT_LEFT\n } else if ($(this._menu).hasClass(CLASS_NAME_MENURIGHT)) {\n placement = PLACEMENT_BOTTOMEND\n }\n\n return placement\n }\n\n _detectNavbar() {\n return $(this._element).closest('.navbar').length > 0\n }\n\n _getOffset() {\n const offset = {}\n\n if (typeof this._config.offset === 'function') {\n offset.fn = data => {\n data.offsets = {\n ...data.offsets,\n ...(this._config.offset(data.offsets, this._element) || {})\n }\n\n return data\n }\n } else {\n offset.offset = this._config.offset\n }\n\n return offset\n }\n\n _getPopperConfig() {\n const popperConfig = {\n placement: this._getPlacement(),\n modifiers: {\n offset: this._getOffset(),\n flip: {\n enabled: this._config.flip\n },\n preventOverflow: {\n boundariesElement: this._config.boundary\n }\n }\n }\n\n // Disable Popper.js if we have a static display\n if (this._config.display === 'static') {\n popperConfig.modifiers.applyStyle = {\n enabled: false\n }\n }\n\n return {\n ...popperConfig,\n ...this._config.popperConfig\n }\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = typeof config === 'object' ? config : null\n\n if (!data) {\n data = new Dropdown(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n\n static _clearMenus(event) {\n if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH ||\n event.type === 'keyup' && event.which !== TAB_KEYCODE)) {\n return\n }\n\n const toggles = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE))\n\n for (let i = 0, len = toggles.length; i < len; i++) {\n const parent = Dropdown._getParentFromElement(toggles[i])\n const context = $(toggles[i]).data(DATA_KEY)\n const relatedTarget = {\n relatedTarget: toggles[i]\n }\n\n if (event && event.type === 'click') {\n relatedTarget.clickEvent = event\n }\n\n if (!context) {\n continue\n }\n\n const dropdownMenu = context._menu\n if (!$(parent).hasClass(CLASS_NAME_SHOW)) {\n continue\n }\n\n if (event && (event.type === 'click' &&\n /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) &&\n $.contains(parent, event.target)) {\n continue\n }\n\n const hideEvent = $.Event(EVENT_HIDE, relatedTarget)\n $(parent).trigger(hideEvent)\n if (hideEvent.isDefaultPrevented()) {\n continue\n }\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n $(document.body).children().off('mouseover', null, $.noop)\n }\n\n toggles[i].setAttribute('aria-expanded', 'false')\n\n if (context._popper) {\n context._popper.destroy()\n }\n\n $(dropdownMenu).removeClass(CLASS_NAME_SHOW)\n $(parent)\n .removeClass(CLASS_NAME_SHOW)\n .trigger($.Event(EVENT_HIDDEN, relatedTarget))\n }\n }\n\n static _getParentFromElement(element) {\n let parent\n const selector = Util.getSelectorFromElement(element)\n\n if (selector) {\n parent = document.querySelector(selector)\n }\n\n return parent || element.parentNode\n }\n\n // eslint-disable-next-line complexity\n static _dataApiKeydownHandler(event) {\n // If not input/textarea:\n // - And not a key in REGEXP_KEYDOWN => not a dropdown command\n // If input/textarea:\n // - If space key => not a dropdown command\n // - If key is other than escape\n // - If key is not up or down => not a dropdown command\n // - If trigger inside the menu => not a dropdown command\n if (/input|textarea/i.test(event.target.tagName) ?\n event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE &&\n (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE ||\n $(event.target).closest(SELECTOR_MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {\n return\n }\n\n if (this.disabled || $(this).hasClass(CLASS_NAME_DISABLED)) {\n return\n }\n\n const parent = Dropdown._getParentFromElement(this)\n const isActive = $(parent).hasClass(CLASS_NAME_SHOW)\n\n if (!isActive && event.which === ESCAPE_KEYCODE) {\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n\n if (!isActive || (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {\n if (event.which === ESCAPE_KEYCODE) {\n $(parent.querySelector(SELECTOR_DATA_TOGGLE)).trigger('focus')\n }\n\n $(this).trigger('click')\n return\n }\n\n const items = [].slice.call(parent.querySelectorAll(SELECTOR_VISIBLE_ITEMS))\n .filter(item => $(item).is(':visible'))\n\n if (items.length === 0) {\n return\n }\n\n let index = items.indexOf(event.target)\n\n if (event.which === ARROW_UP_KEYCODE && index > 0) { // Up\n index--\n }\n\n if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) { // Down\n index++\n }\n\n if (index < 0) {\n index = 0\n }\n\n items[index].focus()\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document)\n .on(EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown._dataApiKeydownHandler)\n .on(EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown._dataApiKeydownHandler)\n .on(`${EVENT_CLICK_DATA_API} ${EVENT_KEYUP_DATA_API}`, Dropdown._clearMenus)\n .on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n event.preventDefault()\n event.stopPropagation()\n Dropdown._jQueryInterface.call($(this), 'toggle')\n })\n .on(EVENT_CLICK_DATA_API, SELECTOR_FORM_CHILD, e => {\n e.stopPropagation()\n })\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Dropdown._jQueryInterface\n$.fn[NAME].Constructor = Dropdown\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Dropdown._jQueryInterface\n}\n\nexport default Dropdown\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.5.3): modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'modal'\nconst VERSION = '4.5.3'\nconst DATA_KEY = 'bs.modal'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst ESCAPE_KEYCODE = 27 // KeyboardEvent.which value for Escape (Esc) key\n\nconst Default = {\n backdrop: true,\n keyboard: true,\n focus: true,\n show: true\n}\n\nconst DefaultType = {\n backdrop: '(boolean|string)',\n keyboard: 'boolean',\n focus: 'boolean',\n show: 'boolean'\n}\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\nconst EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\nconst EVENT_MOUSEUP_DISMISS = `mouseup.dismiss${EVENT_KEY}`\nconst EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SCROLLABLE = 'modal-dialog-scrollable'\nconst CLASS_NAME_SCROLLBAR_MEASURER = 'modal-scrollbar-measure'\nconst CLASS_NAME_BACKDROP = 'modal-backdrop'\nconst CLASS_NAME_OPEN = 'modal-open'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_STATIC = 'modal-static'\n\nconst SELECTOR_DIALOG = '.modal-dialog'\nconst SELECTOR_MODAL_BODY = '.modal-body'\nconst SELECTOR_DATA_TOGGLE = '[data-toggle=\"modal\"]'\nconst SELECTOR_DATA_DISMISS = '[data-dismiss=\"modal\"]'\nconst SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'\nconst SELECTOR_STICKY_CONTENT = '.sticky-top'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Modal {\n constructor(element, config) {\n this._config = this._getConfig(config)\n this._element = element\n this._dialog = element.querySelector(SELECTOR_DIALOG)\n this._backdrop = null\n this._isShown = false\n this._isBodyOverflowing = false\n this._ignoreBackdropClick = false\n this._isTransitioning = false\n this._scrollbarWidth = 0\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return\n }\n\n if ($(this._element).hasClass(CLASS_NAME_FADE)) {\n this._isTransitioning = true\n }\n\n const showEvent = $.Event(EVENT_SHOW, {\n relatedTarget\n })\n\n $(this._element).trigger(showEvent)\n\n if (this._isShown || showEvent.isDefaultPrevented()) {\n return\n }\n\n this._isShown = true\n\n this._checkScrollbar()\n this._setScrollbar()\n\n this._adjustDialog()\n\n this._setEscapeEvent()\n this._setResizeEvent()\n\n $(this._element).on(\n EVENT_CLICK_DISMISS,\n SELECTOR_DATA_DISMISS,\n event => this.hide(event)\n )\n\n $(this._dialog).on(EVENT_MOUSEDOWN_DISMISS, () => {\n $(this._element).one(EVENT_MOUSEUP_DISMISS, event => {\n if ($(event.target).is(this._element)) {\n this._ignoreBackdropClick = true\n }\n })\n })\n\n this._showBackdrop(() => this._showElement(relatedTarget))\n }\n\n hide(event) {\n if (event) {\n event.preventDefault()\n }\n\n if (!this._isShown || this._isTransitioning) {\n return\n }\n\n const hideEvent = $.Event(EVENT_HIDE)\n\n $(this._element).trigger(hideEvent)\n\n if (!this._isShown || hideEvent.isDefaultPrevented()) {\n return\n }\n\n this._isShown = false\n const transition = $(this._element).hasClass(CLASS_NAME_FADE)\n\n if (transition) {\n this._isTransitioning = true\n }\n\n this._setEscapeEvent()\n this._setResizeEvent()\n\n $(document).off(EVENT_FOCUSIN)\n\n $(this._element).removeClass(CLASS_NAME_SHOW)\n\n $(this._element).off(EVENT_CLICK_DISMISS)\n $(this._dialog).off(EVENT_MOUSEDOWN_DISMISS)\n\n if (transition) {\n const transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n $(this._element)\n .one(Util.TRANSITION_END, event => this._hideModal(event))\n .emulateTransitionEnd(transitionDuration)\n } else {\n this._hideModal()\n }\n }\n\n dispose() {\n [window, this._element, this._dialog]\n .forEach(htmlElement => $(htmlElement).off(EVENT_KEY))\n\n /**\n * `document` has 2 events `EVENT_FOCUSIN` and `EVENT_CLICK_DATA_API`\n * Do not move `document` in `htmlElements` array\n * It will remove `EVENT_CLICK_DATA_API` event that should remain\n */\n $(document).off(EVENT_FOCUSIN)\n\n $.removeData(this._element, DATA_KEY)\n\n this._config = null\n this._element = null\n this._dialog = null\n this._backdrop = null\n this._isShown = null\n this._isBodyOverflowing = null\n this._ignoreBackdropClick = null\n this._isTransitioning = null\n this._scrollbarWidth = null\n }\n\n handleUpdate() {\n this._adjustDialog()\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...config\n }\n Util.typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _triggerBackdropTransition() {\n if (this._config.backdrop === 'static') {\n const hideEventPrevented = $.Event(EVENT_HIDE_PREVENTED)\n\n $(this._element).trigger(hideEventPrevented)\n if (hideEventPrevented.isDefaultPrevented()) {\n return\n }\n\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n\n if (!isModalOverflowing) {\n this._element.style.overflowY = 'hidden'\n }\n\n this._element.classList.add(CLASS_NAME_STATIC)\n\n const modalTransitionDuration = Util.getTransitionDurationFromElement(this._dialog)\n $(this._element).off(Util.TRANSITION_END)\n\n $(this._element).one(Util.TRANSITION_END, () => {\n this._element.classList.remove(CLASS_NAME_STATIC)\n if (!isModalOverflowing) {\n $(this._element).one(Util.TRANSITION_END, () => {\n this._element.style.overflowY = ''\n })\n .emulateTransitionEnd(this._element, modalTransitionDuration)\n }\n })\n .emulateTransitionEnd(modalTransitionDuration)\n this._element.focus()\n } else {\n this.hide()\n }\n }\n\n _showElement(relatedTarget) {\n const transition = $(this._element).hasClass(CLASS_NAME_FADE)\n const modalBody = this._dialog ? this._dialog.querySelector(SELECTOR_MODAL_BODY) : null\n\n if (!this._element.parentNode ||\n this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {\n // Don't move modal's DOM position\n document.body.appendChild(this._element)\n }\n\n this._element.style.display = 'block'\n this._element.removeAttribute('aria-hidden')\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n\n if ($(this._dialog).hasClass(CLASS_NAME_SCROLLABLE) && modalBody) {\n modalBody.scrollTop = 0\n } else {\n this._element.scrollTop = 0\n }\n\n if (transition) {\n Util.reflow(this._element)\n }\n\n $(this._element).addClass(CLASS_NAME_SHOW)\n\n if (this._config.focus) {\n this._enforceFocus()\n }\n\n const shownEvent = $.Event(EVENT_SHOWN, {\n relatedTarget\n })\n\n const transitionComplete = () => {\n if (this._config.focus) {\n this._element.focus()\n }\n\n this._isTransitioning = false\n $(this._element).trigger(shownEvent)\n }\n\n if (transition) {\n const transitionDuration = Util.getTransitionDurationFromElement(this._dialog)\n\n $(this._dialog)\n .one(Util.TRANSITION_END, transitionComplete)\n .emulateTransitionEnd(transitionDuration)\n } else {\n transitionComplete()\n }\n }\n\n _enforceFocus() {\n $(document)\n .off(EVENT_FOCUSIN) // Guard against infinite focus loop\n .on(EVENT_FOCUSIN, event => {\n if (document !== event.target &&\n this._element !== event.target &&\n $(this._element).has(event.target).length === 0) {\n this._element.focus()\n }\n })\n }\n\n _setEscapeEvent() {\n if (this._isShown) {\n $(this._element).on(EVENT_KEYDOWN_DISMISS, event => {\n if (this._config.keyboard && event.which === ESCAPE_KEYCODE) {\n event.preventDefault()\n this.hide()\n } else if (!this._config.keyboard && event.which === ESCAPE_KEYCODE) {\n this._triggerBackdropTransition()\n }\n })\n } else if (!this._isShown) {\n $(this._element).off(EVENT_KEYDOWN_DISMISS)\n }\n }\n\n _setResizeEvent() {\n if (this._isShown) {\n $(window).on(EVENT_RESIZE, event => this.handleUpdate(event))\n } else {\n $(window).off(EVENT_RESIZE)\n }\n }\n\n _hideModal() {\n this._element.style.display = 'none'\n this._element.setAttribute('aria-hidden', true)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n this._isTransitioning = false\n this._showBackdrop(() => {\n $(document.body).removeClass(CLASS_NAME_OPEN)\n this._resetAdjustments()\n this._resetScrollbar()\n $(this._element).trigger(EVENT_HIDDEN)\n })\n }\n\n _removeBackdrop() {\n if (this._backdrop) {\n $(this._backdrop).remove()\n this._backdrop = null\n }\n }\n\n _showBackdrop(callback) {\n const animate = $(this._element).hasClass(CLASS_NAME_FADE) ?\n CLASS_NAME_FADE : ''\n\n if (this._isShown && this._config.backdrop) {\n this._backdrop = document.createElement('div')\n this._backdrop.className = CLASS_NAME_BACKDROP\n\n if (animate) {\n this._backdrop.classList.add(animate)\n }\n\n $(this._backdrop).appendTo(document.body)\n\n $(this._element).on(EVENT_CLICK_DISMISS, event => {\n if (this._ignoreBackdropClick) {\n this._ignoreBackdropClick = false\n return\n }\n\n if (event.target !== event.currentTarget) {\n return\n }\n\n this._triggerBackdropTransition()\n })\n\n if (animate) {\n Util.reflow(this._backdrop)\n }\n\n $(this._backdrop).addClass(CLASS_NAME_SHOW)\n\n if (!callback) {\n return\n }\n\n if (!animate) {\n callback()\n return\n }\n\n const backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop)\n\n $(this._backdrop)\n .one(Util.TRANSITION_END, callback)\n .emulateTransitionEnd(backdropTransitionDuration)\n } else if (!this._isShown && this._backdrop) {\n $(this._backdrop).removeClass(CLASS_NAME_SHOW)\n\n const callbackRemove = () => {\n this._removeBackdrop()\n if (callback) {\n callback()\n }\n }\n\n if ($(this._element).hasClass(CLASS_NAME_FADE)) {\n const backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop)\n\n $(this._backdrop)\n .one(Util.TRANSITION_END, callbackRemove)\n .emulateTransitionEnd(backdropTransitionDuration)\n } else {\n callbackRemove()\n }\n } else if (callback) {\n callback()\n }\n }\n\n // ----------------------------------------------------------------------\n // the following methods are used to handle overflowing modals\n // todo (fat): these should probably be refactored out of modal.js\n // ----------------------------------------------------------------------\n\n _adjustDialog() {\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n\n if (!this._isBodyOverflowing && isModalOverflowing) {\n this._element.style.paddingLeft = `${this._scrollbarWidth}px`\n }\n\n if (this._isBodyOverflowing && !isModalOverflowing) {\n this._element.style.paddingRight = `${this._scrollbarWidth}px`\n }\n }\n\n _resetAdjustments() {\n this._element.style.paddingLeft = ''\n this._element.style.paddingRight = ''\n }\n\n _checkScrollbar() {\n const rect = document.body.getBoundingClientRect()\n this._isBodyOverflowing = Math.round(rect.left + rect.right) < window.innerWidth\n this._scrollbarWidth = this._getScrollbarWidth()\n }\n\n _setScrollbar() {\n if (this._isBodyOverflowing) {\n // Note: DOMNode.style.paddingRight returns the actual value or '' if not set\n // while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set\n const fixedContent = [].slice.call(document.querySelectorAll(SELECTOR_FIXED_CONTENT))\n const stickyContent = [].slice.call(document.querySelectorAll(SELECTOR_STICKY_CONTENT))\n\n // Adjust fixed content padding\n $(fixedContent).each((index, element) => {\n const actualPadding = element.style.paddingRight\n const calculatedPadding = $(element).css('padding-right')\n $(element)\n .data('padding-right', actualPadding)\n .css('padding-right', `${parseFloat(calculatedPadding) + this._scrollbarWidth}px`)\n })\n\n // Adjust sticky content margin\n $(stickyContent).each((index, element) => {\n const actualMargin = element.style.marginRight\n const calculatedMargin = $(element).css('margin-right')\n $(element)\n .data('margin-right', actualMargin)\n .css('margin-right', `${parseFloat(calculatedMargin) - this._scrollbarWidth}px`)\n })\n\n // Adjust body padding\n const actualPadding = document.body.style.paddingRight\n const calculatedPadding = $(document.body).css('padding-right')\n $(document.body)\n .data('padding-right', actualPadding)\n .css('padding-right', `${parseFloat(calculatedPadding) + this._scrollbarWidth}px`)\n }\n\n $(document.body).addClass(CLASS_NAME_OPEN)\n }\n\n _resetScrollbar() {\n // Restore fixed content padding\n const fixedContent = [].slice.call(document.querySelectorAll(SELECTOR_FIXED_CONTENT))\n $(fixedContent).each((index, element) => {\n const padding = $(element).data('padding-right')\n $(element).removeData('padding-right')\n element.style.paddingRight = padding ? padding : ''\n })\n\n // Restore sticky content\n const elements = [].slice.call(document.querySelectorAll(`${SELECTOR_STICKY_CONTENT}`))\n $(elements).each((index, element) => {\n const margin = $(element).data('margin-right')\n if (typeof margin !== 'undefined') {\n $(element).css('margin-right', margin).removeData('margin-right')\n }\n })\n\n // Restore body padding\n const padding = $(document.body).data('padding-right')\n $(document.body).removeData('padding-right')\n document.body.style.paddingRight = padding ? padding : ''\n }\n\n _getScrollbarWidth() { // thx d.walsh\n const scrollDiv = document.createElement('div')\n scrollDiv.className = CLASS_NAME_SCROLLBAR_MEASURER\n document.body.appendChild(scrollDiv)\n const scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth\n document.body.removeChild(scrollDiv)\n return scrollbarWidth\n }\n\n // Static\n\n static _jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = {\n ...Default,\n ...$(this).data(),\n ...(typeof config === 'object' && config ? config : {})\n }\n\n if (!data) {\n data = new Modal(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](relatedTarget)\n } else if (_config.show) {\n data.show(relatedTarget)\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document).on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n let target\n const selector = Util.getSelectorFromElement(this)\n\n if (selector) {\n target = document.querySelector(selector)\n }\n\n const config = $(target).data(DATA_KEY) ?\n 'toggle' : {\n ...$(target).data(),\n ...$(this).data()\n }\n\n if (this.tagName === 'A' || this.tagName === 'AREA') {\n event.preventDefault()\n }\n\n const $target = $(target).one(EVENT_SHOW, showEvent => {\n if (showEvent.isDefaultPrevented()) {\n // Only register focus restorer if modal will actually get shown\n return\n }\n\n $target.one(EVENT_HIDDEN, () => {\n if ($(this).is(':visible')) {\n this.focus()\n }\n })\n })\n\n Modal._jQueryInterface.call($(target), config, this)\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Modal._jQueryInterface\n$.fn[NAME].Constructor = Modal\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Modal._jQueryInterface\n}\n\nexport default Modal\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.5.3): tools/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst uriAttrs = [\n 'background',\n 'cite',\n 'href',\n 'itemtype',\n 'longdesc',\n 'poster',\n 'src',\n 'xlink:href'\n]\n\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i\n\nexport const DefaultWhitelist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n div: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n}\n\n/**\n * A pattern that recognizes a commonly useful subset of URLs that are safe.\n *\n * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n */\nconst SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^#&/:?]*(?:[#/?]|$))/gi\n\n/**\n * A pattern that matches safe data URLs. Only matches image, video and audio types.\n *\n * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n */\nconst DATA_URL_PATTERN = /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[\\d+/a-z]+=*$/i\n\nfunction allowedAttribute(attr, allowedAttributeList) {\n const attrName = attr.nodeName.toLowerCase()\n\n if (allowedAttributeList.indexOf(attrName) !== -1) {\n if (uriAttrs.indexOf(attrName) !== -1) {\n return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN))\n }\n\n return true\n }\n\n const regExp = allowedAttributeList.filter(attrRegex => attrRegex instanceof RegExp)\n\n // Check if a regular expression validates the attribute.\n for (let i = 0, len = regExp.length; i < len; i++) {\n if (attrName.match(regExp[i])) {\n return true\n }\n }\n\n return false\n}\n\nexport function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {\n if (unsafeHtml.length === 0) {\n return unsafeHtml\n }\n\n if (sanitizeFn && typeof sanitizeFn === 'function') {\n return sanitizeFn(unsafeHtml)\n }\n\n const domParser = new window.DOMParser()\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html')\n const whitelistKeys = Object.keys(whiteList)\n const elements = [].slice.call(createdDocument.body.querySelectorAll('*'))\n\n for (let i = 0, len = elements.length; i < len; i++) {\n const el = elements[i]\n const elName = el.nodeName.toLowerCase()\n\n if (whitelistKeys.indexOf(el.nodeName.toLowerCase()) === -1) {\n el.parentNode.removeChild(el)\n\n continue\n }\n\n const attributeList = [].slice.call(el.attributes)\n const whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || [])\n\n attributeList.forEach(attr => {\n if (!allowedAttribute(attr, whitelistedAttributes)) {\n el.removeAttribute(attr.nodeName)\n }\n })\n }\n\n return createdDocument.body.innerHTML\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.5.3): tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n DefaultWhitelist,\n sanitizeHtml\n} from './tools/sanitizer'\nimport $ from 'jquery'\nimport Popper from 'popper.js'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'tooltip'\nconst VERSION = '4.5.3'\nconst DATA_KEY = 'bs.tooltip'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst CLASS_PREFIX = 'bs-tooltip'\nconst BSCLS_PREFIX_REGEX = new RegExp(`(^|\\\\s)${CLASS_PREFIX}\\\\S+`, 'g')\nconst DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn']\n\nconst DefaultType = {\n animation: 'boolean',\n template: 'string',\n title: '(string|element|function)',\n trigger: 'string',\n delay: '(number|object)',\n html: 'boolean',\n selector: '(string|boolean)',\n placement: '(string|function)',\n offset: '(number|string|function)',\n container: '(string|element|boolean)',\n fallbackPlacement: '(string|array)',\n boundary: '(string|element)',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n whiteList: 'object',\n popperConfig: '(null|object)'\n}\n\nconst AttachmentMap = {\n AUTO: 'auto',\n TOP: 'top',\n RIGHT: 'right',\n BOTTOM: 'bottom',\n LEFT: 'left'\n}\n\nconst Default = {\n animation: true,\n template: '
' +\n '
' +\n '
',\n trigger: 'hover focus',\n title: '',\n delay: 0,\n html: false,\n selector: false,\n placement: 'top',\n offset: 0,\n container: false,\n fallbackPlacement: 'flip',\n boundary: 'scrollParent',\n sanitize: true,\n sanitizeFn: null,\n whiteList: DefaultWhitelist,\n popperConfig: null\n}\n\nconst HOVER_STATE_SHOW = 'show'\nconst HOVER_STATE_OUT = 'out'\n\nconst Event = {\n HIDE: `hide${EVENT_KEY}`,\n HIDDEN: `hidden${EVENT_KEY}`,\n SHOW: `show${EVENT_KEY}`,\n SHOWN: `shown${EVENT_KEY}`,\n INSERTED: `inserted${EVENT_KEY}`,\n CLICK: `click${EVENT_KEY}`,\n FOCUSIN: `focusin${EVENT_KEY}`,\n FOCUSOUT: `focusout${EVENT_KEY}`,\n MOUSEENTER: `mouseenter${EVENT_KEY}`,\n MOUSELEAVE: `mouseleave${EVENT_KEY}`\n}\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\nconst SELECTOR_TOOLTIP_INNER = '.tooltip-inner'\nconst SELECTOR_ARROW = '.arrow'\n\nconst TRIGGER_HOVER = 'hover'\nconst TRIGGER_FOCUS = 'focus'\nconst TRIGGER_CLICK = 'click'\nconst TRIGGER_MANUAL = 'manual'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Tooltip {\n constructor(element, config) {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s tooltips require Popper.js (https://popper.js.org/)')\n }\n\n // private\n this._isEnabled = true\n this._timeout = 0\n this._hoverState = ''\n this._activeTrigger = {}\n this._popper = null\n\n // Protected\n this.element = element\n this.config = this._getConfig(config)\n this.tip = null\n\n this._setListeners()\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n static get DATA_KEY() {\n return DATA_KEY\n }\n\n static get Event() {\n return Event\n }\n\n static get EVENT_KEY() {\n return EVENT_KEY\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n // Public\n\n enable() {\n this._isEnabled = true\n }\n\n disable() {\n this._isEnabled = false\n }\n\n toggleEnabled() {\n this._isEnabled = !this._isEnabled\n }\n\n toggle(event) {\n if (!this._isEnabled) {\n return\n }\n\n if (event) {\n const dataKey = this.constructor.DATA_KEY\n let context = $(event.currentTarget).data(dataKey)\n\n if (!context) {\n context = new this.constructor(\n event.currentTarget,\n this._getDelegateConfig()\n )\n $(event.currentTarget).data(dataKey, context)\n }\n\n context._activeTrigger.click = !context._activeTrigger.click\n\n if (context._isWithActiveTrigger()) {\n context._enter(null, context)\n } else {\n context._leave(null, context)\n }\n } else {\n if ($(this.getTipElement()).hasClass(CLASS_NAME_SHOW)) {\n this._leave(null, this)\n return\n }\n\n this._enter(null, this)\n }\n }\n\n dispose() {\n clearTimeout(this._timeout)\n\n $.removeData(this.element, this.constructor.DATA_KEY)\n\n $(this.element).off(this.constructor.EVENT_KEY)\n $(this.element).closest('.modal').off('hide.bs.modal', this._hideModalHandler)\n\n if (this.tip) {\n $(this.tip).remove()\n }\n\n this._isEnabled = null\n this._timeout = null\n this._hoverState = null\n this._activeTrigger = null\n if (this._popper) {\n this._popper.destroy()\n }\n\n this._popper = null\n this.element = null\n this.config = null\n this.tip = null\n }\n\n show() {\n if ($(this.element).css('display') === 'none') {\n throw new Error('Please use show on visible elements')\n }\n\n const showEvent = $.Event(this.constructor.Event.SHOW)\n if (this.isWithContent() && this._isEnabled) {\n $(this.element).trigger(showEvent)\n\n const shadowRoot = Util.findShadowRoot(this.element)\n const isInTheDom = $.contains(\n shadowRoot !== null ? shadowRoot : this.element.ownerDocument.documentElement,\n this.element\n )\n\n if (showEvent.isDefaultPrevented() || !isInTheDom) {\n return\n }\n\n const tip = this.getTipElement()\n const tipId = Util.getUID(this.constructor.NAME)\n\n tip.setAttribute('id', tipId)\n this.element.setAttribute('aria-describedby', tipId)\n\n this.setContent()\n\n if (this.config.animation) {\n $(tip).addClass(CLASS_NAME_FADE)\n }\n\n const placement = typeof this.config.placement === 'function' ?\n this.config.placement.call(this, tip, this.element) :\n this.config.placement\n\n const attachment = this._getAttachment(placement)\n this.addAttachmentClass(attachment)\n\n const container = this._getContainer()\n $(tip).data(this.constructor.DATA_KEY, this)\n\n if (!$.contains(this.element.ownerDocument.documentElement, this.tip)) {\n $(tip).appendTo(container)\n }\n\n $(this.element).trigger(this.constructor.Event.INSERTED)\n\n this._popper = new Popper(this.element, tip, this._getPopperConfig(attachment))\n\n $(tip).addClass(CLASS_NAME_SHOW)\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement) {\n $(document.body).children().on('mouseover', null, $.noop)\n }\n\n const complete = () => {\n if (this.config.animation) {\n this._fixTransition()\n }\n\n const prevHoverState = this._hoverState\n this._hoverState = null\n\n $(this.element).trigger(this.constructor.Event.SHOWN)\n\n if (prevHoverState === HOVER_STATE_OUT) {\n this._leave(null, this)\n }\n }\n\n if ($(this.tip).hasClass(CLASS_NAME_FADE)) {\n const transitionDuration = Util.getTransitionDurationFromElement(this.tip)\n\n $(this.tip)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n } else {\n complete()\n }\n }\n }\n\n hide(callback) {\n const tip = this.getTipElement()\n const hideEvent = $.Event(this.constructor.Event.HIDE)\n const complete = () => {\n if (this._hoverState !== HOVER_STATE_SHOW && tip.parentNode) {\n tip.parentNode.removeChild(tip)\n }\n\n this._cleanTipClass()\n this.element.removeAttribute('aria-describedby')\n $(this.element).trigger(this.constructor.Event.HIDDEN)\n if (this._popper !== null) {\n this._popper.destroy()\n }\n\n if (callback) {\n callback()\n }\n }\n\n $(this.element).trigger(hideEvent)\n\n if (hideEvent.isDefaultPrevented()) {\n return\n }\n\n $(tip).removeClass(CLASS_NAME_SHOW)\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n $(document.body).children().off('mouseover', null, $.noop)\n }\n\n this._activeTrigger[TRIGGER_CLICK] = false\n this._activeTrigger[TRIGGER_FOCUS] = false\n this._activeTrigger[TRIGGER_HOVER] = false\n\n if ($(this.tip).hasClass(CLASS_NAME_FADE)) {\n const transitionDuration = Util.getTransitionDurationFromElement(tip)\n\n $(tip)\n .one(Util.TRANSITION_END, complete)\n .emulateTransitionEnd(transitionDuration)\n } else {\n complete()\n }\n\n this._hoverState = ''\n }\n\n update() {\n if (this._popper !== null) {\n this._popper.scheduleUpdate()\n }\n }\n\n // Protected\n\n isWithContent() {\n return Boolean(this.getTitle())\n }\n\n addAttachmentClass(attachment) {\n $(this.getTipElement()).addClass(`${CLASS_PREFIX}-${attachment}`)\n }\n\n getTipElement() {\n this.tip = this.tip || $(this.config.template)[0]\n return this.tip\n }\n\n setContent() {\n const tip = this.getTipElement()\n this.setElementContent($(tip.querySelectorAll(SELECTOR_TOOLTIP_INNER)), this.getTitle())\n $(tip).removeClass(`${CLASS_NAME_FADE} ${CLASS_NAME_SHOW}`)\n }\n\n setElementContent($element, content) {\n if (typeof content === 'object' && (content.nodeType || content.jquery)) {\n // Content is a DOM node or a jQuery\n if (this.config.html) {\n if (!$(content).parent().is($element)) {\n $element.empty().append(content)\n }\n } else {\n $element.text($(content).text())\n }\n\n return\n }\n\n if (this.config.html) {\n if (this.config.sanitize) {\n content = sanitizeHtml(content, this.config.whiteList, this.config.sanitizeFn)\n }\n\n $element.html(content)\n } else {\n $element.text(content)\n }\n }\n\n getTitle() {\n let title = this.element.getAttribute('data-original-title')\n\n if (!title) {\n title = typeof this.config.title === 'function' ?\n this.config.title.call(this.element) :\n this.config.title\n }\n\n return title\n }\n\n // Private\n\n _getPopperConfig(attachment) {\n const defaultBsConfig = {\n placement: attachment,\n modifiers: {\n offset: this._getOffset(),\n flip: {\n behavior: this.config.fallbackPlacement\n },\n arrow: {\n element: SELECTOR_ARROW\n },\n preventOverflow: {\n boundariesElement: this.config.boundary\n }\n },\n onCreate: data => {\n if (data.originalPlacement !== data.placement) {\n this._handlePopperPlacementChange(data)\n }\n },\n onUpdate: data => this._handlePopperPlacementChange(data)\n }\n\n return {\n ...defaultBsConfig,\n ...this.config.popperConfig\n }\n }\n\n _getOffset() {\n const offset = {}\n\n if (typeof this.config.offset === 'function') {\n offset.fn = data => {\n data.offsets = {\n ...data.offsets,\n ...(this.config.offset(data.offsets, this.element) || {})\n }\n\n return data\n }\n } else {\n offset.offset = this.config.offset\n }\n\n return offset\n }\n\n _getContainer() {\n if (this.config.container === false) {\n return document.body\n }\n\n if (Util.isElement(this.config.container)) {\n return $(this.config.container)\n }\n\n return $(document).find(this.config.container)\n }\n\n _getAttachment(placement) {\n return AttachmentMap[placement.toUpperCase()]\n }\n\n _setListeners() {\n const triggers = this.config.trigger.split(' ')\n\n triggers.forEach(trigger => {\n if (trigger === 'click') {\n $(this.element).on(\n this.constructor.Event.CLICK,\n this.config.selector,\n event => this.toggle(event)\n )\n } else if (trigger !== TRIGGER_MANUAL) {\n const eventIn = trigger === TRIGGER_HOVER ?\n this.constructor.Event.MOUSEENTER :\n this.constructor.Event.FOCUSIN\n const eventOut = trigger === TRIGGER_HOVER ?\n this.constructor.Event.MOUSELEAVE :\n this.constructor.Event.FOCUSOUT\n\n $(this.element)\n .on(eventIn, this.config.selector, event => this._enter(event))\n .on(eventOut, this.config.selector, event => this._leave(event))\n }\n })\n\n this._hideModalHandler = () => {\n if (this.element) {\n this.hide()\n }\n }\n\n $(this.element).closest('.modal').on('hide.bs.modal', this._hideModalHandler)\n\n if (this.config.selector) {\n this.config = {\n ...this.config,\n trigger: 'manual',\n selector: ''\n }\n } else {\n this._fixTitle()\n }\n }\n\n _fixTitle() {\n const titleType = typeof this.element.getAttribute('data-original-title')\n\n if (this.element.getAttribute('title') || titleType !== 'string') {\n this.element.setAttribute(\n 'data-original-title',\n this.element.getAttribute('title') || ''\n )\n\n this.element.setAttribute('title', '')\n }\n }\n\n _enter(event, context) {\n const dataKey = this.constructor.DATA_KEY\n context = context || $(event.currentTarget).data(dataKey)\n\n if (!context) {\n context = new this.constructor(\n event.currentTarget,\n this._getDelegateConfig()\n )\n $(event.currentTarget).data(dataKey, context)\n }\n\n if (event) {\n context._activeTrigger[\n event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER\n ] = true\n }\n\n if ($(context.getTipElement()).hasClass(CLASS_NAME_SHOW) || context._hoverState === HOVER_STATE_SHOW) {\n context._hoverState = HOVER_STATE_SHOW\n return\n }\n\n clearTimeout(context._timeout)\n\n context._hoverState = HOVER_STATE_SHOW\n\n if (!context.config.delay || !context.config.delay.show) {\n context.show()\n return\n }\n\n context._timeout = setTimeout(() => {\n if (context._hoverState === HOVER_STATE_SHOW) {\n context.show()\n }\n }, context.config.delay.show)\n }\n\n _leave(event, context) {\n const dataKey = this.constructor.DATA_KEY\n context = context || $(event.currentTarget).data(dataKey)\n\n if (!context) {\n context = new this.constructor(\n event.currentTarget,\n this._getDelegateConfig()\n )\n $(event.currentTarget).data(dataKey, context)\n }\n\n if (event) {\n context._activeTrigger[\n event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER\n ] = false\n }\n\n if (context._isWithActiveTrigger()) {\n return\n }\n\n clearTimeout(context._timeout)\n\n context._hoverState = HOVER_STATE_OUT\n\n if (!context.config.delay || !context.config.delay.hide) {\n context.hide()\n return\n }\n\n context._timeout = setTimeout(() => {\n if (context._hoverState === HOVER_STATE_OUT) {\n context.hide()\n }\n }, context.config.delay.hide)\n }\n\n _isWithActiveTrigger() {\n for (const trigger in this._activeTrigger) {\n if (this._activeTrigger[trigger]) {\n return true\n }\n }\n\n return false\n }\n\n _getConfig(config) {\n const dataAttributes = $(this.element).data()\n\n Object.keys(dataAttributes)\n .forEach(dataAttr => {\n if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) {\n delete dataAttributes[dataAttr]\n }\n })\n\n config = {\n ...this.constructor.Default,\n ...dataAttributes,\n ...(typeof config === 'object' && config ? config : {})\n }\n\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n }\n }\n\n if (typeof config.title === 'number') {\n config.title = config.title.toString()\n }\n\n if (typeof config.content === 'number') {\n config.content = config.content.toString()\n }\n\n Util.typeCheckConfig(\n NAME,\n config,\n this.constructor.DefaultType\n )\n\n if (config.sanitize) {\n config.template = sanitizeHtml(config.template, config.whiteList, config.sanitizeFn)\n }\n\n return config\n }\n\n _getDelegateConfig() {\n const config = {}\n\n if (this.config) {\n for (const key in this.config) {\n if (this.constructor.Default[key] !== this.config[key]) {\n config[key] = this.config[key]\n }\n }\n }\n\n return config\n }\n\n _cleanTipClass() {\n const $tip = $(this.getTipElement())\n const tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX)\n if (tabClass !== null && tabClass.length) {\n $tip.removeClass(tabClass.join(''))\n }\n }\n\n _handlePopperPlacementChange(popperData) {\n this.tip = popperData.instance.popper\n this._cleanTipClass()\n this.addAttachmentClass(this._getAttachment(popperData.placement))\n }\n\n _fixTransition() {\n const tip = this.getTipElement()\n const initConfigAnimation = this.config.animation\n\n if (tip.getAttribute('x-placement') !== null) {\n return\n }\n\n $(tip).removeClass(CLASS_NAME_FADE)\n this.config.animation = false\n this.hide()\n this.show()\n this.config.animation = initConfigAnimation\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n const $element = $(this)\n let data = $element.data(DATA_KEY)\n const _config = typeof config === 'object' && config\n\n if (!data && /dispose|hide/.test(config)) {\n return\n }\n\n if (!data) {\n data = new Tooltip(this, _config)\n $element.data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Tooltip._jQueryInterface\n$.fn[NAME].Constructor = Tooltip\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Tooltip._jQueryInterface\n}\n\nexport default Tooltip\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.5.3): popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Tooltip from './tooltip'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'popover'\nconst VERSION = '4.5.3'\nconst DATA_KEY = 'bs.popover'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst CLASS_PREFIX = 'bs-popover'\nconst BSCLS_PREFIX_REGEX = new RegExp(`(^|\\\\s)${CLASS_PREFIX}\\\\S+`, 'g')\n\nconst Default = {\n ...Tooltip.Default,\n placement: 'right',\n trigger: 'click',\n content: '',\n template: '
' +\n '
' +\n '

' +\n '
'\n}\n\nconst DefaultType = {\n ...Tooltip.DefaultType,\n content: '(string|element|function)'\n}\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\nconst SELECTOR_TITLE = '.popover-header'\nconst SELECTOR_CONTENT = '.popover-body'\n\nconst Event = {\n HIDE: `hide${EVENT_KEY}`,\n HIDDEN: `hidden${EVENT_KEY}`,\n SHOW: `show${EVENT_KEY}`,\n SHOWN: `shown${EVENT_KEY}`,\n INSERTED: `inserted${EVENT_KEY}`,\n CLICK: `click${EVENT_KEY}`,\n FOCUSIN: `focusin${EVENT_KEY}`,\n FOCUSOUT: `focusout${EVENT_KEY}`,\n MOUSEENTER: `mouseenter${EVENT_KEY}`,\n MOUSELEAVE: `mouseleave${EVENT_KEY}`\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Popover extends Tooltip {\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n static get DATA_KEY() {\n return DATA_KEY\n }\n\n static get Event() {\n return Event\n }\n\n static get EVENT_KEY() {\n return EVENT_KEY\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n // Overrides\n\n isWithContent() {\n return this.getTitle() || this._getContent()\n }\n\n addAttachmentClass(attachment) {\n $(this.getTipElement()).addClass(`${CLASS_PREFIX}-${attachment}`)\n }\n\n getTipElement() {\n this.tip = this.tip || $(this.config.template)[0]\n return this.tip\n }\n\n setContent() {\n const $tip = $(this.getTipElement())\n\n // We use append for html objects to maintain js events\n this.setElementContent($tip.find(SELECTOR_TITLE), this.getTitle())\n let content = this._getContent()\n if (typeof content === 'function') {\n content = content.call(this.element)\n }\n\n this.setElementContent($tip.find(SELECTOR_CONTENT), content)\n\n $tip.removeClass(`${CLASS_NAME_FADE} ${CLASS_NAME_SHOW}`)\n }\n\n // Private\n\n _getContent() {\n return this.element.getAttribute('data-content') ||\n this.config.content\n }\n\n _cleanTipClass() {\n const $tip = $(this.getTipElement())\n const tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX)\n if (tabClass !== null && tabClass.length > 0) {\n $tip.removeClass(tabClass.join(''))\n }\n }\n\n // Static\n\n static _jQueryInterface(config) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = typeof config === 'object' ? config : null\n\n if (!data && /dispose|hide/.test(config)) {\n return\n }\n\n if (!data) {\n data = new Popover(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Popover._jQueryInterface\n$.fn[NAME].Constructor = Popover\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Popover._jQueryInterface\n}\n\nexport default Popover\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.5.3): scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'scrollspy'\nconst VERSION = '4.5.3'\nconst DATA_KEY = 'bs.scrollspy'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst Default = {\n offset: 10,\n method: 'auto',\n target: ''\n}\n\nconst DefaultType = {\n offset: 'number',\n method: 'string',\n target: '(string|element)'\n}\n\nconst EVENT_ACTIVATE = `activate${EVENT_KEY}`\nconst EVENT_SCROLL = `scroll${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'\nconst CLASS_NAME_ACTIVE = 'active'\n\nconst SELECTOR_DATA_SPY = '[data-spy=\"scroll\"]'\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'\nconst SELECTOR_NAV_LINKS = '.nav-link'\nconst SELECTOR_NAV_ITEMS = '.nav-item'\nconst SELECTOR_LIST_ITEMS = '.list-group-item'\nconst SELECTOR_DROPDOWN = '.dropdown'\nconst SELECTOR_DROPDOWN_ITEMS = '.dropdown-item'\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\n\nconst METHOD_OFFSET = 'offset'\nconst METHOD_POSITION = 'position'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass ScrollSpy {\n constructor(element, config) {\n this._element = element\n this._scrollElement = element.tagName === 'BODY' ? window : element\n this._config = this._getConfig(config)\n this._selector = `${this._config.target} ${SELECTOR_NAV_LINKS},` +\n `${this._config.target} ${SELECTOR_LIST_ITEMS},` +\n `${this._config.target} ${SELECTOR_DROPDOWN_ITEMS}`\n this._offsets = []\n this._targets = []\n this._activeTarget = null\n this._scrollHeight = 0\n\n $(this._scrollElement).on(EVENT_SCROLL, event => this._process(event))\n\n this.refresh()\n this._process()\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n refresh() {\n const autoMethod = this._scrollElement === this._scrollElement.window ?\n METHOD_OFFSET : METHOD_POSITION\n\n const offsetMethod = this._config.method === 'auto' ?\n autoMethod : this._config.method\n\n const offsetBase = offsetMethod === METHOD_POSITION ?\n this._getScrollTop() : 0\n\n this._offsets = []\n this._targets = []\n\n this._scrollHeight = this._getScrollHeight()\n\n const targets = [].slice.call(document.querySelectorAll(this._selector))\n\n targets\n .map(element => {\n let target\n const targetSelector = Util.getSelectorFromElement(element)\n\n if (targetSelector) {\n target = document.querySelector(targetSelector)\n }\n\n if (target) {\n const targetBCR = target.getBoundingClientRect()\n if (targetBCR.width || targetBCR.height) {\n // TODO (fat): remove sketch reliance on jQuery position/offset\n return [\n $(target)[offsetMethod]().top + offsetBase,\n targetSelector\n ]\n }\n }\n\n return null\n })\n .filter(item => item)\n .sort((a, b) => a[0] - b[0])\n .forEach(item => {\n this._offsets.push(item[0])\n this._targets.push(item[1])\n })\n }\n\n dispose() {\n $.removeData(this._element, DATA_KEY)\n $(this._scrollElement).off(EVENT_KEY)\n\n this._element = null\n this._scrollElement = null\n this._config = null\n this._selector = null\n this._offsets = null\n this._targets = null\n this._activeTarget = null\n this._scrollHeight = null\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...(typeof config === 'object' && config ? config : {})\n }\n\n if (typeof config.target !== 'string' && Util.isElement(config.target)) {\n let id = $(config.target).attr('id')\n if (!id) {\n id = Util.getUID(NAME)\n $(config.target).attr('id', id)\n }\n\n config.target = `#${id}`\n }\n\n Util.typeCheckConfig(NAME, config, DefaultType)\n\n return config\n }\n\n _getScrollTop() {\n return this._scrollElement === window ?\n this._scrollElement.pageYOffset : this._scrollElement.scrollTop\n }\n\n _getScrollHeight() {\n return this._scrollElement.scrollHeight || Math.max(\n document.body.scrollHeight,\n document.documentElement.scrollHeight\n )\n }\n\n _getOffsetHeight() {\n return this._scrollElement === window ?\n window.innerHeight : this._scrollElement.getBoundingClientRect().height\n }\n\n _process() {\n const scrollTop = this._getScrollTop() + this._config.offset\n const scrollHeight = this._getScrollHeight()\n const maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight()\n\n if (this._scrollHeight !== scrollHeight) {\n this.refresh()\n }\n\n if (scrollTop >= maxScroll) {\n const target = this._targets[this._targets.length - 1]\n\n if (this._activeTarget !== target) {\n this._activate(target)\n }\n\n return\n }\n\n if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\n this._activeTarget = null\n this._clear()\n return\n }\n\n for (let i = this._offsets.length; i--;) {\n const isActiveTarget = this._activeTarget !== this._targets[i] &&\n scrollTop >= this._offsets[i] &&\n (typeof this._offsets[i + 1] === 'undefined' ||\n scrollTop < this._offsets[i + 1])\n\n if (isActiveTarget) {\n this._activate(this._targets[i])\n }\n }\n }\n\n _activate(target) {\n this._activeTarget = target\n\n this._clear()\n\n const queries = this._selector\n .split(',')\n .map(selector => `${selector}[data-target=\"${target}\"],${selector}[href=\"${target}\"]`)\n\n const $link = $([].slice.call(document.querySelectorAll(queries.join(','))))\n\n if ($link.hasClass(CLASS_NAME_DROPDOWN_ITEM)) {\n $link.closest(SELECTOR_DROPDOWN)\n .find(SELECTOR_DROPDOWN_TOGGLE)\n .addClass(CLASS_NAME_ACTIVE)\n $link.addClass(CLASS_NAME_ACTIVE)\n } else {\n // Set triggered link as active\n $link.addClass(CLASS_NAME_ACTIVE)\n // Set triggered links parents as active\n // With both
    and