├── .gitignore ├── .nvmrc ├── README.md ├── app.feature ├── img ├── ai-alien.jpeg ├── et-bilu.jpeg ├── icon.webp ├── image.png └── predator.jpeg ├── index.html ├── lib ├── boostrap.min.css └── bootstrap.bundle.min.js ├── package-lock.json ├── package.json └── src ├── controller.js ├── index.js ├── service.js └── view.js /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | .pnpm-debug.log* 9 | 10 | # Diagnostic reports (https://nodejs.org/api/report.html) 11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 12 | 13 | # Runtime data 14 | pids 15 | *.pid 16 | *.seed 17 | *.pid.lock 18 | 19 | # Directory for instrumented libs generated by jscoverage/JSCover 20 | lib-cov 21 | 22 | # Coverage directory used by tools like istanbul 23 | coverage 24 | *.lcov 25 | 26 | # nyc test coverage 27 | .nyc_output 28 | 29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 30 | .grunt 31 | 32 | # Bower dependency directory (https://bower.io/) 33 | bower_components 34 | 35 | # node-waf configuration 36 | .lock-wscript 37 | 38 | # Compiled binary addons (https://nodejs.org/api/addons.html) 39 | build/Release 40 | 41 | # Dependency directories 42 | node_modules/ 43 | jspm_packages/ 44 | 45 | # Snowpack dependency directory (https://snowpack.dev/) 46 | web_modules/ 47 | 48 | # TypeScript cache 49 | *.tsbuildinfo 50 | 51 | # Optional npm cache directory 52 | .npm 53 | 54 | # Optional eslint cache 55 | .eslintcache 56 | 57 | # Optional stylelint cache 58 | .stylelintcache 59 | 60 | # Microbundle cache 61 | .rpt2_cache/ 62 | .rts2_cache_cjs/ 63 | .rts2_cache_es/ 64 | .rts2_cache_umd/ 65 | 66 | # Optional REPL history 67 | .node_repl_history 68 | 69 | # Output of 'npm pack' 70 | *.tgz 71 | 72 | # Yarn Integrity file 73 | .yarn-integrity 74 | 75 | # dotenv environment variable files 76 | .env 77 | .env.development.local 78 | .env.test.local 79 | .env.production.local 80 | .env.local 81 | 82 | # parcel-bundler cache (https://parceljs.org/) 83 | .cache 84 | .parcel-cache 85 | 86 | # Next.js build output 87 | .next 88 | out 89 | 90 | # Nuxt.js build / generate output 91 | .nuxt 92 | dist 93 | 94 | # Gatsby files 95 | .cache/ 96 | # Comment in the public line in if your project uses Gatsby and not Next.js 97 | # https://nextjs.org/blog/next-9-1#public-directory-support 98 | # public 99 | 100 | # vuepress build output 101 | .vuepress/dist 102 | 103 | # vuepress v2.x temp and cache directory 104 | .temp 105 | .cache 106 | 107 | # Docusaurus cache and generated files 108 | .docusaurus 109 | 110 | # Serverless directories 111 | .serverless/ 112 | 113 | # FuseBox cache 114 | .fusebox/ 115 | 116 | # DynamoDB Local files 117 | .dynamodb/ 118 | 119 | # TernJS port file 120 | .tern-port 121 | 122 | # Stores VSCode versions used for testing VSCode extensions 123 | .vscode-test 124 | 125 | # yarn v2 126 | .yarn/cache 127 | .yarn/unplugged 128 | .yarn/build-state.yml 129 | .yarn/install-state.gz 130 | .pnp.* 131 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | v20.12.1 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Vanilla JS Web App example 2 | 3 | This is a simple app website to store images on localStorage using best practices of accessibility. 4 | 5 | [Access it live here](https://erickwendel.github.io/vanilla-js-web-app-example) 6 | 7 | print 8 | 9 | 10 | 11 | # Running 12 | 13 | Restore the dependencies with `npm ci` and run with `npm start`. 14 | 15 | -------------------------------------------------------------------------------- /app.feature: -------------------------------------------------------------------------------- 1 | Feature: Image Registration 2 | 3 | Scenario: Submitting an image with invalid inputs 4 | Given I am on the image registration page 5 | When I enter "" in the title field 6 | Then I enter "" in the URL field 7 | Then I click the submit button 8 | Then I should see "Please type a title for the image" message above the title field 9 | And I should see "Please type a valid URL" message above the imageUrl field 10 | And I should see an exclamation icon in the title and URL fields 11 | 12 | Scenario: Submitting an image with valid inputs using enter key 13 | Given I am on the image registration page 14 | When I enter "Alien BR" in the title field 15 | Then I should see a check icon in the title field 16 | When I enter "https://cdn.mos.cms.futurecdn.net/eM9EvWyDxXcnQTTyH8c8p5-1200-80.jpg" in the URL field 17 | Then I should see a check icon in the imageUrl field 18 | Then I can hit enter to submit the form 19 | And the list of registered images should be updated with the new item 20 | And the new item should be stored in the localStorage 21 | Then The inputs should be cleared 22 | 23 | Scenario: Submitting an image and updating the list 24 | Given I am on the image registration page 25 | Then I have entered "BR Alien" in the title field 26 | Then I have entered "https://cdn.mos.cms.futurecdn.net/eM9EvWyDxXcnQTTyH8c8p5-1200-80.jpg" in the URL field 27 | When I click the submit button 28 | And the list of registered images should be updated with the new item 29 | And the new item should be stored in the localStorage 30 | Then The inputs should be cleared 31 | 32 | Scenario: Refreshing the page after submitting an image clicking in the submit button 33 | Given I am on the image registration page 34 | Then I have submitted an image by clicking the submit button 35 | When I refresh the page 36 | Then I should still see the submitted image in the list of registered images 37 | -------------------------------------------------------------------------------- /img/ai-alien.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ErickWendel/vanilla-js-web-app-example/cc7739e4c798315d72bd83a9f389f268d0517fd8/img/ai-alien.jpeg -------------------------------------------------------------------------------- /img/et-bilu.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ErickWendel/vanilla-js-web-app-example/cc7739e4c798315d72bd83a9f389f268d0517fd8/img/et-bilu.jpeg -------------------------------------------------------------------------------- /img/icon.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ErickWendel/vanilla-js-web-app-example/cc7739e4c798315d72bd83a9f389f268d0517fd8/img/icon.webp -------------------------------------------------------------------------------- /img/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ErickWendel/vanilla-js-web-app-example/cc7739e4c798315d72bd83a9f389f268d0517fd8/img/image.png -------------------------------------------------------------------------------- /img/predator.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ErickWendel/vanilla-js-web-app-example/cc7739e4c798315d72bd83a9f389f268d0517fd8/img/predator.jpeg -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | TDD Frontend Example 9 | 10 | 11 | 12 | 39 | 40 | 41 | 42 |
43 |
44 |
45 |
46 |
47 |
48 | 💥 49 | 50 | 51 |
52 | Please type a title for the image. 53 |
54 |
55 |
56 |
57 |
58 | 📸 59 | 60 | 61 | 62 |
63 | Please type a valid URL 64 |
65 |
66 |
67 |
68 | 69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 | Image of an AI Alien 83 |
84 |

AI Alien

85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 | Image of Predator Night Vision 95 |
96 |

Predator Night Vision

97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 | Image of ET Bilu 107 |
108 |

ET Bilu

109 |
110 |
111 |
112 |
113 |
114 |
115 | 116 | 117 | 118 | -------------------------------------------------------------------------------- /lib/bootstrap.bundle.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v5.3.2 (https://getbootstrap.com/) 3 | * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 5 | */ 6 | !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e()}(this,(function(){"use strict";const t=new Map,e={set(e,i,n){t.has(e)||t.set(e,new Map);const s=t.get(e);s.has(i)||0===s.size?s.set(i,n):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(s.keys())[0]}.`)},get:(e,i)=>t.has(e)&&t.get(e).get(i)||null,remove(e,i){if(!t.has(e))return;const n=t.get(e);n.delete(i),0===n.size&&t.delete(e)}},i="transitionend",n=t=>(t&&window.CSS&&window.CSS.escape&&(t=t.replace(/#([^\s"#']+)/g,((t,e)=>`#${CSS.escape(e)}`))),t),s=t=>{t.dispatchEvent(new Event(i))},o=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),r=t=>o(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(n(t)):null,a=t=>{if(!o(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},l=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),c=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?c(t.parentNode):null},h=()=>{},d=t=>{t.offsetHeight},u=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,f=[],p=()=>"rtl"===document.documentElement.dir,m=t=>{var e;e=()=>{const e=u();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(f.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of f)t()})),f.push(e)):e()},g=(t,e=[],i=t)=>"function"==typeof t?t(...e):i,_=(t,e,n=!0)=>{if(!n)return void g(t);const o=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let r=!1;const a=({target:n})=>{n===e&&(r=!0,e.removeEventListener(i,a),g(t))};e.addEventListener(i,a),setTimeout((()=>{r||s(e)}),o)},b=(t,e,i,n)=>{const s=t.length;let o=t.indexOf(e);return-1===o?!i&&n?t[s-1]:t[0]:(o+=i?1:-1,n&&(o=(o+s)%s),t[Math.max(0,Math.min(o,s-1))])},v=/[^.]*(?=\..*)\.|.*/,y=/\..*/,w=/::\d+$/,A={};let E=1;const T={mouseenter:"mouseover",mouseleave:"mouseout"},C=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function O(t,e){return e&&`${e}::${E++}`||t.uidEvent||E++}function x(t){const e=O(t);return t.uidEvent=e,A[e]=A[e]||{},A[e]}function k(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function L(t,e,i){const n="string"==typeof e,s=n?i:e||i;let o=I(t);return C.has(o)||(o=t),[n,s,o]}function S(t,e,i,n,s){if("string"!=typeof e||!t)return;let[o,r,a]=L(e,i,n);if(e in T){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=x(t),c=l[a]||(l[a]={}),h=k(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=O(r,e.replace(v,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return P(s,{delegateTarget:r}),n.oneOff&&N.off(t,s.type,e,i),i.apply(r,[s])}}(t,i,r):function(t,e){return function i(n){return P(n,{delegateTarget:t}),i.oneOff&&N.off(t,n.type,e),e.apply(t,[n])}}(t,r);u.delegationSelector=o?i:null,u.callable=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function D(t,e,i,n,s){const o=k(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function $(t,e,i,n){const s=e[i]||{};for(const[o,r]of Object.entries(s))o.includes(n)&&D(t,e,i,r.callable,r.delegationSelector)}function I(t){return t=t.replace(y,""),T[t]||t}const N={on(t,e,i,n){S(t,e,i,n,!1)},one(t,e,i,n){S(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=L(e,i,n),a=r!==e,l=x(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))$(t,l,i,e.slice(1));for(const[i,n]of Object.entries(c)){const s=i.replace(w,"");a&&!e.includes(s)||D(t,l,r,n.callable,n.delegationSelector)}}else{if(!Object.keys(c).length)return;D(t,l,r,o,s?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=u();let s=null,o=!0,r=!0,a=!1;e!==I(e)&&n&&(s=n.Event(e,i),n(t).trigger(s),o=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),a=s.isDefaultPrevented());const l=P(new Event(e,{bubbles:o,cancelable:!0}),i);return a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&s&&s.preventDefault(),l}};function P(t,e={}){for(const[i,n]of Object.entries(e))try{t[i]=n}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>n})}return t}function M(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function j(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}const F={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${j(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${j(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter((t=>t.startsWith("bs")&&!t.startsWith("bsConfig")));for(const n of i){let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=M(t.dataset[n])}return e},getDataAttribute:(t,e)=>M(t.getAttribute(`data-bs-${j(e)}`))};class H{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=o(e)?F.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...o(e)?F.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const[n,s]of Object.entries(e)){const e=t[n],r=o(e)?"element":null==(i=e)?`${i}`:Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(s).test(r))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${r}" but expected type "${s}".`)}var i}}class W extends H{constructor(t,i){super(),(t=r(t))&&(this._element=t,this._config=this._getConfig(i),e.set(this._element,this.constructor.DATA_KEY,this))}dispose(){e.remove(this._element,this.constructor.DATA_KEY),N.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){_(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return e.get(r(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.3.2"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}}const B=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?n(i.trim()):null}return e},z={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let n=t.parentNode.closest(e);for(;n;)i.push(n),n=n.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(",");return this.find(e,t).filter((t=>!l(t)&&a(t)))},getSelectorFromElement(t){const e=B(t);return e&&z.findOne(e)?e:null},getElementFromSelector(t){const e=B(t);return e?z.findOne(e):null},getMultipleElementsFromSelector(t){const e=B(t);return e?z.find(e):[]}},R=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,n=t.NAME;N.on(document,i,`[data-bs-dismiss="${n}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),l(this))return;const s=z.getElementFromSelector(this)||this.closest(`.${n}`);t.getOrCreateInstance(s)[e]()}))},q=".bs.alert",V=`close${q}`,K=`closed${q}`;class Q extends W{static get NAME(){return"alert"}close(){if(N.trigger(this._element,V).defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),N.trigger(this._element,K),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=Q.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}R(Q,"close"),m(Q);const X='[data-bs-toggle="button"]';class Y extends W{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=Y.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}N.on(document,"click.bs.button.data-api",X,(t=>{t.preventDefault();const e=t.target.closest(X);Y.getOrCreateInstance(e).toggle()})),m(Y);const U=".bs.swipe",G=`touchstart${U}`,J=`touchmove${U}`,Z=`touchend${U}`,tt=`pointerdown${U}`,et=`pointerup${U}`,it={endCallback:null,leftCallback:null,rightCallback:null},nt={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class st extends H{constructor(t,e){super(),this._element=t,t&&st.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return it}static get DefaultType(){return nt}static get NAME(){return"swipe"}dispose(){N.off(this._element,U)}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),g(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&g(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(N.on(this._element,tt,(t=>this._start(t))),N.on(this._element,et,(t=>this._end(t))),this._element.classList.add("pointer-event")):(N.on(this._element,G,(t=>this._start(t))),N.on(this._element,J,(t=>this._move(t))),N.on(this._element,Z,(t=>this._end(t))))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const ot=".bs.carousel",rt=".data-api",at="next",lt="prev",ct="left",ht="right",dt=`slide${ot}`,ut=`slid${ot}`,ft=`keydown${ot}`,pt=`mouseenter${ot}`,mt=`mouseleave${ot}`,gt=`dragstart${ot}`,_t=`load${ot}${rt}`,bt=`click${ot}${rt}`,vt="carousel",yt="active",wt=".active",At=".carousel-item",Et=wt+At,Tt={ArrowLeft:ht,ArrowRight:ct},Ct={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},Ot={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class xt extends W{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=z.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===vt&&this.cycle()}static get Default(){return Ct}static get DefaultType(){return Ot}static get NAME(){return"carousel"}next(){this._slide(at)}nextWhenVisible(){!document.hidden&&a(this._element)&&this.next()}prev(){this._slide(lt)}pause(){this._isSliding&&s(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval((()=>this.nextWhenVisible()),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?N.one(this._element,ut,(()=>this.cycle())):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void N.one(this._element,ut,(()=>this.to(t)));const i=this._getItemIndex(this._getActive());if(i===t)return;const n=t>i?at:lt;this._slide(n,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&N.on(this._element,ft,(t=>this._keydown(t))),"hover"===this._config.pause&&(N.on(this._element,pt,(()=>this.pause())),N.on(this._element,mt,(()=>this._maybeEnableCycle()))),this._config.touch&&st.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of z.find(".carousel-item img",this._element))N.on(t,gt,(t=>t.preventDefault()));const t={leftCallback:()=>this._slide(this._directionToOrder(ct)),rightCallback:()=>this._slide(this._directionToOrder(ht)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((()=>this._maybeEnableCycle()),500+this._config.interval))}};this._swipeHelper=new st(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=Tt[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=z.findOne(wt,this._indicatorsElement);e.classList.remove(yt),e.removeAttribute("aria-current");const i=z.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(yt),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),n=t===at,s=e||b(this._getItems(),i,n,this._config.wrap);if(s===i)return;const o=this._getItemIndex(s),r=e=>N.trigger(this._element,e,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r(dt).defaultPrevented)return;if(!i||!s)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=s;const l=n?"carousel-item-start":"carousel-item-end",c=n?"carousel-item-next":"carousel-item-prev";s.classList.add(c),d(s),i.classList.add(l),s.classList.add(l),this._queueCallback((()=>{s.classList.remove(l,c),s.classList.add(yt),i.classList.remove(yt,c,l),this._isSliding=!1,r(ut)}),i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return z.findOne(Et,this._element)}_getItems(){return z.find(At,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return p()?t===ct?lt:at:t===ct?at:lt}_orderToDirection(t){return p()?t===lt?ct:ht:t===lt?ht:ct}static jQueryInterface(t){return this.each((function(){const e=xt.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)}))}}N.on(document,bt,"[data-bs-slide], [data-bs-slide-to]",(function(t){const e=z.getElementFromSelector(this);if(!e||!e.classList.contains(vt))return;t.preventDefault();const i=xt.getOrCreateInstance(e),n=this.getAttribute("data-bs-slide-to");return n?(i.to(n),void i._maybeEnableCycle()):"next"===F.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())})),N.on(window,_t,(()=>{const t=z.find('[data-bs-ride="carousel"]');for(const e of t)xt.getOrCreateInstance(e)})),m(xt);const kt=".bs.collapse",Lt=`show${kt}`,St=`shown${kt}`,Dt=`hide${kt}`,$t=`hidden${kt}`,It=`click${kt}.data-api`,Nt="show",Pt="collapse",Mt="collapsing",jt=`:scope .${Pt} .${Pt}`,Ft='[data-bs-toggle="collapse"]',Ht={parent:null,toggle:!0},Wt={parent:"(null|element)",toggle:"boolean"};class Bt extends W{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const i=z.find(Ft);for(const t of i){const e=z.getSelectorFromElement(t),i=z.find(e).filter((t=>t===this._element));null!==e&&i.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return Ht}static get DefaultType(){return Wt}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t=>t!==this._element)).map((t=>Bt.getOrCreateInstance(t,{toggle:!1})))),t.length&&t[0]._isTransitioning)return;if(N.trigger(this._element,Lt).defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(Pt),this._element.classList.add(Mt),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(Mt),this._element.classList.add(Pt,Nt),this._element.style[e]="",N.trigger(this._element,St)}),this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(N.trigger(this._element,Dt).defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,d(this._element),this._element.classList.add(Mt),this._element.classList.remove(Pt,Nt);for(const t of this._triggerArray){const e=z.getElementFromSelector(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(Mt),this._element.classList.add(Pt),N.trigger(this._element,$t)}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(Nt)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=r(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(Ft);for(const e of t){const t=z.getElementFromSelector(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=z.find(jt,this._config.parent);return z.find(t,this._config.parent).filter((t=>!e.includes(t)))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each((function(){const i=Bt.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}N.on(document,It,Ft,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();for(const t of z.getMultipleElementsFromSelector(this))Bt.getOrCreateInstance(t,{toggle:!1}).toggle()})),m(Bt);var zt="top",Rt="bottom",qt="right",Vt="left",Kt="auto",Qt=[zt,Rt,qt,Vt],Xt="start",Yt="end",Ut="clippingParents",Gt="viewport",Jt="popper",Zt="reference",te=Qt.reduce((function(t,e){return t.concat([e+"-"+Xt,e+"-"+Yt])}),[]),ee=[].concat(Qt,[Kt]).reduce((function(t,e){return t.concat([e,e+"-"+Xt,e+"-"+Yt])}),[]),ie="beforeRead",ne="read",se="afterRead",oe="beforeMain",re="main",ae="afterMain",le="beforeWrite",ce="write",he="afterWrite",de=[ie,ne,se,oe,re,ae,le,ce,he];function ue(t){return t?(t.nodeName||"").toLowerCase():null}function fe(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function pe(t){return t instanceof fe(t).Element||t instanceof Element}function me(t){return t instanceof fe(t).HTMLElement||t instanceof HTMLElement}function ge(t){return"undefined"!=typeof ShadowRoot&&(t instanceof fe(t).ShadowRoot||t instanceof ShadowRoot)}const _e={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];me(s)&&ue(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});me(n)&&ue(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function be(t){return t.split("-")[0]}var ve=Math.max,ye=Math.min,we=Math.round;function Ae(){var t=navigator.userAgentData;return null!=t&&t.brands&&Array.isArray(t.brands)?t.brands.map((function(t){return t.brand+"/"+t.version})).join(" "):navigator.userAgent}function Ee(){return!/^((?!chrome|android).)*safari/i.test(Ae())}function Te(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),s=1,o=1;e&&me(t)&&(s=t.offsetWidth>0&&we(n.width)/t.offsetWidth||1,o=t.offsetHeight>0&&we(n.height)/t.offsetHeight||1);var r=(pe(t)?fe(t):window).visualViewport,a=!Ee()&&i,l=(n.left+(a&&r?r.offsetLeft:0))/s,c=(n.top+(a&&r?r.offsetTop:0))/o,h=n.width/s,d=n.height/o;return{width:h,height:d,top:c,right:l+h,bottom:c+d,left:l,x:l,y:c}}function Ce(t){var e=Te(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function Oe(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&ge(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function xe(t){return fe(t).getComputedStyle(t)}function ke(t){return["table","td","th"].indexOf(ue(t))>=0}function Le(t){return((pe(t)?t.ownerDocument:t.document)||window.document).documentElement}function Se(t){return"html"===ue(t)?t:t.assignedSlot||t.parentNode||(ge(t)?t.host:null)||Le(t)}function De(t){return me(t)&&"fixed"!==xe(t).position?t.offsetParent:null}function $e(t){for(var e=fe(t),i=De(t);i&&ke(i)&&"static"===xe(i).position;)i=De(i);return i&&("html"===ue(i)||"body"===ue(i)&&"static"===xe(i).position)?e:i||function(t){var e=/firefox/i.test(Ae());if(/Trident/i.test(Ae())&&me(t)&&"fixed"===xe(t).position)return null;var i=Se(t);for(ge(i)&&(i=i.host);me(i)&&["html","body"].indexOf(ue(i))<0;){var n=xe(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function Ie(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function Ne(t,e,i){return ve(t,ye(e,i))}function Pe(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function Me(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const je={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,n=t.name,s=t.options,o=i.elements.arrow,r=i.modifiersData.popperOffsets,a=be(i.placement),l=Ie(a),c=[Vt,qt].indexOf(a)>=0?"height":"width";if(o&&r){var h=function(t,e){return Pe("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:Me(t,Qt))}(s.padding,i),d=Ce(o),u="y"===l?zt:Vt,f="y"===l?Rt:qt,p=i.rects.reference[c]+i.rects.reference[l]-r[l]-i.rects.popper[c],m=r[l]-i.rects.reference[l],g=$e(o),_=g?"y"===l?g.clientHeight||0:g.clientWidth||0:0,b=p/2-m/2,v=h[u],y=_-d[c]-h[f],w=_/2-d[c]/2+b,A=Ne(v,w,y),E=l;i.modifiersData[n]=((e={})[E]=A,e.centerOffset=A-w,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&Oe(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Fe(t){return t.split("-")[1]}var He={top:"auto",right:"auto",bottom:"auto",left:"auto"};function We(t){var e,i=t.popper,n=t.popperRect,s=t.placement,o=t.variation,r=t.offsets,a=t.position,l=t.gpuAcceleration,c=t.adaptive,h=t.roundOffsets,d=t.isFixed,u=r.x,f=void 0===u?0:u,p=r.y,m=void 0===p?0:p,g="function"==typeof h?h({x:f,y:m}):{x:f,y:m};f=g.x,m=g.y;var _=r.hasOwnProperty("x"),b=r.hasOwnProperty("y"),v=Vt,y=zt,w=window;if(c){var A=$e(i),E="clientHeight",T="clientWidth";A===fe(i)&&"static"!==xe(A=Le(i)).position&&"absolute"===a&&(E="scrollHeight",T="scrollWidth"),(s===zt||(s===Vt||s===qt)&&o===Yt)&&(y=Rt,m-=(d&&A===w&&w.visualViewport?w.visualViewport.height:A[E])-n.height,m*=l?1:-1),s!==Vt&&(s!==zt&&s!==Rt||o!==Yt)||(v=qt,f-=(d&&A===w&&w.visualViewport?w.visualViewport.width:A[T])-n.width,f*=l?1:-1)}var C,O=Object.assign({position:a},c&&He),x=!0===h?function(t,e){var i=t.x,n=t.y,s=e.devicePixelRatio||1;return{x:we(i*s)/s||0,y:we(n*s)/s||0}}({x:f,y:m},fe(i)):{x:f,y:m};return f=x.x,m=x.y,l?Object.assign({},O,((C={})[y]=b?"0":"",C[v]=_?"0":"",C.transform=(w.devicePixelRatio||1)<=1?"translate("+f+"px, "+m+"px)":"translate3d("+f+"px, "+m+"px, 0)",C)):Object.assign({},O,((e={})[y]=b?m+"px":"",e[v]=_?f+"px":"",e.transform="",e))}const Be={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:be(e.placement),variation:Fe(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,We(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,We(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var ze={passive:!0};const Re={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=fe(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,ze)})),a&&l.addEventListener("resize",i.update,ze),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,ze)})),a&&l.removeEventListener("resize",i.update,ze)}},data:{}};var qe={left:"right",right:"left",bottom:"top",top:"bottom"};function Ve(t){return t.replace(/left|right|bottom|top/g,(function(t){return qe[t]}))}var Ke={start:"end",end:"start"};function Qe(t){return t.replace(/start|end/g,(function(t){return Ke[t]}))}function Xe(t){var e=fe(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function Ye(t){return Te(Le(t)).left+Xe(t).scrollLeft}function Ue(t){var e=xe(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function Ge(t){return["html","body","#document"].indexOf(ue(t))>=0?t.ownerDocument.body:me(t)&&Ue(t)?t:Ge(Se(t))}function Je(t,e){var i;void 0===e&&(e=[]);var n=Ge(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=fe(n),r=s?[o].concat(o.visualViewport||[],Ue(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(Je(Se(r)))}function Ze(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function ti(t,e,i){return e===Gt?Ze(function(t,e){var i=fe(t),n=Le(t),s=i.visualViewport,o=n.clientWidth,r=n.clientHeight,a=0,l=0;if(s){o=s.width,r=s.height;var c=Ee();(c||!c&&"fixed"===e)&&(a=s.offsetLeft,l=s.offsetTop)}return{width:o,height:r,x:a+Ye(t),y:l}}(t,i)):pe(e)?function(t,e){var i=Te(t,!1,"fixed"===e);return i.top=i.top+t.clientTop,i.left=i.left+t.clientLeft,i.bottom=i.top+t.clientHeight,i.right=i.left+t.clientWidth,i.width=t.clientWidth,i.height=t.clientHeight,i.x=i.left,i.y=i.top,i}(e,i):Ze(function(t){var e,i=Le(t),n=Xe(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=ve(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=ve(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+Ye(t),l=-n.scrollTop;return"rtl"===xe(s||i).direction&&(a+=ve(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(Le(t)))}function ei(t){var e,i=t.reference,n=t.element,s=t.placement,o=s?be(s):null,r=s?Fe(s):null,a=i.x+i.width/2-n.width/2,l=i.y+i.height/2-n.height/2;switch(o){case zt:e={x:a,y:i.y-n.height};break;case Rt:e={x:a,y:i.y+i.height};break;case qt:e={x:i.x+i.width,y:l};break;case Vt:e={x:i.x-n.width,y:l};break;default:e={x:i.x,y:i.y}}var c=o?Ie(o):null;if(null!=c){var h="y"===c?"height":"width";switch(r){case Xt:e[c]=e[c]-(i[h]/2-n[h]/2);break;case Yt:e[c]=e[c]+(i[h]/2-n[h]/2)}}return e}function ii(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=void 0===n?t.placement:n,o=i.strategy,r=void 0===o?t.strategy:o,a=i.boundary,l=void 0===a?Ut:a,c=i.rootBoundary,h=void 0===c?Gt:c,d=i.elementContext,u=void 0===d?Jt:d,f=i.altBoundary,p=void 0!==f&&f,m=i.padding,g=void 0===m?0:m,_=Pe("number"!=typeof g?g:Me(g,Qt)),b=u===Jt?Zt:Jt,v=t.rects.popper,y=t.elements[p?b:u],w=function(t,e,i,n){var s="clippingParents"===e?function(t){var e=Je(Se(t)),i=["absolute","fixed"].indexOf(xe(t).position)>=0&&me(t)?$e(t):t;return pe(i)?e.filter((function(t){return pe(t)&&Oe(t,i)&&"body"!==ue(t)})):[]}(t):[].concat(e),o=[].concat(s,[i]),r=o[0],a=o.reduce((function(e,i){var s=ti(t,i,n);return e.top=ve(s.top,e.top),e.right=ye(s.right,e.right),e.bottom=ye(s.bottom,e.bottom),e.left=ve(s.left,e.left),e}),ti(t,r,n));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}(pe(y)?y:y.contextElement||Le(t.elements.popper),l,h,r),A=Te(t.elements.reference),E=ei({reference:A,element:v,strategy:"absolute",placement:s}),T=Ze(Object.assign({},v,E)),C=u===Jt?T:A,O={top:w.top-C.top+_.top,bottom:C.bottom-w.bottom+_.bottom,left:w.left-C.left+_.left,right:C.right-w.right+_.right},x=t.modifiersData.offset;if(u===Jt&&x){var k=x[s];Object.keys(O).forEach((function(t){var e=[qt,Rt].indexOf(t)>=0?1:-1,i=[zt,Rt].indexOf(t)>=0?"y":"x";O[t]+=k[i]*e}))}return O}function ni(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,l=i.allowedAutoPlacements,c=void 0===l?ee:l,h=Fe(n),d=h?a?te:te.filter((function(t){return Fe(t)===h})):Qt,u=d.filter((function(t){return c.indexOf(t)>=0}));0===u.length&&(u=d);var f=u.reduce((function(e,i){return e[i]=ii(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[be(i)],e}),{});return Object.keys(f).sort((function(t,e){return f[t]-f[e]}))}const si={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name;if(!e.modifiersData[n]._skip){for(var s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0===r||r,l=i.fallbackPlacements,c=i.padding,h=i.boundary,d=i.rootBoundary,u=i.altBoundary,f=i.flipVariations,p=void 0===f||f,m=i.allowedAutoPlacements,g=e.options.placement,_=be(g),b=l||(_!==g&&p?function(t){if(be(t)===Kt)return[];var e=Ve(t);return[Qe(t),e,Qe(e)]}(g):[Ve(g)]),v=[g].concat(b).reduce((function(t,i){return t.concat(be(i)===Kt?ni(e,{placement:i,boundary:h,rootBoundary:d,padding:c,flipVariations:p,allowedAutoPlacements:m}):i)}),[]),y=e.rects.reference,w=e.rects.popper,A=new Map,E=!0,T=v[0],C=0;C=0,S=L?"width":"height",D=ii(e,{placement:O,boundary:h,rootBoundary:d,altBoundary:u,padding:c}),$=L?k?qt:Vt:k?Rt:zt;y[S]>w[S]&&($=Ve($));var I=Ve($),N=[];if(o&&N.push(D[x]<=0),a&&N.push(D[$]<=0,D[I]<=0),N.every((function(t){return t}))){T=O,E=!1;break}A.set(O,N)}if(E)for(var P=function(t){var e=v.find((function(e){var i=A.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return T=e,"break"},M=p?3:1;M>0&&"break"!==P(M);M--);e.placement!==T&&(e.modifiersData[n]._skip=!0,e.placement=T,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function oi(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function ri(t){return[zt,qt,Rt,Vt].some((function(e){return t[e]>=0}))}const ai={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=ii(e,{elementContext:"reference"}),a=ii(e,{altBoundary:!0}),l=oi(r,n),c=oi(a,s,o),h=ri(l),d=ri(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},li={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.offset,o=void 0===s?[0,0]:s,r=ee.reduce((function(t,i){return t[i]=function(t,e,i){var n=be(t),s=[Vt,zt].indexOf(n)>=0?-1:1,o="function"==typeof i?i(Object.assign({},e,{placement:t})):i,r=o[0],a=o[1];return r=r||0,a=(a||0)*s,[Vt,qt].indexOf(n)>=0?{x:a,y:r}:{x:r,y:a}}(i,e.rects,o),t}),{}),a=r[e.placement],l=a.x,c=a.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[n]=r}},ci={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=ei({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},hi={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0!==r&&r,l=i.boundary,c=i.rootBoundary,h=i.altBoundary,d=i.padding,u=i.tether,f=void 0===u||u,p=i.tetherOffset,m=void 0===p?0:p,g=ii(e,{boundary:l,rootBoundary:c,padding:d,altBoundary:h}),_=be(e.placement),b=Fe(e.placement),v=!b,y=Ie(_),w="x"===y?"y":"x",A=e.modifiersData.popperOffsets,E=e.rects.reference,T=e.rects.popper,C="function"==typeof m?m(Object.assign({},e.rects,{placement:e.placement})):m,O="number"==typeof C?{mainAxis:C,altAxis:C}:Object.assign({mainAxis:0,altAxis:0},C),x=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,k={x:0,y:0};if(A){if(o){var L,S="y"===y?zt:Vt,D="y"===y?Rt:qt,$="y"===y?"height":"width",I=A[y],N=I+g[S],P=I-g[D],M=f?-T[$]/2:0,j=b===Xt?E[$]:T[$],F=b===Xt?-T[$]:-E[$],H=e.elements.arrow,W=f&&H?Ce(H):{width:0,height:0},B=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},z=B[S],R=B[D],q=Ne(0,E[$],W[$]),V=v?E[$]/2-M-q-z-O.mainAxis:j-q-z-O.mainAxis,K=v?-E[$]/2+M+q+R+O.mainAxis:F+q+R+O.mainAxis,Q=e.elements.arrow&&$e(e.elements.arrow),X=Q?"y"===y?Q.clientTop||0:Q.clientLeft||0:0,Y=null!=(L=null==x?void 0:x[y])?L:0,U=I+K-Y,G=Ne(f?ye(N,I+V-Y-X):N,I,f?ve(P,U):P);A[y]=G,k[y]=G-I}if(a){var J,Z="x"===y?zt:Vt,tt="x"===y?Rt:qt,et=A[w],it="y"===w?"height":"width",nt=et+g[Z],st=et-g[tt],ot=-1!==[zt,Vt].indexOf(_),rt=null!=(J=null==x?void 0:x[w])?J:0,at=ot?nt:et-E[it]-T[it]-rt+O.altAxis,lt=ot?et+E[it]+T[it]-rt-O.altAxis:st,ct=f&&ot?function(t,e,i){var n=Ne(t,e,i);return n>i?i:n}(at,et,lt):Ne(f?at:nt,et,f?lt:st);A[w]=ct,k[w]=ct-et}e.modifiersData[n]=k}},requiresIfExists:["offset"]};function di(t,e,i){void 0===i&&(i=!1);var n,s,o=me(e),r=me(e)&&function(t){var e=t.getBoundingClientRect(),i=we(e.width)/t.offsetWidth||1,n=we(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=Le(e),l=Te(t,r,i),c={scrollLeft:0,scrollTop:0},h={x:0,y:0};return(o||!o&&!i)&&(("body"!==ue(e)||Ue(a))&&(c=(n=e)!==fe(n)&&me(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:Xe(n)),me(e)?((h=Te(e,!0)).x+=e.clientLeft,h.y+=e.clientTop):a&&(h.x=Ye(a))),{x:l.left+c.scrollLeft-h.x,y:l.top+c.scrollTop-h.y,width:l.width,height:l.height}}function ui(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||s(t)})),n}var fi={placement:"bottom",modifiers:[],strategy:"absolute"};function pi(){for(var t=arguments.length,e=new Array(t),i=0;iNumber.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(F.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,...g(this._config.popperConfig,[t])}}_selectMenuItem({key:t,target:e}){const i=z.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter((t=>a(t)));i.length&&b(i,e,t===Ti,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=qi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=z.find(Ni);for(const i of e){const e=qi.getInstance(i);if(!e||!1===e._config.autoClose)continue;const n=t.composedPath(),s=n.includes(e._menu);if(n.includes(e._element)||"inside"===e._config.autoClose&&!s||"outside"===e._config.autoClose&&s)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,n=[Ei,Ti].includes(t.key);if(!n&&!i)return;if(e&&!i)return;t.preventDefault();const s=this.matches(Ii)?this:z.prev(this,Ii)[0]||z.next(this,Ii)[0]||z.findOne(Ii,t.delegateTarget.parentNode),o=qi.getOrCreateInstance(s);if(n)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),s.focus())}}N.on(document,Si,Ii,qi.dataApiKeydownHandler),N.on(document,Si,Pi,qi.dataApiKeydownHandler),N.on(document,Li,qi.clearMenus),N.on(document,Di,qi.clearMenus),N.on(document,Li,Ii,(function(t){t.preventDefault(),qi.getOrCreateInstance(this).toggle()})),m(qi);const Vi="backdrop",Ki="show",Qi=`mousedown.bs.${Vi}`,Xi={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Yi={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class Ui extends H{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return Xi}static get DefaultType(){return Yi}static get NAME(){return Vi}show(t){if(!this._config.isVisible)return void g(t);this._append();const e=this._getElement();this._config.isAnimated&&d(e),e.classList.add(Ki),this._emulateAnimation((()=>{g(t)}))}hide(t){this._config.isVisible?(this._getElement().classList.remove(Ki),this._emulateAnimation((()=>{this.dispose(),g(t)}))):g(t)}dispose(){this._isAppended&&(N.off(this._element,Qi),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=r(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),N.on(t,Qi,(()=>{g(this._config.clickCallback)})),this._isAppended=!0}_emulateAnimation(t){_(t,this._getElement(),this._config.isAnimated)}}const Gi=".bs.focustrap",Ji=`focusin${Gi}`,Zi=`keydown.tab${Gi}`,tn="backward",en={autofocus:!0,trapElement:null},nn={autofocus:"boolean",trapElement:"element"};class sn extends H{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return en}static get DefaultType(){return nn}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),N.off(document,Gi),N.on(document,Ji,(t=>this._handleFocusin(t))),N.on(document,Zi,(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,N.off(document,Gi))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=z.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===tn?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?tn:"forward")}}const on=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",rn=".sticky-top",an="padding-right",ln="margin-right";class cn{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,an,(e=>e+t)),this._setElementAttributes(on,an,(e=>e+t)),this._setElementAttributes(rn,ln,(e=>e-t))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,an),this._resetElementAttributes(on,an),this._resetElementAttributes(rn,ln)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(s))}px`)}))}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&F.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=F.getDataAttribute(t,e);null!==i?(F.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)}))}_applyManipulationCallback(t,e){if(o(t))e(t);else for(const i of z.find(t,this._element))e(i)}}const hn=".bs.modal",dn=`hide${hn}`,un=`hidePrevented${hn}`,fn=`hidden${hn}`,pn=`show${hn}`,mn=`shown${hn}`,gn=`resize${hn}`,_n=`click.dismiss${hn}`,bn=`mousedown.dismiss${hn}`,vn=`keydown.dismiss${hn}`,yn=`click${hn}.data-api`,wn="modal-open",An="show",En="modal-static",Tn={backdrop:!0,focus:!0,keyboard:!0},Cn={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class On extends W{constructor(t,e){super(t,e),this._dialog=z.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new cn,this._addEventListeners()}static get Default(){return Tn}static get DefaultType(){return Cn}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||N.trigger(this._element,pn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(wn),this._adjustDialog(),this._backdrop.show((()=>this._showElement(t))))}hide(){this._isShown&&!this._isTransitioning&&(N.trigger(this._element,dn).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(An),this._queueCallback((()=>this._hideModal()),this._element,this._isAnimated())))}dispose(){N.off(window,hn),N.off(this._dialog,hn),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Ui({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_showElement(t){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const e=z.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),d(this._element),this._element.classList.add(An),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,N.trigger(this._element,mn,{relatedTarget:t})}),this._dialog,this._isAnimated())}_addEventListeners(){N.on(this._element,vn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():this._triggerBackdropTransition())})),N.on(window,gn,(()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()})),N.on(this._element,bn,(t=>{N.one(this._element,_n,(e=>{this._element===t.target&&this._element===e.target&&("static"!==this._config.backdrop?this._config.backdrop&&this.hide():this._triggerBackdropTransition())}))}))}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide((()=>{document.body.classList.remove(wn),this._resetAdjustments(),this._scrollBar.reset(),N.trigger(this._element,fn)}))}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(N.trigger(this._element,un).defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(En)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(En),this._queueCallback((()=>{this._element.classList.remove(En),this._queueCallback((()=>{this._element.style.overflowY=e}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;if(i&&!t){const t=p()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=p()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=On.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}N.on(document,yn,'[data-bs-toggle="modal"]',(function(t){const e=z.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),N.one(e,pn,(t=>{t.defaultPrevented||N.one(e,fn,(()=>{a(this)&&this.focus()}))}));const i=z.findOne(".modal.show");i&&On.getInstance(i).hide(),On.getOrCreateInstance(e).toggle(this)})),R(On),m(On);const xn=".bs.offcanvas",kn=".data-api",Ln=`load${xn}${kn}`,Sn="show",Dn="showing",$n="hiding",In=".offcanvas.show",Nn=`show${xn}`,Pn=`shown${xn}`,Mn=`hide${xn}`,jn=`hidePrevented${xn}`,Fn=`hidden${xn}`,Hn=`resize${xn}`,Wn=`click${xn}${kn}`,Bn=`keydown.dismiss${xn}`,zn={backdrop:!0,keyboard:!0,scroll:!1},Rn={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class qn extends W{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return zn}static get DefaultType(){return Rn}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||N.trigger(this._element,Nn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new cn).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(Dn),this._queueCallback((()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(Sn),this._element.classList.remove(Dn),N.trigger(this._element,Pn,{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(N.trigger(this._element,Mn).defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add($n),this._backdrop.hide(),this._queueCallback((()=>{this._element.classList.remove(Sn,$n),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new cn).reset(),N.trigger(this._element,Fn)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new Ui({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():N.trigger(this._element,jn)}:null})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_addEventListeners(){N.on(this._element,Bn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():N.trigger(this._element,jn))}))}static jQueryInterface(t){return this.each((function(){const e=qn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}N.on(document,Wn,'[data-bs-toggle="offcanvas"]',(function(t){const e=z.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this))return;N.one(e,Fn,(()=>{a(this)&&this.focus()}));const i=z.findOne(In);i&&i!==e&&qn.getInstance(i).hide(),qn.getOrCreateInstance(e).toggle(this)})),N.on(window,Ln,(()=>{for(const t of z.find(In))qn.getOrCreateInstance(t).show()})),N.on(window,Hn,(()=>{for(const t of z.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&qn.getOrCreateInstance(t).hide()})),R(qn),m(qn);const Vn={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],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:[]},Kn=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Qn=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,Xn=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!Kn.has(i)||Boolean(Qn.test(t.nodeValue)):e.filter((t=>t instanceof RegExp)).some((t=>t.test(i)))},Yn={allowList:Vn,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
"},Un={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},Gn={entry:"(string|element|function|null)",selector:"(string|element)"};class Jn extends H{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return Yn}static get DefaultType(){return Un}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map((t=>this._resolvePossibleFunction(t))).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){const t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(const[e,i]of Object.entries(this._config.content))this._setContent(t,i,e);const e=t.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&e.classList.add(...i.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(const[e,i]of Object.entries(t))super._typeCheckConfig({selector:e,entry:i},Gn)}_setContent(t,e,i){const n=z.findOne(i,t);n&&((e=this._resolvePossibleFunction(e))?o(e)?this._putElementInTemplate(r(e),n):this._config.html?n.innerHTML=this._maybeSanitize(e):n.textContent=e:n.remove())}_maybeSanitize(t){return this._config.sanitize?function(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const n=(new window.DOMParser).parseFromString(t,"text/html"),s=[].concat(...n.body.querySelectorAll("*"));for(const t of s){const i=t.nodeName.toLowerCase();if(!Object.keys(e).includes(i)){t.remove();continue}const n=[].concat(...t.attributes),s=[].concat(e["*"]||[],e[i]||[]);for(const e of n)Xn(e,s)||t.removeAttribute(e.nodeName)}return n.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return g(t,[this])}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const Zn=new Set(["sanitize","allowList","sanitizeFn"]),ts="fade",es="show",is=".modal",ns="hide.bs.modal",ss="hover",os="focus",rs={AUTO:"auto",TOP:"top",RIGHT:p()?"left":"right",BOTTOM:"bottom",LEFT:p()?"right":"left"},as={allowList:Vn,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},ls={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class cs extends W{constructor(t,e){if(void 0===vi)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t,e),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return as}static get DefaultType(){return ls}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){this._isEnabled&&(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()?this._leave():this._enter())}dispose(){clearTimeout(this._timeout),N.off(this._element.closest(is),ns,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const t=N.trigger(this._element,this.constructor.eventName("show")),e=(c(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!e)return;this._disposePopper();const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:n}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(n.append(i),N.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(i),i.classList.add(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))N.on(t,"mouseover",h);this._queueCallback((()=>{N.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1}),this.tip,this._isAnimated())}hide(){if(this._isShown()&&!N.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))N.off(t,"mouseover",h);this._activeTrigger.click=!1,this._activeTrigger[os]=!1,this._activeTrigger[ss]=!1,this._isHovered=null,this._queueCallback((()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),N.trigger(this._element,this.constructor.eventName("hidden")))}),this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove(ts,es),e.classList.add(`bs-${this.constructor.NAME}-auto`);const i=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME).toString();return e.setAttribute("id",i),this._isAnimated()&&e.classList.add(ts),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new Jn({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{".tooltip-inner":this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(ts)}_isShown(){return this.tip&&this.tip.classList.contains(es)}_createPopper(t){const e=g(this._config.placement,[this,t,this._element]),i=rs[e.toUpperCase()];return bi(this._element,t,this._getPopperConfig(i))}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return g(t,[this._element])}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:t=>{this._getTipElement().setAttribute("data-popper-placement",t.state.placement)}}]};return{...e,...g(this._config.popperConfig,[e])}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)N.on(this._element,this.constructor.eventName("click"),this._config.selector,(t=>{this._initializeOnDelegatedTarget(t).toggle()}));else if("manual"!==e){const t=e===ss?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===ss?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");N.on(this._element,t,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?os:ss]=!0,e._enter()})),N.on(this._element,i,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?os:ss]=e._element.contains(t.relatedTarget),e._leave()}))}this._hideModalHandler=()=>{this._element&&this.hide()},N.on(this._element.closest(is),ns,this._hideModalHandler)}_fixTitle(){const t=this._element.getAttribute("title");t&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",t),this._element.setAttribute("data-bs-original-title",t),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(this._isHovered=!0,this._setTimeout((()=>{this._isHovered&&this.show()}),this._config.delay.show))}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout((()=>{this._isHovered||this.hide()}),this._config.delay.hide))}_setTimeout(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){const e=F.getDataAttributes(this._element);for(const t of Object.keys(e))Zn.has(t)&&delete e[t];return t={...e,..."object"==typeof t&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=!1===t.container?document.body:r(t.container),"number"==typeof 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()),t}_getDelegateConfig(){const t={};for(const[e,i]of Object.entries(this._config))this.constructor.Default[e]!==i&&(t[e]=i);return t.selector=!1,t.trigger="manual",t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(t){return this.each((function(){const e=cs.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(cs);const hs={...cs.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},ds={...cs.DefaultType,content:"(null|string|element|function)"};class us extends cs{static get Default(){return hs}static get DefaultType(){return ds}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{".popover-header":this._getTitle(),".popover-body":this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(t){return this.each((function(){const e=us.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(us);const fs=".bs.scrollspy",ps=`activate${fs}`,ms=`click${fs}`,gs=`load${fs}.data-api`,_s="active",bs="[href]",vs=".nav-link",ys=`${vs}, .nav-item > ${vs}, .list-group-item`,ws={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},As={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class Es extends W{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return ws}static get DefaultType(){return As}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=r(t.target)||document.body,t.rootMargin=t.offset?`${t.offset}px 0px -30%`:t.rootMargin,"string"==typeof t.threshold&&(t.threshold=t.threshold.split(",").map((t=>Number.parseFloat(t)))),t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(N.off(this._config.target,ms),N.on(this._config.target,ms,bs,(t=>{const e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();const i=this._rootElement||window,n=e.offsetTop-this._element.offsetTop;if(i.scrollTo)return void i.scrollTo({top:n,behavior:"smooth"});i.scrollTop=n}})))}_getNewObserver(){const t={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver((t=>this._observerCallback(t)),t)}_observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}`),i=t=>{this._previousScrollData.visibleEntryTop=t.target.offsetTop,this._process(e(t))},n=(this._rootElement||document.documentElement).scrollTop,s=n>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=n;for(const o of t){if(!o.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(o));continue}const t=o.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(s&&t){if(i(o),!n)return}else s||t||i(o)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const t=z.find(bs,this._config.target);for(const e of t){if(!e.hash||l(e))continue;const t=z.findOne(decodeURI(e.hash),this._element);a(t)&&(this._targetLinks.set(decodeURI(e.hash),e),this._observableSections.set(e.hash,t))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(_s),this._activateParents(t),N.trigger(this._element,ps,{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))z.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(_s);else for(const e of z.parents(t,".nav, .list-group"))for(const t of z.prev(e,ys))t.classList.add(_s)}_clearActiveClass(t){t.classList.remove(_s);const e=z.find(`${bs}.${_s}`,t);for(const t of e)t.classList.remove(_s)}static jQueryInterface(t){return this.each((function(){const e=Es.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}N.on(window,gs,(()=>{for(const t of z.find('[data-bs-spy="scroll"]'))Es.getOrCreateInstance(t)})),m(Es);const Ts=".bs.tab",Cs=`hide${Ts}`,Os=`hidden${Ts}`,xs=`show${Ts}`,ks=`shown${Ts}`,Ls=`click${Ts}`,Ss=`keydown${Ts}`,Ds=`load${Ts}`,$s="ArrowLeft",Is="ArrowRight",Ns="ArrowUp",Ps="ArrowDown",Ms="Home",js="End",Fs="active",Hs="fade",Ws="show",Bs=".dropdown-toggle",zs=`:not(${Bs})`,Rs='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',qs=`.nav-link${zs}, .list-group-item${zs}, [role="tab"]${zs}, ${Rs}`,Vs=`.${Fs}[data-bs-toggle="tab"], .${Fs}[data-bs-toggle="pill"], .${Fs}[data-bs-toggle="list"]`;class Ks extends W{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),N.on(this._element,Ss,(t=>this._keydown(t))))}static get NAME(){return"tab"}show(){const t=this._element;if(this._elemIsActive(t))return;const e=this._getActiveElem(),i=e?N.trigger(e,Cs,{relatedTarget:t}):null;N.trigger(t,xs,{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(Fs),this._activate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),N.trigger(t,ks,{relatedTarget:e})):t.classList.add(Ws)}),t,t.classList.contains(Hs)))}_deactivate(t,e){t&&(t.classList.remove(Fs),t.blur(),this._deactivate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),N.trigger(t,Os,{relatedTarget:e})):t.classList.remove(Ws)}),t,t.classList.contains(Hs)))}_keydown(t){if(![$s,Is,Ns,Ps,Ms,js].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=this._getChildren().filter((t=>!l(t)));let i;if([Ms,js].includes(t.key))i=e[t.key===Ms?0:e.length-1];else{const n=[Is,Ps].includes(t.key);i=b(e,t.target,n,!0)}i&&(i.focus({preventScroll:!0}),Ks.getOrCreateInstance(i).show())}_getChildren(){return z.find(qs,this._parent)}_getActiveElem(){return this._getChildren().find((t=>this._elemIsActive(t)))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(const t of e)this._setInitialAttributesOnChild(t)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=this._elemIsActive(t),i=this._getOuterElement(t);t.setAttribute("aria-selected",e),i!==t&&this._setAttributeIfNotExists(i,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){const e=z.getElementFromSelector(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`${t.id}`))}_toggleDropDown(t,e){const i=this._getOuterElement(t);if(!i.classList.contains("dropdown"))return;const n=(t,n)=>{const s=z.findOne(t,i);s&&s.classList.toggle(n,e)};n(Bs,Fs),n(".dropdown-menu",Ws),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(Fs)}_getInnerElement(t){return t.matches(qs)?t:z.findOne(qs,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each((function(){const e=Ks.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}N.on(document,Ls,Rs,(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this)||Ks.getOrCreateInstance(this).show()})),N.on(window,Ds,(()=>{for(const t of z.find(Vs))Ks.getOrCreateInstance(t)})),m(Ks);const Qs=".bs.toast",Xs=`mouseover${Qs}`,Ys=`mouseout${Qs}`,Us=`focusin${Qs}`,Gs=`focusout${Qs}`,Js=`hide${Qs}`,Zs=`hidden${Qs}`,to=`show${Qs}`,eo=`shown${Qs}`,io="hide",no="show",so="showing",oo={animation:"boolean",autohide:"boolean",delay:"number"},ro={animation:!0,autohide:!0,delay:5e3};class ao extends W{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return ro}static get DefaultType(){return oo}static get NAME(){return"toast"}show(){N.trigger(this._element,to).defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(io),d(this._element),this._element.classList.add(no,so),this._queueCallback((()=>{this._element.classList.remove(so),N.trigger(this._element,eo),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this.isShown()&&(N.trigger(this._element,Js).defaultPrevented||(this._element.classList.add(so),this._queueCallback((()=>{this._element.classList.add(io),this._element.classList.remove(so,no),N.trigger(this._element,Zs)}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(no),super.dispose()}isShown(){return this._element.classList.contains(no)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){N.on(this._element,Xs,(t=>this._onInteraction(t,!0))),N.on(this._element,Ys,(t=>this._onInteraction(t,!1))),N.on(this._element,Us,(t=>this._onInteraction(t,!0))),N.on(this._element,Gs,(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=ao.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}return R(ao),m(ao),{Alert:Q,Button:Y,Carousel:xt,Collapse:Bt,Dropdown:qi,Modal:On,Offcanvas:qn,Popover:us,ScrollSpy:Es,Tab:Ks,Toast:ao,Tooltip:cs}})); 7 | //# sourceMappingURL=bootstrap.bundle.min.js.map -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "aula00-tests-frontend-template", 3 | "version": "0.0.1", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "aula00-tests-frontend-template", 9 | "version": "0.0.1", 10 | "license": "ISC", 11 | "devDependencies": { 12 | "browser-sync": "^2.29.3" 13 | }, 14 | "engines": { 15 | "node": "v20.12.1" 16 | } 17 | }, 18 | "node_modules/@socket.io/component-emitter": { 19 | "version": "3.1.0", 20 | "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", 21 | "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", 22 | "dev": true 23 | }, 24 | "node_modules/@types/cookie": { 25 | "version": "0.4.1", 26 | "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", 27 | "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", 28 | "dev": true 29 | }, 30 | "node_modules/@types/cors": { 31 | "version": "2.8.17", 32 | "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", 33 | "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", 34 | "dev": true, 35 | "dependencies": { 36 | "@types/node": "*" 37 | } 38 | }, 39 | "node_modules/@types/node": { 40 | "version": "20.5.7", 41 | "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.7.tgz", 42 | "integrity": "sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==", 43 | "dev": true 44 | }, 45 | "node_modules/accepts": { 46 | "version": "1.3.8", 47 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 48 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 49 | "dev": true, 50 | "dependencies": { 51 | "mime-types": "~2.1.34", 52 | "negotiator": "0.6.3" 53 | }, 54 | "engines": { 55 | "node": ">= 0.6" 56 | } 57 | }, 58 | "node_modules/ansi-regex": { 59 | "version": "5.0.1", 60 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 61 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 62 | "dev": true, 63 | "engines": { 64 | "node": ">=8" 65 | } 66 | }, 67 | "node_modules/ansi-styles": { 68 | "version": "4.3.0", 69 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 70 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 71 | "dev": true, 72 | "dependencies": { 73 | "color-convert": "^2.0.1" 74 | }, 75 | "engines": { 76 | "node": ">=8" 77 | }, 78 | "funding": { 79 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 80 | } 81 | }, 82 | "node_modules/anymatch": { 83 | "version": "3.1.3", 84 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 85 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 86 | "dev": true, 87 | "dependencies": { 88 | "normalize-path": "^3.0.0", 89 | "picomatch": "^2.0.4" 90 | }, 91 | "engines": { 92 | "node": ">= 8" 93 | } 94 | }, 95 | "node_modules/async": { 96 | "version": "2.6.4", 97 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", 98 | "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", 99 | "dev": true, 100 | "dependencies": { 101 | "lodash": "^4.17.14" 102 | } 103 | }, 104 | "node_modules/async-each-series": { 105 | "version": "0.1.1", 106 | "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz", 107 | "integrity": "sha512-p4jj6Fws4Iy2m0iCmI2am2ZNZCgbdgE+P8F/8csmn2vx7ixXrO2zGcuNsD46X5uZSVecmkEy/M06X2vG8KD6dQ==", 108 | "dev": true, 109 | "engines": { 110 | "node": ">=0.8.0" 111 | } 112 | }, 113 | "node_modules/axios": { 114 | "version": "0.21.4", 115 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", 116 | "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", 117 | "dev": true, 118 | "dependencies": { 119 | "follow-redirects": "^1.14.0" 120 | } 121 | }, 122 | "node_modules/balanced-match": { 123 | "version": "1.0.2", 124 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 125 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 126 | "dev": true 127 | }, 128 | "node_modules/base64id": { 129 | "version": "2.0.0", 130 | "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", 131 | "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", 132 | "dev": true, 133 | "engines": { 134 | "node": "^4.5.0 || >= 5.9" 135 | } 136 | }, 137 | "node_modules/batch": { 138 | "version": "0.6.1", 139 | "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", 140 | "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", 141 | "dev": true 142 | }, 143 | "node_modules/binary-extensions": { 144 | "version": "2.2.0", 145 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 146 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 147 | "dev": true, 148 | "engines": { 149 | "node": ">=8" 150 | } 151 | }, 152 | "node_modules/brace-expansion": { 153 | "version": "1.1.11", 154 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 155 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 156 | "dev": true, 157 | "dependencies": { 158 | "balanced-match": "^1.0.0", 159 | "concat-map": "0.0.1" 160 | } 161 | }, 162 | "node_modules/braces": { 163 | "version": "3.0.2", 164 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 165 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 166 | "dev": true, 167 | "dependencies": { 168 | "fill-range": "^7.0.1" 169 | }, 170 | "engines": { 171 | "node": ">=8" 172 | } 173 | }, 174 | "node_modules/browser-sync": { 175 | "version": "2.29.3", 176 | "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.29.3.tgz", 177 | "integrity": "sha512-NiM38O6XU84+MN+gzspVmXV2fTOoe+jBqIBx3IBdhZrdeURr6ZgznJr/p+hQ+KzkKEiGH/GcC4SQFSL0jV49bg==", 178 | "dev": true, 179 | "dependencies": { 180 | "browser-sync-client": "^2.29.3", 181 | "browser-sync-ui": "^2.29.3", 182 | "bs-recipes": "1.3.4", 183 | "chalk": "4.1.2", 184 | "chokidar": "^3.5.1", 185 | "connect": "3.6.6", 186 | "connect-history-api-fallback": "^1", 187 | "dev-ip": "^1.0.1", 188 | "easy-extender": "^2.3.4", 189 | "eazy-logger": "^4.0.1", 190 | "etag": "^1.8.1", 191 | "fresh": "^0.5.2", 192 | "fs-extra": "3.0.1", 193 | "http-proxy": "^1.18.1", 194 | "immutable": "^3", 195 | "localtunnel": "^2.0.1", 196 | "micromatch": "^4.0.2", 197 | "opn": "5.3.0", 198 | "portscanner": "2.2.0", 199 | "raw-body": "^2.3.2", 200 | "resp-modifier": "6.0.2", 201 | "rx": "4.1.0", 202 | "send": "0.16.2", 203 | "serve-index": "1.9.1", 204 | "serve-static": "1.13.2", 205 | "server-destroy": "1.0.1", 206 | "socket.io": "^4.4.1", 207 | "ua-parser-js": "^1.0.33", 208 | "yargs": "^17.3.1" 209 | }, 210 | "bin": { 211 | "browser-sync": "dist/bin.js" 212 | }, 213 | "engines": { 214 | "node": ">= 8.0.0" 215 | } 216 | }, 217 | "node_modules/browser-sync-client": { 218 | "version": "2.29.3", 219 | "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.29.3.tgz", 220 | "integrity": "sha512-4tK5JKCl7v/3aLbmCBMzpufiYLsB1+UI+7tUXCCp5qF0AllHy/jAqYu6k7hUF3hYtlClKpxExWaR+rH+ny07wQ==", 221 | "dev": true, 222 | "dependencies": { 223 | "etag": "1.8.1", 224 | "fresh": "0.5.2", 225 | "mitt": "^1.1.3" 226 | }, 227 | "engines": { 228 | "node": ">=8.0.0" 229 | } 230 | }, 231 | "node_modules/browser-sync-ui": { 232 | "version": "2.29.3", 233 | "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.29.3.tgz", 234 | "integrity": "sha512-kBYOIQjU/D/3kYtUIJtj82e797Egk1FB2broqItkr3i4eF1qiHbFCG6srksu9gWhfmuM/TNG76jMfzAdxEPakg==", 235 | "dev": true, 236 | "dependencies": { 237 | "async-each-series": "0.1.1", 238 | "chalk": "4.1.2", 239 | "connect-history-api-fallback": "^1", 240 | "immutable": "^3", 241 | "server-destroy": "1.0.1", 242 | "socket.io-client": "^4.4.1", 243 | "stream-throttle": "^0.1.3" 244 | } 245 | }, 246 | "node_modules/bs-recipes": { 247 | "version": "1.3.4", 248 | "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz", 249 | "integrity": "sha512-BXvDkqhDNxXEjeGM8LFkSbR+jzmP/CYpCiVKYn+soB1dDldeU15EBNDkwVXndKuX35wnNUaPd0qSoQEAkmQtMw==", 250 | "dev": true 251 | }, 252 | "node_modules/bytes": { 253 | "version": "3.1.2", 254 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 255 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 256 | "dev": true, 257 | "engines": { 258 | "node": ">= 0.8" 259 | } 260 | }, 261 | "node_modules/chalk": { 262 | "version": "4.1.2", 263 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 264 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 265 | "dev": true, 266 | "dependencies": { 267 | "ansi-styles": "^4.1.0", 268 | "supports-color": "^7.1.0" 269 | }, 270 | "engines": { 271 | "node": ">=10" 272 | }, 273 | "funding": { 274 | "url": "https://github.com/chalk/chalk?sponsor=1" 275 | } 276 | }, 277 | "node_modules/chokidar": { 278 | "version": "3.5.3", 279 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 280 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 281 | "dev": true, 282 | "funding": [ 283 | { 284 | "type": "individual", 285 | "url": "https://paulmillr.com/funding/" 286 | } 287 | ], 288 | "dependencies": { 289 | "anymatch": "~3.1.2", 290 | "braces": "~3.0.2", 291 | "glob-parent": "~5.1.2", 292 | "is-binary-path": "~2.1.0", 293 | "is-glob": "~4.0.1", 294 | "normalize-path": "~3.0.0", 295 | "readdirp": "~3.6.0" 296 | }, 297 | "engines": { 298 | "node": ">= 8.10.0" 299 | }, 300 | "optionalDependencies": { 301 | "fsevents": "~2.3.2" 302 | } 303 | }, 304 | "node_modules/cliui": { 305 | "version": "8.0.1", 306 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", 307 | "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", 308 | "dev": true, 309 | "dependencies": { 310 | "string-width": "^4.2.0", 311 | "strip-ansi": "^6.0.1", 312 | "wrap-ansi": "^7.0.0" 313 | }, 314 | "engines": { 315 | "node": ">=12" 316 | } 317 | }, 318 | "node_modules/color-convert": { 319 | "version": "2.0.1", 320 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 321 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 322 | "dev": true, 323 | "dependencies": { 324 | "color-name": "~1.1.4" 325 | }, 326 | "engines": { 327 | "node": ">=7.0.0" 328 | } 329 | }, 330 | "node_modules/color-name": { 331 | "version": "1.1.4", 332 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 333 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 334 | "dev": true 335 | }, 336 | "node_modules/commander": { 337 | "version": "2.20.3", 338 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 339 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 340 | "dev": true 341 | }, 342 | "node_modules/concat-map": { 343 | "version": "0.0.1", 344 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 345 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 346 | "dev": true 347 | }, 348 | "node_modules/connect": { 349 | "version": "3.6.6", 350 | "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", 351 | "integrity": "sha512-OO7axMmPpu/2XuX1+2Yrg0ddju31B6xLZMWkJ5rYBu4YRmRVlOjvlY6kw2FJKiAzyxGwnrDUAG4s1Pf0sbBMCQ==", 352 | "dev": true, 353 | "dependencies": { 354 | "debug": "2.6.9", 355 | "finalhandler": "1.1.0", 356 | "parseurl": "~1.3.2", 357 | "utils-merge": "1.0.1" 358 | }, 359 | "engines": { 360 | "node": ">= 0.10.0" 361 | } 362 | }, 363 | "node_modules/connect-history-api-fallback": { 364 | "version": "1.6.0", 365 | "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", 366 | "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", 367 | "dev": true, 368 | "engines": { 369 | "node": ">=0.8" 370 | } 371 | }, 372 | "node_modules/connect/node_modules/debug": { 373 | "version": "2.6.9", 374 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 375 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 376 | "dev": true, 377 | "dependencies": { 378 | "ms": "2.0.0" 379 | } 380 | }, 381 | "node_modules/connect/node_modules/ms": { 382 | "version": "2.0.0", 383 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 384 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", 385 | "dev": true 386 | }, 387 | "node_modules/cookie": { 388 | "version": "0.4.2", 389 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", 390 | "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", 391 | "dev": true, 392 | "engines": { 393 | "node": ">= 0.6" 394 | } 395 | }, 396 | "node_modules/cors": { 397 | "version": "2.8.5", 398 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 399 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 400 | "dev": true, 401 | "dependencies": { 402 | "object-assign": "^4", 403 | "vary": "^1" 404 | }, 405 | "engines": { 406 | "node": ">= 0.10" 407 | } 408 | }, 409 | "node_modules/debug": { 410 | "version": "4.3.4", 411 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 412 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 413 | "dev": true, 414 | "dependencies": { 415 | "ms": "2.1.2" 416 | }, 417 | "engines": { 418 | "node": ">=6.0" 419 | }, 420 | "peerDependenciesMeta": { 421 | "supports-color": { 422 | "optional": true 423 | } 424 | } 425 | }, 426 | "node_modules/depd": { 427 | "version": "2.0.0", 428 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 429 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 430 | "dev": true, 431 | "engines": { 432 | "node": ">= 0.8" 433 | } 434 | }, 435 | "node_modules/destroy": { 436 | "version": "1.0.4", 437 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 438 | "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==", 439 | "dev": true 440 | }, 441 | "node_modules/dev-ip": { 442 | "version": "1.0.1", 443 | "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", 444 | "integrity": "sha512-LmVkry/oDShEgSZPNgqCIp2/TlqtExeGmymru3uCELnfyjY11IzpAproLYs+1X88fXO6DBoYP3ul2Xo2yz2j6A==", 445 | "dev": true, 446 | "bin": { 447 | "dev-ip": "lib/dev-ip.js" 448 | }, 449 | "engines": { 450 | "node": ">= 0.8.0" 451 | } 452 | }, 453 | "node_modules/easy-extender": { 454 | "version": "2.3.4", 455 | "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz", 456 | "integrity": "sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==", 457 | "dev": true, 458 | "dependencies": { 459 | "lodash": "^4.17.10" 460 | }, 461 | "engines": { 462 | "node": ">= 4.0.0" 463 | } 464 | }, 465 | "node_modules/eazy-logger": { 466 | "version": "4.0.1", 467 | "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-4.0.1.tgz", 468 | "integrity": "sha512-2GSFtnnC6U4IEKhEI7+PvdxrmjJ04mdsj3wHZTFiw0tUtG4HCWzTr13ZYTk8XOGnA1xQMaDljoBOYlk3D/MMSw==", 469 | "dev": true, 470 | "dependencies": { 471 | "chalk": "4.1.2" 472 | }, 473 | "engines": { 474 | "node": ">= 0.8.0" 475 | } 476 | }, 477 | "node_modules/ee-first": { 478 | "version": "1.1.1", 479 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 480 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", 481 | "dev": true 482 | }, 483 | "node_modules/emoji-regex": { 484 | "version": "8.0.0", 485 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 486 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 487 | "dev": true 488 | }, 489 | "node_modules/encodeurl": { 490 | "version": "1.0.2", 491 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 492 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 493 | "dev": true, 494 | "engines": { 495 | "node": ">= 0.8" 496 | } 497 | }, 498 | "node_modules/engine.io": { 499 | "version": "6.5.4", 500 | "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.4.tgz", 501 | "integrity": "sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==", 502 | "dev": true, 503 | "dependencies": { 504 | "@types/cookie": "^0.4.1", 505 | "@types/cors": "^2.8.12", 506 | "@types/node": ">=10.0.0", 507 | "accepts": "~1.3.4", 508 | "base64id": "2.0.0", 509 | "cookie": "~0.4.1", 510 | "cors": "~2.8.5", 511 | "debug": "~4.3.1", 512 | "engine.io-parser": "~5.2.1", 513 | "ws": "~8.11.0" 514 | }, 515 | "engines": { 516 | "node": ">=10.2.0" 517 | } 518 | }, 519 | "node_modules/engine.io-client": { 520 | "version": "6.5.3", 521 | "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.3.tgz", 522 | "integrity": "sha512-9Z0qLB0NIisTRt1DZ/8U2k12RJn8yls/nXMZLn+/N8hANT3TcYjKFKcwbw5zFQiN4NTde3TSY9zb79e1ij6j9Q==", 523 | "dev": true, 524 | "dependencies": { 525 | "@socket.io/component-emitter": "~3.1.0", 526 | "debug": "~4.3.1", 527 | "engine.io-parser": "~5.2.1", 528 | "ws": "~8.11.0", 529 | "xmlhttprequest-ssl": "~2.0.0" 530 | } 531 | }, 532 | "node_modules/engine.io-parser": { 533 | "version": "5.2.1", 534 | "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.1.tgz", 535 | "integrity": "sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==", 536 | "dev": true, 537 | "engines": { 538 | "node": ">=10.0.0" 539 | } 540 | }, 541 | "node_modules/escalade": { 542 | "version": "3.1.1", 543 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 544 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 545 | "dev": true, 546 | "engines": { 547 | "node": ">=6" 548 | } 549 | }, 550 | "node_modules/escape-html": { 551 | "version": "1.0.3", 552 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 553 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", 554 | "dev": true 555 | }, 556 | "node_modules/etag": { 557 | "version": "1.8.1", 558 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 559 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 560 | "dev": true, 561 | "engines": { 562 | "node": ">= 0.6" 563 | } 564 | }, 565 | "node_modules/eventemitter3": { 566 | "version": "4.0.7", 567 | "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", 568 | "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", 569 | "dev": true 570 | }, 571 | "node_modules/fill-range": { 572 | "version": "7.0.1", 573 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 574 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 575 | "dev": true, 576 | "dependencies": { 577 | "to-regex-range": "^5.0.1" 578 | }, 579 | "engines": { 580 | "node": ">=8" 581 | } 582 | }, 583 | "node_modules/finalhandler": { 584 | "version": "1.1.0", 585 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", 586 | "integrity": "sha512-ejnvM9ZXYzp6PUPUyQBMBf0Co5VX2gr5H2VQe2Ui2jWXNlxv+PYZo8wpAymJNJdLsG1R4p+M4aynF8KuoUEwRw==", 587 | "dev": true, 588 | "dependencies": { 589 | "debug": "2.6.9", 590 | "encodeurl": "~1.0.1", 591 | "escape-html": "~1.0.3", 592 | "on-finished": "~2.3.0", 593 | "parseurl": "~1.3.2", 594 | "statuses": "~1.3.1", 595 | "unpipe": "~1.0.0" 596 | }, 597 | "engines": { 598 | "node": ">= 0.8" 599 | } 600 | }, 601 | "node_modules/finalhandler/node_modules/debug": { 602 | "version": "2.6.9", 603 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 604 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 605 | "dev": true, 606 | "dependencies": { 607 | "ms": "2.0.0" 608 | } 609 | }, 610 | "node_modules/finalhandler/node_modules/ms": { 611 | "version": "2.0.0", 612 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 613 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", 614 | "dev": true 615 | }, 616 | "node_modules/follow-redirects": { 617 | "version": "1.15.3", 618 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", 619 | "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", 620 | "dev": true, 621 | "funding": [ 622 | { 623 | "type": "individual", 624 | "url": "https://github.com/sponsors/RubenVerborgh" 625 | } 626 | ], 627 | "engines": { 628 | "node": ">=4.0" 629 | }, 630 | "peerDependenciesMeta": { 631 | "debug": { 632 | "optional": true 633 | } 634 | } 635 | }, 636 | "node_modules/fresh": { 637 | "version": "0.5.2", 638 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 639 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 640 | "dev": true, 641 | "engines": { 642 | "node": ">= 0.6" 643 | } 644 | }, 645 | "node_modules/fs-extra": { 646 | "version": "3.0.1", 647 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", 648 | "integrity": "sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg==", 649 | "dev": true, 650 | "dependencies": { 651 | "graceful-fs": "^4.1.2", 652 | "jsonfile": "^3.0.0", 653 | "universalify": "^0.1.0" 654 | } 655 | }, 656 | "node_modules/fsevents": { 657 | "version": "2.3.3", 658 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 659 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 660 | "dev": true, 661 | "hasInstallScript": true, 662 | "optional": true, 663 | "os": [ 664 | "darwin" 665 | ], 666 | "engines": { 667 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 668 | } 669 | }, 670 | "node_modules/get-caller-file": { 671 | "version": "2.0.5", 672 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 673 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 674 | "dev": true, 675 | "engines": { 676 | "node": "6.* || 8.* || >= 10.*" 677 | } 678 | }, 679 | "node_modules/glob-parent": { 680 | "version": "5.1.2", 681 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 682 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 683 | "dev": true, 684 | "dependencies": { 685 | "is-glob": "^4.0.1" 686 | }, 687 | "engines": { 688 | "node": ">= 6" 689 | } 690 | }, 691 | "node_modules/graceful-fs": { 692 | "version": "4.2.11", 693 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 694 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 695 | "dev": true 696 | }, 697 | "node_modules/has-flag": { 698 | "version": "4.0.0", 699 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 700 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 701 | "dev": true, 702 | "engines": { 703 | "node": ">=8" 704 | } 705 | }, 706 | "node_modules/http-errors": { 707 | "version": "2.0.0", 708 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 709 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 710 | "dev": true, 711 | "dependencies": { 712 | "depd": "2.0.0", 713 | "inherits": "2.0.4", 714 | "setprototypeof": "1.2.0", 715 | "statuses": "2.0.1", 716 | "toidentifier": "1.0.1" 717 | }, 718 | "engines": { 719 | "node": ">= 0.8" 720 | } 721 | }, 722 | "node_modules/http-errors/node_modules/statuses": { 723 | "version": "2.0.1", 724 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 725 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 726 | "dev": true, 727 | "engines": { 728 | "node": ">= 0.8" 729 | } 730 | }, 731 | "node_modules/http-proxy": { 732 | "version": "1.18.1", 733 | "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", 734 | "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", 735 | "dev": true, 736 | "dependencies": { 737 | "eventemitter3": "^4.0.0", 738 | "follow-redirects": "^1.0.0", 739 | "requires-port": "^1.0.0" 740 | }, 741 | "engines": { 742 | "node": ">=8.0.0" 743 | } 744 | }, 745 | "node_modules/iconv-lite": { 746 | "version": "0.4.24", 747 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 748 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 749 | "dev": true, 750 | "dependencies": { 751 | "safer-buffer": ">= 2.1.2 < 3" 752 | }, 753 | "engines": { 754 | "node": ">=0.10.0" 755 | } 756 | }, 757 | "node_modules/immutable": { 758 | "version": "3.8.2", 759 | "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", 760 | "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==", 761 | "dev": true, 762 | "engines": { 763 | "node": ">=0.10.0" 764 | } 765 | }, 766 | "node_modules/inherits": { 767 | "version": "2.0.4", 768 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 769 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 770 | "dev": true 771 | }, 772 | "node_modules/is-binary-path": { 773 | "version": "2.1.0", 774 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 775 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 776 | "dev": true, 777 | "dependencies": { 778 | "binary-extensions": "^2.0.0" 779 | }, 780 | "engines": { 781 | "node": ">=8" 782 | } 783 | }, 784 | "node_modules/is-extglob": { 785 | "version": "2.1.1", 786 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 787 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 788 | "dev": true, 789 | "engines": { 790 | "node": ">=0.10.0" 791 | } 792 | }, 793 | "node_modules/is-fullwidth-code-point": { 794 | "version": "3.0.0", 795 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 796 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 797 | "dev": true, 798 | "engines": { 799 | "node": ">=8" 800 | } 801 | }, 802 | "node_modules/is-glob": { 803 | "version": "4.0.3", 804 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 805 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 806 | "dev": true, 807 | "dependencies": { 808 | "is-extglob": "^2.1.1" 809 | }, 810 | "engines": { 811 | "node": ">=0.10.0" 812 | } 813 | }, 814 | "node_modules/is-number": { 815 | "version": "7.0.0", 816 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 817 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 818 | "dev": true, 819 | "engines": { 820 | "node": ">=0.12.0" 821 | } 822 | }, 823 | "node_modules/is-number-like": { 824 | "version": "1.0.8", 825 | "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", 826 | "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", 827 | "dev": true, 828 | "dependencies": { 829 | "lodash.isfinite": "^3.3.2" 830 | } 831 | }, 832 | "node_modules/is-wsl": { 833 | "version": "1.1.0", 834 | "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", 835 | "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", 836 | "dev": true, 837 | "engines": { 838 | "node": ">=4" 839 | } 840 | }, 841 | "node_modules/jsonfile": { 842 | "version": "3.0.1", 843 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", 844 | "integrity": "sha512-oBko6ZHlubVB5mRFkur5vgYR1UyqX+S6Y/oCfLhqNdcc2fYFlDpIoNc7AfKS1KOGcnNAkvsr0grLck9ANM815w==", 845 | "dev": true, 846 | "optionalDependencies": { 847 | "graceful-fs": "^4.1.6" 848 | } 849 | }, 850 | "node_modules/limiter": { 851 | "version": "1.1.5", 852 | "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", 853 | "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==", 854 | "dev": true 855 | }, 856 | "node_modules/localtunnel": { 857 | "version": "2.0.2", 858 | "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.2.tgz", 859 | "integrity": "sha512-n418Cn5ynvJd7m/N1d9WVJISLJF/ellZnfsLnx8WBWGzxv/ntNcFkJ1o6se5quUhCplfLGBNL5tYHiq5WF3Nug==", 860 | "dev": true, 861 | "dependencies": { 862 | "axios": "0.21.4", 863 | "debug": "4.3.2", 864 | "openurl": "1.1.1", 865 | "yargs": "17.1.1" 866 | }, 867 | "bin": { 868 | "lt": "bin/lt.js" 869 | }, 870 | "engines": { 871 | "node": ">=8.3.0" 872 | } 873 | }, 874 | "node_modules/localtunnel/node_modules/cliui": { 875 | "version": "7.0.4", 876 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 877 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 878 | "dev": true, 879 | "dependencies": { 880 | "string-width": "^4.2.0", 881 | "strip-ansi": "^6.0.0", 882 | "wrap-ansi": "^7.0.0" 883 | } 884 | }, 885 | "node_modules/localtunnel/node_modules/debug": { 886 | "version": "4.3.2", 887 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", 888 | "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", 889 | "dev": true, 890 | "dependencies": { 891 | "ms": "2.1.2" 892 | }, 893 | "engines": { 894 | "node": ">=6.0" 895 | }, 896 | "peerDependenciesMeta": { 897 | "supports-color": { 898 | "optional": true 899 | } 900 | } 901 | }, 902 | "node_modules/localtunnel/node_modules/yargs": { 903 | "version": "17.1.1", 904 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz", 905 | "integrity": "sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ==", 906 | "dev": true, 907 | "dependencies": { 908 | "cliui": "^7.0.2", 909 | "escalade": "^3.1.1", 910 | "get-caller-file": "^2.0.5", 911 | "require-directory": "^2.1.1", 912 | "string-width": "^4.2.0", 913 | "y18n": "^5.0.5", 914 | "yargs-parser": "^20.2.2" 915 | }, 916 | "engines": { 917 | "node": ">=12" 918 | } 919 | }, 920 | "node_modules/localtunnel/node_modules/yargs-parser": { 921 | "version": "20.2.9", 922 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", 923 | "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", 924 | "dev": true, 925 | "engines": { 926 | "node": ">=10" 927 | } 928 | }, 929 | "node_modules/lodash": { 930 | "version": "4.17.21", 931 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 932 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 933 | "dev": true 934 | }, 935 | "node_modules/lodash.isfinite": { 936 | "version": "3.3.2", 937 | "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", 938 | "integrity": "sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==", 939 | "dev": true 940 | }, 941 | "node_modules/micromatch": { 942 | "version": "4.0.5", 943 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 944 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 945 | "dev": true, 946 | "dependencies": { 947 | "braces": "^3.0.2", 948 | "picomatch": "^2.3.1" 949 | }, 950 | "engines": { 951 | "node": ">=8.6" 952 | } 953 | }, 954 | "node_modules/mime": { 955 | "version": "1.4.1", 956 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", 957 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", 958 | "dev": true, 959 | "bin": { 960 | "mime": "cli.js" 961 | } 962 | }, 963 | "node_modules/mime-db": { 964 | "version": "1.52.0", 965 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 966 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 967 | "dev": true, 968 | "engines": { 969 | "node": ">= 0.6" 970 | } 971 | }, 972 | "node_modules/mime-types": { 973 | "version": "2.1.35", 974 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 975 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 976 | "dev": true, 977 | "dependencies": { 978 | "mime-db": "1.52.0" 979 | }, 980 | "engines": { 981 | "node": ">= 0.6" 982 | } 983 | }, 984 | "node_modules/minimatch": { 985 | "version": "3.1.2", 986 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 987 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 988 | "dev": true, 989 | "dependencies": { 990 | "brace-expansion": "^1.1.7" 991 | }, 992 | "engines": { 993 | "node": "*" 994 | } 995 | }, 996 | "node_modules/mitt": { 997 | "version": "1.2.0", 998 | "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz", 999 | "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==", 1000 | "dev": true 1001 | }, 1002 | "node_modules/ms": { 1003 | "version": "2.1.2", 1004 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1005 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1006 | "dev": true 1007 | }, 1008 | "node_modules/negotiator": { 1009 | "version": "0.6.3", 1010 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 1011 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 1012 | "dev": true, 1013 | "engines": { 1014 | "node": ">= 0.6" 1015 | } 1016 | }, 1017 | "node_modules/normalize-path": { 1018 | "version": "3.0.0", 1019 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1020 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1021 | "dev": true, 1022 | "engines": { 1023 | "node": ">=0.10.0" 1024 | } 1025 | }, 1026 | "node_modules/object-assign": { 1027 | "version": "4.1.1", 1028 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1029 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 1030 | "dev": true, 1031 | "engines": { 1032 | "node": ">=0.10.0" 1033 | } 1034 | }, 1035 | "node_modules/on-finished": { 1036 | "version": "2.3.0", 1037 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 1038 | "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", 1039 | "dev": true, 1040 | "dependencies": { 1041 | "ee-first": "1.1.1" 1042 | }, 1043 | "engines": { 1044 | "node": ">= 0.8" 1045 | } 1046 | }, 1047 | "node_modules/openurl": { 1048 | "version": "1.1.1", 1049 | "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", 1050 | "integrity": "sha512-d/gTkTb1i1GKz5k3XE3XFV/PxQ1k45zDqGP2OA7YhgsaLoqm6qRvARAZOFer1fcXritWlGBRCu/UgeS4HAnXAA==", 1051 | "dev": true 1052 | }, 1053 | "node_modules/opn": { 1054 | "version": "5.3.0", 1055 | "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", 1056 | "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", 1057 | "dev": true, 1058 | "dependencies": { 1059 | "is-wsl": "^1.1.0" 1060 | }, 1061 | "engines": { 1062 | "node": ">=4" 1063 | } 1064 | }, 1065 | "node_modules/parseurl": { 1066 | "version": "1.3.3", 1067 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1068 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 1069 | "dev": true, 1070 | "engines": { 1071 | "node": ">= 0.8" 1072 | } 1073 | }, 1074 | "node_modules/picomatch": { 1075 | "version": "2.3.1", 1076 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1077 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1078 | "dev": true, 1079 | "engines": { 1080 | "node": ">=8.6" 1081 | }, 1082 | "funding": { 1083 | "url": "https://github.com/sponsors/jonschlinkert" 1084 | } 1085 | }, 1086 | "node_modules/portscanner": { 1087 | "version": "2.2.0", 1088 | "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz", 1089 | "integrity": "sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==", 1090 | "dev": true, 1091 | "dependencies": { 1092 | "async": "^2.6.0", 1093 | "is-number-like": "^1.0.3" 1094 | }, 1095 | "engines": { 1096 | "node": ">=0.4", 1097 | "npm": ">=1.0.0" 1098 | } 1099 | }, 1100 | "node_modules/range-parser": { 1101 | "version": "1.2.1", 1102 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1103 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 1104 | "dev": true, 1105 | "engines": { 1106 | "node": ">= 0.6" 1107 | } 1108 | }, 1109 | "node_modules/raw-body": { 1110 | "version": "2.5.2", 1111 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", 1112 | "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", 1113 | "dev": true, 1114 | "dependencies": { 1115 | "bytes": "3.1.2", 1116 | "http-errors": "2.0.0", 1117 | "iconv-lite": "0.4.24", 1118 | "unpipe": "1.0.0" 1119 | }, 1120 | "engines": { 1121 | "node": ">= 0.8" 1122 | } 1123 | }, 1124 | "node_modules/readdirp": { 1125 | "version": "3.6.0", 1126 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1127 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1128 | "dev": true, 1129 | "dependencies": { 1130 | "picomatch": "^2.2.1" 1131 | }, 1132 | "engines": { 1133 | "node": ">=8.10.0" 1134 | } 1135 | }, 1136 | "node_modules/require-directory": { 1137 | "version": "2.1.1", 1138 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1139 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 1140 | "dev": true, 1141 | "engines": { 1142 | "node": ">=0.10.0" 1143 | } 1144 | }, 1145 | "node_modules/requires-port": { 1146 | "version": "1.0.0", 1147 | "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", 1148 | "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", 1149 | "dev": true 1150 | }, 1151 | "node_modules/resp-modifier": { 1152 | "version": "6.0.2", 1153 | "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz", 1154 | "integrity": "sha512-U1+0kWC/+4ncRFYqQWTx/3qkfE6a4B/h3XXgmXypfa0SPZ3t7cbbaFk297PjQS/yov24R18h6OZe6iZwj3NSLw==", 1155 | "dev": true, 1156 | "dependencies": { 1157 | "debug": "^2.2.0", 1158 | "minimatch": "^3.0.2" 1159 | }, 1160 | "engines": { 1161 | "node": ">= 0.8.0" 1162 | } 1163 | }, 1164 | "node_modules/resp-modifier/node_modules/debug": { 1165 | "version": "2.6.9", 1166 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1167 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1168 | "dev": true, 1169 | "dependencies": { 1170 | "ms": "2.0.0" 1171 | } 1172 | }, 1173 | "node_modules/resp-modifier/node_modules/ms": { 1174 | "version": "2.0.0", 1175 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1176 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", 1177 | "dev": true 1178 | }, 1179 | "node_modules/rx": { 1180 | "version": "4.1.0", 1181 | "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", 1182 | "integrity": "sha512-CiaiuN6gapkdl+cZUr67W6I8jquN4lkak3vtIsIWCl4XIPP8ffsoyN6/+PuGXnQy8Cu8W2y9Xxh31Rq4M6wUug==", 1183 | "dev": true 1184 | }, 1185 | "node_modules/safer-buffer": { 1186 | "version": "2.1.2", 1187 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1188 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 1189 | "dev": true 1190 | }, 1191 | "node_modules/send": { 1192 | "version": "0.16.2", 1193 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", 1194 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", 1195 | "dev": true, 1196 | "dependencies": { 1197 | "debug": "2.6.9", 1198 | "depd": "~1.1.2", 1199 | "destroy": "~1.0.4", 1200 | "encodeurl": "~1.0.2", 1201 | "escape-html": "~1.0.3", 1202 | "etag": "~1.8.1", 1203 | "fresh": "0.5.2", 1204 | "http-errors": "~1.6.2", 1205 | "mime": "1.4.1", 1206 | "ms": "2.0.0", 1207 | "on-finished": "~2.3.0", 1208 | "range-parser": "~1.2.0", 1209 | "statuses": "~1.4.0" 1210 | }, 1211 | "engines": { 1212 | "node": ">= 0.8.0" 1213 | } 1214 | }, 1215 | "node_modules/send/node_modules/debug": { 1216 | "version": "2.6.9", 1217 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1218 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1219 | "dev": true, 1220 | "dependencies": { 1221 | "ms": "2.0.0" 1222 | } 1223 | }, 1224 | "node_modules/send/node_modules/depd": { 1225 | "version": "1.1.2", 1226 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 1227 | "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", 1228 | "dev": true, 1229 | "engines": { 1230 | "node": ">= 0.6" 1231 | } 1232 | }, 1233 | "node_modules/send/node_modules/http-errors": { 1234 | "version": "1.6.3", 1235 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", 1236 | "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", 1237 | "dev": true, 1238 | "dependencies": { 1239 | "depd": "~1.1.2", 1240 | "inherits": "2.0.3", 1241 | "setprototypeof": "1.1.0", 1242 | "statuses": ">= 1.4.0 < 2" 1243 | }, 1244 | "engines": { 1245 | "node": ">= 0.6" 1246 | } 1247 | }, 1248 | "node_modules/send/node_modules/inherits": { 1249 | "version": "2.0.3", 1250 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1251 | "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", 1252 | "dev": true 1253 | }, 1254 | "node_modules/send/node_modules/ms": { 1255 | "version": "2.0.0", 1256 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1257 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", 1258 | "dev": true 1259 | }, 1260 | "node_modules/send/node_modules/setprototypeof": { 1261 | "version": "1.1.0", 1262 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 1263 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", 1264 | "dev": true 1265 | }, 1266 | "node_modules/send/node_modules/statuses": { 1267 | "version": "1.4.0", 1268 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 1269 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", 1270 | "dev": true, 1271 | "engines": { 1272 | "node": ">= 0.6" 1273 | } 1274 | }, 1275 | "node_modules/serve-index": { 1276 | "version": "1.9.1", 1277 | "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", 1278 | "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", 1279 | "dev": true, 1280 | "dependencies": { 1281 | "accepts": "~1.3.4", 1282 | "batch": "0.6.1", 1283 | "debug": "2.6.9", 1284 | "escape-html": "~1.0.3", 1285 | "http-errors": "~1.6.2", 1286 | "mime-types": "~2.1.17", 1287 | "parseurl": "~1.3.2" 1288 | }, 1289 | "engines": { 1290 | "node": ">= 0.8.0" 1291 | } 1292 | }, 1293 | "node_modules/serve-index/node_modules/debug": { 1294 | "version": "2.6.9", 1295 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1296 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1297 | "dev": true, 1298 | "dependencies": { 1299 | "ms": "2.0.0" 1300 | } 1301 | }, 1302 | "node_modules/serve-index/node_modules/depd": { 1303 | "version": "1.1.2", 1304 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 1305 | "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", 1306 | "dev": true, 1307 | "engines": { 1308 | "node": ">= 0.6" 1309 | } 1310 | }, 1311 | "node_modules/serve-index/node_modules/http-errors": { 1312 | "version": "1.6.3", 1313 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", 1314 | "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", 1315 | "dev": true, 1316 | "dependencies": { 1317 | "depd": "~1.1.2", 1318 | "inherits": "2.0.3", 1319 | "setprototypeof": "1.1.0", 1320 | "statuses": ">= 1.4.0 < 2" 1321 | }, 1322 | "engines": { 1323 | "node": ">= 0.6" 1324 | } 1325 | }, 1326 | "node_modules/serve-index/node_modules/inherits": { 1327 | "version": "2.0.3", 1328 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1329 | "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", 1330 | "dev": true 1331 | }, 1332 | "node_modules/serve-index/node_modules/ms": { 1333 | "version": "2.0.0", 1334 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1335 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", 1336 | "dev": true 1337 | }, 1338 | "node_modules/serve-index/node_modules/setprototypeof": { 1339 | "version": "1.1.0", 1340 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 1341 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", 1342 | "dev": true 1343 | }, 1344 | "node_modules/serve-index/node_modules/statuses": { 1345 | "version": "1.5.0", 1346 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 1347 | "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", 1348 | "dev": true, 1349 | "engines": { 1350 | "node": ">= 0.6" 1351 | } 1352 | }, 1353 | "node_modules/serve-static": { 1354 | "version": "1.13.2", 1355 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", 1356 | "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", 1357 | "dev": true, 1358 | "dependencies": { 1359 | "encodeurl": "~1.0.2", 1360 | "escape-html": "~1.0.3", 1361 | "parseurl": "~1.3.2", 1362 | "send": "0.16.2" 1363 | }, 1364 | "engines": { 1365 | "node": ">= 0.8.0" 1366 | } 1367 | }, 1368 | "node_modules/server-destroy": { 1369 | "version": "1.0.1", 1370 | "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", 1371 | "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==", 1372 | "dev": true 1373 | }, 1374 | "node_modules/setprototypeof": { 1375 | "version": "1.2.0", 1376 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 1377 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", 1378 | "dev": true 1379 | }, 1380 | "node_modules/socket.io": { 1381 | "version": "4.7.2", 1382 | "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.2.tgz", 1383 | "integrity": "sha512-bvKVS29/I5fl2FGLNHuXlQaUH/BlzX1IN6S+NKLNZpBsPZIDH+90eQmCs2Railn4YUiww4SzUedJ6+uzwFnKLw==", 1384 | "dev": true, 1385 | "dependencies": { 1386 | "accepts": "~1.3.4", 1387 | "base64id": "~2.0.0", 1388 | "cors": "~2.8.5", 1389 | "debug": "~4.3.2", 1390 | "engine.io": "~6.5.2", 1391 | "socket.io-adapter": "~2.5.2", 1392 | "socket.io-parser": "~4.2.4" 1393 | }, 1394 | "engines": { 1395 | "node": ">=10.2.0" 1396 | } 1397 | }, 1398 | "node_modules/socket.io-adapter": { 1399 | "version": "2.5.2", 1400 | "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", 1401 | "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", 1402 | "dev": true, 1403 | "dependencies": { 1404 | "ws": "~8.11.0" 1405 | } 1406 | }, 1407 | "node_modules/socket.io-client": { 1408 | "version": "4.7.2", 1409 | "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.2.tgz", 1410 | "integrity": "sha512-vtA0uD4ibrYD793SOIAwlo8cj6haOeMHrGvwPxJsxH7CeIksqJ+3Zc06RvWTIFgiSqx4A3sOnTXpfAEE2Zyz6w==", 1411 | "dev": true, 1412 | "dependencies": { 1413 | "@socket.io/component-emitter": "~3.1.0", 1414 | "debug": "~4.3.2", 1415 | "engine.io-client": "~6.5.2", 1416 | "socket.io-parser": "~4.2.4" 1417 | }, 1418 | "engines": { 1419 | "node": ">=10.0.0" 1420 | } 1421 | }, 1422 | "node_modules/socket.io-parser": { 1423 | "version": "4.2.4", 1424 | "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", 1425 | "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", 1426 | "dev": true, 1427 | "dependencies": { 1428 | "@socket.io/component-emitter": "~3.1.0", 1429 | "debug": "~4.3.1" 1430 | }, 1431 | "engines": { 1432 | "node": ">=10.0.0" 1433 | } 1434 | }, 1435 | "node_modules/statuses": { 1436 | "version": "1.3.1", 1437 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", 1438 | "integrity": "sha512-wuTCPGlJONk/a1kqZ4fQM2+908lC7fa7nPYpTC1EhnvqLX/IICbeP1OZGDtA374trpSq68YubKUMo8oRhN46yg==", 1439 | "dev": true, 1440 | "engines": { 1441 | "node": ">= 0.6" 1442 | } 1443 | }, 1444 | "node_modules/stream-throttle": { 1445 | "version": "0.1.3", 1446 | "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz", 1447 | "integrity": "sha512-889+B9vN9dq7/vLbGyuHeZ6/ctf5sNuGWsDy89uNxkFTAgzy0eK7+w5fL3KLNRTkLle7EgZGvHUphZW0Q26MnQ==", 1448 | "dev": true, 1449 | "dependencies": { 1450 | "commander": "^2.2.0", 1451 | "limiter": "^1.0.5" 1452 | }, 1453 | "bin": { 1454 | "throttleproxy": "bin/throttleproxy.js" 1455 | }, 1456 | "engines": { 1457 | "node": ">= 0.10.0" 1458 | } 1459 | }, 1460 | "node_modules/string-width": { 1461 | "version": "4.2.3", 1462 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1463 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1464 | "dev": true, 1465 | "dependencies": { 1466 | "emoji-regex": "^8.0.0", 1467 | "is-fullwidth-code-point": "^3.0.0", 1468 | "strip-ansi": "^6.0.1" 1469 | }, 1470 | "engines": { 1471 | "node": ">=8" 1472 | } 1473 | }, 1474 | "node_modules/strip-ansi": { 1475 | "version": "6.0.1", 1476 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1477 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1478 | "dev": true, 1479 | "dependencies": { 1480 | "ansi-regex": "^5.0.1" 1481 | }, 1482 | "engines": { 1483 | "node": ">=8" 1484 | } 1485 | }, 1486 | "node_modules/supports-color": { 1487 | "version": "7.2.0", 1488 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1489 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1490 | "dev": true, 1491 | "dependencies": { 1492 | "has-flag": "^4.0.0" 1493 | }, 1494 | "engines": { 1495 | "node": ">=8" 1496 | } 1497 | }, 1498 | "node_modules/to-regex-range": { 1499 | "version": "5.0.1", 1500 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1501 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1502 | "dev": true, 1503 | "dependencies": { 1504 | "is-number": "^7.0.0" 1505 | }, 1506 | "engines": { 1507 | "node": ">=8.0" 1508 | } 1509 | }, 1510 | "node_modules/toidentifier": { 1511 | "version": "1.0.1", 1512 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 1513 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 1514 | "dev": true, 1515 | "engines": { 1516 | "node": ">=0.6" 1517 | } 1518 | }, 1519 | "node_modules/ua-parser-js": { 1520 | "version": "1.0.37", 1521 | "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.37.tgz", 1522 | "integrity": "sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==", 1523 | "dev": true, 1524 | "funding": [ 1525 | { 1526 | "type": "opencollective", 1527 | "url": "https://opencollective.com/ua-parser-js" 1528 | }, 1529 | { 1530 | "type": "paypal", 1531 | "url": "https://paypal.me/faisalman" 1532 | }, 1533 | { 1534 | "type": "github", 1535 | "url": "https://github.com/sponsors/faisalman" 1536 | } 1537 | ], 1538 | "engines": { 1539 | "node": "*" 1540 | } 1541 | }, 1542 | "node_modules/universalify": { 1543 | "version": "0.1.2", 1544 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", 1545 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", 1546 | "dev": true, 1547 | "engines": { 1548 | "node": ">= 4.0.0" 1549 | } 1550 | }, 1551 | "node_modules/unpipe": { 1552 | "version": "1.0.0", 1553 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1554 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 1555 | "dev": true, 1556 | "engines": { 1557 | "node": ">= 0.8" 1558 | } 1559 | }, 1560 | "node_modules/utils-merge": { 1561 | "version": "1.0.1", 1562 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1563 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", 1564 | "dev": true, 1565 | "engines": { 1566 | "node": ">= 0.4.0" 1567 | } 1568 | }, 1569 | "node_modules/vary": { 1570 | "version": "1.1.2", 1571 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1572 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 1573 | "dev": true, 1574 | "engines": { 1575 | "node": ">= 0.8" 1576 | } 1577 | }, 1578 | "node_modules/wrap-ansi": { 1579 | "version": "7.0.0", 1580 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 1581 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1582 | "dev": true, 1583 | "dependencies": { 1584 | "ansi-styles": "^4.0.0", 1585 | "string-width": "^4.1.0", 1586 | "strip-ansi": "^6.0.0" 1587 | }, 1588 | "engines": { 1589 | "node": ">=10" 1590 | }, 1591 | "funding": { 1592 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 1593 | } 1594 | }, 1595 | "node_modules/ws": { 1596 | "version": "8.11.0", 1597 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", 1598 | "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", 1599 | "dev": true, 1600 | "engines": { 1601 | "node": ">=10.0.0" 1602 | }, 1603 | "peerDependencies": { 1604 | "bufferutil": "^4.0.1", 1605 | "utf-8-validate": "^5.0.2" 1606 | }, 1607 | "peerDependenciesMeta": { 1608 | "bufferutil": { 1609 | "optional": true 1610 | }, 1611 | "utf-8-validate": { 1612 | "optional": true 1613 | } 1614 | } 1615 | }, 1616 | "node_modules/xmlhttprequest-ssl": { 1617 | "version": "2.0.0", 1618 | "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", 1619 | "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", 1620 | "dev": true, 1621 | "engines": { 1622 | "node": ">=0.4.0" 1623 | } 1624 | }, 1625 | "node_modules/y18n": { 1626 | "version": "5.0.8", 1627 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 1628 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 1629 | "dev": true, 1630 | "engines": { 1631 | "node": ">=10" 1632 | } 1633 | }, 1634 | "node_modules/yargs": { 1635 | "version": "17.7.2", 1636 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", 1637 | "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", 1638 | "dev": true, 1639 | "dependencies": { 1640 | "cliui": "^8.0.1", 1641 | "escalade": "^3.1.1", 1642 | "get-caller-file": "^2.0.5", 1643 | "require-directory": "^2.1.1", 1644 | "string-width": "^4.2.3", 1645 | "y18n": "^5.0.5", 1646 | "yargs-parser": "^21.1.1" 1647 | }, 1648 | "engines": { 1649 | "node": ">=12" 1650 | } 1651 | }, 1652 | "node_modules/yargs-parser": { 1653 | "version": "21.1.1", 1654 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", 1655 | "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", 1656 | "dev": true, 1657 | "engines": { 1658 | "node": ">=12" 1659 | } 1660 | } 1661 | } 1662 | } 1663 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "aula00-tests-frontend-template", 3 | "version": "0.0.1", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "npx browser-sync start -w --server ." 8 | }, 9 | "keywords": [], 10 | "author": "erickwendel", 11 | "license": "ISC", 12 | "type": "module", 13 | "engines": { 14 | "node": "v20.12.1" 15 | }, 16 | "devDependencies": { 17 | "browser-sync": "^2.29.3" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/controller.js: -------------------------------------------------------------------------------- 1 | export default class Controller { 2 | #view = {} 3 | #service = {} 4 | constructor({ view, service }) { 5 | this.#view = view 6 | this.#service = service 7 | this.#view.configureOnSubmit(this.#onSubmit.bind(this)) 8 | } 9 | 10 | async initialize() { 11 | this.#view.initialize() 12 | return this.loadItems() 13 | } 14 | 15 | /** 16 | * @param {object} item 17 | * @param {string} item.title 18 | * @param {string} item.imageUrl 19 | * @returns {Promise} 20 | */ 21 | async #onSubmit(item) { 22 | await this.#service.saveItem(item) 23 | return this.#view.updateList([item]) 24 | } 25 | 26 | async loadItems() { 27 | const items = await this.#service.getItems() 28 | if(!items.length) return 29 | 30 | this.#view.updateList(items) 31 | } 32 | } -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import View from "./view.js"; 2 | import Service from "./service.js"; 3 | import Controller from "./controller.js"; 4 | 5 | const view = new View(); 6 | 7 | // localStorage.removeItem('tdd-ew-db') 8 | 9 | const service = new Service({ 10 | tableName: 'tdd-ew-db' 11 | }); 12 | 13 | const controller = new Controller({ view, service }); 14 | controller.initialize(); -------------------------------------------------------------------------------- /src/service.js: -------------------------------------------------------------------------------- 1 | export default class Service { 2 | #tableName = '' 3 | constructor({ tableName }) { 4 | this.#tableName = tableName 5 | } 6 | 7 | #getItems() { 8 | return JSON.parse(localStorage.getItem(this.#tableName)) ?? [] 9 | } 10 | 11 | #setItems(items) { 12 | localStorage.setItem(this.#tableName, JSON.stringify(items)) 13 | } 14 | 15 | #sleep(ms) { 16 | return new Promise(resolve => setTimeout(resolve, ms)) 17 | } 18 | 19 | async saveItem(item) { 20 | const items = this.#getItems() 21 | items.push(item) 22 | await this.#sleep(200) 23 | this.#setItems(items) 24 | return; 25 | } 26 | 27 | async getItems() { 28 | await this.#sleep(200) 29 | return this.#getItems() 30 | } 31 | } -------------------------------------------------------------------------------- /src/view.js: -------------------------------------------------------------------------------- 1 | const WAS_VALIDATED_CLASS = 'was-validated' 2 | export default class View { 3 | #forms = document.querySelectorAll('.needs-validation') 4 | #title = document.querySelector('#title') 5 | #cardList = document.querySelector('#card-list') 6 | 7 | #submitFn = () => { } 8 | 9 | constructor() { } 10 | 11 | initialize() { 12 | for (const form of this.#forms) { 13 | form.addEventListener('submit', this.#onSubmit(form), false) 14 | } 15 | } 16 | 17 | /** 18 | * @param {HTMLFormElement} form 19 | */ 20 | #onSubmit(form) { 21 | /** 22 | * @param {Event} event 23 | */ 24 | return (event) => { 25 | form.classList.add(WAS_VALIDATED_CLASS) 26 | event.preventDefault() 27 | event.stopPropagation() 28 | 29 | if (!form.checkValidity()) { 30 | const element = [...form.elements].find(item => !item.checkValidity()) 31 | element?.focus() 32 | return; 33 | } 34 | 35 | form.classList.remove(WAS_VALIDATED_CLASS) 36 | 37 | this.#title.focus() 38 | 39 | this.#submitFn({ 40 | title: form.title.value, 41 | imageUrl: form.imageUrl.value 42 | }) 43 | 44 | form.reset() 45 | } 46 | } 47 | /** 48 | * @param {function} onSubmit 49 | */ 50 | configureOnSubmit(onSubmit) { 51 | this.#submitFn = onSubmit 52 | } 53 | 54 | /** 55 | * @param {object[]} items 56 | * @param {string} items[].title 57 | * @param {string} items[].imageUrl 58 | */ 59 | updateList(items) { 60 | const template = ({ imageUrl, title }) => ` 61 |
62 |
63 |
64 | Image of an ${title} 67 |
68 |

${title}

69 |
70 |
71 |
72 |
73 | ` 74 | 75 | this.#cardList.innerHTML += items.map(template).join('') 76 | } 77 | } --------------------------------------------------------------------------------