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 */const alert=document.getElementById("page-alert"),closeBtn=document.getElementById("page-alert-btn-close");if(alert!==null&&closeBtn!==null){const version=alert.getAttribute("data-page-alert-version")||"unknown",hideAlert=sessionStorage.getItem(`page-alert-${version}`)!==null;hideAlert&&alert.classList.add("d-none"),closeBtn.addEventListener("click",()=>{sessionStorage.setItem(`page-alert-${version}`,"seen"),alert.classList.add("d-none")})}function reveal(){const reveals=document.querySelectorAll(".reveal");for(let i=0;i<reveals.length;i++){const windowHeight=window.innerHeight,elementTop=reveals[i].getBoundingClientRect().top,elementVisible=150;elementTop<windowHeight-elementVisible?(reveals[i].classList.add("active"),reveals[i].classList.remove("reveal")):reveals[i].classList.remove("active")}}window.addEventListener("scroll",reveal);const svgCopy='<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" width="16" height="16" fill="currentColor" class="bi bi-clipboard" viewBox="0 0 16 16"><path d="M4 1.5H3a2 2 0 0 0-2 2V14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V3.5a2 2 0 0 0-2-2h-1v1h1a1 1 0 0 1 1 1V14a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V3.5a1 1 0 0 1 1-1h1v-1z"/><path d="M9.5 1a.5.5 0 0 1 .5.5v1a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5v-1a.5.5 0 0 1 .5-.5h3zm-3-1A1.5 1.5 0 0 0 5 1.5v1A1.5 1.5 0 0 0 6.5 4h3A1.5 1.5 0 0 0 11 2.5v-1A1.5 1.5 0 0 0 9.5 0h-3z"/></svg>',svgCheck='<svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true"><path fill-rule="evenodd" fill="rgb(63, 185, 80)" d="M13.78 4.22a.75.75 0 010 1.06l-7.25 7.25a.75.75 0 01-1.06 0L2.22 9.28a.75.75 0 011.06-1.06L6 10.94l6.72-6.72a.75.75 0 011.06 0z"></path></svg>',addCopyButtons=clipboard=>{document.querySelectorAll("pre > code").forEach(codeBlock=>{const button=document.createElement("button");button.className="clipboard-button",button.setAttribute("data-toast-target","toast-copied-code-message"),button.setAttribute("aria-label","kopÃrovat do schránky"),button.type="button",button.innerHTML=svgCopy,button.addEventListener("click",()=>{const text=codeBlock.innerText.split(` 6`).filter(Boolean).join(` 7`);clipboard.writeText(text).then(()=>{button.blur(),button.innerHTML=svgCheck,setTimeout(()=>button.innerHTML=svgCopy,2e3)},error=>button.innerHTML="Error")});const pre=codeBlock.parentNode;pre.parentNode.insertBefore(button,pre)})};navigator&&navigator.clipboard&&addCopyButtons(navigator.clipboard),document.querySelectorAll("[data-clipboard]").forEach(trigger=>{const text=trigger.getAttribute("data-clipboard");trigger.addEventListener("click",()=>{navigator.clipboard.writeText(text)})});const url=new URL(window.location.href),menu=url.searchParams.get("menu"),child=url.searchParams.get("child"),menuItems=document.querySelectorAll('[data-nav="main"]');if(menu!==null){menuItems.forEach(element=>{element.classList.remove("active")});const targetMainItems=document.querySelectorAll(`[data-nav-main="${menu}"]:not([data-nav-child])`);targetMainItems.forEach(element=>{element.classList.add("active")});const targetChildItems=document.querySelectorAll(`[data-nav-main="${menu}"][data-nav-child="${child}"]`);targetChildItems.forEach(element=>{element.classList.add("active")})}(function(global,factory){typeof exports=="object"&&typeof module!="undefined"?module.exports=factory():typeof define=="function"&&define.amd?define(factory):(global=typeof globalThis!="undefined"?globalThis:global||self,global.bootstrap=factory())})(this,function(){"use strict";const elementMap=new Map,Data={set(element,key,instance){elementMap.has(element)||elementMap.set(element,new Map);const instanceMap=elementMap.get(element);if(!instanceMap.has(key)&&instanceMap.size!==0){console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`);return}instanceMap.set(key,instance)},get(element,key){return elementMap.has(element)?elementMap.get(element).get(key)||null:null},remove(element,key){if(!elementMap.has(element))return;const instanceMap=elementMap.get(element);instanceMap.delete(key),instanceMap.size===0&&elementMap.delete(element)}},MAX_UID=1e6,MILLISECONDS_MULTIPLIER=1e3,TRANSITION_END="transitionend",parseSelector=selector=>(selector&&window.CSS&&window.CSS.escape&&(selector=selector.replace(/#([^\s"#']+)/g,(match,id)=>`#${CSS.escape(id)}`)),selector),toType=object=>object==null?`${object}`:Object.prototype.toString.call(object).match(/\s([a-z]+)/i)[1].toLowerCase(),getUID=prefix=>
7{do prefix+=Math.floor(Math.random()*MAX_UID);while(document.getElementById(prefix))return prefix},getTransitionDurationFromElement=element=>{if(!element)return 0;let{transitionDuration,transitionDelay}=window.getComputedStyle(element);const floatTransitionDuration=Number.parseFloat(transitionDuration),floatTransitionDelay=Number.parseFloat(transitionDelay);return!floatTransitionDuration&&!floatTransitionDelay?0:(transitionDuration=transitionDuration.split(",")[0],transitionDelay=transitionDelay.split(",")[0],(Number.parseFloat(transitionDuration)+Number.parseFloat(transitionDelay))*MILLISECONDS_MULTIPLIER)},triggerTransitionEnd=element=>{element.dispatchEvent(new Event(TRANSITION_END))},isElement$1=object=>!!object&&typeof object=="object"&&(typeof object.jquery!="undefined"&&(object=object[0]),typeof object.nodeType!="undefined"),getElement=object=>isElement$1(object)?object.jquery?object[0]:object:typeof object=="string"&&object.length>0?document.querySelector(parseSelector(object)):null,isVisible=element=>{if(!isElement$1(element)||element.getClientRects().length===0)return!1;const elementIsVisible=getComputedStyle(element).getPropertyValue("visibility")==="visible",closedDetails=element.closest("details:not([open])");if(!closedDetails)return elementIsVisible;if(closedDetails!==element){const summary=element.closest("summary");if(summary&&summary.parentNode!==closedDetails)return!1;if(summary===null)return!1}return elementIsVisible},isDisabled=element=>!element||element.nodeType!==Node.ELEMENT_NODE||!!element.classList.contains("disabled")||(typeof element.disabled!="undefined"?element.disabled:element.hasAttribute("disabled")&&element.getAttribute("disabled")!=="false"),findShadowRoot=element=>{if(!document.documentElement.attachShadow)return null;if(typeof element.getRootNode=="function"){const root=element.getRootNode();return root instanceof ShadowRoot?root:null}return element instanceof ShadowRoot?element:element.parentNode?findShadowRoot(element.parentNode):null},noop=()=>{},reflow=element=>{element.offsetHeight},getjQuery=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,DOMContentLoadedCallbacks=[],onDOMContentLoaded=callback=>{document.readyState==="loading"?(DOMContentLoadedCallbacks.length||document.addEventListener("DOMContentLoaded",()=>{for(const callback of DOMContentLoadedCallbacks)callback()}),DOMContentLoadedCallbacks.push(callback)):callback()},isRTL=()=>document.documentElement.dir==="rtl",defineJQueryPlugin=plugin=>{onDOMContentLoaded(()=>{const $=getjQuery();if($){const name=plugin.NAME,JQUERY_NO_CONFLICT=$.fn[name];$.fn[name]=plugin.jQueryInterface,$.fn[name].Constructor=plugin,$.fn[name].noConflict=()=>($.fn[name]=JQUERY_NO_CONFLICT,plugin.jQueryInterface)}})},execute=(possibleCallback,args=[],defaultValue=possibleCallback)=>typeof possibleCallback=="function"?possibleCallback(...args):defaultValue,executeAfterTransition=(callback,transitionElement,waitForTransition=!0)=>{if(!waitForTransition){execute(callback);return}const durationPadding=5,emulatedDuration=getTransitionDurationFromElement(transitionElement)+durationPadding;let called=!1;const handler=({target})=>
7{if(target!==transitionElement)return;called=!0,transitionElement.removeEventListener(TRANSITION_END,handler),execute(callback)};transitionElement.addEventListener(TRANSITION_END,handler),setTimeout(()=>{called||triggerTransitionEnd(transitionElement)},emulatedDuration)},getNextActiveElement=(list,activeElement,shouldGetNext,isCycleAllowed)=>{const listLength=list.length;let index=list.indexOf(activeElement);return index===-1?!shouldGetNext&&isCycleAllowed?list[listLength-1]:list[0]:(index+=shouldGetNext?1:-1,isCycleAllowed&&(index=(index+listLength)%listLength),list[Math.max(0,Math.min(index,listLength-1))])},namespaceRegex=/[^.]*(?=\..*)\.|.*/,stripNameRegex=/\..*/,stripUidRegex=/::\d+$/,eventRegistry={};let uidEvent=1;const customEvents={mouseenter:"mouseover",mouseleave:"mouseout"},nativeEvents=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 makeEventUid(element,uid){return uid&&`${uid}::${uidEvent++}`||element.uidEvent||uidEvent++}function getElementEvents(element){const uid=makeEventUid(element);return element.uidEvent=uid,eventRegistry[uid]=eventRegistry[uid]||{},eventRegistry[uid]}function bootstrapHandler(element,fn){return function handler(event){return hydrateObj(event,{delegateTarget:element}),handler.oneOff&&EventHandler.off(element,event.type,fn),fn.apply(element,[event])}}function bootstrapDelegationHandler(element,selector,fn){return function handler(event){const domElements=element.querySelectorAll(selector);for(let{target}=event;target&&target!==this;target=target.parentNode)for(const domElement of domElements){if(domElement!==target)continue;return hydrateObj(event,{delegateTarget:target}),handler.oneOff&&EventHandler.off(element,event.type,selector,fn),fn.apply(target,[event])}}}function findHandler(events,callable,delegationSelector=null){return Object.values(events).find(event=>event.callable===callable&&event.delegationSelector===delegationSelector)}function normalizeParameters(originalTypeEvent,handler,delegationFunction){const isDelegated=typeof handler=="string",callable=isDelegated?delegationFunction:handler||delegationFunction;let typeEvent=getTypeEvent(originalTypeEvent);return nativeEvents.has(typeEvent)||(typeEvent=originalTypeEvent),[isDelegated,callable,typeEvent]}function addHandler(element,originalTypeEvent,handler,delegationFunction,oneOff){if(typeof originalTypeEvent!="string"||!element)return;let[isDelegated,callable,typeEvent]=normalizeParameters(originalTypeEvent,handler,delegationFunction);if(originalTypeEvent in customEvents){const wrapFunction=fn=>function(event){if(!event.relatedTarget||event.relatedTarget!==event.delegateTarget&&!event.delegateTarget.contains(event.relatedTarget))return fn.call(this,event)};callable=wrapFunction(callable)}const events=getElementEvents(element),handlers=events[typeEvent]||(events[typeEvent]={}),previousFunction=findHandler(handlers,callable,isDelegated?handler:null);if(previousFunction){previousFunction.oneOff=previousFunction.oneOff&&oneOff;return}const uid=makeEventUid(callable,originalTypeEvent.replace(namespaceRegex,"")),fn=isDelegated?bootstrapDelegationHandler(element,handler,callable):bootstrapHandler(element,callable);fn.delegationSelector=isDelegated?handler:null,fn.callable=callable,fn.oneOff=oneOff,fn.uidEvent=uid,handlers[uid]=fn,element.addEventListener(typeEvent,fn,isDelegated)}function removeHandler(element,events,typeEvent,handler,delegationSelector){const fn=findHandler(events[typeEvent],handler,delegationSelector);if(!fn)return;element.removeEventListener(typeEvent,fn,Boolean(delegationSelector)),delete events[typeEvent][fn.uidEvent]}function removeNamespacedHandlers(element,events,typeEvent,namespace){const storeElementEvent=events[typeEvent]||{};for(const[handlerKey,event]of Object.entries(storeElementEvent))handlerKey.includes(namespace)&&removeHandler(element,events,typeEvent,event.callable,event.delegationSelector)}function getTypeEvent(event){return event=event.replace(stripNameRegex,""),customEvents[event]||event}const EventHandler={on(element,event,handler,delegationFunction){addHandler(element,event,handler,delegationFunction,!1)},one(element,event,handler,delegationFunction){addHandler(element,event,handler,delegationFunction,!0)},off(element,originalTypeEvent,handler,delegationFunction){if(typeof originalTypeEvent!="string"||!element)return;const[isDelegated,callable,typeEvent]=normalizeParameters(originalTypeEvent,handler,delegationFunction),inNamespace=typeEvent!==originalTypeEvent,events=getElementEvents(element),storeElementEvent=events[typeEvent]||{},isNamespace=originalTypeEvent.startsWith(".");if(typeof callable!="undefined"){if(!Object.keys(storeElementEvent).length)return;removeHandler(element,events,typeEvent,callable,isDelegated?handler:null);return}
7if(isNamespace)for(const elementEvent of Object.keys(events))removeNamespacedHandlers(element,events,elementEvent,originalTypeEvent.slice(1));for(const[keyHandlers,event]of Object.entries(storeElementEvent)){const handlerKey=keyHandlers.replace(stripUidRegex,"");(!inNamespace||originalTypeEvent.includes(handlerKey))&&removeHandler(element,events,typeEvent,event.callable,event.delegationSelector)}},trigger(element,event,args){if(typeof event!="string"||!element)return null;const $=getjQuery(),typeEvent=getTypeEvent(event),inNamespace=event!==typeEvent;let jQueryEvent=null,bubbles=!0,nativeDispatch=!0,defaultPrevented=!1;inNamespace&&$&&(jQueryEvent=$.Event(event,args),$(element).trigger(jQueryEvent),bubbles=!jQueryEvent.isPropagationStopped(),nativeDispatch=!jQueryEvent.isImmediatePropagationStopped(),defaultPrevented=jQueryEvent.isDefaultPrevented());const evt=hydrateObj(new Event(event,{bubbles,cancelable:!0}),args);return defaultPrevented&&evt.preventDefault(),nativeDispatch&&element.dispatchEvent(evt),evt.defaultPrevented&&jQueryEvent&&jQueryEvent.preventDefault(),evt}};function hydrateObj(obj,meta={}){for(const[key,value]of Object.entries(meta))try{obj[key]=value}catch{Object.defineProperty(obj,key,{configurable:!0,get(){return value}})}return obj}function normalizeData(value){if(value==="true")return!0;if(value==="false")return!1;if(value===Number(value).toString())return Number(value);if(value===""||value==="null")return null;if(typeof value!="string")return value;try{return JSON.parse(decodeURIComponent(value))}catch{return value}}function normalizeDataKey(key){return key.replace(/[A-Z]/g,chr=>`-${chr.toLowerCase()}`)}const Manipulator={setDataAttribute(element,key,value){element.setAttribute(`data-bs-${normalizeDataKey(key)}`,value)},removeDataAttribute(element,key){element.removeAttribute(`data-bs-${normalizeDataKey(key)}`)},getDataAttributes(element){if(!element)return{};const attributes={},bsKeys=Object.keys(element.dataset).filter(key=>key.startsWith("bs")&&!key.startsWith("bsConfig"));for(const key of bsKeys){let pureKey=key.replace(/^bs/,"");pureKey=pureKey.charAt(0).toLowerCase()+pureKey.slice(1,pureKey.length),attributes[pureKey]=normalizeData(element.dataset[key])}return attributes},getDataAttribute(element,key){return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`))}};class Config{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(config){return config=this._mergeConfigObj(config),config=this._configAfterMerge(config),this._typeCheckConfig(config),config}_configAfterMerge(config){return config}_mergeConfigObj(config,element){const jsonConfig=isElement$1(element)?Manipulator.getDataAttribute(element,"config"):{};return{...this.constructor.Default,...typeof jsonConfig=="object"?jsonConfig:{},...isElement$1(element)?Manipulator.getDataAttributes(element):{},...typeof config=="object"?config:{}}}_typeCheckConfig(config,configTypes=this.constructor.DefaultType){for(const[property,expectedTypes]of Object.entries(configTypes)){const value=config[property],valueType=isElement$1(value)?"element":toType(value);if(!new RegExp(expectedTypes).test(valueType))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`)}}}const VERSION="5.3.2";class BaseComponent extends Config{constructor(element,config){if(super(),element=getElement(element),!element)return;this._element=element,this._config=this._getConfig(config),Data.set(this._element,this.constructor.DATA_KEY,this)}dispose(){Data.remove(this._element,this.constructor.DATA_KEY),EventHandler.off(this._element,this.constructor.EVENT_KEY);for(const propertyName of Object.getOwnPropertyNames(this))this[propertyName]=null}_queueCallback(callback,element,isAnimated=!0){executeAfterTransition(callback,element,isAnimated)}_getConfig(config){return config=this._mergeConfigObj(config,this._element),config=this._configAfterMerge(config),this._typeCheckConfig(config),config}static getInstance(element){return Data.get(getElement(element),this.DATA_KEY)}static getOrCreateInstance(element,config={}){return this.getInstance(element)||new this(element,typeof config=="object"?config:null)}static get VERSION(){return VERSION}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(name){return`${name}${this.EVENT_KEY}`}}const getSelector=element=>{let selector=element.getAttribute("data-bs-target");if(!selector||selector==="#"){let hrefAttribute=element.getAttribute("href");if(!hrefAttribute||!hrefAttribute.includes("#")&&!hrefAttribute.startsWith("."))return null;hrefAttribute.includes("#")&&!hrefAttribute.startsWith("#")&&(hrefAttribute=`#${hrefAttribute.split("#")[1]}`),selector=hrefAttribute&&hrefAttribute!=="#"?parseSelector(hrefAttribute.trim()):null}return selector},SelectorEngine={find(selector,element=document.documentElement){return[].concat(...Element.prototype.querySelectorAll.call(element,selector))},findOne(selector,element=document.documentElement){return Element.prototype.querySelector.call(element,selector)},children(element,selector){return[].concat(...element.children).filter(child=>child.matches(selector))},parents(element,selector){const parents=[];let ancestor=element.parentNode.closest(selector);for(;ancestor;)parents.push(ancestor),ancestor=ancestor.parentNode.closest(selector);return parents},prev(element,selector){let previous=element.previousElementSibling;for(;previous;){if(previous.matches(selector))return[previous];previous=previous.previousElementSibling}return[]},next(element,selector){let next=element.nextElementSibling;for(;next;){if(next.matches(selector))return[next];next=next.nextElementSibling}return[]},focusableChildren(element){const focusables=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map(selector=>`${selector}:not([tabindex^="-"])`).join(",");return this.find(focusables,element).filter(el=>!isDisabled(el)&&isVisible(el))},getSelectorFromElement(element){const selector=getSelector(element);return selector?SelectorEngine.findOne(selector)?selector:null:null},getElementFromSelector(element){const selector=getSelector(element);return selector?SelectorEngine.findOne(selector):null},getMultipleElementsFromSelector(element){const selector=getSelector(element);return selector?SelectorEngine.find(selector):[]}},enableDismissTrigger=(component,method="hide")=>{const clickEvent=`click.dismiss${component.EVENT_KEY}`,name=component.NAME;EventHandler.on(document,clickEvent,`[data-bs-dismiss="${name}"]`,function(event){if(["A","AREA"].includes(this.tagName)&&event.preventDefault(),isDisabled(this))return;const target=SelectorEngine.getElementFromSelector(this)||this.closest(`.${name}`),instance=component.getOrCreateInstance(target);instance[method]()})},NAME$f="alert",DATA_KEY$a="bs.alert",EVENT_KEY$b=`.${DATA_KEY$a}`,EVENT_CLOSE=`close${EVENT_KEY$b}`,EVENT_CLOSED=`closed${EVENT_KEY$b}`,CLASS_NAME_FADE$5="fade",CLASS_NAME_SHOW$8="show";class Alert extends BaseComponent{static get NAME(){return NAME$f}close(){const closeEvent=EventHandler.trigger(this._element,EVENT_CLOSE);if(closeEvent.defaultPrevented)return;this._element.classList.remove(CLASS_NAME_SHOW$8);const isAnimated=this._element.classList.contains(CLASS_NAME_FADE$5);this._queueCallback(()=>this._destroyElement(),this._element,isAnimated)}_destroyElement(){this._element.remove(),EventHandler.trigger(this._element,EVENT_CLOSED),this.dispose()}static jQueryInterface(config){return this.each(function(){const data=Alert.getOrCreateInstance(this);if(typeof config!="string")return;if(data[config]===void 0||config.startsWith("_")||config==="constructor")throw new TypeError(`No method n
7amed "${config}"`);data[config](this)})}}enableDismissTrigger(Alert,"close"),defineJQueryPlugin(Alert);const NAME$e="button",DATA_KEY$9="bs.button",EVENT_KEY$a=`.${DATA_KEY$9}`,DATA_API_KEY$6=".data-api",CLASS_NAME_ACTIVE$3="active",SELECTOR_DATA_TOGGLE$5='[data-bs-toggle="button"]',EVENT_CLICK_DATA_API$6=`click${EVENT_KEY$a}${DATA_API_KEY$6}`;class Button extends BaseComponent{static get NAME(){return NAME$e}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle(CLASS_NAME_ACTIVE$3))}static jQueryInterface(config){return this.each(function(){const data=Button.getOrCreateInstance(this);config==="toggle"&&data[config]()})}}EventHandler.on(document,EVENT_CLICK_DATA_API$6,SELECTOR_DATA_TOGGLE$5,event=>{event.preventDefault();const button=event.target.closest(SELECTOR_DATA_TOGGLE$5),data=Button.getOrCreateInstance(button);data.toggle()}),defineJQueryPlugin(Button);const NAME$d="swipe",EVENT_KEY$9=".bs.swipe",EVENT_TOUCHSTART=`touchstart${EVENT_KEY$9}`,EVENT_TOUCHMOVE=`touchmove${EVENT_KEY$9}`,EVENT_TOUCHEND=`touchend${EVENT_KEY$9}`,EVENT_POINTERDOWN=`pointerdown${EVENT_KEY$9}`,EVENT_POINTERUP=`pointerup${EVENT_KEY$9}`,POINTER_TYPE_TOUCH="touch",POINTER_TYPE_PEN="pen",CLASS_NAME_POINTER_EVENT="pointer-event",SWIPE_THRESHOLD=40,Default$c={endCallback:null,leftCallback:null,rightCallback:null},DefaultType$c={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class Swipe extends Config{constructor(element,config){if(super(),this._element=element,!element||!Swipe.isSupported())return;this._config=this._getConfig(config),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents()}static get Default(){return Default$c}static get DefaultType(){return DefaultType$c}static get NAME(){return NAME$d}dispose(){EventHandler.off(this._element,EVENT_KEY$9)}_start(event){if(!this._supportPointerEvents){this._deltaX=event.touches[0].clientX;return}this._eventIsPointerPenTouch(event)&&(this._deltaX=event.clientX)}_end(event){this._eventIsPointerPenTouch(event)&&(this._deltaX=event.clientX-this._deltaX),this._handleSwipe(),execute(this._config.endCallback)}_move(event){this._deltaX=event.touches&&event.touches.length>1?0:event.touches[0].clientX-this._deltaX}_handleSwipe(){const absDeltaX=Math.abs(this._deltaX);if(absDeltaX<=SWIPE_THRESHOLD)return;const direction=absDeltaX/this._deltaX;if(this._deltaX=0,!direction)return;execute(direction>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(EventHandler.on(this._element,EVENT_POINTERDOWN,event=>this._start(event)),EventHandler.on(this._element,EVENT_POINTERUP,event=>this._end(event)),this._element.classList.add(CLASS_NAME_POINTER_EVENT)):(EventHandler.on(this._element,EVENT_TOUCHSTART,event=>this._start(event)),EventHandler.on(this._element,EVENT_TOUCHMOVE,event=>this._move(event)),EventHandler.on(this._element,EVENT_TOUCHEND,event=>this._end(event)))}_eventIsPointerPenTouch(event){return this._supportPointerEvents&&(event.pointerType===POINTER_TYPE_PEN||event.pointerType===POINTER_TYPE_TOUCH)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const NAME$c="carousel",DATA_KEY$8="bs.carousel",EVENT_KEY$8=`.${DATA_KEY$8}`,DATA_API_KEY$5=".data-api",ARROW_LEFT_KEY$1="ArrowLeft",ARROW_RIGHT_KEY$1="ArrowRight",TOUCHEVENT_COMPAT_WAIT=500,ORDER_NEXT="next",ORDER_PREV="prev",DIRECTION_LEFT="left",DIRECTION_RIGHT="right",EVENT_SLIDE=`slide${EVENT_KEY$8}`,EVENT_SLID=`slid${EVENT_KEY$8}`,EVENT_KEYDOWN$1=`keydown${EVENT_KEY$8}`,EVENT_MOUSEENTER$1=`mouseenter${EVENT_KEY$8}`,EVENT_MOUSELEAVE$1=`mouseleave${EVENT_KEY$8}`,EVENT_DRAG_START=`dragstart${EVENT_KEY$8}`,EVENT_LOAD_DATA_API$3=`load${EVENT_KEY$8}${DATA_API_KEY$5}`,EVENT_CLICK_DATA_API$5=`click${EVENT_KEY$8}${DATA_API_KEY$5}`,CLASS_NAME_CAROUSEL="carousel",CLASS_NAME_ACTIVE$2="active",CLASS_NAME_SLIDE="slide",CLASS_NAME_END="carousel-item-end",CLASS_NAME_START="carousel-item-start",CLASS_NAME_NEXT="carousel-item-next",CLASS_NAME_PREV="carousel-item-prev",SELECTOR_ACTIVE=".active",SELECTOR_ITEM=".carousel-item",SELECTOR_ACTIVE_ITEM=SELECTOR_ACTIVE+SELECTOR_ITEM,SELECTOR_ITEM_IMG=".carousel-item img",SELECTOR_INDICATORS=".carousel-indicators",SELECTOR_DATA_SLIDE="[data-bs-slide], [data-bs-slide-to]",SELECTOR_DATA_RIDE='[data-bs-ride="carousel"]',KEY_TO_DIRECTION={[ARROW_LEFT_KEY$1]:DIRECTION_RIGHT,[ARROW_RIGHT_KEY$1]:DIRECTION_LEFT},Default$b={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},DefaultType$b={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class Carousel extends BaseComponent{constructor(element,config){super(element,config),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=SelectorEngine.findOne(SELECTOR_INDICATORS,this._element),this._addEventListeners(),this._config.ride===CLASS_NAME_CAROUSEL&&this.cycle()}static get Default(){return Default$b}static get DefaultType(){return DefaultType$b}static get NAME(){return NAME$c}next(){this._slide(ORDER_NEXT)}nextWhenVisible(){!document.hidden&&isVisible(this._element)&&this.next()}prev(){this._slide(ORDER_PREV)}pause(){this._isSliding&&triggerTransitionEnd(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval(()=>this.nextWhenVisible(),this._config.interval)}_maybeEnableCycle(){if(!this._config.ride)return;if(this._isSliding){EventHandler.one(this._element,EVENT_SLID,()=>this.cycle());return}this.cycle()}to(index){const items=this._getItems();if(index>items.length-1||index<0)return;if(this._isSliding){EventHandler.one(this._element,EVENT_SLID,()=>this.to(index));return}const activeIndex=this._getItemIndex(this._getActive());if(activeIndex===index)return;const order=index>activeIndex?ORDER_NEXT:ORDER_PREV;this._slide(order,items[index])}
vendor: 4,450 bytes, line 7
7dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(config){return config.defaultInterval=config.interval,config}_addEventListeners(){this._config.keyboard&&EventHandler.on(this._element,EVENT_KEYDOWN$1,event=>this._keydown(event)),this._config.pause==="hover"&&(EventHandler.on(this._element,EVENT_MOUSEENTER$1,()=>this.pause()),EventHandler.on(this._element,EVENT_MOUSELEAVE$1,()=>this._maybeEnableCycle())),this._config.touch&&Swipe.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const img of SelectorEngine.find(SELECTOR_ITEM_IMG,this._element))EventHandler.on(img,EVENT_DRAG_START,event=>event.preventDefault());const endCallBack=()=>{if(this._config.pause!=="hover")return;this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout(()=>this._maybeEnableCycle(),TOUCHEVENT_COMPAT_WAIT+this._config.interval)},swipeConfig={leftCallback:()=>this._slide(this._directionToOrder(DIRECTION_LEFT)),rightCallback:()=>this._slide(this._directionToOrder(DIRECTION_RIGHT)),endCallback:endCallBack};this._swipeHelper=new Swipe(this._element,swipeConfig)}_keydown(event){if(/input|textarea/i.test(event.target.tagName))return;const direction=KEY_TO_DIRECTION[event.key];direction&&(event.preventDefault(),this._slide(this._directionToOrder(direction)))}_getItemIndex(element){return this._getItems().indexOf(element)}_setActiveIndicatorElement(index){if(!this._indicatorsElement)return;const activeIndicator=SelectorEngine.findOne(SELECTOR_ACTIVE,this._indicatorsElement);activeIndicator.classList.remove(CLASS_NAME_ACTIVE$2),activeIndicator.removeAttribute("aria-current");const newActiveIndicator=SelectorEngine.findOne(`[data-bs-slide-to="${index}"]`,this._indicatorsElement);newActiveIndicator&&(newActiveIndicator.classList.add(CLASS_NAME_ACTIVE$2),newActiveIndicator.setAttribute("aria-current","true"))}_updateInterval(){const element=this._activeElement||this._getActive();if(!element)return;const elementInterval=Number.parseInt(element.getAttribute("data-bs-interval"),10);this._config.interval=elementInterval||this._config.defaultInterval}_slide(order,element=null){if(this._isSliding)return;const activeElement=this._getActive(),isNext=order===ORDER_NEXT,nextElement=element||getNextActiveElement(this._getItems(),activeElement,isNext,this._config.wrap);if(nextElement===activeElement)return;const nextElementIndex=this._getItemIndex(nextElement),triggerEvent=eventName=>EventHandler.trigger(this._element,eventName,{relatedTarget:nextElement,direction:this._orderToDirection(order),from:this._getItemIndex(activeElement),to:nextElementIndex}),slideEvent=triggerEvent(EVENT_SLIDE);if(slideEvent.defaultPrevented)return;if(!activeElement||!nextElement)return;const isCycling=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(nextElementIndex),this._activeElement=nextElement;const directionalClassName=isNext?CLASS_NAME_START:CLASS_NAME_END,orderClassName=isNext?CLASS_NAME_NEXT:CLASS_NAME_PREV;nextElement.classList.add(orderClassName),reflow(nextElement),activeElement.classList.add(directionalClassName),nextElement.classList.add(directionalClassName);const completeCallBack=()=>{nextElement.classList.remove(directionalClassName,orderClassName),nextElement.classList.add(CLASS_NAME_ACTIVE$2),activeElement.classList.remove(CLASS_NAME_ACTIVE$2,orderClassName,directionalClassName),this._isSliding=!1,triggerEvent(EVENT_SLID)};this._queueCallback(completeCallBack,activeElement,this._isAnimated()),isCycling&&this.cycle()}_isAnimated(){return this._element.classList.contains(CLASS_NAME_SLIDE)}_getActive(){return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM,this._element)}_getItems(){return SelectorEngine.find(SELECTOR_ITEM,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(direction){return isRTL()?direction===DIRECTION_LEFT?ORDER_PREV:ORDER_NEXT:direction===DIRECTION_LEFT?ORDER_NEXT:ORDER_PREV}_orderToDirection(order){return isRTL()?order===ORDER_PREV?DIRECTION_LEFT:DIRECTION_RIGHT:order===ORDER_PREV?DIRECTION_RIGHT:DIRECTION_LEFT}static jQueryInterface(config){return this.each(function(){const data=Carousel.getOrCreateInstance(this,config);if(typeof config=="number"){data.to(config);return}if(typeof config=="string"){if(data[config]===void 0||config.startsWith("_")||config==="constructor")throw new TypeError(`No method n
7amed "${config}"`);data[config]()}})}}EventHandler.on(document,EVENT_CLICK_DATA_API$5,SELECTOR_DATA_SLIDE,function(event){const target=SelectorEngine.getElementFromSelector(this);if(!target||!target.classList.contains(CLASS_NAME_CAROUSEL))return;event.preventDefault();const carousel=Carousel.getOrCreateInstance(target),slideIndex=this.getAttribute("data-bs-slide-to");if(slideIndex){carousel.to(slideIndex),carousel._maybeEnableCycle();return}if(Manipulator.getDataAttribute(this,"slide")==="next"){carousel.next(),carousel._maybeEnableCycle();return}carousel.prev(),carousel._maybeEnableCycle()}),EventHandler.on(window,EVENT_LOAD_DATA_API$3,()=>{const carousels=SelectorEngine.find(SELECTOR_DATA_RIDE);for(const carousel of carousels)Carousel.getOrCreateInstance(carousel)}),defineJQueryPlugin(Carousel);const NAME$b="collapse",DATA_KEY$7="bs.collapse",EVENT_KEY$7=`.${DATA_KEY$7}`,DATA_API_KEY$4=".data-api",EVENT_SHOW$6=`show${EVENT_KEY$7}`,EVENT_SHOWN$6=`shown${EVENT_KEY$7}`,EVENT_HIDE$6=`hide${EVENT_KEY$7}`,EVENT_HIDDEN$6=`hidden${EVENT_KEY$7}`,EVENT_CLICK_DATA_API$4=`click${EVENT_KEY$7}${DATA_API_KEY$4}`,CLASS_NAME_SHOW$7="show",CLASS_NAME_COLLAPSE="collapse",CLASS_NAME_COLLAPSING="collapsing",CLASS_NAME_COLLAPSED="collapsed",CLASS_NAME_DEEPER_CHILDREN=`:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`,CLASS_NAME_HORIZONTAL="collapse-horizontal",WIDTH="width",HEIGHT="height",SELECTOR_ACTIVES=".collapse.show, .collapse.collapsing",SELECTOR_DATA_TOGGLE$4='[data-bs-toggle="collapse"]',Default$a={parent:null,toggle:!0},DefaultType$a={parent:"(null|element)",toggle:"boolean"};class Collapse extends BaseComponent{constructor(element,config){super(element,config),this._isTransitioning=!1,this._triggerArray=[];const toggleList=SelectorEngine.find(SELECTOR_DATA_TOGGLE$4);for(const elem of toggleList){const selector=SelectorEngine.getSelectorFromElement(elem),filterElement=SelectorEngine.find(selector).filter(foundElement=>foundElement===this._element);selector!==null&&filterElement.length&&this._triggerArray.push(elem)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return Default$a}static get DefaultType(){return DefaultType$a}static get NAME(){return NAME$b}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let activeChildren=[];if(this._config.parent&&(activeChildren=this._getFirstLevelChildren(SELECTOR_ACTIVES).filter(element=>element!==this._element).map(element=>Collapse.getOrCreateInstance(element,{toggle:!1}))),activeChildren.length&&activeChildren[0]._isTransitioning)return;const startEvent=EventHandler.trigger(this._element,EVENT_SHOW$6);if(startEvent.defaultPrevented)return;for(const activeInstance of activeChildren)activeInstance.hide();const dimension=this._getDimension();this._element.classList.remove(CLASS_NAME_COLLAPSE),this._element.classList.add(CLASS_NAME_COLLAPSING),this._element.style[dimension]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const complete=()=>{this._isTransitioning=!1,this._element.classList.remove(CLASS_NAME_COLLAPSING),this._element.classList.add(CLASS_NAME_COLLAPSE,CLASS_NAME_SHOW$7),this._element.style[dimension]="",EventHandler.trigger(this._element,EVENT_SHOWN$6)},capitalizedDimension=dimension[0].toUpperCase()+dimension.slice(1),scrollSize=`scroll${capitalizedDimension}`;this._queueCallback(complete,this._element,!0),this._element.style[dimension]=`${this._element[scrollSize]}px`}hide(){if(this._isTransitioning||!this._isShown())return;const startEvent=EventHandler.trigger(this._element,EVENT_HIDE$6);if(startEvent.defaultPrevented)return;const dimension=this._getDimension();this._element.style[dimension]=`${this._element.getBoundingClientRect()[dimension]}px`,reflow(this._element),this._element.classList.add(CLASS_NAME_COLLAPSING),this._element.classList.remove(CLASS_NAME_COLLAPSE,CLASS_NAME_SHOW$7);for(const trigger of this._triggerArray){const element=SelectorEngine.getElementFromSelector(trigger);element&&!this._isShown(element)&&this._addAriaAndCollapsedClass([trigger],!1)}this._isTransitioning=!0;const complete=()=>{this._isTransitioning=!1,this._element.classList.remove(CLASS_NAME_COLLAPSING),this._element.classList.add(CLASS_NAME_COLLAPSE),EventHandler.trigger(this._element,EVENT_HIDDEN$6
vendor: 3,842 bytes, line 7
7)};this._element.style[dimension]="",this._queueCallback(complete,this._element,!0)}_isShown(element=this._element){return element.classList.contains(CLASS_NAME_SHOW$7)}_configAfterMerge(config){return config.toggle=Boolean(config.toggle),config.parent=getElement(config.parent),config}_getDimension(){return this._element.classList.contains(CLASS_NAME_HORIZONTAL)?WIDTH:HEIGHT}_initializeChildren(){if(!this._config.parent)return;const children=this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE$4);for(const element of children){const selected=SelectorEngine.getElementFromSelector(element);selected&&this._addAriaAndCollapsedClass([element],this._isShown(selected))}}_getFirstLevelChildren(selector){const children=SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN,this._config.parent);return SelectorEngine.find(selector,this._config.parent).filter(element=>!children.includes(element))}_addAriaAndCollapsedClass(triggerArray,isOpen){if(!triggerArray.length)return;for(const element of triggerArray)element.classList.toggle(CLASS_NAME_COLLAPSED,!isOpen),element.setAttribute("aria-expanded",isOpen)}static jQueryInterface(config){const _config={};return typeof config=="string"&&/show|hide/.test(config)&&(_config.toggle=!1),this.each(function(){const data=Collapse.getOrCreateInstance(this,_config);if(typeof config=="string"){if(typeof data[config]=="undefined")throw new TypeError(`No method named "${config}"`);data[config]()}})}}EventHandler.on(document,EVENT_CLICK_DATA_API$4,SELECTOR_DATA_TOGGLE$4,function(event){(event.target.tagName==="A"||event.delegateTarget&&event.delegateTarget.tagName==="A")&&event.preventDefault();for(const element of SelectorEngine.getMultipleElementsFromSelector(this))Collapse.getOrCreateInstance(element,{toggle:!1}).toggle()}),defineJQueryPlugin(Collapse);var top="top",bottom="bottom",right="right",left="left",auto="auto",basePlacements=[top,bottom,right,left],start="start",end="end",clippingParents="clippingParents",viewport="viewport",popper="popper",reference="reference",variationPlacements=basePlacements.reduce(function(acc,placement){return acc.concat([placement+"-"+start,placement+"-"+end])},[]),placements=[].concat(basePlacements,[auto]).reduce(function(acc,placement){return acc.concat([placement,placement+"-"+start,placement+"-"+end])},[]),beforeRead="beforeRead",read="read",afterRead="afterRead",beforeMain="beforeMain",main="main",afterMain="afterMain",beforeWrite="beforeWrite",write="write",afterWrite="afterWrite",modifierPhases=[beforeRead,read,afterRead,beforeMain,main,afterMain,beforeWrite,write,afterWrite];function getNodeName(element){return element?(element.nodeName||"").toLowerCase():null}function getWindow(node){if(node==null)return window;if(node.toString()!=="[object Window]"){var ownerDocument=node.ownerDocument;return ownerDocument?ownerDocument.defaultView||window:window}return node}function isElement(node){var OwnElement=getWindow(node).Element;return node instanceof OwnElement||node instanceof Element}function isHTMLElement(node){var OwnElement=getWindow(node).HTMLElement;return node instanceof OwnElement||node instanceof HTMLElement}function isShadowRoot(node){if(typeof ShadowRoot=="undefined")return!1;var OwnElement=getWindow(node).ShadowRoot;return node instanceof OwnElement||node instanceof ShadowRoot}function applyStyles(_ref){var state=_ref.state;Object.keys(state.elements).forEach(function(name){var style=state.styles[name]||{},attributes=state.attributes[name]||{},element=state.elements[name];if(!isHTMLElement(element)||!getNodeName(element))return;Object.assign(element.style,style),Object.keys(attributes).forEach(function(name){var value=attributes[name];value===!1?element.removeAttribute(name):element.setAttribute(name,value===!0?"":value)})})}function effect$2(_ref2){var state=_ref2.state,initialStyles={popper:{position:state.o
7ptions.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(state.elements.popper.style,initialStyles.popper),state.styles=initialStyles,state.elements.arrow&&Object.assign(state.elements.arrow.style,initialStyles.arrow),function(){Object.keys(state.elements).forEach(function(name){var element=state.elements[name],attributes=state.attributes[name]||{},styleProperties=Object.keys(state.styles.hasOwnProperty(name)?state.styles[name]:initialStyles[name]),style=styleProperties.reduce(function(style,property){return style[property]="",style},{});if(!isHTMLElement(element)||!getNodeName(element))return;Object.assign(element.style,style),Object.keys(attributes).forEach(function(attribute){element.removeAttribute(attribute)})})}}const applyStyles$1={name:"applyStyles",enabled:!0,phase:"write",fn:applyStyles,effect:effect$2,requires:["computeStyles"]};function getBasePlacement(placement){return placement.split("-")[0]}var max=Math.max,min=Math.min,round=Math.round;function getUAString(){var uaData=navigator.userAgentData;return uaData!=null&&uaData.brands&&Array.isArray(uaData.brands)?uaData.brands.map(function(item){return item.brand+"/"+item.version}).join(" "):navigator.userAgent}function isLayoutViewport(){return!/^((?!chrome|android).)*safari/i.test(getUAString())}function getBoundingClientRect(element,includeScale,isFixedStrategy){includeScale===void 0&&(includeScale=!1),isFixedStrategy===void 0&&(isFixedStrategy=!1);var clientRect=element.getBoundingClientRect(),scaleX=1,scaleY=1;includeScale&&isHTMLElement(element)&&(scaleX=element.offsetWidth>0?round(clientRect.width)/element.offsetWidth||1:1,scaleY=element.offsetHeight>0?round(clientRect.height)/element.offsetHeight||1:1);var _ref=isElement(element)?getWindow(element):window,visualViewport=_ref.visualViewport,addVisualOffsets=!isLayoutViewport()&&isFixedStrategy,x=(clientRect.left+(addVisualOffsets&&visualViewport?visualViewport.offsetLeft:0))/scaleX,y=(clientRect.top+(addVisualOffsets&&visualViewport?visualViewport.offsetTop:0))/scaleY,width=clientRect.width/scaleX,height=clientRect.height/scaleY;return{width,height,top:y,right:x+width,bottom:y+height,left:x,x,y}}function getLayoutRect(element){var clientRect=getBoundingClientRect(element),width=element.offsetWidth,height=element.offsetHeight;return Math.abs(clientRect.width-width)<=1&&(width=clientRect.width),Math.abs(clientRect.height-height)<=1&&(height=clientRect.height),{x:element.offsetLeft,y:element.offsetTop,width,height}}function contains(parent,child){var rootNode=child.getRootNode&&child.getRootNode();if(parent.contains(child))return!0;if(rootNode&&isShadowRoot(rootNode)){var next=child;do{if(next&&parent.isSameNode(next))return!0;next=next.parentNode||next.host}while(next)}return!1}function getComputedStyle$1(element){return getWindow(element).getComputedStyle(element)}function isTableElement(element){return["table","td","th"].indexOf(getNodeName(element))>=0}function getDocumentElement(element){return((isElement(element)?element.ownerDocument:element.document)||window.document).documentElement}function getParentNode(element){return getNodeName(element)==="html"?element:element.assignedSlot||element.parentNode||(isShadowRoot(element)?element.host:null)||getDocumentElement(element)}function getTrueOffsetParent(element){return!isHTMLElement(element)||getComputedStyle$1(element).position==="fixed"?null:element.offsetParent}function getContainingBlock(element){var isFirefox=/firefox/i.test(getUAString()),isIE=/Trident/i.test(getUAString());if(isIE&&isHTMLElement(element)){var elementCss=getComputedStyle$1(element);if(elementCss.position==="fixed")return null}var css,currentNode=getParentNode(element);for(isShadowRoot(currentNode)&&(currentNode=currentNode.host);isHTMLElement(currentNode)&&["html","body"].indexOf(getNodeName(currentNode))<0;){if(css=getComputedStyle$1(currentNode),css.transform!=="none"||css.perspective!=="none"||css.contain==="paint"||["transform","perspective"].indexOf(css.willChange)!==-1||isFirefox&&css.willChange==="filter"||isFirefox&&css.filter&&css.filter!=="none")return currentNode;currentNode=currentNode.parentNode}return null}function getOffsetParent(element){for(var window=getWindow(element),offsetParent=getTrueOffsetParent(element);offsetParent&&isTableElement(offsetParent)&&getComputedStyle$1(offsetParent).position==="static";)offsetParent=getTrueOffsetParent(offsetParent);return offsetParent&&(getNodeName(offsetParent)==="html"||getNodeName(offsetParent)==="body"&&getComputedStyle$1(offsetParent).position==="static")?window:offsetParent||getContainingBlock(element)||window}function getMainAxisFromPlacement(placement){return["top","bottom"].indexOf(placement)>=0?"x":"y"}function within(min$1,value,max$1){return max(min$1,min(value,max$1))}function withinMaxClamp(min,value,max){var v=within(min,value,max);return v>max?max:v}function getFreshSideObject(){return{top:0,right:0,bottom:0,left:0}}
7function mergePaddingObject(paddingObject){return Object.assign({},getFreshSideObject(),paddingObject)}function expandToHashMap(value,keys){return keys.reduce(function(hashMap,key){return hashMap[key]=value,hashMap},{})}var toPaddingObject=function(padding,state){return padding=typeof padding=="function"?padding(Object.assign({},state.rects,{placement:state.placement})):padding,mergePaddingObject(typeof padding!="number"?padding:expandToHashMap(padding,basePlacements))};function arrow(_ref){var _state$modifiersData$,state=_ref.state,name=_ref.name,options=_ref.options,arrowElement=state.elements.arrow,popperOffsets=state.modifiersData.popperOffsets,basePlacement=getBasePlacement(state.placement),axis=getMainAxisFromPlacement(basePlacement),isVertical=[left,right].indexOf(basePlacement)>=0,len=isVertical?"height":"width";if(!arrowElement||!popperOffsets)return;var paddingObject=toPaddingObject(options.padding,state),arrowRect=getLayoutRect(arrowElement),minProp=axis==="y"?top:left,maxProp=axis==="y"?bottom:right,endDiff=state.rects.reference[len]+state.rects.reference[axis]-popperOffsets[axis]-state.rects.popper[len],startDiff=popperOffsets[axis]-state.rects.reference[axis],arrowOffsetParent=getOffsetParent(arrowElement),clientSize=arrowOffsetParent?axis==="y"?arrowOffsetParent.clientHeight||0:arrowOffsetParent.clientWidth||0:0,centerToReference=endDiff/2-startDiff/2,min=paddingObject[minProp],max=clientSize-arrowRect[len]-paddingObject[maxProp],center=clientSize/2-arrowRect[len]/2+centerToReference,offset=within(min,center,max),axisProp=axis;state.modifiersData[name]=(_state$modifiersData$={},_state$modifiersData$[axisProp]=offset,_state$modifiersData$.centerOffset=offset-center,_state$modifiersData$)}function effect$1(_ref2){var state=_ref2.state,options=_ref2.options,_options$element=options.element,arrowElement=_options$element===void 0?"[data-popper-arrow]":_options$element;if(arrowElement==null)return;if(typeof arrowElement=="string"&&(arrowElement=state.elements.popper.querySelector(arrowElement),!arrowElement))return;if(!contains(state.elements.popper,arrowElement))return;state.elements.arrow=arrowElement}const arrow$1={name:"arrow",enabled:!0,phase:"main",fn:arrow,effect:effect$1,requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function getVariation(placement){return placement.split("-")[1]}var unsetSides={top:"auto",right:"auto",bottom:"auto",left:"auto"};function roundOffsetsByDPR(_ref,win){var x=_ref.x,y=_ref.y,dpr=win.devicePixelRatio||1;return{x:round(x*dpr)/dpr||0,y:round(y*dpr)/dpr||0}}function mapToStyles(_ref2){var _Object$assign2,_Object$assign,popper=_ref2.popper,popperRect=_ref2.popperRect,placement=_ref2.placement,variation=_ref2.variation,offsets=_ref2.offsets,position=_ref2.position,gpuAcceleration=_ref2.gpuAcceleration,adaptive=_ref2.adaptive,roundOffsets=_ref2.roundOffsets,isFixed=_ref2.isFixed,_offsets$x=offsets.x,x=_offsets$x===void 0?0:_offsets$x,_offsets$y=offsets.y,y=_offsets$y===void 0?0:_offsets$y,_ref3=typeof roundOffsets=="function"?roundOffsets({x,y}):{x,y},x=_ref3.x,y=_ref3.y,hasX=offsets.hasOwnProperty("x"),hasY=offsets.hasOwnProperty("y"),sideX=left,sideY=top,win=window;if(adaptive){var offsetParent=getOffsetParent(popper),heightProp="clientHeight",widthProp="clientWidth";if(offsetParent===getWindow(popper)&&(offsetParent=getDocumentElement(popper),getComputedStyle$1(offsetParent).position!=="static"&&position==="absolute"&&(heightProp="scrollHeight",widthProp="scrollWidth")),offsetParent=offsetParent,placement===top||(placement===left||placement===right)&&variation===end){sideY=bottom;var offsetY=isFixed&&offsetParent===win&&win.visualViewport?win.visualViewport.height:offsetParent[heightProp];y-=offsetY-popperRect.height,y*=gpuAcceleration?1:-1}if(placement===left||(placement===top||placement===bottom)&&variation===end){sideX=right;var offsetX=isFixed&&offsetParent===win&&win.visualViewport?win.visualViewport.width:offsetParent[widthProp];x-=offsetX-popperRect.width,x*=gpuAcceleration?1:-1}}var commonStyles=Object.assign({position},adaptive&&unsetSides),_ref4=roundOffsets===!0?roundOffsetsByDPR({x,y},getWindow(popper)):{x,y},x=_ref4.x,y=_ref4.y;return gpuAcceleration?Object.assign({},commonStyles,(_Object$assign={},_Object$assign[sideY]=hasY?"0":"",_Object$assign[sideX]=hasX?"0":"",_Object$assign.transform=(win.devicePixelRatio||1)<=1?"translate("+x+"px, "+y+"px)":"translate3d("+x+"px, "+y+"px, 0)",_Object$assign)):Object.assign({},commonStyles,(_Object$assign2={},_Object$assign2[sideY]=hasY?y+"px":"",_Object$assign2[sideX]=hasX?x+"px":"",_Object$assign2.transform="",_Object$assign2))}function computeStyles(_ref5){var state=_ref5.state,options=_ref5.options,_options$gpuAccelerat=options.gpuAcceleration,gpuA
vendor: 4,545 bytes, line 7
7cceleration=_options$gpuAccelerat===void 0||_options$gpuAccelerat,_options$adaptive=options.adaptive,adaptive=_options$adaptive===void 0||_options$adaptive,_options$roundOffsets=options.roundOffsets,roundOffsets=_options$roundOffsets===void 0||_options$roundOffsets,commonStyles={placement:getBasePlacement(state.placement),variation:getVariation(state.placement),popper:state.elements.popper,popperRect:state.rects.popper,gpuAcceleration,isFixed:state.options.strategy==="fixed"};state.modifiersData.popperOffsets!=null&&(state.styles.popper=Object.assign({},state.styles.popper,mapToStyles(Object.assign({},commonStyles,{offsets:state.modifiersData.popperOffsets,position:state.options.strategy,adaptive,roundOffsets})))),state.modifiersData.arrow!=null&&(state.styles.arrow=Object.assign({},state.styles.arrow,mapToStyles(Object.assign({},commonStyles,{offsets:state.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets})))),state.attributes.popper=Object.assign({},state.attributes.popper,{"data-popper-placement":state.placement})}const computeStyles$1={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:computeStyles,data:{}};var passive={passive:!0};function effect(_ref){var state=_ref.state,instance=_ref.instance,options=_ref.options,_options$scroll=options.scroll,scroll=_options$scroll===void 0||_options$scroll,_options$resize=options.resize,resize=_options$resize===void 0||_options$resize,window=getWindow(state.elements.popper),scrollParents=[].concat(state.scrollParents.reference,state.scrollParents.popper);return scroll&&scrollParents.forEach(function(scrollParent){scrollParent.addEventListener("scroll",instance.update,passive)}),resize&&window.addEventListener("resize",instance.update,passive),function(){scroll&&scrollParents.forEach(function(scrollParent){scrollParent.removeEventListener("scroll",instance.update,passive)}),resize&&window.removeEventListener("resize",instance.update,passive)}}const eventListeners={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect,data:{}};var hash$1={left:"right",right:"left",bottom:"top",top:"bottom"};function getOppositePlacement(placement){return placement.replace(/left|right|bottom|top/g,function(matched){return hash$1[matched]})}var hash={start:"end",end:"start"};function getOppositeVariationPlacement(placement){return placement.replace(/start|end/g,function(matched){return hash[matched]})}function getWindowScroll(node){var win=getWindow(node),scrollLeft=win.pageXOffset,scrollTop=win.pageYOffset;return{scrollLeft,scrollTop}}function getWindowScrollBarX(element){return getBoundingClientRect(getDocumentElement(element)).left+getWindowScroll(element).scrollLeft}function getViewportRect(element,strategy){var win=getWindow(element),html=getDocumentElement(element),visualViewport=win.visualViewport,width=html.clientWidth,height=html.clientHeight,x=0,y=0;if(visualViewport){width=visualViewport.width,height=visualViewport.height;var layoutViewport=isLayoutViewport();(layoutViewport||!layoutViewport&&strategy==="fixed")&&(x=visualViewport.offsetLeft,y=visualViewport.offsetTop)}return{width,height,x:x+getWindowScrollBarX(element),y}}function getDocumentRect(element){var _element$ownerDocumen,html=getDocumentElement(element),winScroll=getWindowScroll(element),body=(_element$ownerDocumen=element.ownerDocument)==null?void 0:_element$ownerDocumen.body,width=max(html.scrollWidth,html.clientWidth,body?body.scrollWidth:0,body?body.clientWidth:0),height=max(html.scrollHeight,html.clientHeight,body?body.scrollHeight:0,body?body.clientHeight:0),x=-winScroll.scrollLeft+getWindowScrollBarX(element),y=-winScroll.scrollTop;return getComputedStyle$1(body||html).direction==="rtl"&&(x+=max(html.clientWidth,body?body.clientWidth:0)-width),{width,height,x,y}}function isScrollParent(element){var _getComputedStyle=getComputedStyle$1(element),overflow=_getComputedStyle.overflow,overflowX=_getComputedStyle.overflowX,overflowY=_getComputedStyle.overflowY;return/auto|scroll|overlay|hidden/.test(overflow+overflowY+overflowX)}function getScrollParent(node){return["html","body","#document"].indexOf(getNodeName(node))>=0?node.ownerDocument.body:isHTMLElement(node)&&isScrollParent(node)?node:getScrollParent(getParentNode(node))}function listScrollParents(element,list){list===void 0&&(list=[]);var _element$ownerDocumen,scrollParent=getScrollParent(element),isBody=scrollParent===((_element$ownerDocumen=element.ownerDocument)==null?void 0:_element$ownerDocumen.body),win=getWindow(scrollParent),target=isBody?[win].concat(win.visualVie
vendor: 4,203 bytes, line 7
7wport||[],isScrollParent(scrollParent)?scrollParent:[]):scrollParent,updatedList=list.concat(target);return isBody?updatedList:updatedList.concat(listScrollParents(getParentNode(target)))}function rectToClientRect(rect){return Object.assign({},rect,{left:rect.x,top:rect.y,right:rect.x+rect.width,bottom:rect.y+rect.height})}function getInnerBoundingClientRect(element,strategy){var rect=getBoundingClientRect(element,!1,strategy==="fixed");return rect.top=rect.top+element.clientTop,rect.left=rect.left+element.clientLeft,rect.bottom=rect.top+element.clientHeight,rect.right=rect.left+element.clientWidth,rect.width=element.clientWidth,rect.height=element.clientHeight,rect.x=rect.left,rect.y=rect.top,rect}function getClientRectFromMixedType(element,clippingParent,strategy){return clippingParent===viewport?rectToClientRect(getViewportRect(element,strategy)):isElement(clippingParent)?getInnerBoundingClientRect(clippingParent,strategy):rectToClientRect(getDocumentRect(getDocumentElement(element)))}function getClippingParents(element){var clippingParents=listScrollParents(getParentNode(element)),canEscapeClipping=["absolute","fixed"].indexOf(getComputedStyle$1(element).position)>=0,clipperElement=canEscapeClipping&&isHTMLElement(element)?getOffsetParent(element):element;return isElement(clipperElement)?clippingParents.filter(function(clippingParent){return isElement(clippingParent)&&contains(clippingParent,clipperElement)&&getNodeName(clippingParent)!=="body"}):[]}function getClippingRect(element,boundary,rootBoundary,strategy){var mainClippingParents=boundary==="clippingParents"?getClippingParents(element):[].concat(boundary),clippingParents=[].concat(mainClippingParents,[rootBoundary]),firstClippingParent=clippingParents[0],clippingRect=clippingParents.reduce(function(accRect,clippingParent){var rect=getClientRectFromMixedType(element,clippingParent,strategy);return accRect.top=max(rect.top,accRect.top),accRect.right=min(rect.right,accRect.right),accRect.bottom=min(rect.bottom,accRect.bottom),accRect.left=max(rect.left,accRect.left),accRect},getClientRectFromMixedType(element,firstClippingParent,strategy));return clippingRect.width=clippingRect.right-clippingRect.left,clippingRect.height=clippingRect.bottom-clippingRect.top,clippingRect.x=clippingRect.left,clippingRect.y=clippingRect.top,clippingRect}function computeOffsets(_ref){var offsets,len,reference=_ref.reference,element=_ref.element,placement=_ref.placement,basePlacement=placement?getBasePlacement(placement):null,variation=placement?getVariation(placement):null,commonX=reference.x+reference.width/2-element.width/2,commonY=reference.y+reference.height/2-element.height/2;switch(basePlacement){case top:offsets={x:commonX,y:reference.y-element.height};break;case bottom:offsets={x:commonX,y:reference.y+reference.height};break;case right:offsets={x:reference.x+reference.width,y:commonY};break;case left:offsets={x:reference.x-element.width,y:commonY};break;default:offsets={x:reference.x,y:reference.y}}var mainAxis=basePlacement?getMainAxisFromPlacement(basePlacement):null;if(mainAxis!=null)switch(len=mainAxis==="y"?"height":"width",variation){case start:offsets[mainAxis]=offsets[mainAxis]-(reference[len]/2-element[len]/2);break;case end:offsets[mainAxis]=offsets[mainAxis]+(reference[len]/2-element[len]/2);break}return offsets}function detectOverflow(state,options){options===void 0&&(options={});var _options=options,_options$placement=_options.placement,placement=_options$placement===void 0?state.placement:_options$placement,_options$strategy=_options.strategy,strategy=_options$strategy===void 0?state.strategy:_options$strategy,_options$boundary=_options.boundary,boundary=_options$boundary===void 0?clippingParents:_options$boundary,_options$rootBoundary=_options.rootBoundary,rootBoundary=_options$rootBoundary===void 0?viewport:_options$rootBoundary,_options$elementConte=_options.elementContext,elementContext=_options$elementConte===void 0?popper:_options$elementConte,_options$altBoundary=_options.altBoundary,altBoundary=_options$altBoundary!==void 0&&_options$altBoundary,_options$padding=_options.padding,padding=_options$padding===void 0?0:_options$padding,paddingObject=mergePaddingOb
vendor: 9,982 bytes, line 7
7ject(typeof padding!="number"?padding:expandToHashMap(padding,basePlacements)),altContext=elementContext===popper?reference:popper,popperRect=state.rects.popper,element=state.elements[altBoundary?altContext:elementContext],clippingClientRect=getClippingRect(isElement(element)?element:element.contextElement||getDocumentElement(state.elements.popper),boundary,rootBoundary,strategy),referenceClientRect=getBoundingClientRect(state.elements.reference),popperOffsets=computeOffsets({reference:referenceClientRect,element:popperRect,strategy:"absolute",placement}),popperClientRect=rectToClientRect(Object.assign({},popperRect,popperOffsets)),elementClientRect=elementContext===popper?popperClientRect:referenceClientRect,overflowOffsets={top:clippingClientRect.top-elementClientRect.top+paddingObject.top,bottom:elementClientRect.bottom-clippingClientRect.bottom+paddingObject.bottom,left:clippingClientRect.left-elementClientRect.left+paddingObject.left,right:elementClientRect.right-clippingClientRect.right+paddingObject.right},offsetData=state.modifiersData.offset;if(elementContext===popper&&offsetData){var offset=offsetData[placement];Object.keys(overflowOffsets).forEach(function(key){var multiply=[right,bottom].indexOf(key)>=0?1:-1,axis=[top,bottom].indexOf(key)>=0?"y":"x";overflowOffsets[key]+=offset[axis]*multiply})}return overflowOffsets}function computeAutoPlacement(state,options){options===void 0&&(options={});var _options=options,placement=_options.placement,boundary=_options.boundary,rootBoundary=_options.rootBoundary,padding=_options.padding,flipVariations=_options.flipVariations,_options$allowedAutoP=_options.allowedAutoPlacements,allowedAutoPlacements=_options$allowedAutoP===void 0?placements:_options$allowedAutoP,variation=getVariation(placement),placements$1=variation?flipVariations?variationPlacements:variationPlacements.filter(function(placement){return getVariation(placement)===variation}):basePlacements,allowedPlacements=placements$1.filter(function(placement){return allowedAutoPlacements.indexOf(placement)>=0});allowedPlacements.length===0&&(allowedPlacements=placements$1);var overflows=allowedPlacements.reduce(function(acc,placement){return acc[placement]=detectOverflow(state,{placement,boundary,rootBoundary,padding})[getBasePlacement(placement)],acc},{});return Object.keys(overflows).sort(function(a,b){return overflows[a]-overflows[b]})}function getExpandedFallbackPlacements(placement){if(getBasePlacement(placement)===auto)return[];var oppositePlacement=getOppositePlacement(placement);return[getOppositeVariationPlacement(placement),oppositePlacement,getOppositeVariationPlacement(oppositePlacement)]}function flip(_ref){var state=_ref.state,options=_ref.options,name=_ref.name;if(state.modifiersData[name]._skip)return;for(var _options$mainAxis=options.mainAxis,checkMainAxis=_options$mainAxis===void 0||_options$mainAxis,_options$altAxis=options.altAxis,checkAltAxis=_options$altAxis===void 0||_options$altAxis,specifiedFallbackPlacements=options.fallbackPlacements,padding=options.padding,boundary=options.boundary,rootBoundary=options.rootBoundary,altBoundary=options.altBoundary,_options$flipVariatio=options.flipVariations,flipVariations=_options$flipVariatio===void 0||_options$flipVariatio,allowedAutoPlacements=options.allowedAutoPlacements,preferredPlacement=state.options.placement,basePlacement=getBasePlacement(preferredPlacement),isBasePlacement=basePlacement===preferredPlacement,fallbackPlacements=specifiedFallbackPlacements||(isBasePlacement||!flipVariations?[getOppositePlacement(preferredPlacement)]:getExpandedFallbackPlacements(preferredPlacement)),placements=[preferredPlacement].concat(fallbackPlacements).reduce(function(acc,placement){return acc.concat(getBasePlacement(placement)===auto?computeAutoPlacement(state,{placement,boundary,rootBoundary,padding,flipVariations,allowedAutoPlacements}):placement)},[]),referenceRect=state.rects.reference,popperRect=state.rects.popper,checksMap=new Map,makeFallbackChecks=!0,firstFittingPlacement=placements[0],i=0;i<placements.length;i++){var placement=placements[i],_basePlacement=getBasePlacement(placement),isStartVariation=getVariation(placement)===start,isVertical=[top,bottom].indexOf(_basePlacement)>=0,len=isVertical?"width":"height",overflow=detectOverflow(state,{placement,boundary,rootBoundary,altBoundary,padding}),mainVariationSide=isVertical?isStartVariation?right:left:isStartVariation?bottom:top;referenceRect[len]>popperRect[len]&&(mainVariationSide=getOppositePlacement(mainVariationSide));var altVariationSide=getOppositePlacement(mainVariationSide),checks=[];if(checkMainAxis&&checks.push(overflow[_basePlacement]<=0),checkAltAxis&&checks.push(overflow[mainVariationSide]<=0,overflow[altVariationSide]<=0),checks.every(function(check){return check})){firstFittingPlacement=placement,makeFallbackChecks=!1;break}checksMap.set(placement,checks)}if(makeFallbackChecks)for(var numberOfChecks=flipVariations?3:1,_loop=function(_i){var fittingPlacement=placements.find(function(placement){var checks=checksMap.get(placement);if(checks)return checks.slice(0,_i).every(function(check){return check})});if(fittingPlacement)return firstFittingPlacement=fittingPlacement,"break"},_i=numberOfChecks;_i>0;_i--){var _ret=_loop(_i);if(_ret==="break")break}state.placement!==firstFittingPlacement&&(state.modifiersData[name]._skip=!0,state.placement=firstFittingPlacement,state.reset=!0)}const flip$1={name:"flip",enabled:!0,phase:"main",fn:flip,requiresIfExists:["offset"],data:{_skip:!1}};function getSideOffsets(overflow,rect,preventedOffsets){return preventedOffsets===void 0&&(preventedOffsets={x:0,y:0}),{top:overflow.top-rect.height-preventedOffsets.y,right:overflow.right-rect.width+preventedOffsets.x,bottom:overflow.bottom-rect.height+preventedOffsets.y,left:overflow.left-rect.width-preventedOffsets.x}}function isAnySideFullyClipped(overflow){return[top,right,bottom,left].some(function(side){return overflow[side]>=0})}function hide(_ref){var state=_ref.state,name=_ref.name,referenceRect=state.rects.reference,popperRect=state.rects.popper,preventedOffsets=state.modifiersData.preventOverflow,referenceOverflow=detectOverflow(state,{elementContext:"reference"}),popperAltOverflow=detectOverflow(state,{altBoundary:!0}),referenceClippingOffsets=getSideOffsets(referenceOverflow,referenceRect),popperEscapeOffsets=getSideOffsets(popperAltOverflow,popperRect,preventedOffsets),isReferenceHidden=isAnySideFullyClipped(referenceClippingOffsets),hasPopperEscaped=isAnySideFullyClipped(popperEscapeOffsets);state.modifiersData[name]={referenceClippingOffsets,popperEscapeOffsets,isReferenceHidden,hasPopperEscaped},state.attributes.popper=Object.assign({},state.attributes.popper,{"data-popper-reference-hidden":isReferenceHidden,"data-popper-escaped":hasPopperEscaped})}const hide$1={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:hide};function distanceAndSkiddingToXY(placement,rects,offset){var basePlacement=getBasePlacement(placement),invertDistance=[left,top].indexOf(basePlacement)>=0?-1:1,_ref=typeof offset=="function"?offset(Object.assign({},rects,{placement})):offset,skidding=_ref[0],distance=_ref[1],skidding=skidding||0,distance=(distance||0)*invertDistance;return[left,right].indexOf(basePlacement)>=0?{x:distance,y:skidding}:{x:skidding,y:distance}}function offset(_ref2){var state=_ref2.state,options=_ref2.options,name=_ref2.name,_options$offset=options.offset,offset=_options$offset===void 0?[0,0]:_options$offset,data=placements.reduce(function(acc,placement){return acc[placement]=distanceAndSkiddingToXY(placement,state.rects,offset),acc},{}),_data$state$placement=data[state.placement],x=_data$state$placement.x,y=_data$state$placement.y;state.modifiersData.popperOffsets!=null&&(state.modifiersData.popperOffsets.x+=x,state.modifiersData.popperOffsets.y+=y),state.modifiersData[name]=data}const offset$1={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:offset};function popperOffsets(_ref){var state=_ref.state,name=_ref.name;state.modifiersData[name]=computeOffsets({reference:state.rects.reference,element:state.rects.popper,strategy:"absolute",placement:state.placement})}const popperOffsets$1={name:"popperOffsets",enabled:!0,phase:"read",fn:popperOffsets,data:{}};function getAltAxis(axis){return axis==="x"?"y":"x"}function preventOverflow(_ref){var _offsetModifierState$,_offsetModifierState$2,state=_ref.state,options=_ref.options,name=_ref.name,_options$mainAxis=options.mainAxis,checkMainAxis=_options$mainAxis===void 0||_options$mainAxis,_options$altAxis=options.altAxis,checkAltAxis=_options$altAxis!==void 0&&_options$altAxis,boundary=options.boundary,rootBoundary=options.rootBoundary,altBoundary=options.altBoundary,padding=options.padding,_options$tether=options.tether,tether=_options$tether===void 0||_options$tether,_options$tetherOffset=options.tetherOffset,tetherOffset=_options$tetherOffset===void 0?0:_options$tetherOffset,overflow=detectOverflow(state,{boundary,rootBoundary,padding,altBoundary}),basePlacement=getBasePlacement(state.placement),variation=getVariation(state.placement),isBasePlacement=!variation,mainAxis=getMainAxisFromPlacement(basePlacement),altAxis=getAltAxis(mainAxis),popperOffsets=state.modifiersData.popperOffsets,referenceRect=state.rects.reference,popperRect=state.rects.popper,tetherOffsetValue=typeof tetherOffset=="function"?tetherOffset(Object.assign({},state.rects,{placement:state.placement})):tetherOffset,normalizedTetherOffsetValue=typeof tetherOffsetValue=="number"?{mainAxis:tetherOffsetValue,altAxis:tetherOffsetValue}:Object.assign({mainAxis:0,altAxis:0},tetherOffsetValue),offsetModifierState=state.modifiersData.offset?state.modifiersData.offset[state.placement]:null,data={x:0,y:0};if(!popperOffsets)return;if(checkMainAxis){var mainSide=mainAxis==="y"?top:left,altSide=mainAxis==="y"?bottom:right,len=mainAxis==="y"?"height":"width",offset=popperOffsets[mainAxis],min$1=offset+overflow[mainSide],max$1=offset-
vendor: 4,167 bytes, line 7
7overflow[altSide],additive=tether?-popperRect[len]/2:0,minLen=variation===start?referenceRect[len]:popperRect[len],maxLen=variation===start?-popperRect[len]:-referenceRect[len],arrowElement=state.elements.arrow,arrowRect=tether&&arrowElement?getLayoutRect(arrowElement):{width:0,height:0},arrowPaddingObject=state.modifiersData["arrow#persistent"]?state.modifiersData["arrow#persistent"].padding:getFreshSideObject(),arrowPaddingMin=arrowPaddingObject[mainSide],arrowPaddingMax=arrowPaddingObject[altSide],arrowLen=within(0,referenceRect[len],arrowRect[len]),minOffset=isBasePlacement?referenceRect[len]/2-additive-arrowLen-arrowPaddingMin-normalizedTetherOffsetValue.mainAxis:minLen-arrowLen-arrowPaddingMin-normalizedTetherOffsetValue.mainAxis,maxOffset=isBasePlacement?-referenceRect[len]/2+additive+arrowLen+arrowPaddingMax+normalizedTetherOffsetValue.mainAxis:maxLen+arrowLen+arrowPaddingMax+normalizedTetherOffsetValue.mainAxis,arrowOffsetParent=state.elements.arrow&&getOffsetParent(state.elements.arrow),clientOffset=arrowOffsetParent?mainAxis==="y"?arrowOffsetParent.clientTop||0:arrowOffsetParent.clientLeft||0:0,offsetModifierValue=(_offsetModifierState$=offsetModifierState?.[mainAxis])!=null?_offsetModifierState$:0,tetherMin=offset+minOffset-offsetModifierValue-clientOffset,tetherMax=offset+maxOffset-offsetModifierValue,preventedOffset=within(tether?min(min$1,tetherMin):min$1,offset,tether?max(max$1,tetherMax):max$1);popperOffsets[mainAxis]=preventedOffset,data[mainAxis]=preventedOffset-offset}if(checkAltAxis){var _mainSide=mainAxis==="x"?top:left,_altSide=mainAxis==="x"?bottom:right,_offset=popperOffsets[altAxis],_len=altAxis==="y"?"height":"width",_min=_offset+overflow[_mainSide],_max=_offset-overflow[_altSide],isOriginSide=[top,left].indexOf(basePlacement)!==-1,_offsetModifierValue=(_offsetModifierState$2=offsetModifierState?.[altAxis])!=null?_offsetModifierState$2:0,_tetherMin=isOriginSide?_min:_offset-referenceRect[_len]-popperRect[_len]-_offsetModifierValue+normalizedTetherOffsetValue.altAxis,_tetherMax=isOriginSide?_offset+referenceRect[_len]+popperRect[_len]-_offsetModifierValue-normalizedTetherOffsetValue.altAxis:_max,_preventedOffset=tether&&isOriginSide?withinMaxClamp(_tetherMin,_offset,_tetherMax):within(tether?_tetherMin:_min,_offset,tether?_tetherMax:_max);popperOffsets[altAxis]=_preventedOffset,data[altAxis]=_preventedOffset-_offset}state.modifiersData[name]=data}const preventOverflow$1={name:"preventOverflow",enabled:!0,phase:"main",fn:preventOverflow,requiresIfExists:["offset"]};function getHTMLElementScroll(element){return{scrollLeft:element.scrollLeft,scrollTop:element.scrollTop}}function getNodeScroll(node){return node===getWindow(node)||!isHTMLElement(node)?getWindowScroll(node):getHTMLElementScroll(node)}function isElementScaled(element){var rect=element.getBoundingClientRect(),scaleX=round(rect.width)/element.offsetWidth||1,scaleY=round(rect.height)/element.offsetHeight||1;return scaleX!==1||scaleY!==1}function getCompositeRect(elementOrVirtualElement,offsetParent,isFixed){isFixed===void 0&&(isFixed=!1);var isOffsetParentAnElement=isHTMLElement(offsetParent),offsetParentIsScaled=isHTMLElement(offsetParent)&&isElementScaled(offsetParent),documentElement=getDocumentElement(offsetParent),rect=getBoundingClientRect(elementOrVirtualElement,offsetParentIsScaled,isFixed),scroll={scrollLeft:0,scrollTop:0},offsets={x:0,y:0};return(isOffsetParentAnElement||!isOffsetParentAnElement&&!isFixed)&&((getNodeName(offsetParent)!=="body"||isScrollParent(documentElement))&&(scroll=getNodeScroll(offsetParent)),isHTMLElement(offsetParent)?(offsets=getBoundingClientRect(offsetParent,!0),offsets.x+=offsetParent.clientLeft,offsets.y+=offsetParent.clientTop):documentElement&&(offsets.x=getWindowScrollBarX(documentElement))),{x:rect.left+scroll.scrollLeft-offsets.x,y:rect.top+scroll.scrollTop-offsets.y,width:rect.width,height:rect.height}}function order(modifiers){var map=new Map,visited=new Set,result=[];modifiers.forEach(function(modifier){map.set(modifier.name,modifier)});function sort(modifier){visited.add(modifier.name);var requires=[].concat(modifier.requires||[],modifier.requiresIfExists||[]);
vendor: 4,163 bytes, line 7
7requires.forEach(function(dep){if(!visited.has(dep)){var depModifier=map.get(dep);depModifier&&sort(depModifier)}}),result.push(modifier)}return modifiers.forEach(function(modifier){visited.has(modifier.name)||sort(modifier)}),result}function orderModifiers(modifiers){var orderedModifiers=order(modifiers);return modifierPhases.reduce(function(acc,phase){return acc.concat(orderedModifiers.filter(function(modifier){return modifier.phase===phase}))},[])}function debounce(fn){var pending;return function(){return pending||(pending=new Promise(function(resolve){Promise.resolve().then(function(){pending=void 0,resolve(fn())})})),pending}}function mergeByName(modifiers){var merged=modifiers.reduce(function(merged,current){var existing=merged[current.name];return merged[current.name]=existing?Object.assign({},existing,current,{options:Object.assign({},existing.options,current.options),data:Object.assign({},existing.data,current.data)}):current,merged},{});return Object.keys(merged).map(function(key){return merged[key]})}var DEFAULT_OPTIONS={placement:"bottom",modifiers:[],strategy:"absolute"};function areValidElements(){for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++)args[_key]=arguments[_key];return!args.some(function(element){return!element||typeof element.getBoundingClientRect!="function"})}function popperGenerator(generatorOptions){generatorOptions===void 0&&(generatorOptions={});var _generatorOptions=generatorOptions,_generatorOptions$def=_generatorOptions.defaultModifiers,defaultModifiers=_generatorOptions$def===void 0?[]:_generatorOptions$def,_generatorOptions$def2=_generatorOptions.defaultOptions,defaultOptions=_generatorOptions$def2===void 0?DEFAULT_OPTIONS:_generatorOptions$def2;return function(reference,popper,options){options===void 0&&(options=defaultOptions);var state={placement:"bottom",orderedModifiers:[],options:Object.assign({},DEFAULT_OPTIONS,defaultOptions),modifiersData:{},elements:{reference,popper},attributes:{},styles:{}},effectCleanupFns=[],isDestroyed=!1,instance={state,setOptions:function(setOptionsAction){var options=typeof setOptionsAction=="function"?setOptionsAction(state.options):setOptionsAction;cleanupModifierEffects(),state.options=Object.assign({},defaultOptions,state.options,options),state.scrollParents={reference:isElement(reference)?listScrollParents(reference):reference.contextElement?listScrollParents(reference.contextElement):[],popper:listScrollParents(popper)};var orderedModifiers=orderModifiers(mergeByName([].concat(defaultModifiers,state.options.modifiers)));return state.orderedModifiers=orderedModifiers.filter(function(m){return m.enabled}),runModifierEffects(),instance.update()},forceUpdate:function(){if(isDestroyed)return;var _state$elements=state.elements,reference=_state$elements.reference,popper=_state$elements.popper;if(!areValidElements(reference,popper))return;state.rects={reference:getCompositeRect(reference,getOffsetParent(popper),state.options.strategy==="fixed"),popper:getLayoutRect(popper)},state.reset=!1,state.placement=state.options.placement,state.orderedModifiers.forEach(function(modifier){return state.modifiersData[modifier.name]=Object.assign({},modifier.data)});for(var index=0;index<state.orderedModifiers.length;index++){if(state.reset===!0){state.reset=!1,index=-1;continue}var _state$orderedModifie=state.orderedModifiers[index],fn=_state$orderedModifie.fn,_state$orderedModifie2=_state$orderedModifie.options,_options=_state$orderedModifie2===void 0?{}:_state$orderedModifie2,name=_state$orderedModifie.name;typeof fn=="function"&&(state=fn({state,options:_options,name,instance})||state)}},update:debounce(function(){return new Promise(function(resolve){instance.forceUpdate(),resolve(state)})}),destroy:function(){cleanupModifierEffects(),isDestroyed=!0}};if(!areValidElements(reference,popper))return instance;instance.setOptions(options).then(function(state){!isDestroyed&&options.onFirstUpdate&&options.onFirstUpdate(state)});function runModifierEffects(){state.orderedModifiers.forEach(function(_ref){var name=_ref.name,_ref$options=_ref.options,options=_ref$options===void 0?{}:_ref$options,effect=_ref.effect;
7if(typeof effect=="function"){var cleanupFn=effect({state,name,instance,options}),noopFn=function(){};effectCleanupFns.push(cleanupFn||noopFn)}})}function cleanupModifierEffects(){effectCleanupFns.forEach(function(fn){return fn()}),effectCleanupFns=[]}return instance}}var createPopper$2=popperGenerator(),defaultModifiers$1=[eventListeners,popperOffsets$1,computeStyles$1,applyStyles$1],createPopper$1=popperGenerator({defaultModifiers:defaultModifiers$1}),defaultModifiers=[eventListeners,popperOffsets$1,computeStyles$1,applyStyles$1,offset$1,flip$1,preventOverflow$1,arrow$1,hide$1],createPopper=popperGenerator({defaultModifiers});const Popper=Object.freeze(Object.defineProperty({__proto__:null,afterMain,afterRead,afterWrite,applyStyles:applyStyles$1,arrow:arrow$1,auto,basePlacements,beforeMain,beforeRead,beforeWrite,bottom,clippingParents,computeStyles:computeStyles$1,createPopper,createPopperBase:createPopper$2,createPopperLite:createPopper$1,detectOverflow,end,eventListeners,flip:flip$1,hide:hide$1,left,main,modifierPhases,offset:offset$1,placements,popper,popperGenerator,popperOffsets:popperOffsets$1,preventOverflow:preventOverflow$1,read,reference,right,start,top,variationPlacements,viewport,write},Symbol.toStringTag,{value:"Module"})),NAME$a="dropdown",DATA_KEY$6="bs.dropdown",EVENT_KEY$6=`.${DATA_KEY$6}`,DATA_API_KEY$3=".data-api",ESCAPE_KEY$2="Escape",TAB_KEY$1="Tab",ARROW_UP_KEY$1="ArrowUp",ARROW_DOWN_KEY$1="ArrowDown",RIGHT_MOUSE_BUTTON=2,EVENT_HIDE$5=`hide${EVENT_KEY$6}`,EVENT_HIDDEN$5=`hidden${EVENT_KEY$6}`,EVENT_SHOW$5=`show${EVENT_KEY$6}`,EVENT_SHOWN$5=`shown${EVENT_KEY$6}`,EVENT_CLICK_DATA_API$3=`click${EVENT_KEY$6}${DATA_API_KEY$3}`,EVENT_KEYDOWN_DATA_API=`keydown${EVENT_KEY$6}${DATA_API_KEY$3}`,EVENT_KEYUP_DATA_API=`keyup${EVENT_KEY$6}${DATA_API_KEY$3}`,CLASS_NAME_SHOW$6="show",CLASS_NAME_DROPUP="dropup",CLASS_NAME_DROPEND="dropend",CLASS_NAME_DROPSTART="dropstart",CLASS_NAME_DROPUP_CENTER="dropup-center",CLASS_NAME_DROPDOWN_CENTER="dropdown-center",SELECTOR_DATA_TOGGLE$3='[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)',SELECTOR_DATA_TOGGLE_SHOWN=`${SELECTOR_DATA_TOGGLE$3}.${CLASS_NAME_SHOW$6}`,SELECTOR_MENU=".dropdown-menu",SELECTOR_NAVBAR=".navbar",SELECTOR_NAVBAR_NAV=".navbar-nav",SELECTOR_VISIBLE_ITEMS=".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",PLACEMENT_TOP=isRTL()?"top-end":"top-start",PLACEMENT_TOPEND=isRTL()?"top-start":"top-end",PLACEMENT_BOTTOM=isRTL()?"bottom-end":"bottom-start",PLACEMENT_BOTTOMEND=isRTL()?"bottom-start":"bottom-end",PLACEMENT_RIGHT=isRTL()?"left-start":"right-start",PLACEMENT_LEFT=isRTL()?"right-start":"left-start",PLACEMENT_TOPCENTER="top",PLACEMENT_BOTTOMCENTER="bottom",Default$9={autoClose:!0,boundary:"clippingParents",display:"dynamic",offset:[0,2],popperConfig:null,reference:"toggle"},DefaultType$9={autoClose:"(boolean|string)",boundary:"(string|element)",display:"string",offset:"(array|string|function)",popperConfig:"(null|object|function)",reference:"(string|element|object)"};class Dropdown extends BaseComponent{constructor(element,config){super(element,config),this._popper=null,this._parent=this._element.parentNode,this._menu=SelectorEngine.next(this._element,SELECTOR_MENU)[0]||SelectorEngine.prev(this._element,SELECTOR_MENU)[0]||SelectorEngine.findOne(SELECTOR_MENU,this._parent),this._inNavbar=this._detectNavbar()}static get Default(){return Default$9}static get DefaultType(){return DefaultType$9}static get NAME(){return NAME$a}toggle(){return this._isShown()?this.hide():this.show()}show(){if(isDisabled(this._element)||this._isShown())return;const relatedTarget={relatedTarget:this._element},showEvent=EventHandler.trigger(this._element,EVENT_SHOW$5,relatedTarget);if(showEvent.defaultPrevented)return;if(this._createPopper(),"ontouchstart"in document.documentElement&&!this._parent.closest(SELECTOR_NAVBAR_NAV))for(const element of[].concat(...document.body.children))EventHandler.on(element,"mouseover",noop);this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.add(CLASS_NAME_SHOW$6),this._element.classList.add(CLASS_NAME_SHOW$6),EventHandler.trigger(this._element,EVENT_SHOWN$5,relatedTarget)}
7hide(){if(isDisabled(this._element)||!this._isShown())return;const relatedTarget={relatedTarget:this._element};this._completeHide(relatedTarget)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_completeHide(relatedTarget){const hideEvent=EventHandler.trigger(this._element,EVENT_HIDE$5,relatedTarget);if(hideEvent.defaultPrevented)return;if("ontouchstart"in document.documentElement)for(const element of[].concat(...document.body.children))EventHandler.off(element,"mouseover",noop);this._popper&&this._popper.destroy(),this._menu.classList.remove(CLASS_NAME_SHOW$6),this._element.classList.remove(CLASS_NAME_SHOW$6),this._element.setAttribute("aria-expanded","false"),Manipulator.removeDataAttribute(this._menu,"popper"),EventHandler.trigger(this._element,EVENT_HIDDEN$5,relatedTarget)}_getConfig(config){if(config=super._getConfig(config),typeof config.reference=="object"&&!isElement$1(config.reference)&&typeof config.reference.getBoundingClientRect!="function")throw new TypeError(`${NAME$a.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);return config}_createPopper(){if(typeof Popper=="undefined")throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let referenceElement=this._element;this._config.reference==="parent"?referenceElement=this._parent:isElement$1(this._config.reference)?referenceElement=getElement(this._config.reference):typeof this._config.reference=="object"&&(referenceElement=this._config.reference);const popperConfig=this._getPopperConfig();this._popper=createPopper(referenceElement,this._menu,popperConfig)}_isShown(){return this._menu.classList.contains(CLASS_NAME_SHOW$6)}_getPlacement(){const parentDropdown=this._parent;if(parentDropdown.classList.contains(CLASS_NAME_DROPEND))return PLACEMENT_RIGHT;if(parentDropdown.classList.contains(CLASS_NAME_DROPSTART))return PLACEMENT_LEFT;if(parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER))return PLACEMENT_TOPCENTER;if(parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER))return PLACEMENT_BOTTOMCENTER;const isEnd=getComputedStyle(this._menu).getPropertyValue("--bs-position").trim()==="end";return parentDropdown.classList.contains(CLASS_NAME_DROPUP)?isEnd?PLACEMENT_TOPEND:PLACEMENT_TOP:isEnd?PLACEMENT_BOTTOMEND:PLACEMENT_BOTTOM}_detectNavbar(){return this._element.closest(SELECTOR_NAVBAR)!==null}_getOffset(){const{offset}=this._config;return typeof offset=="string"?offset.split(",").map(value=>Number.parseInt(value,10)):typeof offset=="function"?popperData=>offset(popperData,this._element):offset}_getPopperConfig(){const defaultBsPopperConfig={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||this._config.display==="static")&&(Manipulator.setDataAttribute(this._menu,"popper","static"),defaultBsPopperConfig.modifiers=[{name:"applyStyles",enabled:!1}]),{...defaultBsPopperConfig,...execute(this._config.popperConfig,[defaultBsPopperConfig])}}_selectMenuItem({key,target}){const items=SelectorEngine.find(SELECTOR_VISIBLE_ITEMS,this._menu).filter(element=>isVisible(element));if(!items.length)return;getNextActiveElement(items,target,key===ARROW_DOWN_KEY$1,!items.includes(target)).focus()}static jQueryInterface(config){return this.each(function(){const data=Dropdown.getOrCreateInstance(this,config);if(typeof config!="string")return;if(typeof data[config]=="undefined")throw new TypeError(`No method named "${config}"`);data[config]()})}static clearMenus(event){if(event.button===RIGHT_MOUSE_BUTTON||event.type==="keyup"&&event.key!==TAB_KEY$1)return;const openToggles=SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN);for(const toggle of openToggles){const context=Dropdown.getInstance(toggle);if(!context||context._config.autoClose===!1)continue;const composedPath=event.composedPath(),isMenuTarget=composedPath.includes(context._menu);if(composedPath.includes(context._element)||context._config.autoClose==="inside"&&!isMenuTarget||context._config.autoClose==="outside"&&isMenuTarget)continue;
vendor: 7,129 bytes, line 7
7if(context._menu.contains(event.target)&&(event.type==="keyup"&&event.key===TAB_KEY$1||/input|select|option|textarea|form/i.test(event.target.tagName)))continue;const relatedTarget={relatedTarget:context._element};event.type==="click"&&(relatedTarget.clickEvent=event),context._completeHide(relatedTarget)}}static dataApiKeydownHandler(event){const isInput=/input|textarea/i.test(event.target.tagName),isEscapeEvent=event.key===ESCAPE_KEY$2,isUpOrDownEvent=[ARROW_UP_KEY$1,ARROW_DOWN_KEY$1].includes(event.key);if(!isUpOrDownEvent&&!isEscapeEvent)return;if(isInput&&!isEscapeEvent)return;event.preventDefault();const getToggleButton=this.matches(SELECTOR_DATA_TOGGLE$3)?this:SelectorEngine.prev(this,SELECTOR_DATA_TOGGLE$3)[0]||SelectorEngine.next(this,SELECTOR_DATA_TOGGLE$3)[0]||SelectorEngine.findOne(SELECTOR_DATA_TOGGLE$3,event.delegateTarget.parentNode),instance=Dropdown.getOrCreateInstance(getToggleButton);if(isUpOrDownEvent){event.stopPropagation(),instance.show(),instance._selectMenuItem(event);return}instance._isShown()&&(event.stopPropagation(),instance.hide(),getToggleButton.focus())}}EventHandler.on(document,EVENT_KEYDOWN_DATA_API,SELECTOR_DATA_TOGGLE$3,Dropdown.dataApiKeydownHandler),EventHandler.on(document,EVENT_KEYDOWN_DATA_API,SELECTOR_MENU,Dropdown.dataApiKeydownHandler),EventHandler.on(document,EVENT_CLICK_DATA_API$3,Dropdown.clearMenus),EventHandler.on(document,EVENT_KEYUP_DATA_API,Dropdown.clearMenus),EventHandler.on(document,EVENT_CLICK_DATA_API$3,SELECTOR_DATA_TOGGLE$3,function(event){event.preventDefault(),Dropdown.getOrCreateInstance(this).toggle()}),defineJQueryPlugin(Dropdown);const NAME$9="backdrop",CLASS_NAME_FADE$4="fade",CLASS_NAME_SHOW$5="show",EVENT_MOUSEDOWN=`mousedown.bs.${NAME$9}`,Default$8={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},DefaultType$8={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class Backdrop extends Config{constructor(config){super(),this._config=this._getConfig(config),this._isAppended=!1,this._element=null}static get Default(){return Default$8}static get DefaultType(){return DefaultType$8}static get NAME(){return NAME$9}show(callback){if(!this._config.isVisible){execute(callback);return}this._append();const element=this._getElement();this._config.isAnimated&&reflow(element),element.classList.add(CLASS_NAME_SHOW$5),this._emulateAnimation(()=>{execute(callback)})}hide(callback){if(!this._config.isVisible){execute(callback);return}this._getElement().classList.remove(CLASS_NAME_SHOW$5),this._emulateAnimation(()=>{this.dispose(),execute(callback)})}dispose(){if(!this._isAppended)return;EventHandler.off(this._element,EVENT_MOUSEDOWN),this._element.remove(),this._isAppended=!1}_getElement(){if(!this._element){const backdrop=document.createElement("div");backdrop.className=this._config.className,this._config.isAnimated&&backdrop.classList.add(CLASS_NAME_FADE$4),this._element=backdrop}return this._element}_configAfterMerge(config){return config.rootElement=getElement(config.rootElement),config}_append(){if(this._isAppended)return;const element=this._getElement();this._config.rootElement.append(element),EventHandler.on(element,EVENT_MOUSEDOWN,()=>{execute(this._config.clickCallback)}),this._isAppended=!0}_emulateAnimation(callback){executeAfterTransition(callback,this._getElement(),this._config.isAnimated)}}const NAME$8="focustrap",DATA_KEY$5="bs.focustrap",EVENT_KEY$5=`.${DATA_KEY$5}`,EVENT_FOCUSIN$2=`focusin${EVENT_KEY$5}`,EVENT_KEYDOWN_TAB=`keydown.tab${EVENT_KEY$5}`,TAB_KEY="Tab",TAB_NAV_FORWARD="forward",TAB_NAV_BACKWARD="backward",Default$7={autofocus:!0,trapElement:null},DefaultType$7={autofocus:"boolean",trapElement:"element"};class FocusTrap extends Config{constructor(config){super(),this._config=this._getConfig(config),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return Default$7}static get DefaultType(){return DefaultType$7}static get NAME(){return NAME$8}activate(){if(this._isActive)return;this._config.autofocus&&this._config.trapElement.focus(),EventHandler.off(document,EVENT_KEY$5),EventHandler.on(document,EVENT_FOCUSIN$2,event=>this._handleFocusin(event)),EventHandler.on(document,EVENT_KEYDOWN_TAB,event=>this._handleKeydown(event)),this._isActive=!0}deactivate(){if(!this._isActive)return;this._isActive=!1,EventHandler.off(document,EVENT_KEY$5)}_handleFocusin(event){const{trapElement}=this._config;if(event.target===document||event.target===trapElement||trapElement.contains(event.target))return;const elements=SelectorEngine.focusableChildren(trapElement);elements.length===0?trapElement.focus():this._lastTabNavDirection===TAB_NAV_BACKWARD?elements[elements.length-1].focus():elements[0].focus()}_handleKeydown(event){if(event.key!==TAB_KEY)return;this._lastTabNavDirection=event.shiftKey?TAB_NAV_BACKWARD:TAB_NAV_FORWARD}}const SELECTOR_FIXED_CONTENT=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",SELECTOR_STICKY_CONTENT=".sticky-top",PROPERTY_PADDING="padding-right",PROPERTY_MARGIN="margin-right";class ScrollBarHelper{constructor(){this._element=document.body}getWidth(){const documentWidth=document.documentElement.clientWidth;return Math.abs(window.innerWidth-documentWidth)}hide(){const width=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,PROPERTY_PADDING,calculatedValue=>calculatedValue+width),this._setElementAttributes(SELECTOR_FIXED_CONTENT,PROPERTY_PADDING,calculatedValue=>calculatedValue+width),this._setElementAttributes(SELECTOR_STICKY_CONTENT,PROPERTY_MARGIN,calculatedValue=>calculatedValue-width)}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,PROPERTY_PADDING),this._resetElementAttributes(SELECTOR_FIXED_CONTENT,PROPERTY_PADDING),this._resetElementAttributes(SELECTOR_STICKY_CONTENT,PROPERTY_MARGIN)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(selector,styleProperty,callback){const scrollbarWidth=this.getWidth(),manipulationCallBack=element=>{if(element!==this._element&&window.innerWidth>element.clientWidth+scrollbarWidth)return;this._saveInitialAttribute(element,styleProperty);const calculatedValue=window.getComputedStyle(element).getPropertyValue(styleProperty);element.style.setProperty(styleProperty,`${callback(Number.parseFloat(calculatedValue))}px`)};this._applyManipulationCallback(selector,manipulationCallBack)}_saveInitialAttribute(element,styleProperty){const actualValue=element.style.getPropertyValue(styleProperty);actualValue&&Manipulator.setDataAttribute(element,styleProperty,actualValue)}_resetElementAttributes(selector,styleProperty){const manipulationCallBack=element=>{const value=Manipulator.getDataAttribute(element,styleProperty);if(value===null){element.style.removeProperty(styleProperty);return}Manipulator.removeDataAttribute(element,styleProperty),element.style.setProperty(styleProperty,value)};this._applyManipulationCallback(selector,manipulationCallBack)}
7_applyManipulationCallback(selector,callBack){if(isElement$1(selector)){callBack(selector);return}for(const sel of SelectorEngine.find(selector,this._element))callBack(sel)}}const NAME$7="modal",DATA_KEY$4="bs.modal",EVENT_KEY$4=`.${DATA_KEY$4}`,DATA_API_KEY$2=".data-api",ESCAPE_KEY$1="Escape",EVENT_HIDE$4=`hide${EVENT_KEY$4}`,EVENT_HIDE_PREVENTED$1=`hidePrevented${EVENT_KEY$4}`,EVENT_HIDDEN$4=`hidden${EVENT_KEY$4}`,EVENT_SHOW$4=`show${EVENT_KEY$4}`,EVENT_SHOWN$4=`shown${EVENT_KEY$4}`,EVENT_RESIZE$1=`resize${EVENT_KEY$4}`,EVENT_CLICK_DISMISS=`click.dismiss${EVENT_KEY$4}`,EVENT_MOUSEDOWN_DISMISS=`mousedown.dismiss${EVENT_KEY$4}`,EVENT_KEYDOWN_DISMISS$1=`keydown.dismiss${EVENT_KEY$4}`,EVENT_CLICK_DATA_API$2=`click${EVENT_KEY$4}${DATA_API_KEY$2}`,CLASS_NAME_OPEN="modal-open",CLASS_NAME_FADE$3="fade",CLASS_NAME_SHOW$4="show",CLASS_NAME_STATIC="modal-static",OPEN_SELECTOR$1=".modal.show",SELECTOR_DIALOG=".modal-dialog",SELECTOR_MODAL_BODY=".modal-body",SELECTOR_DATA_TOGGLE$2='[data-bs-toggle="modal"]',Default$6={backdrop:!0,focus:!0,keyboard:!0},DefaultType$6={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class Modal extends BaseComponent{constructor(element,config){super(element,config),this._dialog=SelectorEngine.findOne(SELECTOR_DIALOG,this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new ScrollBarHelper,this._addEventListeners()}static get Default(){return Default$6}static get DefaultType(){return DefaultType$6}static get NAME(){return NAME$7}toggle(relatedTarget){return this._isShown?this.hide():this.show(relatedTarget)}show(relatedTarget){if(this._isShown||this._isTransitioning)return;const showEvent=EventHandler.trigger(this._element,EVENT_SHOW$4,{relatedTarget});if(showEvent.defaultPrevented)return;this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(CLASS_NAME_OPEN),this._adjustDialog(),this._backdrop.show(()=>this._showElement(relatedTarget))}hide(){if(!this._isShown||this._isTransitioning)return;const hideEvent=EventHandler.trigger(this._element,EVENT_HIDE$4);if(hideEvent.defaultPrevented)return;this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(CLASS_NAME_SHOW$4),this._queueCallback(()=>this._hideModal(),this._element,this._isAnimated())}dispose(){EventHandler.off(window,EVENT_KEY$4),EventHandler.off(this._dialog,EVENT_KEY$4),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Backdrop({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new FocusTrap({trapElement:this._element})}_showElement(relatedTarget){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 modalBody=SelectorEngine.findOne(SELECTOR_MODAL_BODY,this._dialog);modalBody&&(modalBody.scrollTop=0),reflow(this._element),this._element.classList.add(CLASS_NAME_SHOW$4);const transitionComplete=()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,EventHandler.trigger(this._element,EVENT_SHOWN$4,{relatedTarget})};this._queueCallback(transitionComplete,this._dialog,this._isAnimated())}_addEventListeners(){EventHandler.on(this._element,EVENT_KEYDOWN_DISMISS$1,event=>{if(event.key!==ESCAPE_KEY$1)return;if(this._config.keyboard){this.hide();return}this._triggerBackdropTransition()}),EventHandler.on(window,EVENT_RESIZE$1,()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()}),EventHandler.on(this._element,EVENT_MOUSEDOWN_DISMISS,event=>{EventHandler.one(this._element,EVENT_CLICK_DISMISS,event2=>{if(this._element!==event.target||this._element!==event2.target)return;if(this._config.backdrop==="static"){this._triggerBackdropTransition();return}this._config.backdrop&&this.hide()})})}_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(CLASS_NAME_OPEN),this._resetAdjustments(),this._scrollBar.reset(),EventHandler.trigger(this._element,EVENT_HIDDEN$4)})}_isAnimated(){return this._element.classList.contains(CLASS_NAME_FADE$3)}_triggerBackdropTransition(){const hideEvent=EventHandler.trigger(this._element,EVENT_HIDE_PREVENTED$1);if(hideEvent.defaultPrevented)return;const isModalOverflowing=this._element.scrollHeight>document.documentElement.clientHeight,initialOverflowY=this._element.style.overflowY;if(initialOverflowY==="hidden"||this._element.classList.contains(CLASS_NAME_STATIC))return;isModalOverflowing||(this._element.style.overflowY="hidden"),this._element.classList.add(CLASS_NAME_STATIC),this._queueCallback(()=>{this._element.classList.remove(CLASS_NAME_STATIC),this._queueCallback(()=>{this._element.style.overflowY=initialOverflowY},this._dialog)},this._dialog),this._element.focus()}_adjustDialog(){const isModalOverflowing=this._element.scrollHeight>document.documentElement.clientHeight,scrollbarWidth=this._scrollBar.getWidth(),isBodyOverflowing=scrollbarWidth>0;if(isBodyOverflowing&&!isModalOverflowing){const property=isRTL()?"paddingLeft":"paddingRight";this._element.style[property]=`${scrollbarWidth}px`}if(!isBodyOverflowing&&isModalOverflowing){const property=isRTL()?"paddingRight":"paddingLeft";this._element.style[property]=`${scrollbarWidth}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(config,relatedTarget){return this.each(function(){const data=Modal.getOrCreateInstance(this,config);if(typeof config!="string")return;if(typeof data[config]=="undefined")throw new TypeError(`No method n
7amed "${config}"`);data[config](relatedTarget)})}}EventHandler.on(document,EVENT_CLICK_DATA_API$2,SELECTOR_DATA_TOGGLE$2,function(event){const target=SelectorEngine.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&event.preventDefault(),EventHandler.one(target,EVENT_SHOW$4,showEvent=>{if(showEvent.defaultPrevented)return;EventHandler.one(target,EVENT_HIDDEN$4,()=>{isVisible(this)&&this.focus()})});const alreadyOpen=SelectorEngine.findOne(OPEN_SELECTOR$1);alreadyOpen&&Modal.getInstance(alreadyOpen).hide();const data=Modal.getOrCreateInstance(target);data.toggle(this)}),enableDismissTrigger(Modal),defineJQueryPlugin(Modal);const NAME$6="offcanvas",DATA_KEY$3="bs.offcanvas",EVENT_KEY$3=`.${DATA_KEY$3}`,DATA_API_KEY$1=".data-api",EVENT_LOAD_DATA_API$2=`load${EVENT_KEY$3}${DATA_API_KEY$1}`,ESCAPE_KEY="Escape",CLASS_NAME_SHOW$3="show",CLASS_NAME_SHOWING$1="showing",CLASS_NAME_HIDING="hiding",CLASS_NAME_BACKDROP="offcanvas-backdrop",OPEN_SELECTOR=".offcanvas.show",EVENT_SHOW$3=`show${EVENT_KEY$3}`,EVENT_SHOWN$3=`shown${EVENT_KEY$3}`,EVENT_HIDE$3=`hide${EVENT_KEY$3}`,EVENT_HIDE_PREVENTED=`hidePrevented${EVENT_KEY$3}`,EVENT_HIDDEN$3=`hidden${EVENT_KEY$3}`,EVENT_RESIZE=`resize${EVENT_KEY$3}`,EVENT_CLICK_DATA_API$1=`click${EVENT_KEY$3}${DATA_API_KEY$1}`,EVENT_KEYDOWN_DISMISS=`keydown.dismiss${EVENT_KEY$3}`,SELECTOR_DATA_TOGGLE$1='[data-bs-toggle="offcanvas"]',Default$5={backdrop:!0,keyboard:!0,scroll:!1},DefaultType$5={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class Offcanvas extends BaseComponent{constructor(element,config){super(element,config),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return Default$5}static get DefaultType(){return DefaultType$5}static get NAME(){return NAME$6}toggle(relatedTarget){return this._isShown?this.hide():this.show(relatedTarget)}show(relatedTarget){if(this._isShown)return;const showEvent=EventHandler.trigger(this._element,EVENT_SHOW$3,{relatedTarget});if(showEvent.defaultPrevented)return;this._isShown=!0,this._backdrop.show(),this._config.scroll||(new ScrollBarHelper).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(CLASS_NAME_SHOWING$1);const completeCallBack=()=>{(!this._config.scroll||this._config.backdrop)&&this._focustrap.activate(),this._element.classList.add(CLASS_NAME_SHOW$3),this._element.classList.remove(CLASS_NAME_SHOWING$1),EventHandler.trigger(this._element,EVENT_SHOWN$3,{relatedTarget})};this._queueCallback(completeCallBack,this._element,!0)}hide(){if(!this._isShown)return;const hideEvent=EventHandler.trigger(this._element,EVENT_HIDE$3);if(hideEvent.defaultPrevented)return;this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add(CLASS_NAME_HIDING),this._backdrop.hide();const completeCallback=()=>{this._element.classList.remove(CLASS_NAME_SHOW$3,CLASS_NAME_HIDING),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new ScrollBarHelper).reset(),EventHandler.trigger(this._element,EVENT_HIDDEN$3)};this._queueCallback(completeCallback,this._element,!0)}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const clickCallback=()=>{if(this._config.backdrop==="static"){EventHandler.trigger(this._element,EVENT_HIDE_PREVENTED);return}this.hide()},isVisible=Boolean(this._config.backdrop);return new Backdrop({className:CLASS_NAME_BACKDROP,isVisible,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:isVisible?clickCallback:null})}_initializeFocusTrap(){return new FocusTrap({trapElement:this._element})}_addEventListeners(){EventHandler.on(this._element,EVENT_KEYDOWN_DISMISS,event=>{if(event.key!==ESCAPE_KEY)return;if(this._config.keyboard){this.hide();return}EventHandler.trigger(this._element,EVENT_HIDE_PREVENTED)})}static jQueryInterface(config){return this.each(function(){const data=Offcanvas.getOrCreateInstance(this,config);if(typeof config!="string")return;if(data[config]===void 0||config.startsWith("_")||config==="constructor")throw new TypeError(`No method n
7amed "${config}"`);data[config](this)})}}EventHandler.on(document,EVENT_CLICK_DATA_API$1,SELECTOR_DATA_TOGGLE$1,function(event){const target=SelectorEngine.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&event.preventDefault(),isDisabled(this))return;EventHandler.one(target,EVENT_HIDDEN$3,()=>{isVisible(this)&&this.focus()});const alreadyOpen=SelectorEngine.findOne(OPEN_SELECTOR);alreadyOpen&&alreadyOpen!==target&&Offcanvas.getInstance(alreadyOpen).hide();const data=Offcanvas.getOrCreateInstance(target);data.toggle(this)}),EventHandler.on(window,EVENT_LOAD_DATA_API$2,()=>{for(const selector of SelectorEngine.find(OPEN_SELECTOR))Offcanvas.getOrCreateInstance(selector).show()}),EventHandler.on(window,EVENT_RESIZE,()=>{for(const element of SelectorEngine.find("[aria-modal][class*=show][class*=offcanvas-]"))getComputedStyle(element).position!=="fixed"&&Offcanvas.getOrCreateInstance(element).hide()}),enableDismissTrigger(Offcanvas),defineJQueryPlugin(Offcanvas);const ARIA_ATTRIBUTE_PATTERN=/^aria-[\w-]*$/i,DefaultAllowlist={"*":["class","dir","id","lang","role",ARIA_ATTRIBUTE_PATTERN],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},uriAttributes=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),SAFE_URL_PATTERN=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,allowedAttribute=(attribute,allowedAttributeList)=>{const attributeName=attribute.nodeName.toLowerCase();return allowedAttributeList.includes(attributeName)?!uriAttributes.has(attributeName)||Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue)):allowedAttributeList.filter(attributeRegex=>attributeRegex instanceof RegExp).some(regex=>regex.test(attributeName))};function sanitizeHtml(unsafeHtml,allowList,sanitizeFunction){if(!unsafeHtml.length)return unsafeHtml;if(sanitizeFunction&&typeof sanitizeFunction=="function")return sanitizeFunction(unsafeHtml);const domParser=new window.DOMParser,createdDocument=domParser.parseFromString(unsafeHtml,"text/html"),elements=[].concat(...createdDocument.body.querySelectorAll("*"));for(const element of elements){const elementName=element.nodeName.toLowerCase();if(!Object.keys(allowList).includes(elementName)){element.remove();continue}const attributeList=[].concat(...element.attributes),allowedAttributes=[].concat(allowList["*"]||[],allowList[elementName]||[]);for(const attribute of attributeList)allowedAttribute(attribute,allowedAttributes)||element.removeAttribute(attribute.nodeName)}return createdDocument.body.innerHTML}const NAME$5="TemplateFactory",Default$4={allowList:DefaultAllowlist,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"<div></div>"},DefaultType$4={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},DefaultContentType={entry:"(string|element|function|null)",selector:"(string|element)"};class TemplateFactory extends Config{constructor(config){super(),this._config=this._getConfig(config)}static get Default(){return Default$4}static get DefaultType(){return DefaultType$4}static get NAME(){return NAME$5}getContent(){return Object.values(this._config.content).map(config=>this._resolvePossibleFunction(config)).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(content){return this._checkContent(content),this._config.content={...this._config.content,...content},this}toHtml(){const templateWrapper=document.createElement("div");templateWrapper.innerHTML=this._maybeSanitize(this._config.template);for(const[selector,text]of Object.entries(this._config.content))this._setContent(templateWrapper,text,selector);const template=templateWrapper.children[0],extraClass=this._resolvePossibleFunction(this._config.extraClass);return extraClass&&template.classList.add(...extraClass.split(" ")),template}_typeCheckConfig(config){super._typeCheckConfig(config),this._checkContent(config.content)}_checkContent(arg){for(const[selector,content]of Object.entries(arg))super._typeCheckConfig({selector,entry:content},DefaultContentType)}_setContent(template,content,selector){const templateElement=SelectorEngine.findOne(selector,template);
7if(!templateElement)return;if(content=this._resolvePossibleFunction(content),!content){templateElement.remove();return}if(isElement$1(content)){this._putElementInTemplate(getElement(content),templateElement);return}if(this._config.html){templateElement.innerHTML=this._maybeSanitize(content);return}templateElement.textContent=content}_maybeSanitize(arg){return this._config.sanitize?sanitizeHtml(arg,this._config.allowList,this._config.sanitizeFn):arg}_resolvePossibleFunction(arg){return execute(arg,[this])}_putElementInTemplate(element,templateElement){if(this._config.html){templateElement.innerHTML="",templateElement.append(element);return}templateElement.textContent=element.textContent}}const NAME$4="tooltip",DISALLOWED_ATTRIBUTES=new Set(["sanitize","allowList","sanitizeFn"]),CLASS_NAME_FADE$2="fade",CLASS_NAME_MODAL="modal",CLASS_NAME_SHOW$2="show",SELECTOR_TOOLTIP_INNER=".tooltip-inner",SELECTOR_MODAL=`.${CLASS_NAME_MODAL}`,EVENT_MODAL_HIDE="hide.bs.modal",TRIGGER_HOVER="hover",TRIGGER_FOCUS="focus",TRIGGER_CLICK="click",TRIGGER_MANUAL="manual",EVENT_HIDE$2="hide",EVENT_HIDDEN$2="hidden",EVENT_SHOW$2="show",EVENT_SHOWN$2="shown",EVENT_INSERTED="inserted",EVENT_CLICK$1="click",EVENT_FOCUSIN$1="focusin",EVENT_FOCUSOUT$1="focusout",EVENT_MOUSEENTER="mouseenter",EVENT_MOUSELEAVE="mouseleave",AttachmentMap={AUTO:"auto",TOP:"top",RIGHT:isRTL()?"left":"right",BOTTOM:"bottom",LEFT:isRTL()?"right":"left"},Default$3={allowList:DefaultAllowlist,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:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',title:"",trigger:"hover focus"},DefaultType$3={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 Tooltip extends BaseComponent{constructor(element,config){if(typeof Popper=="undefined")throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(element,config),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 Default$3}static get DefaultType(){return DefaultType$3}static get NAME(){return NAME$4}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){if(!this._isEnabled)return;if(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()){this._leave();return}this._enter()}dispose(){clearTimeout(this._timeout),EventHandler.off(this._element.closest(SELECTOR_MODAL),EVENT_MODAL_HIDE,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(this._element.style.display==="none")throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const showEvent=EventHandler.trigger(this._element,this.constructor.eventName(EVENT_SHOW$2)),shadowRoot=findShadowRoot(this._element),isInTheDom=(shadowRoot||this._element.ownerDocument.documentElement).contains(this._element);if(showEvent.defaultPrevented||!isInTheDom)return;this._disposePopper();const tip=this._getTipElement();this._element.setAttribute("aria-describedby",tip.getAttribute("id"));const{container}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(container.append(tip),EventHandler.trigger(this._element,this.constructor.eventName(EVENT_INSERTED))),this._popper=this._createPopper(tip),tip.classList.add(CLASS_NAME_SHOW$2),"ontouchstart"in document.documentElement)for(const element of[].concat(...document.body.children))EventHandler.on(element,"mouseover",noop);const complete=()=>{EventHandler.trigger(this._element,this.constructor.eventName(EVENT_SHOWN$2)),this._isHovered===!1&&this._leave(),this._isHovered=!1};this._queueCallback(complete,this.tip,this._isAnimated())}
7hide(){if(!this._isShown())return;const hideEvent=EventHandler.trigger(this._element,this.constructor.eventName(EVENT_HIDE$2));if(hideEvent.defaultPrevented)return;const tip=this._getTipElement();if(tip.classList.remove(CLASS_NAME_SHOW$2),"ontouchstart"in document.documentElement)for(const element of[].concat(...document.body.children))EventHandler.off(element,"mouseover",noop);this._activeTrigger[TRIGGER_CLICK]=!1,this._activeTrigger[TRIGGER_FOCUS]=!1,this._activeTrigger[TRIGGER_HOVER]=!1,this._isHovered=null;const complete=()=>{if(this._isWithActiveTrigger())return;this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),EventHandler.trigger(this._element,this.constructor.eventName(EVENT_HIDDEN$2))};this._queueCallback(complete,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(content){const tip=this._getTemplateFactory(content).toHtml();if(!tip)return null;tip.classList.remove(CLASS_NAME_FADE$2,CLASS_NAME_SHOW$2),tip.classList.add(`bs-${this.constructor.NAME}-auto`);const tipId=getUID(this.constructor.NAME).toString();return tip.setAttribute("id",tipId),this._isAnimated()&&tip.classList.add(CLASS_NAME_FADE$2),tip}setContent(content){this._newContent=content,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(content){return this._templateFactory?this._templateFactory.changeContent(content):this._templateFactory=new TemplateFactory({...this._config,content,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{[SELECTOR_TOOLTIP_INNER]:this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(event){return this.constructor.getOrCreateInstance(event.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(CLASS_NAME_FADE$2)}_isShown(){return this.tip&&this.tip.classList.contains(CLASS_NAME_SHOW$2)}_createPopper(tip){const placement=execute(this._config.placement,[this,tip,this._element]),attachment=AttachmentMap[placement.toUpperCase()];return createPopper(this._element,tip,this._getPopperConfig(attachment))}_getOffset(){const{offset}=this._config;return typeof offset=="string"?offset.split(",").map(value=>Number.parseInt(value,10)):typeof offset=="function"?popperData=>offset(popperData,this._element):offset}_resolvePossibleFunction(arg){return execute(arg,[this._element])}_getPopperConfig(attachment){const defaultBsPopperConfig={placement:attachment,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:data=>{this._getTipElement().setAttribute("data-popper-placement",data.state.placement)}}]};return{...defaultBsPopperConfig,...execute(this._config.popperConfig,[defaultBsPopperConfig])}}_setListeners(){const triggers=this._config.trigger.split(" ");for(const trigger of triggers)if(trigger==="click")EventHandler.on(this._element,this.constructor.eventName(EVENT_CLICK$1),this._config.selector,event=>{const context=this._initializeOnDelegatedTarget(event);context.toggle()});else if(trigger!==TRIGGER_MANUAL){const eventIn=trigger===TRIGGER_HOVER?this.constructor.eventName(EVENT_MOUSEENTER):this.constructor.eventName(EVENT_FOCUSIN$1),eventOut=trigger===TRIGGER_HOVER?this.constructor.eventName(EVENT_MOUSELEAVE):this.constructor.eventName(EVENT_FOCUSOUT$1);EventHandler.on(this._element,eventIn,this._config.selector,event=>{const context=this._initializeOnDelegatedTarget(event);context._activeTrigger[event.type==="focusin"?TRIGGER_FOCUS:TRIGGER_HOVER]=!0,context._enter()}),EventHandler.on(this._element,eventOut,this._config.selector,event=>{const context=this._initializeOnDelegatedTarget(event);context._activeTrigger[event.type==="focusout"?TRIGGER_FOCUS:TRIGGER_HOVER]=context._element.contains(event.relatedTarget),context._leave()})}this._hideModalHandler=()=>{this._element&&this.hide()},EventHandler.on(this._element.closest(SELECTOR_MODAL),EVENT_MODAL_HIDE,this._hideModalHandler)}_fixTitle(){const title=this._element.getAttribute("title");if(!title)return;!this._element.getAttribute("aria-label")&&!this._element.textContent.trim()&&this._element.setAttribute("aria-label",title),this._element.setAttribute("data-bs-original-title",title),this._element.removeAttribute("title")}_enter(){if(this._isShown()||this._isHovered){this._isHovered=!0;return}this._isHovered=!0,this._setTimeout(()=>{this._isHovered&&this.show()},this._config.delay.show)}_leave(){if(this._isWithActiveTrigger())return;this._isHovered=!1,this._setTimeout(()=>{this._isHovered||this.hide()},this._config.delay.hide)}_setTimeout(handler,timeout){clearTimeout(this._timeout),this._timeout=setTimeout(handler,timeout)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(config){const dataAttributes=Manipulator.getDataAttributes(this._element);
vendor: 4,185 bytes, line 7
7for(const dataAttribute of Object.keys(dataAttributes))DISALLOWED_ATTRIBUTES.has(dataAttribute)&&delete dataAttributes[dataAttribute];return config={...dataAttributes,...typeof config=="object"&&config?config:{}},config=this._mergeConfigObj(config),config=this._configAfterMerge(config),this._typeCheckConfig(config),config}_configAfterMerge(config){return config.container=config.container===!1?document.body:getElement(config.container),typeof config.delay=="number"&&(config.delay={show:config.delay,hide:config.delay}),typeof config.title=="number"&&(config.title=config.title.toString()),typeof config.content=="number"&&(config.content=config.content.toString()),config}_getDelegateConfig(){const config={};for(const[key,value]of Object.entries(this._config))this.constructor.Default[key]!==value&&(config[key]=value);return config.selector=!1,config.trigger="manual",config}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(config){return this.each(function(){const data=Tooltip.getOrCreateInstance(this,config);if(typeof config!="string")return;if(typeof data[config]=="undefined")throw new TypeError(`No method named "${config}"`);data[config]()})}}defineJQueryPlugin(Tooltip);const NAME$3="popover",SELECTOR_TITLE=".popover-header",SELECTOR_CONTENT=".popover-body",Default$2={...Tooltip.Default,content:"",offset:[0,8],placement:"right",template:'<div class="popover" role="tooltip"><div class="popover-arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>',trigger:"click"},DefaultType$2={...Tooltip.DefaultType,content:"(null|string|element|function)"};class Popover extends Tooltip{static get Default(){return Default$2}static get DefaultType(){return DefaultType$2}static get NAME(){return NAME$3}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{[SELECTOR_TITLE]:this._getTitle(),[SELECTOR_CONTENT]:this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(config){return this.each(function(){const data=Popover.getOrCreateInstance(this,config);if(typeof config!="string")return;if(typeof data[config]=="undefined")throw new TypeError(`No method named "${config}"`);data[config]()})}}defineJQueryPlugin(Popover);const NAME$2="scrollspy",DATA_KEY$2="bs.scrollspy",EVENT_KEY$2=`.${DATA_KEY$2}`,DATA_API_KEY=".data-api",EVENT_ACTIVATE=`activate${EVENT_KEY$2}`,EVENT_CLICK=`click${EVENT_KEY$2}`,EVENT_LOAD_DATA_API$1=`load${EVENT_KEY$2}${DATA_API_KEY}`,CLASS_NAME_DROPDOWN_ITEM="dropdown-item",CLASS_NAME_ACTIVE$1="active",SELECTOR_DATA_SPY='[data-bs-spy="scroll"]',SELECTOR_TARGET_LINKS="[href]",SELECTOR_NAV_LIST_GROUP=".nav, .list-group",SELECTOR_NAV_LINKS=".nav-link",SELECTOR_NAV_ITEMS=".nav-item",SELECTOR_LIST_ITEMS=".list-group-item",SELECTOR_LINK_ITEMS=`${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`,SELECTOR_DROPDOWN=".dropdown",SELECTOR_DROPDOWN_TOGGLE$1=".dropdown-toggle",Default$1={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},DefaultType$1={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class ScrollSpy extends BaseComponent{constructor(element,config){super(element,config),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement=getComputedStyle(this._element).overflowY==="visible"?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return Default$1}static get DefaultType(){return DefaultType$1}static get NAME(){return NAME$2}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const section of this._observableSections.values())this._observer.observe(section)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(config){return config.target=getElement(config.target)||document.body,config.rootMargin=config.offset?`${c
7onfig.offset}px 0px -30%`:config.rootMargin,typeof config.threshold=="string"&&(config.threshold=config.threshold.split(",").map(value=>Number.parseFloat(value))),config}_maybeEnableSmoothScroll(){if(!this._config.smoothScroll)return;EventHandler.off(this._config.target,EVENT_CLICK),EventHandler.on(this._config.target,EVENT_CLICK,SELECTOR_TARGET_LINKS,event=>{const observableSection=this._observableSections.get(event.target.hash);if(observableSection){event.preventDefault();const root=this._rootElement||window,height=observableSection.offsetTop-this._element.offsetTop;if(root.scrollTo){root.scrollTo({top:height,behavior:"smooth"});return}root.scrollTop=height}})}_getNewObserver(){const options={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver(entries=>this._observerCallback(entries),options)}_observerCallback(entries){const targetElement=entry=>this._targetLinks.get(`#${entry.target.id}`),activate=entry=>{this._previousScrollData.visibleEntryTop=entry.target.offsetTop,this._process(targetElement(entry))},parentScrollTop=(this._rootElement||document.documentElement).scrollTop,userScrollsDown=parentScrollTop>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=parentScrollTop;for(const entry of entries){if(!entry.isIntersecting){this._activeTarget=null,this._clearActiveClass(targetElement(entry));continue}const entryIsLowerThanPrevious=entry.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(userScrollsDown&&entryIsLowerThanPrevious){if(activate(entry),!parentScrollTop)return;continue}!userScrollsDown&&!entryIsLowerThanPrevious&&activate(entry)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const targetLinks=SelectorEngine.find(SELECTOR_TARGET_LINKS,this._config.target);for(const anchor of targetLinks){if(!anchor.hash||isDisabled(anchor))continue;const observableSection=SelectorEngine.findOne(decodeURI(anchor.hash),this._element);isVisible(observableSection)&&(this._targetLinks.set(decodeURI(anchor.hash),anchor),this._observableSections.set(anchor.hash,observableSection))}}_process(target){if(this._activeTarget===target)return;this._clearActiveClass(this._config.target),this._activeTarget=target,target.classList.add(CLASS_NAME_ACTIVE$1),this._activateParents(target),EventHandler.trigger(this._element,EVENT_ACTIVATE,{relatedTarget:target})}_activateParents(target){if(target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)){SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE$1,target.closest(SELECTOR_DROPDOWN)).classList.add(CLASS_NAME_ACTIVE$1);return}for(const listGroup of SelectorEngine.parents(target,SELECTOR_NAV_LIST_GROUP))for(const item of SelectorEngine.prev(listGroup,SELECTOR_LINK_ITEMS))item.classList.add(CLASS_NAME_ACTIVE$1)}_clearActiveClass(parent){parent.classList.remove(CLASS_NAME_ACTIVE$1);const activeNodes=SelectorEngine.find(`${SELECTOR_TARGET_LINKS}.${CLASS_NAME_ACTIVE$1}`,parent);for(const node of activeNodes)node.classList.remove(CLASS_NAME_ACTIVE$1)}static jQueryInterface(config){return this.each(function(){const data=ScrollSpy.getOrCreateInstance(this,config);if(typeof config!="string")return;if(data[config]===void 0||config.startsWith("_")||config==="constructor")throw new TypeError(`No method named "${config}"`);data[config]()})}}EventHandler.on(window,EVENT_LOAD_DATA_API$1,()=>{for(const spy of SelectorEngine.find(SELECTOR_DATA_SPY))ScrollSpy.getOrCreateInstance(spy)}),defineJQueryPlugin(ScrollSpy);const NAME$1="tab",DATA_KEY$1="bs.tab",EVENT_KEY$1=`.${DATA_KEY$1}`,EVENT_HIDE$1=`hide${EVENT_KEY$1}`,EVENT_HIDDEN$1=`hidden${EVENT_KEY$1}`,EVENT_SHOW$1=`show${EVENT_KEY$1}`,EVENT_SHOWN$1=`shown${EVENT_KEY$1}`,EVENT_CLICK_DATA_API=`click${EVENT_KEY$1}`,EVENT_KEYDOWN=`keydown${EVENT_KEY$1}`,EVENT_LOAD_DATA_API=`load${EVENT_KEY$1}`,ARROW_LEFT_KEY="ArrowLeft",ARROW_RIGHT_KEY="ArrowRight",ARROW_UP_KEY="ArrowUp",ARROW_DOWN_KEY="ArrowDown",HOME_KEY="Home",END_KEY="End",CLASS_NAME_ACTIVE="active",CLASS_NAME_FADE$1="fade",CLASS_NAME_SHOW$1="show",CLASS_DROPDOWN="dropdown",SELECTOR_DROPDOWN_TOGGLE=".dropdown-toggle",SELECTOR_DROPDOWN_MENU=".dropdown-menu",NOT_SELECTOR_DROPDOWN_TOGGLE=`
7:not(${SELECTOR_DROPDOWN_TOGGLE})`,SELECTOR_TAB_PANEL='.list-group, .nav, [role="tablist"]',SELECTOR_OUTER=".nav-item, .list-group-item",SELECTOR_INNER=`.nav-link${NOT_SELECTOR_DROPDOWN_TOGGLE}, .list-group-item${NOT_SELECTOR_DROPDOWN_TOGGLE}, [role="tab"]${NOT_SELECTOR_DROPDOWN_TOGGLE}`,SELECTOR_DATA_TOGGLE='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',SELECTOR_INNER_ELEM=`${SELECTOR_INNER}, ${SELECTOR_DATA_TOGGLE}`,SELECTOR_DATA_TOGGLE_ACTIVE=`.${CLASS_NAME_ACTIVE}[data-bs-toggle="tab"], .${CLASS_NAME_ACTIVE}[data-bs-toggle="pill"], .${CLASS_NAME_ACTIVE}[data-bs-toggle="list"]`;class Tab extends BaseComponent{constructor(element){if(super(element),this._parent=this._element.closest(SELECTOR_TAB_PANEL),!this._parent)return;this._setInitialAttributes(this._parent,this._getChildren()),EventHandler.on(this._element,EVENT_KEYDOWN,event=>this._keydown(event))}static get NAME(){return NAME$1}show(){const innerElem=this._element;if(this._elemIsActive(innerElem))return;const active=this._getActiveElem(),hideEvent=active?EventHandler.trigger(active,EVENT_HIDE$1,{relatedTarget:innerElem}):null,showEvent=EventHandler.trigger(innerElem,EVENT_SHOW$1,{relatedTarget:active});if(showEvent.defaultPrevented||hideEvent&&hideEvent.defaultPrevented)return;this._deactivate(active,innerElem),this._activate(innerElem,active)}_activate(element,relatedElem){if(!element)return;element.classList.add(CLASS_NAME_ACTIVE),this._activate(SelectorEngine.getElementFromSelector(element));const complete=()=>{if(element.getAttribute("role")!=="tab"){element.classList.add(CLASS_NAME_SHOW$1);return}element.removeAttribute("tabindex"),element.setAttribute("aria-selected",!0),this._toggleDropDown(element,!0),EventHandler.trigger(element,EVENT_SHOWN$1,{relatedTarget:relatedElem})};this._queueCallback(complete,element,element.classList.contains(CLASS_NAME_FADE$1))}_deactivate(element,relatedElem){if(!element)return;element.classList.remove(CLASS_NAME_ACTIVE),element.blur(),this._deactivate(SelectorEngine.getElementFromSelector(element));const complete=()=>{if(element.getAttribute("role")!=="tab"){element.classList.remove(CLASS_NAME_SHOW$1);return}element.setAttribute("aria-selected",!1),element.setAttribute("tabindex","-1"),this._toggleDropDown(element,!1),EventHandler.trigger(element,EVENT_HIDDEN$1,{relatedTarget:relatedElem})};this._queueCallback(complete,element,element.classList.contains(CLASS_NAME_FADE$1))}_keydown(event){if(![ARROW_LEFT_KEY,ARROW_RIGHT_KEY,ARROW_UP_KEY,ARROW_DOWN_KEY,HOME_KEY,END_KEY].includes(event.key))return;event.stopPropagation(),event.preventDefault();const children=this._getChildren().filter(element=>!isDisabled(element));let nextActiveElement;if([HOME_KEY,END_KEY].includes(event.key))nextActiveElement=children[event.key===HOME_KEY?0:children.length-1];else{const isNext=[ARROW_RIGHT_KEY,ARROW_DOWN_KEY].includes(event.key);nextActiveElement=getNextActiveElement(children,event.target,isNext,!0)}nextActiveElement&&(nextActiveElement.focus({preventScroll:!0}),Tab.getOrCreateInstance(nextActiveElement).show())}_getChildren(){return SelectorEngine.find(SELECTOR_INNER_ELEM,this._parent)}_getActiveElem(){return this._getChildren().find(child=>this._elemIsActive(child))||null}_setInitialAttributes(parent,children){this._setAttributeIfNotExists(parent,"role","tablist");for(const child of children)this._setInitialAttributesOnChild(child)}_setInitialAttributesOnChild(child){child=this._getInnerElement(child);const isActive=this._elemIsActive(child),outerElem=this._getOuterElement(child);child.setAttribute("aria-selected",isActive),outerElem!==child&&this._setAttributeIfNotExists(outerElem,"role","presentation"),isActive||child.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(child,"role","tab"),this._setInitialAttributesOnTargetPanel(child)}_setInitialAttributesOnTargetPanel(child){const target=SelectorEngine.getElementFromSelector(child);if(!target)return;this._setAttributeIfNotExists(target,"role","tabpanel"),child.id&&this._setAttributeIfNotExists(target,"aria-labelledby",`${child.id}`)}_toggleDropDown(element,open){const outerElem=this._getOuterElement(element);if(!outerElem.classList.contains(CLASS_DROPDOWN))return;const toggle=(selector,className)=>{const element=SelectorEngine.findOne(selector,outerElem);element&&element.classList.toggle(className,open)};toggle(SELECTOR_DROPDOWN_TOGGLE,CLASS_NAME_ACTIVE),toggle(SELECTOR_DROPDOWN_MENU,CLASS_NAME_SHOW$1),outerElem.setAttribute("aria-expanded",open)}_setAttributeIfNotExists(element,attribute,value){element.hasAttribute(attribute)||element.setAttribute(attribute,value)}_elemIsActive(elem){return elem.classList.contains(CLASS_NAME_ACTIVE)}_getInnerElement(elem){return elem.matches(SELECTOR_INNER_ELEM)?elem:SelectorEngine.findOne(SELECTOR_INNER_ELEM,elem)}_getOuterElement(elem){return elem.closest(SELECTOR_OUTER)||elem}static jQueryInterface(config){return this.each(function(){const data=Tab.getOrCreateInstance(this);if(typeof config!="string")return;if(data[config]===void 0||config.startsWith("_")||config==="constructor")throw new TypeError(`No method n
7amed "${config}"`);data[config]()})}}EventHandler.on(document,EVENT_CLICK_DATA_API,SELECTOR_DATA_TOGGLE,function(event){if(["A","AREA"].includes(this.tagName)&&event.preventDefault(),isDisabled(this))return;Tab.getOrCreateInstance(this).show()}),EventHandler.on(window,EVENT_LOAD_DATA_API,()=>{for(const element of SelectorEngine.find(SELECTOR_DATA_TOGGLE_ACTIVE))Tab.getOrCreateInstance(element)}),defineJQueryPlugin(Tab);const NAME="toast",DATA_KEY="bs.toast",EVENT_KEY=`.${DATA_KEY}`,EVENT_MOUSEOVER=`mouseover${EVENT_KEY}`,EVENT_MOUSEOUT=`mouseout${EVENT_KEY}`,EVENT_FOCUSIN=`focusin${EVENT_KEY}`,EVENT_FOCUSOUT=`focusout${EVENT_KEY}`,EVENT_HIDE=`hide${EVENT_KEY}`,EVENT_HIDDEN=`hidden${EVENT_KEY}`,EVENT_SHOW=`show${EVENT_KEY}`,EVENT_SHOWN=`shown${EVENT_KEY}`,CLASS_NAME_FADE="fade",CLASS_NAME_HIDE="hide",CLASS_NAME_SHOW="show",CLASS_NAME_SHOWING="showing",DefaultType={animation:"boolean",autohide:"boolean",delay:"number"},Default={animation:!0,autohide:!0,delay:5e3};class Toast extends BaseComponent{constructor(element,config){super(element,config),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return Default}static get DefaultType(){return DefaultType}static get NAME(){return NAME}show(){const showEvent=EventHandler.trigger(this._element,EVENT_SHOW);if(showEvent.defaultPrevented)return;this._clearTimeout(),this._config.animation&&this._element.classList.add(CLASS_NAME_FADE);const complete=()=>{this._element.classList.remove(CLASS_NAME_SHOWING),EventHandler.trigger(this._element,EVENT_SHOWN),this._maybeScheduleHide()};this._element.classList.remove(CLASS_NAME_HIDE),reflow(this._element),this._element.classList.add(CLASS_NAME_SHOW,CLASS_NAME_SHOWING),this._queueCallback(complete,this._element,this._config.animation)}hide(){if(!this.isShown())return;const hideEvent=EventHandler.trigger(this._element,EVENT_HIDE);if(hideEvent.defaultPrevented)return;const complete=()=>{this._element.classList.add(CLASS_NAME_HIDE),this._element.classList.remove(CLASS_NAME_SHOWING,CLASS_NAME_SHOW),EventHandler.trigger(this._element,EVENT_HIDDEN)};this._element.classList.add(CLASS_NAME_SHOWING),this._queueCallback(complete,this._element,this._config.animation)}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(CLASS_NAME_SHOW),super.dispose()}isShown(){return this._element.classList.contains(CLASS_NAME_SHOW)}_maybeScheduleHide(){if(!this._config.autohide)return;if(this._hasMouseInteraction||this._hasKeyboardInteraction)return;this._timeout=setTimeout(()=>{this.hide()},this._config.delay)}_onInteraction(event,isInteracting){switch(event.type){case"mouseover":case"mouseout":{this._hasMouseInteraction=isInteracting;break}case"focusin":case"focusout":{this._hasKeyboardInteraction=isInteracting;break}}if(isInteracting){this._clearTimeout();return}const nextElement=event.relatedTarget;if(this._element===nextElement||this._element.contains(nextElement))return;this._maybeScheduleHide()}_setListeners(){EventHandler.on(this._element,EVENT_MOUSEOVER,event=>this._onInteraction(event,!0)),EventHandler.on(this._element,EVENT_MOUSEOUT,event=>this._onInteraction(event,!1)),EventHandler.on(this._element,EVENT_FOCUSIN,event=>this._onInteraction(event,!0)),EventHandler.on(this._element,EVENT_FOCUSOUT,event=>this._onInteraction(event,!1))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(config){return this.each(function(){const data=Toast.getOrCreateInstance(this,config);if(typeof config=="string"){if(typeof data[config]=="undefined")throw new TypeError(`No method named "${config}"`);data[config](this)}})}}enableDismissTrigger(Toast),defineJQueryPlugin(Toast);const index_umd={Alert,Button,Carousel,Collapse,Dropdown,Modal,Offcanvas,Popover,ScrollSpy,Tab,Toast,Tooltip};return index_umd}),function _f(self){"use strict";try{module&&(self=module)}catch{}self._factory=_f;function u(a){return"undefined"==typeof a||a}function v(a){const b=Array(a);for(let c=0;c<a;c++)b[c]=x();return b}function x(){return Object.create(null)}function aa(a,b){return b.length-a.length}function C(a){return"string"==typeof a}function D(a){return"object"==typeof a}function E(a){return"function"==typeof a}function ba(a,b){var c=ca;if(a&&(b&&(a=F(a,b)),this.H&&(a=F(a,this.H)),this.J&&1<a.length&&(a=F(a,this.J)),c||""===c)){if(b=a.split(c),this.filter){a=this.filter,c=b.length;const d=[];for(let e=0,f=0;e<c;e++){const h=b[e];h&&!a[h]&&(d[f++]=h)}a=d}else a=b;return a}return a}const ca=/[\p{Z}\p{S}\p{P}\p{C}]+/u,da=/[\u0300-\u036f]/g;function ea(a,b){const c=Object.keys(a),d=c.length,e=[];let f="",h=0;for(let g=0,k,m;g<d;g++)k=c[g],(m=a[k])?(e[h++]=G(b?"(?!\\b)"+k+"(\\b|_)":k),e[h++]=m):f+=(f?"|":"")+k;return f&&(e[h++]=G(b?"(?!\\b)("+f+")(\\b|_)":"("+f+")"),e[h]=""),e}function F(a,b){for(let c=0,d=b.length;
7c<d&&(a=a.replace(b[c],b[c+1]),a);c+=2);return a}function G(a){return new RegExp(a,"g")}function fa(a){let b="",c="";for(let d=0,e=a.length,f;d<e;d++)(f=a[d])!==c&&(b+=c=f);return b}var t,Aa,Da,Ha,Ka,ia={encode:ha,F:!1,G:""};function ha(a){return ba.call(this,(""+a).toLowerCase(),!1)}const ja={},I={};function ka(a){J(a,"add"),J(a,"append"),J(a,"search"),J(a,"update"),J(a,"remove")}function J(a,b){a[b+"Async"]=function(){const c=this,d=arguments;var e=d[d.length-1];let f;return E(e)&&(f=e,delete d[d.length-1]),e=new Promise(function(h){setTimeout(function(){c.async=!0;const g=c[b].apply(c,d);c.async=!1,h(g)})}),f?(e.then(f),this):e}}function la(a,b,c,d){const e=a.length;let f=[],h,g,k=0;d&&(d=[]);for(let m=e-1;0<=m;m--){const n=a[m],w=n.length,q=x();let r=!h;for(let l=0;l<w;l++){const p=n[l],A=p.length;if(A)for(let B=0,z,y;B<A;B++)if(y=p[B],h){{if(h[y]){if(!m)if(c)c--;else if(f[k++]=y,k===b)return f;(m||d)&&(q[y]=1),r=!0}if(d&&(z=(g[y]||0)+1,g[y]=z,z<e)){const H=d[z-2]||(d[z-2]=[]);H[H.length]=y}}}else q[y]=1}if(d)h||(g=q);else if(!r)return[];h=q}if(d)for(let m=d.length-1,n,w;0<=m;m--){n=d[m],w=n.length;for(let q=0,r;q<w;q++)if(r=n[q],!h[r]){if(c)c--;else if(f[k++]=r,k===b)return f;h[r]=1}}return f}function ma(a,b){const c=x(),d=x(),e=[];for(let f=0;f<a.length;f++)c[a[f]]=1;for(let f=0,h;f<b.length;f++){h=b[f];for(let g=0,k;g<h.length;g++)k=h[g],c[k]&&!d[k]&&(d[k]=1,e[e.length]=k)}return e}function K(a){this.l=!0!==a&&a,this.cache=x(),this.h=[]}function na(a,b,c){D(a)&&(a=a.query);let d=this.cache.get(a);return d||(d=this.search(a,b,c),this.cache.set(a,d)),d}K.prototype.set=function(a,b){if(!this.cache[a]){var c=this.h.length;c===this.l?delete this.cache[this.h[c-1]]:c++;for(--c;0<c;c--)this.h[c]=this.h[c-1];this.h[0]=a}this.cache[a]=b},K.prototype.get=function(a){const b=this.cache[a];if(this.l&&b&&(a=this.h.indexOf(a))){const c=this.h[a-1];this.h[a-1]=this.h[a],this.h[a]=c}return b};
vendor: 1,151 bytes, line 7
7const pa={memory:{charset:"latin:extra",D:3,B:4,m:!1},performance:{D:3,B:3,s:!1,context:{depth:2,D:1}},match:{charset:"latin:extra",G:"reverse"},score:{charset:"latin:advanced",D:20,B:3,context:{depth:3,D:9}},default:{}};function qa(a,b,c,d,e,f,h,g){setTimeout(function(){const k=a(c?c+"."+d:d,JSON.stringify(h));k&&k.then?k.then(function(){b.export(a,b,c,e,f+1,g)}):b.export(a,b,c,e,f+1,g)})}function L(a,b){if(!(this instanceof L))return new L(a);if(a){C(a)?a=pa[a]:(c=a.preset)&&(a=Object.assign({},c[c],a)),c=a.charset;var c,d=a.lang;C(c)&&(-1===c.indexOf(":")&&(c+=":default"),c=I[c]),C(d)&&(d=ja[d])}else a={};let e,f,h=a.context||{};if(this.encode=a.encode||c&&c.encode||ha,this.register=b||x(),this.D=e=a.resolution||9,this.G=b=c&&c.G||a.tokenize||"strict",this.depth="strict"===b&&h.depth,this.l=u(h.bidirectional),this.s=f=u(a.optimize),this.m=u(a.fastupdate),this.B=a.minlength||1,this.C=a.boost,this.map=f?v(e):x(),this.A=e=h.resolution||1,this.h=f?v(e):x(),this.F=c&&c.F||a.rtl,this.H=(b=a.matcher||d&&d.H)&&ea(b,!1),this.J=(b=a.stemmer||d&&d.J)&&ea(b,!0),c=b=a.filter||d&&d.filter){c=b,d=x();for(let g=0,k=c.length;g<k;g++)d[c[g]]=1;c=d}
7this.filter=c,this.cache=(b=a.cache)&&new K(b)}t=L.prototype,t.append=function(a,b){return this.add(a,b,!0)},t.add=function(a,b,c,d){if(b&&(a||0===a)){if(!d&&!c&&this.register[a])return this.update(a,b);if(b=this.encode(b),d=b.length){const m=x(),n=x(),w=this.depth,q=this.D;for(let r=0;r<d;r++){let l=b[this.F?d-1-r:r];if(e=l.length,l&&e>=this.B&&(w||!n[l])){var e,g,k,f=M(q,d,r),h="";switch(this.G){case"full":if(2<e){for(f=0;f<e;f++)for(g=e;g>f;g--)g-f>=this.B&&(k=M(q,d,r,e,f),h=l.substring(f,g),N(this,n,h,k,a,c));break}case"reverse":if(1<e){for(g=e-1;0<g;g--)h=l[g]+h,h.length>=this.B&&N(this,n,h,M(q,d,r,e,g),a,c);h=""}case"forward":if(1<e){for(g=0;g<e;g++)h+=l[g],h.length>=this.B&&N(this,n,h,f,a,c);break}default:if(this.C&&(f=Math.min(f/this.C(b,l,r)|0,q-1)),N(this,n,l,f,a,c),w&&1<d&&r<d-1)for(e=x(),h=this.A,f=l,g=Math.min(w+1,d-r),e[f]=1,k=1;k<g;k++)if((l=b[this.F?d-1-r-k:r+k])&&l.length>=this.B&&!e[l]){e[l]=1;const p=this.l&&l>f;N(this,m,p?f:l,M(h+(d/2>h?0:1),d,r,g-1,k-1),a,c,p?l:f)}}}}this.m||(this.register[a]=1)}}return this};function M(a,b,c,d,e){return c&&1<a?b+(d||0)<=a?c+(e||0):(a-1)/(b+(d||0))*(c+(e||0))+1|0:0}function N(a,b,c,d,e,f,h){let g=h?a.h:a.map;(!b[c]||h&&!b[c][h])&&(a.s&&(g=g[d]),h?(b=b[c]||(b[c]=x()),b[h]=1,g=g[h]||(g[h]=x())):b[c]=1,g=g[c]||(g[c]=[]),a.s||(g=g[d]||(g[d]=[])),f&&g.includes(e)||(g[g.length]=e,a.m&&(a=a.register[e]||(a.register[e]=[]),a[a.length]=g)))}t.search=function(a,b,c){c||(!b&&D(a)?(c=a,a=c.query):D(b)&&(c=b));let d=[],e,f,h=0;if(c){a=c.query||a,b=c.limit,h=c.offset||0;var k,g=c.context;f=c.suggest}if(a&&(a=this.encode(""+a),e=a.length,1<e)){c=x(),k=[];for(let n=0,w=0,q;n<e;n++)if((q=a[n])&&q.length>=this.B&&!c[q])if(this.s||f||this.map[q])k[w++]=q,c[q]=1;else return d;a=k,e=a.length}if(!e)return d;b||(b=100),g=this.depth&&1<e&&!1!==g,c=0;let m;g?(m=a[0],c=1):1<e&&a.sort(aa);for(let n,w;c<e;c++){if(w=a[c],g?(n=ra(this,d,f,b,h,2===e,w,m),f&&!1===n&&d.length||(m=w)):n=ra(this,d,f,b,h,1===e,w),n)return n;if(f&&c===e-1){if(k=d.length,!k){if(g){g=0,c=-1;continue}return d}if(1===k)return sa(d[0],b,h)}}return la(d,b,h,f)};function ra(a,b,c,d,e,f,h,g){let k=[],m=g?a.h:a.map;if(a.s||(m=ta(m,h,g,a.l)),m){let n=0;const w=Math.min(m.length,g?a.A:a.D);for(let q=0,r=0,l,p;q<w;q++)if((l=m[q])&&(a.s&&(l=ta(l,h,g,a.l)),e&&l&&f&&(p=l.length,p<=e?(e-=p,l=null):(l=l.slice(e),e=0)),l&&(k[n++]=l,f&&(r+=l.length,r>=d))))break;if(n){if(f)return sa(k,d,0);b[b.length]=k;return}}return!c&&k}function sa(a,b,c){return a=1===a.length?a[0]:[].concat.apply([],a),c||a.length>b?a.slice(c,c+b):a}function ta(a,b,c,d){return c?(d=d&&b>c,a=(a=a[d?b:c])&&a[d?c:b]):a=a[b],a}t.contain=function(a){return!!this.register[a]},t.update=function(a,b){return this.remove(a).add(a,b)},t.remove=function(a,b){const c=this.register[a];if(c){if(this.m)for(let d=0,e;d<c.length;d++)e=c[d],e.splice(e.indexOf(a),1);else O(this.map,a,this.D,this.s),this.depth&&O(this.h,a,this.A,this.s);if(b||delete this.register[a],this.cache){b=this.cache;for(let d=0,e,f;d<b.h.length;d++)f=b.h[d],e=b.cache[f],e.includes(a)&&(b.h.splice(d--,1),delete b.cache[f])}}return this};function O(a,b,c,d,e){let f=0;if(a.constructor===Array)if(e)b=a.indexOf(b),-1!==b?1<a.length&&(a.splice(b,1),f++):f++;else{e=Math.min(a.length,c);for(let h=0,g;h<e;h++)(g=a[h])&&(f=O(g,b,c,d,e),d||f||delete a[h])}else for(let h in a)(f=O(a[h],b,c,d,e))||delete a[h];return f}t.searchCache=na,t.export=function(a,b,c,d,e,f){let h=!0;"undefined"==typeof f&&(h=new Promise(m=>{f=m}));let g,k;switch(e||(e=0)){case 0:if(g="reg",this.m){k=x();for(let m in this.register)k[m]=1}else k=this.register;break;case 1:g="cfg",k={doc:0,opt:this.s?1:0};break;case 2:g="map",k=this.map;break;case 3:g="ctx",k=this.h;break;default:"undefined"==typeof c&&f&&f();return}return qa(a,b||this,c,g,d,e,k,f),h},t.import=function(a,b){if(b)switch(C(b)&&(b=JSON.parse(b)),a){case"cfg":this.s=!!b.opt;break;case"reg":this.m=!1,this.register=b;break;case"map":this.map=b;break;case"ctx":this.h=b}},ka(L.prototype);function ua(a){a=a.data;var d,b=self._index;const c=a.args;switch(d=a.task,d){case"init":d=a.options||{},a=a.factory,b=d.encode,d.cache=!1,b&&0===b.indexOf("function")&&(d.encode=Function("return "+b)()),a?(Function("return "+a)()(self),self._index=new self.FlexSearch.Index(d),delete self.FlexSearch):self._index=new L(d);break;default:a=a.id,b=b[d].apply(b,c),postMessage("search"===d?{id:a,msg:b}:{id:a})}}let va=0;function P(a){if(!(this instanceof P))return new P(a);var b;a?E(b=a.encode)&&(a.encode=b.toString()):a={},(b=(self||window)._factory)&&(b=b.toString());const c="undefined"==typeof window&&self.exports,d=this;this.o=wa(b,c,a.worker),this.h=x(),this.o&&(c?this.o.on("message",function(e){d.h[e.id](e.msg),delete d.h[e.id]}
7):this.o.onmessage=function(e){e=e.data,d.h[e.id](e.msg),delete d.h[e.id]},this.o.postMessage({task:"init",factory:b,options:a}))}Q("add"),Q("append"),Q("search"),Q("update"),Q("remove");function Q(a){P.prototype[a]=P.prototype[a+"Async"]=function(){const b=this,c=[].slice.call(arguments);var d=c[c.length-1];let e;return E(d)&&(e=d,c.splice(c.length-1,1)),d=new Promise(function(f){setTimeout(function(){b.h[++va]=f,b.o.postMessage({task:a,id:va,args:c})})}),e?(d.then(e),this):d}}function wa(a,b,c){let d;try{d=b?new(require("worker_threads").Worker)(__dirname+"/node/node.js"):a?new Worker(URL.createObjectURL(new Blob(["onmessage="+ua.toString()],{type:"text/javascript"}))):new Worker(C(c)?c:"worker/worker.js",{type:"module"})}catch{}return d}function S(a){if(!(this instanceof S))return new S(a);var c,b=a.document||a.doc||a;this.K=[],this.h=[],this.A=[],this.register=x(),this.key=(c=b.key||b.id)&&T(c,this.A)||"id",this.m=u(a.fastupdate),this.C=(c=b.store)&&!0!==c&&[],this.store=c&&x(),this.I=(c=b.tag)&&T(c,this.A),this.l=c&&x(),this.cache=(c=a.cache)&&new
vendor: 4,711 bytes, line 7
7K(c),a.cache=!1,this.o=a.worker,this.async=!1,c=x();let d=b.index||b.field||b;C(d)&&(d=[d]);for(let e=0,f,h;e<d.length;e++)f=d[e],C(f)||(h=f,f=f.field),h=D(h)?Object.assign({},a,h):a,this.o&&(c[f]=new P(h),c[f].o||(this.o=!1)),this.o||(c[f]=new L(h,this.register)),this.K[e]=T(f,this.A),this.h[e]=f;if(this.C)for(a=b.store,C(a)&&(a=[a]),b=0;b<a.length;b++)this.C[b]=T(a[b],this.A);this.index=c}function T(a,b){const c=a.split(":");let d=0;for(let e=0;e<c.length;e++)a=c[e],0<=a.indexOf("[]")&&(a=a.substring(0,a.length-2))&&(b[d]=!0),a&&(c[d++]=a);return d<c.length&&(c.length=d),1<d?c:c[0]}function U(a,b){if(C(b))a=a[b];else for(let c=0;a&&c<b.length;c++)a=a[b[c]];return a}function V(a,b,c,d,e){if(a=a[e],d===c.length-1)b[e]=a;else if(a)if(a.constructor===Array)for(b=b[e]=Array(a.length),e=0;e<a.length;e++)V(a,b,c,d,e);else b=b[e]||(b[e]=x()),e=c[++d],V(a,b,c,d,e)}function X(a,b,c,d,e,f,h,g){if(a=a[h])if(d===b.length-1){if(a.constructor===Array){if(c[d]){for(b=0;b<a.length;b++)e.add(f,a[b],!0,!0);return}a=a.join(" ")}e.add(f,a,g,!0)}else if(a.constructor===Array)for(h=0;h<a.length;h++)X(a,b,c,d,e,f,h,g);else h=b[++d],X(a,b,c,d,e,f,h,g)}t=S.prototype,t.add=function(a,b,c){if(D(a)&&(b=a,a=U(b,this.key)),b&&(a||0===a)){if(!c&&this.register[a])return this.update(a,b);for(let d=0,e,f;d<this.h.length;d++)f=this.h[d],e=this.K[d],C(e)&&(e=[e]),X(b,e,this.A,0,this.index[f],a,e[0],c);if(this.I){let d=U(b,this.I),e=x();C(d)&&(d=[d]);for(let f=0,h,g;f<d.length;f++)if(h=d[f],!e[h]&&(e[h]=1,g=this.l[h]||(this.l[h]=[]),!c||!g.includes(a))&&(g[g.length]=a,this.m)){const k=this.register[a]||(this.register[a]=[]);k[k.length]=g}}if(this.store&&(!c||!this.store[a])){let d;if(this.C){d=x();for(let e=0,f;e<this.C.length;e++)f=this.C[e],C(f)?d[f]=b[f]:V(b,d,f,0,f[0])}this.store[a]=d||b}}return this},t.append=function(a,b){return this.add(a,b,!0)},t.update=function(a,b){return this.remove(a).add(a,b)},t.remove=function(a){if(D(a)&&(a=U(a,this.key)),this.register[a]){for(var b=0;b<this.h.length&&(this.index[this.h[b]].remove(a,!this.o),!this.m);b++);if(this.I&&!this.m)for(let c in this.l){b=this.l[c];const d=b.indexOf(a);-1!==d&&(1<b.length?b.splice(d,1):delete this.l[c])}this.store&&delete this.store[a],delete this.register[a]}return this},t.search=function(a,b,c,d){c||(!b&&D(a)?(c=a,a=""):D(b)&&(c=b,b=0));let e=[],f=[],h,g,k,m,n,w,q=0;if(c)if(c.constructor===Array)k=c,c=null;else{if(a=c.query||a,k=(h=c.pluck)||c.index||c.field,m=c.tag,g=this.store&&c.enrich,n="and"===c.bool,b=c.limit||b||100,w=c.offset||0,m&&(C(m)&&(m=[m]),!a)){for(let l=0,p;l<m.length;l++)(p=xa.call(this,m[l],b,w,g))&&(e[e.length]=p,q++);return q?e:[]}C(k)&&(k=[k])}k||(k=this.h),n=n&&(1<k.length||m&&1<m.length);const r=!d&&(this.o||this.async)&&[];for(let l=0,p,A,B;l<k.length;l++){let z;if(A=k[l],C(A)||(z=A,A=z.field,a=z.query||a,b=z.limit||b,g=z.enrich||g),r)r[l]=this.index[A].searchAsync(a,b,z||c);else{if(d?p=d[l]:p=this.index[A].search(a,b,z||c),B=p&&p.length,m&&B){const y=[];let H=0;n&&(y[0]=[p]);for(let W=0,oa,R;W<m.length;W++)(oa=m[W],B=(R=this.l[oa])&&R.length)&&(H++,y[y.length]=n?[R]:R);H&&(p=n?la(y,b||100,w||0):ma(p,y),B=p.length)}if(B)f[q]=A,e[q++]=p;else if(n)return[]}}if(r){const l=this;return new Promise(function(p){Promise.all(r).then(function(A){p(l.search(a,b,c,A))})})}if(!q)return[];if(h&&(!g||!this.store))return e[0];for(let l=0,p;l<f.length;l++){if(p=e[l],p.length&&g&&(p=ya.call(this,p)),h)return p;e[l]={field:f[l],result:p}}return e};function xa(a,b,c,d){let e=this.l[a],f=e&&e.length-c;if(f&&0<f)return(f>b||c)&&(e=e.slice(c,c+b)),d&&(e=ya.call(this,e)),{tag:a,result:e}}function ya(a){const b=Array(a.length);for(let c=0,d;c<a.length;c++)d=a[c],b[c]={id:d,doc:this.store[d]};return b}t.contain=function(a){return!!this.register[a]},t.get=function(a){return this.store[a]},t.set=function(a,b){return this.store[a]=b,this},t.searchCache=na,t.export=function(a,b,c,d,e,f){let h;if("undefined"==typeof f&&(h=new Promise(g=>{f=g})),e||(e=0),d||(d=0),d<this.h.length){const g=this.h[d],k=this.index[g];b=this,setTimeout(function(){k.export(a,b,e?g:"",d,e++,f)||(d++,e=1,b.export(a,b,g,d,e,f))})}else{let g,k;switch(e){case 1:g="tag",k=this.l,c=null;break;case 2:g="store",k=this.store,c=null;break;default:f();return}qa(a,this,c,g,d,e,k,f)}return h},t.import=function(a,b){if(b)switch(C(b)&&(b=JSON.parse(b)),a){case"tag":this.l=b;break;case"reg":this.m=!1,this.register=b;for(let d=0,e;d<this.h.length;d++)e=this.index[this.h[d]],e.register=b,e.m=!1;break;case"store":this.store=b;break;default:a=a.split(".");const c=a[0];a=a[1],c&&a&&this.index[c].import(a,b)}},ka(S.prototype),Aa={encode:za,F:!1,G:""};const Ba=[G("[à áâãäå]"),"a",G("[èéêë]"),"e",G("[ìÃîï]"),"i",G("[òóôõö
7Å]"),"o",G("[ùúûüű]"),"u",G("[ýŷÿ]"),"y",G("ñ"),"n",G("[çc]"),"k",G("Ã"),"s",G(" & ")," and "];function za(a){var b=a=""+a;return b.normalize&&(b=b.normalize("NFD").replace(da,"")),ba.call(this,b.toLowerCase(),!a.normalize&&Ba)}Da={encode:Ca,F:!1,G:"strict"};const Ea=/[^a-z0-9]+/,Fa={b:"p",v:"f",w:"f",z:"s",x:"s","Ã":"s",d:"t",n:"m",c:"k",g:"k",j:"k",q:"k",i:"e",y:"e",u:"o"};function Ca(a){a=za.call(this,a).join(" ");const b=[];if(a){const c=a.split(Ea),d=c.length;for(let e=0,f,h=0;e<d;e++)if((a=c[e])&&(!this.filter||!this.filter[a])){f=a[0];let g=Fa[f]||f,k=g;for(let m=1;m<a.length;m++){f=a[m];const n=Fa[f]||f;n&&n!==k&&(g+=n,k=n)}b[h++]=g}}return b}Ha={encode:Ga,F:!1,G:""};const Ia=[G("ae"),"a",G("oe"),"o",G("sh"),"s",G("th"),"t",G("ph"),"f",G("pf"),"f",G("(?![aeo])h(?![aeo])"),"",G("(?!^[aeo])h(?!^[aeo])"),""];function Ga(a,b){return a&&(a=Ca.call(this,a).join(" "),2<a.length&&(a=F(a,Ia)),b||(1<a.length&&(a=fa(a)),a&&(a=a.split(" ")))),a||[]}Ka={encode:Ja,F:!1,G:""};const La=G("(?!\\b)[aeo]");function Ja(a){return a&&(a=Ga.call(this,a,!0),1<a.length&&(a=a.replace(La,"")),1<a.length&&(a=fa(a)),a&&(a=a.split(" "))),a||[]}I["latin:default"]=ia,I["latin:simple"]=Aa,I["latin:balance"]=Da,I["latin:advanced"]=Ha,I["latin:extra"]=Ka;const Y={Index:L,Document:S,Worker:P,registerCharset:function(a,b){I[a]=b},registerLanguage:function(a,b){ja[a]=b}};let Z;(Z=self.define)&&Z.amd?Z([],function(){return Y}):self.exports?self.exports=Y:self.FlexSearch=Y}(this);const search=document.querySelector(".search-input"),suggestions=document.querySelector(".search-suggestions"),background=document.querySelector(".search-background");var index=new FlexSearch.Document({tokenize:"forward",cache:100,document:{id:"id",tag:"tag",store:["href","title","description"],index:["title","description","content"]}});function initIndex(){index.add({id:0,tag:"cs",href:"/blog/100-000-000/",title:"100 000 000",description:"Tak jsem si vÅ¡iml, že se celková návÅ¡tÄvost TOPlistu minulý týden pÅehoupla pÅes metu 100 miliónů. DÃky vÅ¡em.",content:`Tak jsem si vÅ¡iml, že se celková návÅ¡tÄvost TOPlistu minulý týden pÅehoupla pÅes metu 100 miliónů. DÃky vÅ¡em. 8`}).add({id:1,tag:"cs",href:"/blog/bezpecnostni-kod/",title:"BezpeÄnostnà kód",description:"Pokud se stane, že je kód pro vaÅ¡i stránku umÃstÄn jinde, je nejsnažšà kontaktovat majitele této stránky, aby omyl napravil. Pokud to nevede k cÃli, je nynà možné náhradnà ÅeÅ¡enÃ.",content:`Pokud se stane, že je kód pro vaÅ¡i stránku umÃstÄn jinde, je nejsnažšà kontaktovat majitele této stránky, aby omyl napravil. Pokud to nevede k cÃli, je nynà možné náhradnà ÅeÅ¡enÃ. V editaci je možné nastavit BezpeÄnostnà kód, což je ÄÃslo v rozsahu 1-99. Pokud jej nastavÃte (tj. na hodnotu vyššà než 0) a ke kódu na svých stránkách pÅidáte parametr seed s jeho hodnotou, budou zapoÄÃtávány pouze tyto návÅ¡tÄvy. Hodnotu můžete libovolnÄ mÄnit. Funkci zruÅ¡Ãte nastavenÃm bezp. kódu na nulu. 9`}).add({id:2,tag:"cs",href:"/blog/button-80x15/",title:"button 80Ã15",description:"",content:` 10`}).add({id:3,tag:"cs",href:"/blog/denni-statistiky-pres-rss/",title:"Dennà statistiky pÅes RSS",description:"Pro ty, kteÅà nechtÄjà Äekat celý týden na email se souhrnem návÅ¡tÄvnosti, jsem pÅipravil RSS feed. Link na nÄj je v podrobných statistikách.",content:`Pro ty, kteÅà nechtÄjà Äekat celý týden na email se souhrnem návÅ¡tÄvnosti, jsem pÅipravil RSS feed. Link na nÄj je v podrobných statistikách. Jednak v menu vpravo nebo je uveden i v headru stránky, takže jej nabÃdne každý inteligentnÄjšà prohlÞeÄ. ObecnÄ má adresu http://www.toplist.cz/stat/?id=ID_stránky&a=rss. Obsahuje poÄet návÅ¡tÄv a zhlédnutà za konkrétnà den a poÅadà celkové a v kategorii. 11`}).add({id:4,tag:"cs",href:"/napoveda/faq/",title:"FAQ - Äasto kladené otázky",description:"Co je tohle za stránku? Na této stránce se budeme snažit odpovÃdat na nÄkteré Äasté dotazy, které nám chodÃ.",content:` Co je tohle za stránku? Na této stránce se budeme snažit odpovÃdat na nÄkteré Äasté dotazy, které nám chodÃ. OdpovÄdi
11nejsou nijak uspoÅádány a budou postupnÄ pÅibývat, jak se budou objevovat nové otázky. Ty můžete posÃlat na adresu [email protected]. 12Je služba placená nebo zdarma? Služba je zdarma. Je možné pÅikoupit rozÅ¡ÃÅenou službu TOPlist Profi. 13Co je to TOPlist ID? TOPlist ID je ÄÃslo, které rozliÅ¡uje jednotlivé registrované webové stránky. Je proto nedÃlnou souÄástà mÄÅÃcÃho kódu, sloužà k pÅÃstupu k nastavenà informacà o stránce a do statistik. ZÃskáte jej okamžitÄ po registraci. PozdÄji je možné jej najÃt pÅi vyhledánà vašà stránky v podrobných informacÃch o stránce. 14Jaký je rozdÃl mezi návÅ¡tÄvou a zhlédnutÃm? Hodnoty, které jsou mÄÅeny, a způsob, jakým jsou zaznamenávány, je popsané v metodice mÄÅenÃ. 15Co je to âreloadâ? âReloadâ znamená, že bylo pÅistoupeno podruhé za sebou ze stejného IP a nenà poÄÃtán do celkového poÄtu pÅÃstupů (aby si nÄkdo jednoduÅ¡e ânenaklikalâ vÄtšà návÅ¡tevnost). Tj. nevadÃ, že použÃváte tlaÄÃtko âobnovitâ, tento pokus by mÄl být ignorován. 16Dajà se zjistit podrobné statistiky i za delšà obdobÃ? Ano. V rámci rozÅ¡ÃÅené služby TOPlist Profi lze sledovat podrobné statistiky až rok zpÄt. 17Jak je to s reklamou na TOPlistu? Hlavnà reklamnà prostory jsou dva. Na hlavnà stránce (dvÄ pozice) a na stránce s výpisem kategorià (také dvÄ pozice). Na hlavnà stránce je umÃstÄnà exkluzivnà (tzn. že je reklama zobrazena každému návÅ¡tevnÃkovi). Na stránkách kategorià rotuje vÃce reklam, ale zase je zde dosahován delšà Äas zobrazenà (view-time), takže je vÃce Äasu napÅ. pro zobrazenà animovaného banneru apod. O dalšà informace a ceny si piÅ¡te na adresu [email protected]. 18Jak zjistÃm své ID? ID zÃskáte až po registraci. ZjistÃte ho tak, že nejdÅÃve najdete VaÅ¡i stránku (napÅ. pomocà funkce Hledat ) a poté kliknete na podrobné statistiky (ikonka grafu vpravo) a v tabulce v hornà Äásti stránky je uvedeno ID. Pokud je VaÅ¡e stránka novÄ zaregistrována (ménÄ než 1 den), je také v sekci Novinky. 19Co se vlastnÄ v žebÅÃÄku zobrazuje? PÅi kliknutà na kategorii se zobrazà seznam, který vypadá pÅibližnÄ takto: 20ŽebÅÃÄek kategorie Pozice serveru v dané kategorii. PrvnÃch 10 serverů má poÅadà oznaÄené ikonkou, ostatnà pÃsmem. PoÄÃtá se podle průmÄrné návÅ¡tÄvnosti za poslednÃch 7 dnÃ. Å ipka znázorÅuje tendenci návÅ¡tÄvnosti (zelená â pÅi růstu nad 10%, modrá â stagnace, Äervená â pokles o vÃc než 10%) ÄÃselné vyjádÅenà zmÄny návÅ¡tÄvnosti. VypoÄÃtává se jako pomÄr mezi průmÄrnou návÅ¡tÄvnostà a odhadem dneÅ¡nà návÅ¡tÄvnosti. Název serveru. Pokud na nÄm necháte myÅ¡ chvÃli stát, může se â pokud je vyplnÄn â zobrazit podrobnÄjšà popis. PrůmÄrná návÅ¡tÄvnost. PoÄÃtá se za poslednÃch 7 dnÃ. PoÄet návÅ¡tÄv od registrace serveru. NávÅ¡tÄvy dnes â hlavnà mÄÅený údaj. NávÅ¡tÄva je jeden uživatel za 30 minut. Tj. pokud
20se na stránku vrátà po této dobÄ, je znovu zapoÄÃtán. Jinak se zaznamená jen jako âreloadâ. Pageview â poÄet zhlédnutà stránky. Jedná se vlastnÄ o souÄet ânávÅ¡tÄvâ plus âreloadůâ bez rozliÅ¡enÃ. Datum registrace serveru. Jak dlouho je server registrován. PÅedpovÄÄ dneÅ¡nà návÅ¡tÄvnosti. Z důvodu jednoduchosti (tj. rychlosti) výpoÄtu se jedná o lineárnà regresi. Odkaz na podrobnÄjšà statistiky jednotlivých serverů. Pokud na nÄm necháte myÅ¡ chvÃli stát, zobrazà se ID stránky. Jak má vypadat odkaz, když chci zjistit odkud pÅiÅ¡li návÅ¡tÄvnÃci a chci zobrazovat poÄÃtadlo zaÄÃnajÃcà od 1723? Jedná se vlastnÄ o využità témÄÅ vÅ¡ech parametrů: 21<a href="https://www.toplist.cz/" target="_top"> <script language="JavaScript"> </script> <noscript> <img SRC="https://toplist.cz/count.asp?logo=counter&start=1723&ID=vaÅ¡eID" border="0" alt="TOPlist" width="88" height="31"> </noscript> </a>POZOR: za Äárkou po top.document.referrer je apostrof a uvozovka. Ne tÅi apostrofy !!! Ale lepšà bude použÃt formuláŠpro mÄÅÃcà kód. 22Zaregistroval jsem stránku a pÅesto se u nà v žebÅÃÄku stále ukazuje 0 pÅÃstupů. Samotná registrace nestaÄà pro mÄÅenÃ. Je potÅeba nÄjakým způsobem návÅ¡tÄvu zaznamenat. A k tomu sloužà mÄÅÃcà kód, který musà být na stránce umÃstÄn. Nejrychleji jej zÃskáte vygenerovánÃm v tomto formuláÅi. 23Má se mÄÅÃcà kód umÃstit na každou stránku nebo staÄà jen na úvodnÃ? Kód musà být umÃstÄn na vÅ¡ech stránkách, jejichž návÅ¡tÄvnost má být zapoÄÃtávána. Dá se pÅedpokládat, že se vyskytnou návÅ¡tÄvnÃci, kteÅà úvodnà stránku âvynechajÃâ (napÅ. pÅijdou pÅÃmo z vyhledávaÄe na podstránku) a ti by nebyli zaznamenáni. 24ProÄ nenà v Infopanelu týdennà návÅ¡tÄvnost poÄÃtána od pondÄlÃ? To by znamenalo, že by v pondÄlà byla návÅ¡tÄvnost jen za 1 den (pondÄlÃ), v úterý za dva atd. Proto je poÄÃtá tzv. plovoucà týden, tj. poslednÃch 7 dnÃ. 25Nechodà mi týdennà mail s návÅ¡tÄvnostà Zkontrolujte, zda nenà špatnÄ nastavený filtr na SPAM a email nekonÄà v koÅ¡i. Také pozor na to, že se návÅ¡tÄvnost posÃlá z jiné emailové adresy [email protected] než ostatnà maily (s registraci, editaci, heslu), takže může být zahazovaná pouze ta. Každý týden je rozesláno nÄkolik stovek tisÃc tÄchto emailů, nÄkteré mailové servery (zejména freemaily) mohou chybnÄ považovat tento provoz za spam, je dobré se proto zeptat i administrátorů tÄchto serverů (ale vÄtÅ¡ina velkých Äeských freemailů o tom và a má filtry patÅiÄnÄ nastavené). Adresu [email protected] použÃváme jen na posÃlánà reportů a nic jiného. Když ji ve vaÅ¡em emailu nastavÃte jako důvÄryhodnou nebo bez k
25ontroly na spam, tak budete mÃt jistotu, že vám report vždy pÅijde. 26Druhá možnost je, že se z uvedené adresy vracà email (hlášenà o plné schránce, automatické odpovÄdi apod.). Pokud takové emaily dostaneme tÅikrát, posÃlánà se automaticky ukonÄÃ. Po opravenà pÅÃÄiny staÄà editovat záznam na TOPlistu a posÃlánà se znovu zahájÃ. 27V každém pÅÃpadÄ můžete celou historii návÅ¡tÄvnosti od registrace v TOPlistu nalézt v podrobných statistikách stránky. 28Jak zruÅ¡Ãm registraci? NejdÅÃv je potÅeba odstranit mÄÅÃcà kód ze stránek. Poté lze stránku odstranit â odkaz Smazat v pravém menu v podrobných statistikách. Pokud byl jeÅ¡tÄ nalezen mÄÅÃcà kód (tj. v uplynulých dvou dnech doÅ¡lo k zaznamenánà návÅ¡tÄvy) je mÃsto smazanà vypsán seznam tÄchto stránek pro kontrolu, zda se na nich mÄÅÃcà kód skuteÄnÄ nenalézá. 29V mÄÅených doménách se ukazuje nÄjaká cizÃ, co mám dÄlat? âMÄÅené doményâ ukazujà adresy, na kterých je umÃstÄn mÄÅÃcà kód a které majà alespoÅ 10% podÃl na celkové návÅ¡tÄvnosti. Data majà historii 2 dny, takže se každá zmÄna projevà až po jejich uplynutÃ. Pokud se tam objevà cizà doména, bude na ni patrnÄ umÃstÄn kód s vaÅ¡Ãm ID. Konkrétnà stránky lze dohledat ve statistice Vstupnà stránky. Pokud nebude možná domluva s provozovatelem tÄchto stránek, lze využÃt BezpeÄnostnà kód k zamezenà poÄÃtánà z cizÃch stránek. 30Po pÅevodu stránek na SSL(HTTPS) pÅestalo mÄÅenà fungovat V mÄÅÃcÃm kódu staÄà nahradit znaky http:// za https://. PÅÃpadnÄ znovu vygenerujte mÄÅÃcà kód. Nynà se vytvoÅà verze, která už obsahuje tuto úpravu. 31PÅesunuli jsme stránky na jinou adresu. Co máme dÄlat? NemusÃte dÄlat nic ð Pokud se jedná jen o zmÄnu adresy a stránky stále obsahujà stejný mÄÅÃcà kód (se stejným ID), bude mÄÅenà pokraÄovat i na nové adrese. Můžete upravit adresu v editaci záznamu na TOPlistu, aby odkaz smÄÅoval na správnou adresu, ale na samotné mÄÅenà to nemá vliv. 32SplÅuje TOPlist podmÃnky GDPR? Ano. Informace o zÃskavaných osobnÃch údajÃch, důvody a lhůty pro jejich zpracovánà naleznete na stránce Osobnà údaje. 33ProÄ je ve statistikách mÃsto adresy pomlÄka? PomlÄka mÃsto adresy znamená, že prohlÞeÄ návÅ¡tÄvnÃka nepÅedal informaci, jakou stránku si prohlÞÃ. To se dÄje když je stránka zabezpeÄená pomocà TLS (https), ale je na nà jeÅ¡tÄ starý mÄÅÃcà kód, který mÄÅil pÅes http. Jednoduché ÅeÅ¡enà je prostÄ v mÄÅÃcÃm kódu zmÄnit http:// za https:// (takže tam bude https://toplist.cz atd.). Nebo lze vygenerovat a použÃt nový mÄÅÃcà kód, který už obsahuje https rovnou. Na adrese https://www.toplist.cz/code/ 34`}).add({id:5,tag:"cs",href:"/blog/hledane-fraze/",title:"Hledané fráze ve vyhledávaÄÃch",description:"PÅidali jsme do statistik novou sekci âvyhledávaÄe - hledaná slovaâ. Tato tabulka zobrazuje nejÄastÄji hledané fráze, které vedly k návÅ¡tÄvám vaÅ¡ich stránek z vyhledávaÄů.",content:`PÅidali jsme do statistik novou sekci âvyhledávaÄe - hledaná slovaâ. Tato tabulka zobrazuje nejÄastÄji hledané fráze, které vedly k návÅ¡tÄvám vaÅ¡ich stránek z vyhledávaÄů. 35Aktualizace (26. 5.): PÅidali jsme také statistiku cest po serveru âcestyâ 36`}).add({id:6,tag:"cs",href:"/blog/internet-explorer-9-0/",title:"Internet Explorer 9.0",description:"Od zaÄátku týdne je ve statistikách prohlÞeÄů rozliÅ¡ována i nová verze IE â 9.0. ZatÃm je jejà podÃl v Åádu desetin procenta, ale dá se pÅedpokládat růst ð",content:`Od zaÄátku týdne je ve statistikách prohlÞeÄů rozliÅ¡ována i nová verze IE â 9.0. ZatÃm je jejà podÃl v Åádu desetin procenta, ale dá se pÅedpokládat růst ð 37`}).add({id:7,tag:"cs",href:"/blog/ios-13-1-je-uz-v-cesku-nejpouzivanejsi/",title:"iOS 13.1 je už v Äesku nejpoužÃvanÄjÅ¡Ã",description:"Nové globálnà statistiky TOPlistu za minulý týden (7. â 13. ÅÃjen 2019) ukazujÃ, jak rychle probÃhá aktualizace nové verze iOS. Za tÅi týdny od svého uvedenà (24.",content:`Nové globálnà statistiky TOPlistu za minulý týden (7. â 13. ÅÃjen 2019) ukazujÃ, jak rychle probÃhá aktualizace nové verze iOS. Za tÅi týdny od svého uvedenà (24. záÅÃ) se stává nejpoužÃvanÄjšà verzà mobilnÃho operaÄnÃho systému firmy Apple (42,48%). 38Ve statistikách lze nálezt i dalšà informace. TÅeba podÃly prohlÞeÄů a to i rozdÄlenÄ pro mobily a stolnà poÄÃtaÄe. Nebo verze Windows, kde je stále vidÄt vysoký podÃl verze 7 a dokonce se ukazujà i XP. 39Statistiky se poÄÃtajà z návÅ¡tÄv z Äeska (urÄené pomocà GeoIP), pÅÃpadnÄ ze Slovenska (tam zatÃm vede iOS 12.4). Zobrazuje se prvnÃch 10 záznamů, pokud je jednotlivý podÃl vÄtšà než 1%. Jinak
39se zahrne do skupiny âostatnÃâ. Jelikož se jedná o poÄÃtánà návÅ¡tÄvnosti, zahrnujà výsledky i aktivitu uživatelů. Můžou se proto liÅ¡it od tržnÃho podÃlu v pÅÃpadÄ, že tÅeba uživatelé urÄitého prohlÞeÄe ménÄ surfujà než ostatnà apod. 40`}).add({id:8,tag:"cs",href:"/blog/jak-jsme-slavili-silvestr/",title:"Jak jsme slavili Silvestr",description:"Jak je z obrázku provozu na TOPlistu vidÄt, zaÄali se lidé na oslavu pÅipravovat už od odpoledne. Chybà odpolednà špiÄka, která by rostla od druhé hodiny.",content:`Jak je z obrázku provozu na TOPlistu vidÄt, zaÄali se lidé na oslavu pÅipravovat už od odpoledne. Chybà odpolednà špiÄka, která by rostla od druhé hodiny. Samotné slavenà zaÄalo od sedmi veÄer a, pochopitelnÄ, vyvrcholilo o půlnoci. PokraÄovalo do jedné hodiny, kdy se provoz vrátil do bÄžného stavu. A, jak vidÃte, 1. leden je už zase den jako každý jiný. 41Za TOPlist vám v pÅejeme vÅ¡echno nejlepšà do nového roku, hodnÄ zdravÃ, úspÄchů a vysokou návÅ¡tÄvnost ð 42`}).add({id:9,tag:"cs",href:"/napoveda/kod-na-stranku/jak-si-nastavit-merici-kod-toplistu-do-google-tag-manageru/",title:"Jak si nastavit mÄÅÃcà kód TOPlistu do Google Tag Manageru",description:"V pÅÃpadÄ, že využÃváte Google Tag Manager, můžete jednoduÅ¡e vložit mÄÅÃcà kód (javascript) TOPlistu do Google Tag Manageru, aniž byste museli zasahovat pÅÃmo do kódu Vašà stránky.",content:`V pÅÃpadÄ, že využÃváte Google Tag Manager, můžete jednoduÅ¡e vložit mÄÅÃcà kód (javascript) TOPlistu do Google Tag Manageru, aniž byste museli zasahovat pÅÃmo do kódu Vašà stránky. #Jak na to 43Po pÅihlášenà do Google Tag Manageru v Äásti âWorkspaceâ proveÄte následujÃcÃ: 44kliknÄte v levém menu na položku âTagâ vytvoÅte nový âTagâ kliknutÃm na tlaÄÃtko âNewâ v pravé hornà Äásti vedle ikonky lupy pojmenujte si nový âTagâ kliknutÃm do textového pole âUntitled Tagâ a vepsánÃm názvu kliknÄte do Äásti âTag Configurationâ z nabÃdky v pravé Äásti stránky vyberte âCustom HTML Tagâ do pole pro vloženà html vložte javascript kód TOPlistu, který naleznete na https://www.toplist.cz/code/ a zÃskáte ho zatrženÃm varianty âNicâneviditelný bodâ zaÅ¡krtnÄte âSupport document.writeâ kliknÄte do Äásti âTriggeringâ v dolnà Äásti stránky pod Äástà âTag Configurationâ z nabÃdky v pravé Äásti stránky vyberte âAll Pagesâ kliknutÃm na tlaÄÃtko âSaveâ v pravé hornà Äásti stránky, vÅ¡e uložÃte nezapomeÅte zmÄny vypublikovat kliknutÃm na tlaÄÃtko âSubmitâ v pravé hornà Äásti stránky `}).add({id:10,tag:"cs",href:"/napoveda/jak-zacit/",title:"Jak zaÄÃt?",description:`K mÄÅenà návÅ¡tÄvnosti staÄà 3 jednoduché kroky: 45Pokud chcete mÄÅit návÅ¡tÄvnost vašà stránky, je potÅeba se zaregistrovat. Registrace i provoz služby TOPlist je zdarma.`,content:`K mÄÅenà návÅ¡tÄvnosti staÄà 3 jednoduché kroky: 46Pokud chcete mÄÅit návÅ¡tÄvnost vašà stránky, je potÅeba se zaregistrovat. Registrace i provoz služby TOPlist je zdarma. Po registraci je emailem zaslán mÄÅÃcà kód. Pokud nevyhovuje nebo chcete použÃt jiné poÄÃtadlo, můžete vytvoÅit jiný mÄÅÃcà kód ve formuláÅi. Kód poté umÃstÃte na každou stránku, kterou chcete mÄÅit. Jedná se o tzn. HTML kód, který lze editovat v jednoduchých editorech typu Poznámkový blok. VÃce o HTML na www.jakpsatweb.cz. V každém pÅÃpadÄ je nutné, aby na stránkách byl mÄÅÃcà kód, protože bez nÄj nenà technicky možné návÅ¡tÄvnost zaznamenávat. VÃce o mÄÅenà se dovÃte v Metodice mÄÅenÃ. Tipy jak umÃstit mÄÅÃcà kód do různých redakÄnÃch systémů najdete na stránce Kód na stránku 47Pokud máte nÄjaké otázky, zkuste se podÃvat do Äastých dotazů nebo nám napiÅ¡te na [email protected]. 48`}).add({id:11,tag:"cs",href:"/blog/kod-na-stranku/",title:"Kód na stránku",description:"ZaÄal jsem dávat dohromady tipy, jak dát mÄÅÃcà kód na různé stránky. Pokud máte nÄjaký dalÅ¡Ã, poÅ¡lete mi ho nebo můžete stránku po registraci rovnou upravit.",content:`ZaÄal jsem dávat dohromady tipy, jak dát mÄÅÃcà kód na různé stránky. Pokud máte nÄjaký dalÅ¡Ã, poÅ¡lete mi ho nebo můžete stránku po registraci rovnou upravit. Viz Kód na stránku 49`}).add({id:12,tag:"cs",href:"/kontakt/",title:"Kontakt",description:`TOPlist s.r.o. nám. Dr. Václava Holého 1054/13, 180 00 Praha 8 50IÄ: 27204171 51DIÄ: CZ27204171 52dat. schránka: df3vma`,content:` TOPlist s.r.o. nám. Dr. Václava Holého 1054/13, 180 00 Praha 8 53IÄ: 27204171 54DIÄ: CZ27204171 55dat. schránka: df3vma 56tel. +42O 777 2O2 2O3 57Technická podpora email: [email protected] 58Reklama David Süssemilch 59email: [email protected] 60`}).add({id:13,tag:"cs",href:"/blog/kontrola-gdpr-z-uoou/",title:"Kontrola GDPR z ÃOOÃ",description:`Na zaÄátku roku probÄhla kontrola dodržovánà GDPR na TOPlistu. Hlavnà výsledek je: 61âÃÅad v souvislosti s pÅedmÄtným zpracovánÃm osobnÃch údajů nezjistil poruÅ¡enà naÅÃzenà (EU) 2016/679.`,content:`Na zaÄátku roku probÄhla kontrola dodržovánà GDPR na TOPlistu. Hlavnà výsledek je: 62âÃÅad v souvislosti s pÅedmÄtným zpracovánÃm osobnÃch údajů nezjistil poruÅ¡enà naÅÃzenà (EU) 2016/679.â 63Nynà je zpráva zveÅejnÄna pÅÃmo na webu ÃÅadu pro ochranu osobnÃch údaju. 64`}).add({id:14,tag:"cs",href:"/blog/krizova-strategie/",title:"Krizová strategie",description:"Situace Celá situace zaÄala jako banálnà závada. Ve Ätvrtek veÄer odeÅ¡el v jednom databázovém serveru pevný disk. Nenà to nic výjimeÄného a servery jsou na to pÅipraveny a standardnÄ se celá záležitost obejde bez komplikacÃ.",content:` Situace Celá situace zaÄala jako banálnà závada. Ve Ätvrtek veÄer odeÅ¡el v jednom databázovém serveru pevný disk. Nenà to nic výjimeÄného a servery jsou na to pÅipraveny a standardnÄ se celá záležitost obejde bez komplikacÃ. Práci automaticky pÅevezmou dalšà disky, kterých bývá nÄkolik pÅipravených. V tomto pÅÃpadÄ se ovÅ¡em objevily indicie, že se může jednat o nÄco závažnÄjÅ¡Ãho. Souborový systém hlásil možné poÅ¡kozenÃ. Na vÃkend byla proto naplánovaná důkladná kontrola. BÄhem nà se ovÅ¡em ukázalo, že server vykazuje dalšà podivné chovánÃ. NÄkdy se zdálo, jakoby docházelo k výpa
64dkům operaÄnà pamÄti. ObÄas byly problémy se sÃÅ¥ovým pÅipojenÃm. PamÄÅ¥ byla vymÄnÄna, zrovna tak kabely a switch na vnitÅnà sÃti. Ve finále bylo vymÄnÄno celé chasis serveru. A nové už zaÄalo pracovat bez problému. Původnà je už nynà na cestÄ k výrobci pro analýzu. 65Bohužel, pÅi opravách muselo být pÅesunuto pÅibližnÄ 600 GB dat (vÄetnÄ zpÄtného importu do databáze). Což probÃhalo v noci ze soboty na nedÄli. A navic bÄhem této odstávky pÅibylo dalÅ¡Ãch 14 milionů nových záznamů (viz. bod 2 krizové strategie) 66Nynà se statistiky dopoÄÃtávajÃ. A já doufám, že dneÅ¡nà noc už bude klidnÄjšà a já koneÄnÄ doženu ty tÅi hodiny spánku za vÃkend ð 67TÃm se omlouvám za pÅÃpadné problémy a dÄkuji za pochopenÃ. 68ZároveÅ bych chtÄl podÄkovat RenatÄ, která obÄtavÄ i o vÃkendu vyÅizovala dotazy zaslané na helpdesk. 69PF 70Krizová strategie 1. Neomezovat mÄÅené stránky V pÅÃpadÄ problému je našà prioritou, aby se mÄÅené stránky naÄÃtaly bez snÞenà rychlosti. Toho je dosaženo nÄkolika způsoby. Jednak se pro mÄÅenà nepoužÃvá žadný externà skript, na který by se mohlo Äekat. ZároveÅ majà mÄÅené ikony definován rozmÄr, takže se stránka vykreslà jeÅ¡tÄ pÅed jejich naÄtenÃm. 71Dále jsou pÅed naÅ¡imi webovými servery tzn. load balancery. A jsou nastaveny tak, že pokud náš server neodpovà bÄhem chvÃle, je spojenà bez milosti ukonÄeno, aby nedocházelo k ÄekánÃ. A to, v krajnÃm pÅÃpadÄ, i za cenu nezapoÄtenà návÅ¡tÄvy. Rychlé zobrazenà mÄÅené stránky je zkrátka absolutnà priorita. 722. ZÃskávánà dat Dalšà prioritou je zÃskávánà dat. Pokud docházà k problémům pÅi jejich zpracovánÃ, je důležité, aby se namÄÅená data alespoÅ ukládala. To umožnÃ, po vyÅeÅ¡enà zdrženÃ, jejich zpÄtné zpracovánÃ. 733. Zobrazenà statistik ByÅ¥ je to z hlediska prezentace samotného TOPlistu na Å¡kodu (je hned vidÄt, že ânÄco nefungujeâ), je samotné zobrazenà výsledků statistik až na tÅetÃm mÃstÄ. Chápeme, že jsou nÄkdy potÅeba data k dispozici co nejdÅÃve. Ale vÄÅÃme, že uživatele se mohou ke statistikám vrátit pozdÄji (v základnà verzi až 7 dni, v Profi neomezenÄ) a pochopÃ, že zabezpeÄenà prvnÃch dvou bodů je i z jejich hlediska důležitÄjÅ¡Ã. 74`}).add({id:15,tag:"cs",href:"/blog/mazani-zaznamu/",title:"Mazanà záznamu",description:"Dneska nastala drobná aktualizace. Smazat stránku lze pouze v pÅÃpadÄ, že k nebyla alespoÅ dva dny zaznamenána návÅ¡tÄva. Omezà se tÃm smazánà omylem.",content:`Dneska nastala drobná aktualizace. Smazat stránku lze pouze v pÅÃpadÄ, že k nebyla alespoÅ dva dny zaznamenána návÅ¡tÄva. Omezà se tÃm smazánà omylem. Seznam takových stránek je buÄ vypsán pÅi mazánÃ, nebo lze použÃt statistiku Vstupnà stránky. Chyby mi, prosÃm, hlaste tÅeba do diskusÃ. 75`}).add({id:16,tag:"cs",href:"/blog/memcached/",title:"Memcached",description:`distribuovaná memory storage DoteÄ jsem informace o právÄ aktivnÃch sessions ukládal klasicky do databáze. 76Jelikož se nynà dosti zvedlo množstvà sledovaných návÅ¡tÄvnÃků, obsahovala ve Å¡piÄce pÅes 3 milióny záznamů (souÄet vÅ¡ech online návÅ¡tÄvnÃků na vÅ¡ech mÄÅených serverech) a poÄet dotazů do nà byl v Åádech stovek za vteÅinu.`,content:` distribuovaná memory storage DoteÄ jsem informace o právÄ aktivnÃch sessions ukládal klasicky do databáze. 77Jelikož se nynà dosti zvedlo množstvà sledovaných návÅ¡tÄvnÃků, obsahovala ve Å¡piÄce pÅes 3 milióny záznamů (souÄet vÅ¡ech online návÅ¡tÄvnÃků na vÅ¡ech mÄÅených serverech) a poÄet dotazů do nà byl v Åádech stovek za vteÅinu. Proto jsem se rozhodl vyzkouÅ¡et na jejich uloženà pamÄÅ¥ový daemon. Nejsem pÅÃznivcem akademického âurob-si-sámâ a tak jsem použil memcached, který už na jiných projektech nÄjakou dobu použÃváme. 78Jedná se o jednoduchý prográmek, který umožÅuje uloženà vÃceménÄ libovolné struktury (klientské knihovny jsou pro Perl, Python, PHP, C ad. â samotný protokol je také primitivnÃ) pod klÃÄ.
79BÄhem dneÅ¡ka uvidÃm, jaký vliv to bude mÃt na samotné statistiky, ale metodika zůstává nezmÄnÄná (proÄ taky mÄnit to, co 8 let funguje), tj. min. 30 minut interval mezi návÅ¡tÄvami jednoho uživatele. 80`}).add({id:17,tag:"cs",href:"/blog/memcached-1-vysledky/",title:"Memcached â 1. výsledky",description:`Tento pÅÃspÄvek je vÃceménÄ odpovÄÄ Jirkovi Pallasovi v komentáÅi k pÅedchozÃmu, ale tÅeba bude zajÃmat i nÄkoho dalÅ¡Ãho ð 81Po pÅibližnÄ 14.`,content:`Tento pÅÃspÄvek je vÃceménÄ odpovÄÄ Jirkovi Pallasovi v komentáÅi k pÅedchozÃmu, ale tÅeba bude zajÃmat i nÄkoho dalÅ¡Ãho ð 82Po pÅibližnÄ 14. dnech provozu je situace následujÃcÃ. 83PrůmÄrný provoz je pÅes 500 Ätenà a 300 nastavenà za vteÅinu. PÅi objemu dat kolem 170 MB je procesor [email protected] zatÞený asi na 5%. A to jeÅ¡tÄ bÄžà na 2.4 jádru, tj. bez podpory epollu [viz libevent]. Na jiném projektu jej už použÃváme (Debian sarge a 2.6 jádro). Proklamované zrychlenà o Åády se sice nekonalo, ale âalespoÅâ v násobcÃch to bylo. 84`}).add({id:18,tag:"cs",href:"/blog/merene-domeny/",title:"MÄÅené domény",description:"PÅemýšlÃm, že bych v podrobných statistikách, ve veÅejné Äásti, vypisoval domény, na kterých doÅ¡lo k mÄÅenÃ. Bylo by hned vidÄt, kdo nasázel mÄÅÃcà kód na x dalÅ¡Ãch adres.",content:`PÅemýšlÃm, že bych v podrobných statistikách, ve veÅejné Äásti, vypisoval domény, na kterých doÅ¡lo k mÄÅenÃ. Bylo by hned vidÄt, kdo nasázel mÄÅÃcà kód na x dalÅ¡Ãch adres. Žádná ÄÃsla, žádné detaily, jen seznam domén. TÄch, kteÅà nejsou v žebÅÃÄku zobrazeni, by se to netýkalo. NÄjaké protinávrhy? ð 85`}).add({id:19,tag:"cs",href:"/napoveda/toplist-profi/merene-statistiky/",title:"MÄÅené statistiky",description:`V reportu lze vytvoÅit statistiky následujÃcÃch hodnoty: 86NávÅ¡tÄvy NávÅ¡tÄvy poÄet návÅ¡tÄv, které byly zaznamenány na webu. NávÅ¡tÄva je definována jako sledovánà aktivit uživatele na webu.`,content:`V reportu lze vytvoÅit statistiky následujÃcÃch hodnoty: 87NávÅ¡tÄvy NávÅ¡tÄvy poÄet návÅ¡tÄv, které byly zaznamenány na webu. NávÅ¡tÄva je definována jako sledovánà aktivit uživatele na webu. NávÅ¡tÄva konÄà po 30 minutách neÄinnosti uživatele na webu. Pokud se uživatel vrátà na web po vÃce než 30 minutách, bude to považováno za novou návÅ¡tÄvu. 88Unikátnà IP poÄet unikátnÃch anonymizovaných IP adres, které byly zaznamenány na webu. 89Zhlédnutà poÄet zhlédnutých stránek na webu. Zhlédnutà je definováno jako zobrazenà stránky uživatelem. Zobrazenà dalÅ¡Ãch stránek nebo opÄtovné zobrazenà stejné stránky se poÄÃtá jako dalšà zhlédnutÃ. 90ProhlÞeÄe poÄet návÅ¡tÄv rozdÄlený podle prohlÞeÄů. ProhlÞeÄe jsou identifikovány podle názvu a verze. 91OperaÄnà systémy poÄet návÅ¡tÄv rozdÄlený podle operaÄnÃch systémů. 92RozliÅ¡enà monitorů poÄet návÅ¡tÄv rozdÄlený podle rozliÅ¡enà monitorů. Udává se v poÄtu pixelů Å¡ÃÅky a výšky. 93Barevná hloubka poÄet návÅ¡tÄv rozdÄlený podle barevné hloubky monitorů. Udává se v bitech. 94Hloubka návÅ¡tÄv poÄet návÅ¡tÄv rozdÄlený podle hloubky návÅ¡tÄv. Hloubka návÅ¡tÄv je definována jako poÄet zhlédnutých stránek bÄhem jedné návÅ¡tÄvy. 95NávÅ¡tÄvy - domény poÄet návÅ¡tÄv rozdÄlený podle domén návÅ¡tÄvnÃků (adresou jejich poskytovatele pÅÃpojenÃ). Domény jsou identifikovány podle druhé úrovnÄ domény. Tj. napÅ. seznam.cz, toplist.cz, o2.cz, atd. 96NávÅ¡tÄvy - domény(trend) poÄet návÅ¡tÄv rozdÄlený podle domén návÅ¡tÄvnÃků. Výsledky jsou zobrazeny v grafu v Äasovém sledu. 97VyhledávaÄe poÄet návÅ¡tÄv rozdÄlený podle vyhledávaÄů. VyhledávaÄe jsou identifikovány podle refereru(odkazujÃcà stránky), ze kterého pÅiÅ¡el návÅ¡tÄvnÃk. 98Typ zaÅÃzenà poÄet návÅ¡tÄv rozdÄlený podle typu zaÅÃzenÃ. Typy zaÅÃzenà mohou být mobilnà telefony, tablety, poÄÃtaÄe, atd. 99Typ aplikace poÄet návÅ¡tÄv rozdÄlený podle typu aplikace. Typy aplikacà mohou být webové prohlÞeÄe, mobilnà aplikace, chytré televize, automobily atd. 100NávÅ¡tÄvnost bÄhem dne poÄet návÅ¡tÄv rozdÄlený podle dennà doby. Udává se v hodinách. 101NávÅ¡tÄvnost podle dne poÄet návÅ¡tÄv rozdÄlený podle dne v týdnu. 102Trend návÅ¡tÄvnosti poÄet návÅ¡tÄv zobrazený v Äasovém sledu. 103Celková návÅ¡tÄvnost celkový poÄet návÅ¡tÄv zobrazený ve zvoleném obdobÃ. 104Verze prohlÞeÄe poÄet návÅ¡tÄv rozdÄlený podle verze prohlÞeÄe. 105Verze operaÄnÃho systému poÄet návÅ¡tÄv rozdÄlený podle verze operaÄnÃho systému. 106Engine prohlÞeÄe poÄet návÅ¡tÄv rozdÄlený podle engine prohlÞeÄe. Jedná se o základnà zobrazovacà jádro prohlÞeÄe. Mohou to být napÅ. Gecko, Trident, WebKit, atd. 107ZemÄ poÄet návÅ¡tÄv rozdÄlený podle zemÄ návÅ¡tÄvnÃků. 108návÅ¡tÄvy - TLD poÄet návÅ¡tÄv rozdÄlený podle TLD návÅ¡tÄvnÃků. TLD je doména nejvyššà úrovnÄ. Tj. napÅ. .cz, .com, .net, atd. 109Zdroje VÅ¡echny pÅehled vÅ¡ech zdrojů návÅ¡tÄvnosti. Zdroje jsou identifikovány podle refereru(odkazujÃcà stránky), ze kterého pÅiÅ¡el návÅ¡tÄvnÃk. 110Domény pÅehled zdrojů návÅ¡tÄvnosti rozdÄlený podle domén návÅ¡tÄvnÃků. Domény jsou identifikovány podle druhé úrovnÄ domény. Tj. napÅ. seznam.cz, toplist.cz, o2.cz, atd. 111VyhledávaÄe pÅehled zdrojů návÅ¡tÄvnosti rozdÄlený podle vyhledávaÄů. VyhledávaÄe jsou identifikovány podle refereru(odkazujÃcà stránky), ze kterého pÅiÅ¡el návÅ¡tÄvnÃk. 112Hledané fráze pÅehled zdrojů návÅ¡tÄvnosti rozdÄlený podle frázÃ, které byly hledané ve vyhledávaÄÃch. 113Obsah Vstupnà strÃánky poÄet návÅ¡tÄv rozdÄlený podle vstupnÃch stránek. Vstupnà stránka je definována jako prvnà zhlédnutá stránka návÅ¡tÄvnÃkem. 114Výstupnà stránky poÄet návÅ¡tÄv rozdÄlený podle výstupnÃch stránek. Výstupnà stránka je definována jako poslednà zhlédnutá stránka návÅ¡tÄvnÃkem bÄhem jedné návÅ¡tÄvy. 115NejnavÅ¡tÄvovanÄjšà poÄet návÅ¡tÄv rozdÄlený podle nejnavÅ¡tÄvovanÄjÅ¡Ãch stránek. 116Cesty poÄet návÅ¡tÄv rozdÄlený podle cest návÅ¡tÄvnÃků. Cesta je definována jako sled zhlédnutých stránek návÅ¡tÄvnÃkem bÄhem jedné návÅ¡tÄvy. 117Lokálnà hledánà - fráze poÄet návÅ¡tÄv rozdÄlený podle frázÃ, které byly hledané ve vyhledávánà na mÄÅeném webu. 118`}).add({id:20,tag:"cs",href:"/blog/mereni-navstevnosti-bez-cookie
118s/",title:"MÄÅenà návÅ¡tÄvnosti bez cookies",description:"Vždy jsme kladli důraz na soukromà návÅ¡tÄvnÃků VaÅ¡ich stránek. Nesledujeme je, nevytváÅÃme jejich profily pro cÃlenà reklamy, nezpracováváme jejich osobnà data.",content:`Vždy jsme kladli důraz na soukromà návÅ¡tÄvnÃků VaÅ¡ich stránek. Nesledujeme je, nevytváÅÃme jejich profily pro cÃlenà reklamy, nezpracováváme jejich osobnà data. VytváÅÃme statistiky, které jsou urÄeny pouze pro Vás, majitele a administrátory webových stránek. I proto jsme bez problému proÅ¡li kontrolou dodržovánà GDPR ÃÅadu pro ochranu osobnÃch údajů. Samotné cookies se použÃvajà pouze k technickému rozliÅ¡enà ânávÅ¡tÄvyâ a âzhlédnutÃâ viz Metodika mÄÅenÃ. 119BÄhem letoÅ¡nÃho roku byl vyvinutý nový způsob rozliÅ¡ovánÃ. CÃlem bylo zcela odstranit nutnost použità cookies. ZmÄna byla úspÄÅ¡ná a podle dosavadnÃch testů je rozdÃl v namÄÅených hodnotách pod úrovnà statistické chyby. MÄÅÃcà kód na VaÅ¡ich stránkách nenà potÅeba mÄnit a novinka bude automaticky aktivnà u vÅ¡ech stránek 1. ledna 2022. 120ZároveÅ se trochu zmÄnà grafika ikon, která (koneÄnÄ ð) bude ladit se zmÄnou grafiky samotného webu. Zde je ukázka upravených ikon. Jedna z verzÃ, s nápisem âbez cookiesâ, Vám umožnà informovat VaÅ¡e návÅ¡tÄvnÃky, že si vážÃte jejich soukromà a použÃváte mÄÅenÃ, které to respektuje. 121PoÄÃtadla Loga Aktualizace [30.12.2021 01:07]: nové mÄÅenà je spuÅ¡tÄné `}).add({id:21,tag:"cs",href:"/blog/mereni-navstevnosti-na-wapu/",title:"MÄÅenà návÅ¡tÄvnosti na WAPu",description:"Nenà to úplná novinka, ale asi jsem o tom jeÅ¡tÄ nikde nepsal ð Kdysi jsem si hrál s WAPem, takže staÄà použÃt kód:",content:`Nenà to úplná novinka, ale asi jsem o tom jeÅ¡tÄ nikde nepsal ð Kdysi jsem si hrál s WAPem, takže staÄà použÃt kód: 122<img src=âhttp://toplist.cz/wap.asp?ID=xxxâ alt=â.â/>kde xxx je pochopitelnÄ ID stránky. PosÃlá to WBMP bÃlý bod. Nejsou tam žadná rozÅ¡iÅenà pomocà Javaskriptu atp. Dalšà omezenà je, že WAP neposÃlá referrer, takže stránky jsou oznaÄeny ve statistikách jednotnÄ jako âW@Pâ. JeÅ¡tÄ nenà udÄlaná nÄjaká bližšà identifikace mobilů, ale pokud bude zájem a hlavnÄ data, tak se to dá dodÄlat. 123`}).add({id:22,tag:"cs",href:"/blog/metodika-globalni-statistiky-vyhledavacu/",title:"Metodika globálnà statistiky vyhledávaÄů",description:"Pomocà Javaskriptu se zaznamenávajà referery na mÄÅeném webu. Vynechány jsou kategorie Erotika a ZahraniÄnÃ, servery TOPlist a Sreality s Sbazarem (kvůli omezenà vlivu odkazů mezi službami Seznamu).",content:`Pomocà Javaskriptu se zaznamenávajà referery na mÄÅeném webu. Vynechány jsou kategorie Erotika a ZahraniÄnÃ, servery TOPlist a Sreality s Sbazarem (kvůli omezenà vlivu odkazů mezi službami Seznamu). Dále jsou zapoÄÃtány pouze služby, které bÄhem dne pÅinesly vÃc než 10 návÅ¡tÄv. V grafech jsou dennà hodnoty agregovány podle týdne. Graf umožÅuje k URL pÅidat dva parametry: lang (hodnota CZ vyfiltruje pouze uživatele z Äech rozliÅ¡ených pomocà databáze GeoIP) a year (výpis statistik za urÄitý kalendáÅnà rok). 124Snad vám to pomohlo trochu se ve výsledcÃch zorientovat. 125`}).add({id:23,tag:"cs",href:"/napoveda/dokumentace/metodika-mereni/",title:"Metodika mÄÅenÃ",description:"Jak se mÄÅÃ? K mÄÅenà návÅ¡tÄvnosti sledované stránky se použÃvá kód, který je nutné na ni umÃstit (dalšà informace viz Jak zaÄÃt?",content:` Jak se mÄÅÃ? K mÄÅenà návÅ¡tÄvnosti sledované stránky se použÃvá kód, který je nutné na ni umÃstit (dalšà informace viz Jak zaÄÃt?). Jedná se vlastnÄ o obrázek (může to být buÄ standardnà ikona o rozmÄrech 88Ã31 bodů nebo âneviditelnýâ bod o velikosti 1Ã1 bod). Z toho plyne urÄitá možná nepÅesnost mÄÅenÃ, způsobená napÅ. vypnutým zobrazovánÃm grafiky na stranÄ návÅ¡tÄvnÃka. Na druhou stranu to daleko lépe odrážà napÅ. reklamnà možnosti plochy (komu se nezobrazà ikona TOPlistu, tomu se nezobrazà ani reklamnà banner). NavÃc lze toto ÄásteÄnÄ eliminovat souÄasným použitÃm i textového poÄÃtadla, které systém TOPlist také nabÃzÃ. 126Jaké hodnoty se mÄÅÃ? NávÅ¡tÄvy (visits) Jedná se o základnà veliÄinu mÄÅenou TOPlistem. Podle obecných pravidel se jedná o zobrazenà stránky v prohlÞeÄi za urÄitou dobu. Podle pravidel použÃvaných ve svÄtÄ (viz. Wiki
126pedie http://en.wikipedia.org/wiki/Bounce_Rate) je tato doba 30 minut. To znamená, že pokud se uživatel ze stejného poÄÃtaÄe vrátà po vÃce než 30 minutách na stránku zpÄt, je zapoÄÃtána nová návÅ¡tÄva. Dennà hodnoty jsou archivovány za celou dobu od registrace. 127Zhlédnutà (pageviews) Tato hodnota znamená každé zobrazenà stránky (nebo stránek, pokud je kód umÃstÄn na vÃce). A to i v pÅÃpadÄ, kdy uživatel použije tÅeba tlaÄÃtko Obnovit. 128Toto jsou hlavnà veliÄiny, které TOPlist mÄÅà o návÅ¡tÄvnosti. Dalšà hodnoty jsou doplÅkové a umožÅujà dalšà upÅesnÄnà informacà o návÅ¡tÄvnÃcÃch. PatÅà k nim informace o použÃvaných prohlÞeÄÃch, operaÄnÃch systémech, domény návÅ¡tÄvnÃků, rozliÅ¡enà a barevná hloubka monitorů ad. 129Dalšà popis zobrazovaných hodnot naleznete také v Äasto kladených otázkách. 130Pojmy IP unikátnà ÄÃselná adresa každého poÄÃtaÄe, který je pÅipojen k internetu. 131cookie krátká textová informace, kterou lze uložit v prohlÞeÄi návÅ¡tÄvnÃka webové stránky a pozdÄji zpÄt vyzvednout. MÄÅenà TOPlistem cookies nepoužÃvá. 132`}).add({id:24,tag:"cs",href:"/blog/mnohonasobne-rychlejsi-statistiky/",title:"MnohonásobnÄ rychlejšà statistiky",description:"PrávÄ byla do provozu spuÅ¡tÄná nová verze statistik. Vzhled a funkce zůstaly stejné, ale je úplnÄ pÅepracované technické ÅeÅ¡enÃ, které bÄžà na pozadÃ.",content:`PrávÄ byla do provozu spuÅ¡tÄná nová verze statistik. Vzhled a funkce zůstaly stejné, ale je úplnÄ pÅepracované technické ÅeÅ¡enÃ, které bÄžà na pozadÃ. PoužÃvá se jiná databáze a jejà volánà pÅes REST API. DÃky tomu je naÄÃtánà dat mnohonásobnÄ rychlejÅ¡Ã. Proto jsou i výsledky pro stránky se stovkami tisÃc zhlédnutà dennÄ zobrazeny bÄhem zlomku vteÅiny. 133`}).add({id:25,tag:"cs",href:"/napoveda/dokumentace/nastaveni/",title:"NastavenÃ",description:`https://www.toplist.cz/edit/ 134V nastavenà lze editovat základnà údaje o registrované stránce (adresa, název, popisek, kategorie, kontaktnà email), dalšà volby (pÅÃstup bez hesla, zmÄna hesla, skrytà statistik a dalÅ¡Ã) a pÅehled pÅihlášenà k úÄtu.`,content:`https://www.toplist.cz/edit/ 135V nastavenà lze editovat základnà údaje o registrované stránce (adresa, název, popisek, kategorie, kontaktnà email), dalšà volby (pÅÃstup bez hesla, zmÄna hesla, skrytà statistik a dalÅ¡Ã) a pÅehled pÅihlášenà k úÄtu. 136PÅihlášenà Do editace se pÅihlásÃte pomoci TOPlist ID a hesla, které jste nastavili pÅi registraci. Pokud jej neznáte, lze jej obnovit pomocà odkazu “zapomenuté heslo”, kdy po vyplnÄnà správného konktatnà email je na nÄj zaslán odkaz na zmÄnu hesla. 137Ãdaje Stránka nastavenà má tÅi Äásti. Hlavnà je formuláŠpro nastavenà údajů. UmožÅuje zmÄnit tyto údaje: 138Adresa - Hlavnà webová adresa (URL) registrované webové stránky. Název - Název stránky, který bude zobrazen v žebÅÃÄku návÅ¡tÄvnosti, výpisu statistik atd. Popis - Krátký (max. 255 znaků) popis stránky, zobrazený jako alternativnà text odkazu v žebÅÃÄku, ve výpisu statistik atd. Kategorie - Zvolená hlavnà kategorie, v které bude stránka zobrazena v žebÅÃÄku. PosÃlat každý týden statistiky mailem - Volba, zda se má každÄ pondÄlà posÃlat krátký email s pÅehledem návÅ¡tÄvnosti za pÅedchozà týden na kontaktnà emaily. Podrobné statistiky jen s heslem - Zda je ke zobrazenà statistik vyžadováno heslo. Je to stejné heslo, jako je potÅeba k pÅistupu do nastavenÃ. NeveÅejné mÄÅenà - Vypnutà zobrazenà stránky v žebÅÃÄku a výsledcÃch hledánÃ. NezapoÄÃtavaná IP adresa - IP adresa, nebo jejà Äast (nahrazenà pomocà *, napÅ. 127.0.1.*), z kterých se nemá návÅ¡tÄvnost zaznamenávat. BezpeÄnostnà kód - viz vÃc informacà Email - kontaktnà email nebo vÃc emailů oddÄlených Äárkou. Sloužà k zasÃlánà týdennÃch statistik, pÅÃpadnÄ zaslánà odkazu na n
138astavenà nového hesla. Pokud dojde k jeho ovÄÅenÃ, je aktivnà pÅÃmý link z žebÅÃÄku na mÄÅenou stránku. Menu Druhá Äast stránky je menu s odkazy na zmÄnu hesla, vynulovánà statistik a smazánà úÄtu. 139Log pÅÃstupů Poslednà Äástà je seznam pÅihlášenÃ. Obsahuje Äas poslednÃho pÅihlášenà z pÅisluÅ¡né IP adresy a akci, které toho pÅihlášenà vyžadovala. 140`}).add({id:26,tag:"cs",href:"/napoveda/nastaveni-hesla/",title:"Nastavenà hesla",description:"Jeden z nejÄastÄjÅ¡Ãch dotazů, které ÅeÅ¡Ãme jsou otázky typu: âJsem nový majitel webu a jak zÃskám heslo, když nemám pÅÃstup k emailům v registraciâ nebo âNepamatuju si, jaký email je registrovanýâ.",content:`Jeden z nejÄastÄjÅ¡Ãch dotazů, které ÅeÅ¡Ãme jsou otázky typu: âJsem nový majitel webu a jak zÃskám heslo, když nemám pÅÃstup k emailům v registraciâ nebo âNepamatuju si, jaký email je registrovanýâ. Nynà lze tuto situaci jednoduÅ¡e ÅeÅ¡it. 141Ve formuláÅi pro obnovu hesla je jeÅ¡tÄ jeden formuláÅ. V nÄm se zobrazà adresa z vaÅ¡eho webu, na které budeme Äekat kontrolnà klÃÄ. PatrnÄ to bude stránka, která jeÅ¡tÄ neexistuje. Nenà tak potÅeba zasahovat do souÄasného webu a staÄà tuto novou stránku vytvoÅit. Nemusà to být ani plnohodnotná stránka (napÅ. i bez designu apod.). Může být i jen obyÄejný textový soubor. 142Pak staÄà nechat zkontrolovat, že obsahuje klÃÄ. A pokud ano, tak umožnÃme heslo zmÄnit. 143Konkrétnà pÅÃklad: 144FormuláŠpro obnovu hesla Pro TOPlist je nastavenà hesla na adrese https://www.toplist.cz/password/reset/1. Po zmáÄknutà tlaÄÃtka to vypÃÅ¡e požadovanu adresu (každý návÅ¡tÄvnÃk uvidà jinou). Pro náš pÅÃklad to může být tÅeba: www.toplist.cz/jvdrv.html. A také klÃÄ WY3NqZRsbZQPfHbGksyOE7b2SMGLWVU7. Takže staÄÃ, abych vytvoÅil soubor na požadováné adrese. A po zkontrolovánà bude možné heslo zmÄnit. 145`}).add({id:27,tag:"cs",href:"/blog/nova-verze-blogu/",title:"Nová verze blogu",description:"Tento blog zaÄÃnal pÅed vÃce než 20 lety jako poznámky na blogu Lidé.cz. PozdÄji se pÅesunul na vlastnà doménu a na redakÄnà systém Wordpress.",content:`Tento blog zaÄÃnal pÅed vÃce než 20 lety jako poznámky na blogu Lidé.cz. PozdÄji se pÅesunul na vlastnà doménu a na redakÄnà systém Wordpress. Nynà nastal Äas na dalšà vÄtšà zmÄnu. Rozhodl jsem se zaÄÃt použÃvat statický generátor Hugo. Pro informaÄnà web je to vhodné ÅeÅ¡enÃ. DÃky tomu, že se stránky generujà pÅedem, je jejich zobrazenà rychlejšà a bezpeÄnÄjÅ¡Ã. Editace je jednoduchá dÃky Markdownu a umožÅuje verzovánÃ. 146Po vyzkouÅ¡enà nÄkolika Å¡ablon jsem se rozhodl pro Hinode. Je to relativnÄ nová Å¡ablona, postavená na Bootstrap 5. ZároveÅ umožÅuje kombinaci jak stránek s dokumentacÃ, tak i blogu. Je zatÃm stále ve vývoji a nÄkteré Äásti jsem musel upravit. Pokud to bude dávat smysl, budu se snažit úpravy posÃlat zpÄt do upstreamu. 147NapÅÃklad jsem pÅidal podporu pro Isso, které použÃvám pro komentáÅe. Je to, alespoÅ zatÃm, jediná dynamická Äást na tomto webu. VÅ¡echny komentáÅe jsou uloženy na vlastnÃm serveru a nejsou závislé na žádné tÅetà stranÄ. 148`}).add({id:28,tag:"cs",href:"/blog/nove-podkategorie-a-prejmenovani-kategorie-casopisy/",title:"Nové podkategorie a pÅejmenovánà kategorie Äasopisy",description:`V rámci postupné aktualizace stromu kategorià jsme pÅejmenovali kategorii âÄasopisyâ na âMagazÃnyâ a pÅidali jsme nové podkategorie: 149âMagazÃny pro ženyâ jako podkategorii kategorie âMagazÃnyâ âVaÅenà a receptyâ jako podkategorii kategorie âŽivotnà stylâ âOrdinaceâ jako podkategorii kategorie âZdravÃâ Pokud Vám budou nové kategorie vyhovovat, využijte váš úÄet na TOPlist.`,content:`V rámci postupné aktualizace stromu kategorià jsme pÅejmenovali kategorii âÄasopisyâ na âMagazÃnyâ a pÅidali jsme nové podkategorie: 150âMagazÃny pro ženyâ jako podkategorii kategorie âMagazÃnyâ âVaÅenà a receptyâ jako podkategorii kategorie âŽivotnà stylâ âOrdinaceâ jako podkategorii kategorie âZdravÃâ Pokud Vám budou nové kategorie vyhovovat, využijte váš úÄet na TOPlist.cz a zaÅaÄte si vaÅ¡e stránky do tÄchto nových podkategoriÃ. I nadále budou vaÅ¡e stránky zobrazené i v hlavnà kategorii. 151`}).add({id:29,tag:"cs",href:"/blog/nove-podkategorie-cestovani/",title:"Nové podkategorie CestovánÃ",description:"PÅidal sem do kategorie Cestovánà tÅi nové podkategorie: cestovnà kanceláÅe, ubytovánà a informace. Pokud máte návrhy na nÄjaké nové kategorie, tak je smÄle sem s nimi ð.",content:`PÅidal sem do kategorie Cestovánà tÅi nové podkategorie: cestovnà kanceláÅe, ubytovánà a informace. Pokud máte návrhy na nÄjaké nové kategorie, tak je smÄle sem s nimi ð. Jedinou podmÃnkou je, aby bylo už registrováno minimálnÄ 50 webů, které by mohly do této kategorie patÅit. 152`}).add({id:30,tag:"cs",href:"/blog/nove-statistiky-prohlizecu/",title:"Nové statistiky prohlÞeÄů",description:"VÄtÅ¡ina statistik nynà umožÅuje zobrazenà výsledku jak v tabulce, tak i grafu (pro statistiky za jeden den je použitý koláÄový graf).",content:`VÄtÅ¡ina statistik nynà umožÅuje zobrazenà výsledku jak v tabulce, tak i grafu (pro statistiky za jeden den je použitý koláÄový graf). 153ZároveÅ je vytvoÅený nový způsob identifikovánà prohlÞeÄů, které umožnà mÄÅit vÃce parametrů. Jako ukázka jsou pÅidané dvÄ statistiky: 154Typ zaÅÃzenà RozliÅ¡enÃ, zda se jedná o poÄÃtaÄ (desktop), chytrý telefon, tablet, phablet (vÄtšà chytrý telefon) apod. 155Engine prohlÞeÄe Také nazývané vykreslovacà jádro (Wikipedie). Základnà Äást prohlÞeÄe, která se stará o samotné vykreslenà stránky. PrávÄ jejà vlastnosti urÄujÃ, jak se návÅ¡tÄvnÃkům stránka zobrazÃ. Dnes mezi nejpoužÃvanÄjšà patÅà Blink (Chrome, Opera), Gecko (Firefox) a Webkit (staršà Chrome, Safari). 156Do konce prázdnin by mÄlo dojÃt k pÅechodu na novou identifikaci i u ostatnÃch statistik (verze prohlÞeÄe, operaÄnÃho systému ad.) 157`}).add({id:31,tag:"cs",href:"/blog/novy-hlavni-databazovy-server/",title:"nový hlavnà databázový server",description:`V poslednÃch dnech, kdy objem dennÃch statistik pÅesáhl 170 miliónů zhlédnutÃ, se ukázala nutnost výmÄny hlavnÃho databázového serveru. 158Je docela pÅekvapivé, že na svém mÃstÄ vydrzel vÃc než tÅi roky.`,content:`V poslednÃch dnech, kdy objem dennÃch statistik pÅesáhl 170 miliónů zhlédnutÃ, se ukázala nutnost výmÄny hlavnÃho databázového serveru. 159Je docela pÅekvapivé, že na svém mÃstÄ vydrzel vÃc než tÅi roky. Ale je pravda, že z nÄj byla bÄhem té doby podstatná Äást zátÄže pÅesunuta na dalšà dva pomocné servery. Takže původnà dual Xeon na 3GHz a 2GB pamÄti byl vymÄnen za nový
159s parametry 2x quad-core Xeon E5335 2GHz, 8GB RAM, 4x 76GB 15krpm SAS v RAID 10. 160Bylo nutné systém jeÅ¡tÄ trochu vyladit (raid je softwarový, ale server obsahuje i HW RAID s 256 MB vyrovnávacà pamÄti a to trochu mate systém pÅi zápisech), ale jinak se zdá, že by mÄl mÃt dostateÄný výkon. A je jenom otázka, jestli vydrzà tak dlouho jako jeho pÅedchůdce. 161A jedna perliÄka na závÄr. Když to spoÄÃtám, tak TOPlist dnes bÄzà na 15 procesorech, celkem s 32 jádry, 24 GB RAM a 4TB disků. Nebýt toho, že ty požadavky stoupaly postupnÄ bÄhem poslednÃch 4 let (tenkrát jeÅ¡tÄ vÅ¡echno bÄželo na jednom stroji), dalo se to vÅ¡echno nacpat do jednoho blade serveru ð. 162`}).add({id:32,tag:"cs",href:"/blog/novy-server/",title:"Nový server",description:"Problémy zaÄaly minulý týden, kdy na hostingu (Casablanca) vypadl proud a prý jim dvacet minut trvalo než na to vůbec pÅiÅ¡li.",content:`Problémy zaÄaly minulý týden, kdy na hostingu (Casablanca) vypadl proud a prý jim dvacet minut trvalo než na to vůbec pÅiÅ¡li. VÅ¡echno vyvrcholilo vÄera veÄer, kdy se pÅi instalaci nového serveru zjistilo, že je na jednom stávajÃcÃm disk v takovém stavu, že po rebootu už nenabÄhl (nechci spekulovat, jak moc se na této situaci výpadek projevil, ale umÅelého železa bylo po serverovnÄ vidÄt docela dost). Jelikož ani rozbÄhnutà nového serveru nebylo zcela bez problému (napÅ. podpora pro nový RAID ÅadiÄ je až v jádÅe 2.6.14) byl dneska, bohužel, TOPlist v degradovaném stavu. Nynà se podaÅilo situaci stabilizovat. Nový server se na tom podÃlà nemalou mÄrou. 163Jedná se o pomÄrnÄ zajÃmavý kousek. Jeho výrobce je Supermicro a z oficiálnÃch stránek se o nÄm nic nedovÃte. Na nich se totiž zdá, se Supermicro je ÄistÄ Intel-only výrobce. Takže až na adrese http://www.supermicro.com/Aplus/ se dá objevit, že to nenà úplnÄ pravda. Tento konkrétnà kousek má oznaÄenà AS1020A-T. Jedná se o 1U server osazený 2GB RAM a dvÄma Opterony 270 (2.0GHz, dual-core). ZatÃm na nÄm bÄžà 32bitová verze Debianu (sarge). O tom, jakou 64bit distribuci tam dát zatÃm uvažuji (zatÃm mi bÄžà Ubuntu a CentOS). VaÅ¡e pÅÃpadné tipy jsou vÃtány ð. 164JeÅ¡tÄ nenà celý systém úplnÄ doladÄný, ale celkový nárůst výpoÄetnà kapacity je témÄÅ 50%, takže skýtá rezervy. A jeÅ¡tÄ se trochu zvednou, až se zase zapojà ten odeÅ¡lý server, co tam ležà v koutÄ, to byl Opteron 144 (1,8Ghz, single-core). 165`}).add({id:33,tag:"cs",href:"/obchodni-podminky/",title:"Obchodnà podmÃnky",description:"I. Základnà ustanovenà Tyto VÅ¡eobecné smluvnà podmÃnky (dále jen âVOPâ) upravujà smluvnà vztah mezi Provozovatelem a ZákaznÃkem. Provozovatelem služby mÄÅenà návÅ¡tÄvnosti webových stránek TOPlist Profi (dále jen âSlužbyâ) je spoleÄnost TOPlist s.",content:" I. Základnà ustanovenà Tyto VÅ¡eobecné smluvnà podmÃnky (dále jen âVOPâ) upravujà smluvnà vztah mezi Provozovatelem a ZákaznÃkem. Provozovatelem služby mÄÅenà návÅ¡tÄvnosti webových stránek TOPlist Profi (dále jen âSlužbyâ) je spoleÄnost TOPlist s.r.o., IÄ: 27204171, se sÃdlem námÄstà Dr. Václava Holého 1054/13, LibeÅ, 180 00 Praha 8, spisová znaÄka: C 104234 vedená u MÄstského soudu v Praze. ZákaznÃkem se stává svéprávná fyzická osoba nebo právnická osoba, která s Provozovatelem uzavÅe Smlouvu. K uzavÅenà smlouvy dojde vyplnÄnÃm objednávky na stránkách âprofi.toplist.czâ na nÄkterou z nabÃzených služeb Provozovatele a souÄasnÄ Åádným zaplacenÃm Äástky dle aktuálnÃho cenÃku provozovatele, popÅ. zÅÃzenÃm služby pokud se jedná o službu bezplatnou. ObjednánÃm služby ZákaznÃk projevuje souhlas s tÄmito VÅ¡eobecnými smluvnÃmi podmÃnkami (VOP). ZákaznÃkem â spotÅebitelem se rozumà svéprávná fyzická osoba, která uzavÃrá smlouvu s Provozovatelem pro své soukromé, nepodnikatelské úÄely. Autorizacà se myslà prokázánà totožnosti zákaznÃka, zejména prokázánà se pÅihlaÅ¡ovacÃm jménem a heslem k Zákaznickému úÄtu, a tÃm také prokázánà práva pro nakládánà se zákaznickým úÄtem a službami, které jsou pod nÃm vedeny. ZákaznÃk bere na vÄdomà a souhlasà s tÃm, že nenà oprávnÄn uzavÃrat smlouvu s Provozovatelem a objednávat služby nabÃzené Provozovatelem jménem tÅetÃch stran, jestliže mu k tomu tÅetà strana nedala pÅedem pÃsemný souhlas. Tento pÃsemný souhlas může být kdykoliv Provozovatelem vyžádán a ZákaznÃk je povinen jej neprodlenÄ pÅedložit, jinak je Provozovatel oprávnÄn objednanou službu zruÅ¡it. ObjednánÃm služby ZákaznÃk vyjadÅuje svůj jednoznaÄný souhlas a porozumÄnà se Smlouvou, tÄmito VOP a vÅ¡emi ostatnÃmi podmÃnkami souvisejÃcÃmi s objednanou službou, stejnÄ jako s obsahem, specifikacà a cen
165ou jÃm objednané služby dle nabÃdky Provozovatele. ZákaznÃk i Provozovatel jsou povinni v průbÄhu trvánà Smlouvy dodržovat vÅ¡eobecnÄ platné právnà pÅedpisy, ustanovenà Smlouvy, tyto VOP a dalšà podmÃnky v pÅÃpadÄ, že jsou souÄástà zákaznÃkem objednané služby. ZákaznÃk uzavÅenÃm Smlouvy rovnÄž prohlaÅ¡uje, že se seznámil s funkcemi dané služby a z toho důvodu nenà v rámci poskytnuté služby oprávnÄn požadovat vrácenà již uhrazené platby za nÄkterou z nabÃzených služeb s odůvodnÄnÃm, že mu provedenà služby nevyhovuje. ZákaznÃk v plné mÃÅe odpovÃdá za veÅ¡keré Å¡kody, které způsobà svým jednánÃm v rozporu s tÄmito VOP a/nebo právnÃm Åádem Äeské republiky Provozovateli, jiným uživatelům Služeb nebo jiným tÅetÃm osobám. Této odpovÄdnosti se nelze zprostit. V pÅÃpadÄ, že ZákaznÃk poruÅ¡uje tyto VOP, je Provozovatel oprávnÄn pozastavit jeho Služby. PÅi zvlášť závažném poruÅ¡enà nebo opakovaném poruÅ¡ovánà tÄchto VOP je Provozovatel oprávnÄn službu zruÅ¡it. ZruÅ¡enÃm služby se rozumà jejà pozastavenÃ, ukonÄenà a smazánà dat této služby. II. Povinnosti a práva provozovatele Provozovatel zajistà bezproblémový provoz služeb s výjimkou doby nezbytné pro údržbu technických a softwarových prostÅedků, jejichž prostÅednictvÃm jsou služby provozovány. Provozovatel je oprávnÄn provádÄt plánované odstávky systémů za úÄelem jejich údržby a aktualizacÃ. Provozovatel je oprávnÄn provádÄt neplánované odstávky, pokud to situace vyžaduje a je nutné je neodkladnÄ provést za úÄelem zajiÅ¡tÄnà dalÅ¡Ãho chodu služeb a serverů. Poruchou se rozumà chyba v technických nebo softwarových prostÅedcÃch Provozovatele, která způsobuje úplnou nefunkÄnost Äi nedostupnost služeb, následkem Äehož je ZákaznÃk nemůže v plné mÃÅe využÃvat. Za poruchu se nepovažuje plánovaná odstávka. Provozovatel neruÄà za nefunkÄnost Äi nedostupnost služby, která je zapÅÃÄinÄna tÅetà stranou. Provozovatel nenese žádnou zodpovÄdnost za nefunkÄnost Äi nedostupnost systému, která byla způsobena technickým Äi jiným problémem na stranÄ subdodavatele, poruchou Äi odstávkou v sÃti Internet mezi uživatelem a servery Provozovatele Äi vyššà mocÃ. Provozovatel nenese zodpovÄdnost za nedostupnost služby v pÅÃpadÄ nefunkÄnosti pÅipojenà uživatele k Internetu. Provozovatel neodpovÃdá za jakoukoli Å¡kodu Äi ztrátu, která byla nebo by mohla být ZákaznÃkovi způsobena v souvislosti s použÃvánÃm služeb. Jakékoliv náhrady Å¡kod a dalÅ¡Ãch nákladů, vÄetnÄ odpovÄdnosti za uÅ¡lý zisk ZákaznÃka, jsou vždy limitovány (a ohraniÄeny) maximálnà výšÃ, která je rovna poplatku za jeden mÄsÃc provozu pÅÃsluÅ¡né služby. Provozovatel může vkládat reklamnà sdÄlenà (o maximálnà délce textu 200 znaků) a to své nebo tÅetÃch stran do pravidelných emailů s týdennÃm reportem návÅ¡tÄvnosti. III. VyúÄtovánà a platby Aktuálnà cenÃk je k dispozici na stránkách Provozovatele âprofi.toplist.czâ. ZmÄny v cenÃku Provozovatel vÄas oznamuje na stejných stránkách. Faktury a zálohové faktury jsou ZákaznÃkovi zasÃlány prostÅednictvÃm elektronické poÅ¡ty na e-mailovou adresu, která je uvedena v zákaznickém úÄtu ZákaznÃka. ÃÄetnà doklady nejsou poskytovány v papÃrové podobÄ, s ÄÃmž ZákaznÃk výslovnÄ souhlasÃ. Jestliže ZákaznÃk neuhradà jakoukoliv zálohovou fakturu (výzvu k platbÄ) do konce pÅedplaceného obdobà dané služby, je Provozovatel oprávnÄn službu pozastavit. Jestliže ZákaznÃk neuhradà jakoukoliv fakturu do doby jejà splatnosti, je Provozovatel oprávnÄn službu pozastavit. Faktury a zálohové faktury se považujà za uhrazené pÅi splnÄnà vÅ¡ech následujÃcÃch podmÃnek: platba je zaslána na správný úÄet Provozovatele je poukázána pÅesná Äástka dle výzvy k platbÄ ve správné mÄnÄ pÅi platbÄ je uveden správný variabilnà symbol platba je pÅipsána na úÄet Provozovatele platba je zpracována platebnÃm systémem Provozovatele Provozovatel neakceptuje pÃsemná, faxová, e-mailová ani žádná jiná podobná potvrzenà o zaplacenÃ, pokud Äástka na úÄet Provozovatele jeÅ¡tÄ nedorazila. PÅi mezinárodnà platbÄ je ZákaznÃk povinen uhradit veÅ¡keré poplatky spojené se zahraniÄnÃm platebnÃm stykem (nastavenà poplatků âOURâ). V opaÄném pÅÃpadÄ provozovatel platbu neakceptuje a ZákaznÃk je povinen dorovnat rozdÃl tak, aby pÅiÅ¡la Provozovateli Äástka v plné požadované výši. IV. Ochrana informacà a ochrana osobnÃch údajů Provozovatel i ZákaznÃk se zavazujà k mlÄenlivosti o skuteÄnostech, které se vzájemnÄ dozvÄdÄli v souvislosti se zÅÃzenÃm a provozem služeb. Ochrana informacà se nevztahuje na pÅÃpad, kdy má Poskytovatel informaÄnà povinnost stanovenou zákonem resp. kdy si informace vyžádajà státnà orgány oprávnÄné k tomu zákonem, nebo jde o informace, které jsou veÅejnÄ dostupné. Detaily ohlednÄ osobnÃch údajů, nakládánà s osobnÃmi údaji a ochrany osobnÃch údajů jsou v samostatném dokumentu Zásady zpracovanà osobnÃch údajů zákaznÃků. V pÅÃpadÄ, že ZákaznÃk u Provozovatele uchovává (ukládá) jakékoliv osobnà údaje, tak se mezi Provozovatelem a ZákaznÃkem uzavÃrá Zpracovatelská smlouva, podle které je ZákaznÃk správcem tÄchto osobnÃch údajů a Provozovatel zpracovatelem. ObdobnÄ se postupuje i v pÅÃpadÄ, že ZákaznÃk působà již jako zpracovatel osobnÃch údajů pro jiného správce. V takovém pÅÃpadÄ je Provozovatel dalÅ¡Ãm zpracovatelem. Poskytovatel se zavazuje zabezpeÄit ochranu osobnÃch údajů pÅed neoprávnÄným nebo nahodilým pÅÃstupem, zabránit jejich zmÄnÄ, ztrátÄ Äi zniÄenÃ, neoprávnÄnému p
165Åenosu Äi jejich jinému neoprávnÄnému zpracovánÃ, jakož i jinému zneužità V. Doba trvánà dohody a jejà zánik Doba platnosti je 6 nebo 12 mÄsÃců dle druhu služby. Po ukonÄenà služby jsou data namÄÅená a reporty vytvoÅené bÄhem jejà platnosti dále uchovány. Pro vytvoÅenà nových statistických reportů je nutná aktivnà služba. ZákaznÃk â spotÅebitel má v souladu s ust. § 1829 z.Ä. 89/2012 Sb., obÄanský zákonÃk právo odstoupit od smlouvy ve lhůtÄ 14 dnů ode dne jejÃho uzavÅenÃ. Vzhledem k tomu, že ZákaznÃk â spotÅebitel výslovnÄ požádal Provozovatele o zapoÄetà s poskytovánÃm služeb pÅed koncem lhůty pro odstoupenÃ, bere na vÄdomÃ, že je povinen uhradit Provozovateli pomÄrnou Äást sjednané ceny za plnÄnà poskytnuté do okamžiku odstoupenà od smlouvy. Odstoupit může zákaznÃk vyplnÄnÃm pÅÃsluÅ¡ného formuláÅe v pÅÃsluÅ¡né zákaznické sekci na internetových stránkách Provozovatele. VI. Reklamace ZákaznÃk je oprávnÄn reklamovat chybnÄ provedené vytvoÅenà statistického reportu Äi mimoÅádné události, k nimž doÅ¡lo v souvislosti se Službou, a to ve lhůtÄ do 3 mÄsÃců od události, která je pÅedmÄtem reklamace. Reklamaci provedete tak, že zaÅ¡lete pÅÃsluÅ¡né oznámenà na naÅ¡i e-mailovou adresu pro reklamaÄnà ÅÃzenà [email protected]. Po obdrženà reklamace provedeme Å¡etÅenà za úÄelem zjiÅ¡tÄnà jejà oprávnÄnosti. Do 15 pracovnÃch dnů po obdrženà reklamace jsme povinni Vám sdÄlit výsledky naÅ¡eho Å¡etÅenà a stanovisko k reklamaci. V pÅÃpadech výskytu pÅekážek nezávislých na naÅ¡i vůli se v souladu s § 258 odst. (2) Zákona o platebnÃm styku se tato lhůta prodlužuje na 35 pracovnÃch dnÃ. V pÅÃpadÄ oprávnÄné reklamace jsme povinni pÅijmout a provést nápravná opatÅenÃ. ZávÄreÄná ustanovenà VeÅ¡kerá ujednánà mezi Provozovatelem a ZákaznÃkem se ÅÃdà platným a úÄinným Äeským právnÃm Åádem. S ohledem na to, že smluvnà vztah je zakládán na delšà dobu dobu, a po tuto může dojÃt ke zmÄnám na trhu Äi legislativÄ, vyhrazuje si Provozovatel ve smyslu § 1752 z.Ä. 89/2012 Sb., obÄanský zákonÃk, oprávnÄnà tyto VOP v pÅimÄÅeném rozsahu mÄnit. Nové znÄnà VOP zveÅejnà Provozovatel na svých WWW stránkách a ZákaznÃk bude na takovou pÅÃpadnou zmÄnu upozornÄn e-mailem, a to v pÅimÄÅené lhůtÄ pÅedtÃm, než nové VOP vstoupà v úÄinnost. ZákaznÃk má právo zmÄny VOP pÃsemnÄ odmÃtnout, a to nejpozdÄji do dne, kdy nastane jejich úÄinnost. V pÅÃpadÄ, že ZákaznÃk zmÄny VOP v této dobÄ neodmÃtne, platÃ, že se smluvnà vztah ÅÃdà novým znÄnÃm VOP. V pÅÃpadÄ, že ZákaznÃk zmÄny/nové úplnÄ znÄnà VOP odmÃtne, jsou Provozovatel i ZákaznÃk oprávnÄni pÅÃsluÅ¡ný smluvnà vztah pÅedÄasnÄ ukonÄit, a to vzájemnou dohodou Äi výpovÄdÃ. VýpovÄdnà lhůta v takovém pÅÃpadÄ Äinà 2 mÄsÃce od pÃsemného oznámenà o zmÄnÄ VOP druhé smluvnà stranÄ. V pÅÃpadÄ, že jsou tyto VOP k dispozici pro ZákaznÃka ve vÃce jazykových verzÃch, má pÅednost Äeská verze. Provozovatel v takovém pÅÃpadÄ neodpovÃdá za správnost takového pÅekladu. Tyto VOP nabývajà úÄinnosti dnem 13. 3. 2020. "}).add({id:34,tag:"cs",href:"/napoveda/dokumentace/osobni-udaje/",title:"Osobnà údaje",description:`Provozovatelem služby TOPlist je firma: 166TOPlist s.r.o. nám. Dr. Václava Holého 1054/13, 180 00 Praha 8 167IÄ: 27204171 168DIÄ: CZ27204171`,content:`Provozovatelem služby TOPlist je firma: 169TOPlist s.r.o. nám. Dr. Václava Holého 1054/13, 180 00 Praha 8 170IÄ: 27204171 171DIÄ: CZ27204171 172dat. schránka: df3vma 173dále jen âProvozovatelâ. 174Osobnà údaje dle NaÅÃzenà Evropského parlamentu a rady (EU) 2016/679, dále jen âNaÅÃzenÃâ, jsou zpracovávany ve dvou pÅÃpadech. Jednak pÅi mÄÅenà návÅ¡tÄvnosti a, za druhé, pÅi provozu samotného webu Toplist. PÅi mÄÅenà návÅ¡tÄvnosti Provozovatel, v postavenà zpracovatele osobnÃch údajů dle Äl. 4 bodu 8) NaÅÃzenÃ, pÅijal dostateÄná technická a organizaÄnà opatÅenà k zabezpeÄenà zpracovávaných osobnÃch údajů dle Äl. 32 tohoto NaÅÃzenÃ, vÄetnÄ povinnosti mlÄenlivosti. 175MÄÅenà návÅ¡tÄvnosti Cookies Cookies se pro mÄÅenà návÅ¡tÄvnosti nepoužÃvajÃ. 176IP adresa Anonymizované IP adresy se ukládajà po dobu 5 dnà a pÅÃstup k nim (vždy maximálnÄ 100 poslednÃch záznamů) má správce mÄÅené stránky. V pÅÃpadÄ, že statistiky nejsou chránÄny heslem, jsou veÅejné. 177IP adresa je použitá pro technické zabezpeÄenà provozu služby, tj. ke statistickému mÄÅenà návÅ¡tÄvnosti stránky. Provozovatel, dle Älánku 11, odstavec 1 NaÅÃzenÃ, neuchovává, nezÃskává ani nezpracovává dodateÄné informace za úÄelem identifikace subjektu údajů. 178Web TOPlist Web TOPlist použÃvá pro pÅihlášenà ID stránky a uživatelem zvolené heslo, které je uloženo v bcrypt hashovaném tvaru. Kontaktnà email (pÅÃpadnÄ emaily
178) nemá souvislost s pÅihlaÅ¡ovánÃm a heslem. Může sloužit k zaslánà odkazu pro zmÄnu zapomenutého hesla a, volitelnÄ, pro zasÃlánà pravidelných statistických reportů. Seznam stránek, kde je email použitý jako kontaktnÃ, lze zÃskat zde. 179FunkÄnà cookies jsou použity pro technické zaznamenánà nastavenÃ: (pÅÃstup bez nutnosti opakovaného zadánà hesla, zapamatovánà zvolených statistik). 180identifikátor doba platnosti popis použità statList 14 dnà zapamatovánà výbÄru zobrazených statistik a jejich pÅedvolenà pÅi dalÅ¡Ãm výbÄru session sezenà (do ukonÄenà prohlÞeÄe) zapamatovánà hesla po pÅihlášenÃ, aby nebylo nutné jej znovu zadávat různý dle ID stránky 14 dnà zapamatovat si, že pro pÅÃstup do statistik nemá být vyžadováno heslo I pro tyto údaje platÃ, že Provozovatel neuchovává, nezÃskává ani nezpracovává dodateÄné informace za úÄelem identifikace subjektu údajů. 181V pÅÃpadÄ dotazů Äi požadavků můžete napsat na email [email protected]. 182`}).add({id:35,tag:"cs",href:"/blog/par-novinek-na-toplistu/",title:"Pár novinek na TOPlistu",description:"Je to zejména mÄÅenà návÅ¡tÄvnosti podle zemÄ. Dál jsem u výpisu cest po serveru pÅidal linky na stránky (ahoj Ivo ð) a u výpisu hledaných frázà pÅidal možnost vypsánà vÅ¡ech.",content:`Je to zejména mÄÅenà návÅ¡tÄvnosti podle zemÄ. Dál jsem u výpisu cest po serveru pÅidal linky na stránky (ahoj Ivo ð) a u výpisu hledaných frázà pÅidal možnost vypsánà vÅ¡ech. A jeÅ¡tÄ drobnost, u mailu s týdennÃmi statistikami je v subjectu uvedeno ÄÃslo týdne a rok. 183`}).add({id:36,tag:"cs",href:"/blog/pocasi-vs-navstevnost/",title:"PoÄasà vs. návÅ¡tÄvnost",description:"Krátká poznámka, jaký vliv má na návÅ¡tÄvnost poÄasÃ. Jak se v minulých dvou týdnech udÄlalo koneÄnÄ hezky, zaznamenával TOPlist pouze kolem 140 milionů zhlédnutà za den.",content:`Krátká poznámka, jaký vliv má na návÅ¡tÄvnost poÄasÃ. Jak se v minulých dvou týdnech udÄlalo koneÄnÄ hezky, zaznamenával TOPlist pouze kolem 140 milionů zhlédnutà za den. A bÄhem proprÅ¡ené nedÄle už to bylo zase bÄžných 170 milionů (tj. rozdÃl vÃc než 15%). PoÄet návÅ¡tÄv tolik neklesl (v Åádu procent), takže se spÃÅ¡ zkrátila doba strávená na serveru. Zaznamenali jste tento pokles i na vaÅ¡ich serverech nebo vaÅ¡i navÅ¡tÄvnÃci hezké poÄasà ignorovali? ð 184`}).add({id:37,tag:"cs",href:"/blog/podil-firefoxu/",title:"PodÃl Firefoxu",description:"PodÃl Firefoxu u Äeských uživatelů stabilnÄ pÅekonal 40%. Aktuálnà stav na https://www.toplist.cz/global/history/browser/?lang=CZ",content:`PodÃl Firefoxu u Äeských uživatelů stabilnÄ pÅekonal 40%. Aktuálnà stav na https://www.toplist.cz/global/history/browser/?lang=CZ 185`}).add({id:38,tag:"cs",href:"/blog/podily-navstevniku-podle-domen-po-20-letech/",title:"PodÃl návÅ¡tÄvnÃků podle domén 2. úrovnÄ, po 20 letech",description:"PÅesnÄ pÅed 20 lety probÄhla malá blogová diskuze o podÃlu poskytovatelů pÅipojenà na Äeském internetu. PojÄme se podÃvat, co se za tu dobu zmÄnilo.",content:`PÅesnÄ pÅed 20 lety probÄhla malá blogová diskuze o podÃlu poskytovatelů pÅipojenà na Äeském internetu. PojÄme se podÃvat, co se za tu dobu zmÄnilo. 186Krátce ÅeÄeno - vÅ¡echno. 187Doména PodÃl 1. o2.cz 17.14 % 2. vodafone.cz 13.21 % 3. tmcz.cz 11.92 % 4. starnet.cz 2.51 % 5. poda.cz 1.32 % 6. nej.cz 0.93 % 7. nordic.tel 0.87 % 8. rionet.cz 0.67 % 9. nbox.cz 0.45 % 10. bluetone.cz 0.43 % U vÄerejÅ¡Ãch (pátek 9. bÅezna 2024) statistik je použitá trochu jiná metodika. PodÃl je poÄÃtán na základÄ návÅ¡tÄv, u kterých je geolokacà (která nebyla jeÅ¡tÄ pÅed 20 lety implementovaná) urÄená zemÄ původu Äeská republika. Že tÃm vypadl, v původnÃch statistikách uvedený, AOL, už dnes vadit nebude. 188I tak je na prvnà pohled patrná konsolidace trhu. Je vidÄt násobný odskok vÅ¡ech tÅà mobilnÃch operátotorů od ostatnà konkurence. PÅed dvaceti lety byl nejvÄtšà poskytovatel na prvnÃm mÃstÄ s podÃlem 4.72
188%. Respektive, i kdyby se poÄÃtaly spoleÄnÄ domény jejichž dneÅ¡nà pokraÄovatel je O2 (tj. iol.cz a eurotel.cz), tak by jejich podÃl byl 6,93 %, což je stále násobnÄ ménÄ než dneÅ¡nà 17.14 %. Trochu “neviditelný” je podÃl Nej.cz, který je v TOP 10 zastoupen hned tÅemi doménami (nej.cz, rionet.cz a nbox.cz), ale ani jejich spoleÄný podÃl neohrožuje dominanci tÅà mobilnÃch operátorů. Ta vznikla jednak nástupem mobilnÃho internetu, ale i akvizicemi. NapÅÃklad, v původnà tabulce se to týkalo tÅeba Mistralu (UPC -> Vodafone) nebo Contactelu (GTS -> T-Mobile). 189Ostatnà poskytovatelé v podstatÄ zmizeli. AÅ¥ už tehdejšà velcà hráÄi Video On Line nebo Tiscali nebo tÅeba projekt IndoÅ¡. 190`}).add({id:39,tag:"cs",href:"/blog/podily-navstevniku-podle-domen-2-urovne/",title:"PodÃly návÅ¡tÄvnÃků podle domén 2. úrovnÄ",description:"To hlavnà už zmÃnil Yuhů. Já k tomu jeÅ¡tÄ dodám upÅesnÄnÃ. Filtr je podobný jako u refererů, tj. nepoÄÃtajà se záznamy z kategorià Anglicky a Erotika.",content:`To hlavnà už zmÃnil Yuhů. Já k tomu jeÅ¡tÄ dodám upÅesnÄnÃ. Filtr je podobný jako u refererů, tj. nepoÄÃtajà se záznamy z kategorià Anglicky a Erotika. Jinak
190se skuteÄnÄ nemÄÅà na unikátnà uživatele, ale návÅ¡tÄvy. ÄÃmž, jak DuÅ¡an zmiÅuje, je zohlednÄn nejen celkový poÄet, ale též aktivita zákaznÃků jednotlivých providerů. K jeho tabulce za nedÄli pÅipojuji pro ukázku TOP10 ze vÄerejÅ¡ka (pondÄlà 9.2.2004). 191Doména PodÃl 1. vol.cz 4.72 % 2. tiscali.cz 4.29 % 3. iol.cz 4.17 % 4. mistral.cz 3.78 % 5. eurotel.cz 2.76 % 6. aol.com 2.28 % 7. contactel.net 2.11 % 8. indos.cz 2.08 % 9. contactel.cz 1.89 % 10. karneval.cz 1.29 % RozdÃl je vidÄt hlavnÄ v poklesu podÃlu velkých providerů ve prospÄch pÅipojenà ze Å¡kol a firem. 192`}).add({id:40,tag:"cs",href:"/blog/podkategorie-na-toplistu/",title:"Podkategorie na TOPlistu",description:"VÃm o tom, že probÃhá diskuse nad rozdÄlenÃm kategorie Weblogy na vÃc podkategorià (pÅehled je tÅeba u Každého blogujÃcÃho :-))",content:`VÃm o tom, že probÃhá diskuse nad rozdÄlenÃm kategorie Weblogy na vÃc podkategorià (pÅehled je tÅeba u Každého blogujÃcÃho :-)) 193Nad tÃm jsem v minulosti už i pÅemýšlel (napÅ. chovatelé by Å¡li rozdÄlit na pejskaÅe, koÄiÄkáÅe ad.). Nerad bych ale opustil výhody âjedné úrovnÄâ â napÅ. možnost rychlého pÅechodu z kategorie do kategorie pomocà selectu, odkaz na vÅ¡echno hned z homepage apod. A zároveÅ nechci mÃt z TOPlistu katalog. V prvnà ÅadÄ sloužà k mÄÅenà návÅ¡tÄvnosti. 194Pokud vás ale napadne nÄjaký jednoduchý a úÄinný způsob jak to vyÅeÅ¡it, nenà problém jej aplikovat. VaÅ¡e námÄty a pÅipomÃnky jen uvÃtám buÄ v diskusi nebo na mailu. 195UPDATE â Robert reagoval s námitkou, že by se mÄl filtrovat erotický obsah. Tohle TOPlist ovÅ¡em dÄlá odjakživa (viz výpis vÅ¡ech kategorii Äi hledánÃ, kde nejsou erotické stránky). Jen je nÄkdy tÄžšà rozhodnout, jestli je to vÃc osobnà stránka exhibicionisty, blog nebo porno. PodobnÄ dilema jako tÅeba v pÅÃpadÄ obchodu s erotickým zbožÃm. Je to erotika nebo virtuálnà obchod? 196`}).add({id:41,tag:"cs",href:"/blog/pomlcka-misto-adresy-stranky/",title:"PomlÄka mÃsto adresy stránky",description:"StruÄnÄ Pokud se ve statistikách na TOPlistu mÃsto adresy mÄÅené stránky objevuje pomlÄka â, staÄà v mÄÅÃcÃm kódu zmÄnit http:// za https://",content:` StruÄnÄ Pokud se ve statistikách na TOPlistu mÃsto adresy mÄÅené stránky objevuje pomlÄka â, staÄà v mÄÅÃcÃm kódu zmÄnit http:// za https:// 197Delšà povÃdánà Nové prohlÞeÄe nepÅedávajà informaci o navÅ¡tÃvené stránce (tzv. referer) v pÅÃpadÄ, že je stránka na Å¡ifrovaném spojenà (HTTPS) a mÄÅÃcà prvek takové spojenà nemá (má jen HTTP). Ostatnà pÅÃpady (obojà stejné, nebo stránka HTTP a mÄÅenà HTTPS) stále fungujÃ. MÄÅÃcà kód TOPlistu je proto od roku 2012 vytváÅen s odkazem pÅes HTTPS. 198V pÅÃpadÄ, že jste dlouhodobý uživatel TOPlistu, máte na stránce jeÅ¡tÄ starou verzi, a svou stránku zaÄnete Å¡ifrovat, informace o adrese stránky se pÅestane posÃlat. VÅ¡echny ostatnà statistiky (poÄet návÅ¡tÄv, informace o prohlÞeÄi apod.) se mÄÅà dál. 199ÅeÅ¡enà je jednoduché. BuÄ, jak je napsáno v prvnÃm odstavci, jenom upravÃte mÄÅÃcà kód na stránce, nebo jej nahradÃte novÄ vytvoÅeným ze stránky https://www.toplist.cz/code/. Ten už Å¡ifrovaný odkaz obsahuje. 200`}).add({id:42,tag:"cs",href:"/blog/potvrzeni-tydennich-reportu/",title:"Potvrzenà týdennÃch reportů",description:`Celý leden byl do týdennÃch reportů pÅidaný následujÃcà text: 201abych si byl jistý, že neobtÄžuji posÃlánÃm tohoto týdennÃho pÅehledu návÅ¡tÄvnosti, nastavte zasÃlánà na následujÃcÃm odkazu, kde také najdete vÃce informacÃ.`,content:`Celý leden byl do týdennÃch reportů pÅidaný následujÃcà text: 202abych si byl jistý, že neobtÄžuji posÃlánÃm tohoto týdennÃho pÅehledu návÅ¡tÄvnosti, nastavte zasÃlánà na následujÃcÃm odkazu, kde také najdete vÃce informacÃ. V opaÄném pÅÃpadÄ staÄà tento email ignorovat a nejpozdÄji na zaÄátku února zasÃlánà skonÄà 203ProÄ jsem to udÄlal? Hlavnà důvody byly tyto: 204Za ty desÃtky let, co posÃlánà reportů bÄžÃ, se nashromáždilo množstvà uživatelů, kteÅà už o nÄ nemajà zájem, ale nezruÅ¡ili odbÄr v nastavenÃ. ZbyteÄnÄ to zdržuje odesÃlánÃ
204(emailů se posÃlá pÅes 300 tisÃc) Riskujeme, že budou oznaÄovány jako spam a to poÅ¡kodà posÃlánà i tÄm, kteÅà je chtÄjÃ. Co dál? A jak jsem slÃbil, tak se také stalo. Pokud jste v lednu neklikli na odkaz pro potvrzenà zasÃlánà týdennÃch reportů, tak od února už vám reporty chodit nebudou. 205Co když je chci zpÄt? Pokud byste si to rozmysleli, můžete zasÃlánà reportů opÄt povolit v nastavenà vaÅ¡eho úÄtu na TOPlistu. 206Statistiky A, pochopitelnÄ, o namÄÅené statistiky jste nepÅiÅ¡li. Stále jsou dostupné na webu. 207`}).add({id:43,tag:"cs",href:"/blog/prehled-prihlaseni/",title:"PÅehled pÅihlášenÃ",description:"Na stránku s editacà záznamu jsme pÅidali pÅehled pÅÃhlášenÃ. Jedná se o deset poslednÃch IP adres, z kterých bylo zadáno heslo.",content:`Na stránku s editacà záznamu jsme pÅidali pÅehled pÅÃhlášenÃ. Jedná se o deset poslednÃch IP adres, z kterých bylo zadáno heslo. NapÅÃklad pro pÅÃstup do editace nebo do statistik, pokud jsou heslem chránÄné. Pro každou adresu je jeÅ¡tÄ uvedený poslednà Äas a akce. Viz obrázek: 208`}).add({id:44,tag:"cs",href:"/blog/prehled-registrovanych-stranek-podle-emailu/",title:"PÅehled registrovaných stránek podle emailu",description:"PÅipravili jsme stránku, která umožnà zjistit vÅ¡echny registrace, u kterých je uvedený váš email jako kontaktnÃ. A zároveÅ umožnà rychlé nastavenà posÃlánà pravidelného týdennÃho reportu.",content:`PÅipravili jsme stránku, která umožnà zjistit vÅ¡echny registrace, u kterých je uvedený váš email jako kontaktnÃ. A zároveÅ umožnà rychlé nastavenà posÃlánà pravidelného týdennÃho reportu. 209Funguje to tak, že na adrese https://www.toplist.cz/edit/email/ zadáte svůj email a na nÄj pÅijde odkaz na pÅÃsluÅ¡ný seznam. V nÄm je možné rovnou zvolit posÃlánà a je v nÄm i odkaz na podrobné statistiky a editaci každé stránky. 210`}).add({id:45,tag:"cs",href:"/blog/presun-proveden/",title:"PÅesun proveden",description:"Takže pÅesun byl v noci proveden podle plánu. Až na ignoraci hodinové expirace DNS záznamu u nÄkterých providerů (Contactel, Tiscali aj.",content:`Takže pÅesun byl v noci proveden podle plánu. Až na ignoraci hodinové expirace DNS záznamu u nÄkterých providerů (Contactel, Tiscali aj.) vÅ¡e probÄhlo relativnÄ hladce. 211Co se týÄe výkonu, má systém nynà dost velkou rezervu a navÃc možnost snadného upgradu. 212`}).add({id:46,tag:"cs",href:"/napoveda/toplist-profi/pridani-noveho-webu/",title:"PÅidánà nového webu",description:"Nový web musà být nejprve registrován do bezplatné verze TOPlist.cz. Pokud je pÅi jeho registraci použit stejný kontaktnà email jako pro pÅihlášenà do TOPlist Profi, je pÅi dalÅ¡Ãm pÅihlášenà automaticky pÅiÅazen k úÄtu.",content:`Nový web musà být nejprve registrován do bezplatné verze TOPlist.cz. Pokud je pÅi jeho registraci použit stejný kontaktnà email jako pro pÅihlášenà do TOPlist Profi, je pÅi dalÅ¡Ãm pÅihlášenà automaticky pÅiÅazen k úÄtu. 213Pokud je web registrován do jiného úÄtu, je možné jej pÅidat do TOPlist Profi pomocà jeho TOPlist ID. PÅihlaste se do TOPlist Profi a kliknÄte na tlaÄÃtko PÅidat web v sekce Seznam webů na úvodnà stránce služby Profi. 214Pak staÄà zadat TOPlist ID webu a stejné heslo jako je použité pro pÅÃhlášenà do základnà verze TOPlistu. Pokud je heslo správné, web je pÅidán do TOPlist Profi. 215`}).add({id:47,tag:"cs",href:"/blog/prihlaseni-toplist-id-email/",title:"PÅihlášenÃ: TOPlist ID nebo email",description:"TOPlist umožÅuje pÅihlásit se k vaÅ¡emu úÄtu pomocà vaÅ¡eho TOPlist ID nebo emailové adresy spojené s úÄtem. Oba způsoby majà své výhody a použità závisà na vaÅ¡ich preferencÃch a potÅebách.",content:`TOPlist umožÅuje pÅihlásit se k vaÅ¡emu úÄtu pomocà vaÅ¡eho TOPlist ID nebo emailové adresy spojené s úÄtem. Oba způsoby majà své výhody a použità závisà na vaÅ¡ich preferencÃch a potÅebách. 216PÅihlášenà pomocà TOPlist ID Vzniklo jako prvnà způsob v dobách, kdy pÅihlaÅ¡ovánà pomocà emailu nebylo bÄžné. Pro ilustraci, Gmail, který pÅihlaÅ¡ovánà pomocà emailu zpopularizoval, vznikl až o 7 let pozdÄji než TOPlist. 217Dodnes pÅinášà nÄkteré výhody: 218Ochrana soukromÃ: K použÃvánà TOPlistu nepotÅebujete nikde zadávat svůj email. Email se použÃvá pouze jako kontaktnà údaj pro obnovenà hesla nebo posÃlánà týdennÃch reportů. Pokud si tedy heslo budete pamatovat a nebudete chtÃt dostávat reporty, nemusÃte ho mÃt vyplnÄný. Jednoduchost: TOPlist ID je stejnÄ potÅeba použÃt v mÄÅÃcÃm kódu na vaÅ¡ich stránkách, takže jej máte vždy po ruce a nemusÃte vzpomÃnat jakým emailem se vlastnÄ máte pÅihlásit. Stabilita: Na rozdÃl od emailu, který se může mÄnit (zmÄna správce stránek, pracovnà email apod.), TOPlist ID zůstává konstantnà po celou dobu existence vaÅ¡eho úÄtu. PÅihlášenà pomocà emailu PÅihlášenà pomocà emailu je použito hlavnÄ v rámci služby TOPlist Profi, která umožÅuje nÄkteré funkce využÃt i v základnà bezplatné verzi TOPlistu. 219Hlavnà výhodou pÅihlášenà pomocà emailu je možnost slouÄenà vÃce úÄtů pod jednu emailovou adresu. Základnà slouÄenà probÄhne automaticky, kdy se pÅi pÅihlášenà pÅiÅadà vÅ¡echny registrace, které majà stejný email jako kontaktnÃ. Dalšà web lze pÅidávat ruÄnÄ pomocà funkce “Profi: pÅidánà nového webu”. V nových statistikách pak můžete mezi weby jednoduÅ¡e pÅepÃnat. 220V rámci služby Profi to dále umožÅuje vytváÅenà pÅÃstupů s různou úrovnà oprávnÄnà pro různé uživatele. NapÅÃklad rozliÅ¡ovat pÅÃstup pro editaci nastavenà a pÅÃstup pouze ke statistikám. 221`}).add({id:48,tag:"cs",href:"/napoveda/kod-na-stranku/redakcni-systemy/",title:"RedakÄnà systémy",description:`Krátké návody, jak pÅidat mÄÅÃcà kód na různé stránky. Pokud máte nÄjaký podobný návod, poÅ¡lete mi jej n
221a [email protected]. 222RS WordPress https://wordpress.`,content:`Krátké návody, jak pÅidat mÄÅÃcà kód na různé stránky. Pokud máte nÄjaký podobný návod, poÅ¡lete mi jej na [email protected]. 223RS WordPress https://wordpress.org/plugins/toplist/ 224RS Joomla http://www.phoca.cz/phoca-topliststatistics 225RS Drupal Pro verzi 5 existuje modul http://drupal.org/project/czech_audit 226Dokuwiki http://www.dokuwiki.org/plugin:toplist 227Webnode https://www.wpromotions.eu/ako-vlozit-pocitadlo-navstev-na-web-vo-webnode/ 228`}).add({id:49,tag:"cs",href:"/napoveda/toplist-profi/registrace/",title:"Registrace",description:"Registrace do služby TOPlist Profi je také zdarma. UmožÅuje použità rozÅ¡ÃÅených funkcà TOPlistu, které vyžadujà pÅihlášenà (napÅ. REST API). ZároveÅ umožÅuje pÅehled o vÅ¡ech VaÅ¡ich stránkách, které jsou v TOPlistu zaregistrované.",content:`Registrace do služby TOPlist Profi je také zdarma. UmožÅuje použità rozÅ¡ÃÅených funkcà TOPlistu, které vyžadujà pÅihlášenà (napÅ. REST API). ZároveÅ umožÅuje pÅehled o vÅ¡ech VaÅ¡ich stránkách, které jsou v TOPlistu zaregistrované. 229Registraci zaÄnete na úvodnà stránce služby TOPlist Profi, kde kliknete na odkaz Registrace zdarma. 230Poté vyplnÃte registraÄnà formuláÅ. Povinné pole je pouze email, pomocà kterého se budete pÅihlaÅ¡ovat. Po vyplnÄnà formuláÅe kliknÄte na tlaÄÃtko Registrovat. 231Po registraci obdržÃte email s odkazem pro aktivaci úÄtu a nastavenà hesla. 232Po pÅihlášenà jsou k úÄtu automaticky pÅiÅazeny ty stránky, které majà vyplnÄný stejný kontaktnà email. 233`}).add({id:50,tag:"cs",href:"/napoveda/dokumentace/rest-api/",title:"REST API",description:`Pro pÅÃstup k datům, statistikám a správÄ podporuje TOPlist také rozhrannà REST API. Jeho úvodnà stránka je na adrese 234https://profi.toplist.cz/api/`,content:`Pro pÅÃstup k datům, statistikám a správÄ podporuje TOPlist také rozhrannà REST API. Jeho úvodnà stránka je na adrese 235https://profi.toplist.cz/api/ 236Dostupné metody jsou rozdÄlené do 4 skupin: 237web základnà informace o registrované stránce, generovánà mÄÅÃcÃho kódu, ÄÃselnÃky 238statistika pÅÃstup k výsledkům statistik 239profi operace dostupné pÅi aktivnà službÄ TOPlist Profi 240global metoda pro globálnà statistiky 241Testovánà PosÃlánà požadavků na server lze testovat hned v dokumentaci. StaÄà u metody vyplnit správnÄ hodnoty a odeslat tlaÄÃtkem Zkusit. Pak je vypsán pÅÃklad volánà pomocà pÅÃkazu curl, volaná adresa, tÄlo požadavku a vracený kód a výsledek. 242Autorizace Autorizace v API NÄkteré metody vyžadujà autorizaci. Jsou oznaÄené ikonou (viz obrázek bod 1.). Po kliknutà na ikonu se objevà dialog na obrázku. 243OvÄÅenà probÃhá klÃÄem, který vytvoÅÃte na adrese https://profi.toplist.cz/#server_setting, vložÃte do pole âvalueâ (bod 2) a odeÅ¡lete tlaÄÃtkem Authorize. 244PÅi odeslánà pÅÃmo na server je klÃÄ pÅedávaný headerem serverKey. Lze to vidÄt i pÅi testu ve výpisu pÅÃkazu curl. 245Pro autorizaci je nutná registrace ve službÄ Profi, která je zdarma a nenà potÅeba, aby byla služba aktivnÃ. Registrace je potÅeba pro správu klÃÄů (tÄch může být vÃc pro různé úÄely) a pÅÃstupu k datům. 246`}).add({id:51,tag:"cs",href:"/napoveda/dokumentace/api-autentifikace/",title:"REST API - autentifikace",description:"Pro autorizace do API probÃhá ve dvou krocÃch. Nejprve je potÅeba, pomocà pÅÃstupového klÃÄe, zÃskat pÅÃstupový token a poté ho použÃt pro autorizaci v dalÅ¡Ãch požadavcÃch.",content:`Pro autorizace do API probÃhá ve dvou krocÃch. Nejprve je potÅeba, pomocà pÅÃstupového klÃÄe, zÃskat pÅÃstupový token a poté ho použÃt pro autorizaci v dalÅ¡Ãch požadavcÃch. 247VytvoÅenà pÅÃstupového klÃÄe PÅÃstupový klÃÄ je dvojice privátnÃho a veÅejného klÃÄe. Vygenerujete je napÅÃklad pomocà nástroje openssll: 248openssl ecparam -name prime256v1 -genkey -noout -out private.pem openssl ec
248-in private.pem -pubout > public.pemTÃm vzniknou dva soubory private.pem a public.pem. Prvnà obsahuje privátnà klÃÄ, který je potÅeba uchovávat v bezpeÄÃ. 249Druhý obsahuje veÅejný klÃÄ, který je potÅeba pÅidat do nastavenà uživatele v TOPlist Profi: 250ZÃskánà pÅÃstupového tokenu K zÃskánà pÅÃstupového tokenu je potÅeba poslat požadavek na adresu https://profi.toplist.cz/api/v1/login Autentifikace probÃhá pomocà HTTP hlaviÄky Authorization. HlaviÄka musà obsahovat JWT podepsaný privátnÃm klÃÄem. PÅÃklad volánà v Pythonu: 251import jwt import requests import time privateKey = open('private.pem').read() jwtPayload = jwt.encode( 'sub': '[email protected]', 'aud': 'batch', 'iss': '0123456-789a-bcde-f012-3456789abcd', 'nbf': int(time.time()), 'exp': int(time.time()) + 5*60, 'jti': '1234567890' , privateKey, algorithm='ES256') token = requests.post(f"https://media.toplist.cz/api/v1/login", headers= 'Accept':'application/json', 'Authorization': jwtPayload ).json()['token']Význam claimů JWT: 252sub - email uživatele, pro kterého je token vytvoÅen aud - v tomto pÅÃpadÄ vždy hodnota ‘batch’ iss - identifikátor Provozovatele, který je uveden v nastavenà serveru nbf - Äas, kdy token zaÄne platit exp - Äas, kdy token pÅestane platit (maximálnÄ 1 hodina) jti - unikátnà identifikátor tokenu Použità tokenu Vygenerovaný token je potÅeba pÅidat do hlaviÄky Authorization pro každý dalšà požadavek jako Bearer token. Tj.: Authorization: Bearer <token> 253`}).add({id:52,tag:"cs",href:"/blog/restart/",title:"Restart",description:"Rok 2016 je za námi. ZapoÄÃtali jsme bÄhem nÄj 6 723 268 569 návÅ¡tÄv a 34 851 098 705 zhlédnutà (ano, Åád desÃtek miliard je správnÄ).",content:`Rok 2016 je za námi. ZapoÄÃtali jsme bÄhem nÄj 6 723 268 569 návÅ¡tÄv a 34 851 098 705 zhlédnutà (ano, Åád desÃtek miliard je správnÄ). 254Co nás Äeká v tomto roce? 255Restart, který je stejný. Že to znà jako paradox? SouhlasÃme, ale nejlépe to vystihuje reakce lidÃ, kterým jsme pÅedvedli, co pÅipravujeme. 256Restart proto, že se zmÄnà témÄÅ vÅ¡e. PÅechod na zobrazovanà webu pÅes https (samotné mÄÅenà v https je možné od roku 2011) je jenom jednou z 216 zmÄn, které probÄhly v uplynulých mÄsÃcÃch v rámci pÅÃprav. HlavnÃm cÃlem je pÅechod na novÄjšà technologie, které zrychlà dalšà vývoj a zjednodušà i dohnánà naÅ¡ich, pÅiznáváme, i letitých restů. 257Stejný proto, že jsme si vÄdomi, že za 19 let existence TOPlistu jsou uživatelé na zvyklà na to, jak se náš web použÃvá. A mnohdy jej preferujà právÄ pro snadnost a rychlost ovládánÃ. Proto je pro nás prioritou zachovat tyto vlastnosti. A, pochopitelnÄ, i souÄasný mÄÅÃcà kód zůstane stále funkÄnÃ. 258Jako u každého paradoxu, nebude ÅeÅ¡enà jednoduché a Äeká nás jeÅ¡tÄ hodnÄ práce. Ale jeÅ¡tÄ bÄhem této zimy zaÄnou být novinky viditelné. 259Hezký nový rok 2017 a držte nám palce ð 260`}).add({id:53,tag:"cs",href:"/blog/srovnani-s-prechozim-tydnem-v-reportu/",title:"Srovnánà s pÅechozÃm týdnem v reportu",description:"PÅidali jsme do týdennÃho reportu srovnánà s pÅechozÃm týdnem. Vypisuje se relativnà rozdÃl mezi poslednÃm a pÅedposlednÃm týdnem. Po najetà myšà se v bublinÄ objevà i absolutnà hodnota celkové návÅ¡tÄvnosti.",content:`PÅidali jsme do týdennÃho reportu srovnánà s pÅechozÃm týdnem. Vypisuje se relativnà rozdÃl mezi poslednÃm a pÅedposlednÃm týdnem. Po najetà myšà se v bublinÄ objevà i absolutnà hodnota celkové návÅ¡tÄvnosti. 261Celkem 64665 +4.5% 262Je to sice drobnost, ale alepoÅ nemusÃte hledat v doÅ¡lých mailech a hned vidÃte, jaký je vývoj návÅ¡tÄvnosti ð 263`}).add({id:54,tag:"cs",href:"/blog/ssl/",title:"SSL",description:"I vygenerovaná verze mÄÅÃcÃho kódu už poÄÃtá se SSL, takže ji nemusÃte pÅepisovat ð Viz http://www.toplist.cz/edit/?a=l",content:`I vygenerovaná verze mÄÅÃcÃho kódu už poÄÃtá se SSL, takže ji nemusÃte pÅepisovat ð Viz http://www.toplist.cz/edit/?a=l 264`}).add({id:55,tag:"cs",href:"/blog/staticke-linky-na-toplist/",title:"Statické linky na TOPlist",description:`Jelikož: 265se teÄ webserver celkem fláká jsem si chtÄl vyzkouÅ¡et mod_rewrite mÄ Å¡tve Google tou svojà ignoracà dynamických stránek nastavil jsem Apache tak, aby bral i linky do kategorià jako adresáÅe.`,content:`Jelikož: 266se teÄ webserver celkem fláká jsem si chtÄl vyzkouÅ¡et mod_rewrite mÄ Å¡tve Google tou svojà ignoracà dynamických stránek nastavil jsem Apache tak, aby bral i linky do kategorià jako adresáÅe. Takže žebÅÃÄek weblogů nynà funguje i na adrese http://www.toplist.cz/weblogy. Odstránkovánà se dÄje pÅes âpodadresáÅâ, napÅ. http://www.toplist.cz/weblogy/50. 267Když už jsem byl v tom, tak jsem zprovoznil i jednoduššà pÅÃstup k podrobným statistikám, které jsou pÅes adresáŠstat a ID. Viz. http://toplist.cz/stat/
26750427. 268Původnà cesty pÅes dynamické adresy zůstávajà zachovány. 269`}).add({id:56,tag:"cs",href:"/napoveda/dokumentace/statistiky/",title:"Statistiky",description:`https://www.toplist.cz/statistics/ 270PÅihlášenà Statistiky umožÅujà pÅÃhlášenà buÄ pomocà TOPlist ID stránky a hesla (stejného jako do editace záznamu). Druhá možnost je pomocà emailu.`,content:`https://www.toplist.cz/statistics/ 271PÅihlášenà Statistiky umožÅujà pÅÃhlášenà buÄ pomocà TOPlist ID stránky a hesla (stejného jako do editace záznamu). Druhá možnost je pomocà emailu. To pÅedpokládá registraci do služby TOPlist Profi (bezplatnÄ) a pÅiÅazenà mÄÅených stránek k úÄtu. 272Menu V pravé hornà Äásti obrazovky je základnà menu pro zmÄnu zobrazeného obdobÃ: 273< - posun do historie > - posun do budoucnosti >| - posun na dneÅ¡nà datum 274U velkých monitoru je jeÅ¡tÄ tlaÄÃÄko na pÅepnutà zobrazenà ve dvou nebo tÅech sloupcÃch 2 [|] 275PÅi najetà na menu se rozbalà dalšà možnosti. 276V levé Äásti jsou rychlé odkazy na konkrétnà statistiky. 277V pravé je možnost zvolit statistiky za delšà obdobà (týden, mÄsÃc, rok). Dalšà je výbÄr zobrazené stránky. V pÅÃpadÄ pÅihlášenà pÅes email můžete mÃt k nÄmu pÅiÅazeno vÃc stránek a zde mezi nimi rychle pÅepÃnat. A poslednà volba je odhlášenÃ. 278Podle vybraného obdobà se mÄnà i krok (minimálnà Äasový interval) podle následujÃcà tabulky: 279celé obdobà krok den hodina týden den mÄsÃc den rok týden Info Celková historie návÅ¡tÄvnosti Prvnà statistikou je celkový pÅehled návÅ¡tÄvnosti (poÄet návÅ¡tÄv a zhlédnutÃ) za celou dobu od registrace. StandardnÄ je zobrazený plovoucà týdennà průmÄr, který nenà ovlivnÄn rozdÃlem návÅ¡tÄvnostà bÄhem pracovnÃch dnà a vÃkendu. V menu “krok” jde zmÄnit na poÄet za 1 den, týden a 30 dnÃ. 280Záznam Následuje výpis poslednÃch zaznamenaných návÅ¡tÄv. V pravém hornÃm rohu je aktualizovaný poÄet dneÅ¡nÃch návÅ¡tÄv, zhlédnutà a aktuálnà poÄet online návÅ¡tÄvnÃků. 281Ve verzi Profi je možné aktivovat volbu “live”, kdy docházà v automatické aktualizaci zobrazenà vÄetnÄ pÅehledu dalÅ¡Ãch zhlédnutà v rámci jedné návÅ¡tÄvy. 282Informace, které jsou zobrazeny: 283Äas návÅ¡tÄvy, anonymizovaný hostname a IP návÅ¡tÄvy, ikona s vlajkou zemÄ (v popisku je dvouznakový kód zemÄ) referer návÅ¡tÄvy titulek stránky, jejà URL a odkaz na stránku ikona typu zaÅÃzenà (mobil, poÄÃtaÄ atd.), ikona prohlÞeÄe, verze prohlÞeÄe a op. systému, rozliÅ¡enà ve tvaru Å¡ÃÅka x výška x barevná hloubka ikony dalšà zhlednutà s odkazem na stránku (v popisku je Äas, titulek stránky) Statistiky Statistiky umožÅujà dva nebo tÅi typu zobrazenÃ. To je pÅepÃná pomocà ikon v pravém hornÃm rohu bloku: NapÅ. v pÅÃpadÄ zemà původu lze pÅepÃnat mezi zobrazenÃm: 284V pÅÃpadÄ, kdy graf zobrazuje jeden typ hodnoty, zárovÄÅ ve spodnà Äásti ukazuje souÄet, průmÄr, maximum a minimum za obdobÃ. Maximum a minimum v závorce ukazuje v kterém Äase k nim doÅ¡lo. 285NávÅ¡tÄvnost Sekce zobrazujÃcà základnà statistiky souvisejÃcà s pÅÃstupy uživatelů na vaÅ¡e stránky. 286návÅ¡tÄvy Graf návÅ¡tÄv v mÄÅeném obdobÃ. 287zhlédnutà PrůbÄh poÄtu zobrazenà v obdobÃ. 288zemÄ hodinová návÅ¡tÄvnost PrůmÄrná návÅ¡tevnost podle hodiny za celé mÄÅené obdobÃ. 289návÅ¡tÄvnost podle dne v týdnu PrůmÄrná návÅ¡tevnost podle dne v týdnu za celé mÄÅené obdobÃ. 290návÅ¡tÄvy - domény návÅ¡tÄvy - TLD reporty Profi Poslednà reporty vygenerované službou Profi. 291ZaÅÃzenà Druhá sekce zobrazuje statistiky souvisejÃcà s použitými zaÅÃzenÃmi. 292prohlÞeÄe Äasový vývoj podÃlu jednotlivých prohlÞeÄů. 293operaÄnà systémy verze prohlÞeÄe verze op. systému typ zaÅÃzenà engine prohlÞeÄe rozliÅ¡enà monitoru Zdroje Dalšà sekce zobrazuje statistiky souvisejÃcà se zdroji odkud pÅicházà návÅ¡tÄvnÃci vaÅ¡ich stránek. 294vÅ¡echny Tabulka vÅ¡ech refererů, odkazujÃcÃch na vaÅ¡e stránky. 295domény Tabulka refererů, odkazujÃcÃch na vaÅ¡e stránky, seskupených podle domény 2.Åádu. 296vyhledávaÄe Graf průbÄhu poÄtů návÅ¡tÄv z vyhledávaÄů. 297Obsah Sekce se statistikami souvisejÃcÃmi s obsahem vaÅ¡ich stránek. 298vstupnà stránky Tabulka vstupnÃch stránek, tj. stránky, které byly prvnà navÅ¡tÃvené v rámci návÅ¡tÄvy. 299stránky Tabulka vÅ¡ech zhlédnutých stránek. 300výstupnà stránky Tabulka výstupnÃch stránek, tj. stránky, které byly poslednà navÅ¡tÃvené v rámci návÅ¡tÄvy. 301lokálnà hledánà Pokud v nastavenà vaÅ¡eho webu v službÄ Profi nastavÃte klÃÄové slovo, které znamená parametr pro vyhledávánà na vaÅ¡em webu (napÅ. pokud adresa výsledků hledánà na vaÅ¡em serveru vypadá jako www.server.cz/?search=novinky, bude klÃÄové slovo “search”), budou zde zobrazeny statistiky hledánÃ. 302KampanÄ zdroje Graf zdrojů podle parametru utm_source 303kampanÄ Graf kampanà podle parametru utm_campaign 304`}).add({id:57,tag:"cs",href:"/blog/statistiky-5-dni/",title:"Statistiky 5 dnÃ",description:"Podrobné statistiky ve free verzi jsou nynà archivovány 5 dnÃ. Takže když v pondÄlà pÅijdete do práce, stále jeÅ¡tÄ budete mÃt statistiky za celý pátek.",content:`Podrobné statistiky ve free verzi jsou nynà archivovány 5 dnÃ. Takže když v pondÄlà pÅijdete do práce, stále jeÅ¡tÄ budete mÃt statistiky za celý pátek. 305`}).add({id:58,tag:"cs",href:"/blog/statistiky-podle-kategorii/",title:"Statistiky podle kategoriÃ",description:"Yuhůů mne pÅemluvil, abych vytvoÅil stránku s nÄjakými celkovými statistikami TOPlistu. Prvnà verze je na adrese http://www.toplist.cz/global.html. Stránka je generována jednou dennÄ.",content:`Yuhůů mne pÅemluvil, abych vytvoÅil stránku s nÄjakými celkovými statistikami TOPlistu. Prvnà verze je na adrese http://www.toplist.cz/global.html. Stránka je generována jednou dennÄ. 306ZatÃm jsou na nà podÃly prohlÞeÄů a op. systému podle kategorià za pÅedchozà den (tj. ten den, jehož datum tam je napsáno :-)). Zobrazeny jsou pouze ty typy, které majà alespoÅ v jedné k
306ategorii podÃl nad 0,1%. 307JeÅ¡tÄ je tam tabulka s průbÄhem návÅ¡tÄvnosti bÄhem poslednÃho týdne. 308Dalšà statistiky budou postupem Äasu pÅibývat. Když mi dáte vÄdÄt, co chcete, pokusÃm se je vytvoÅit. 309Ze statistik urÄitÄ vyÄtete nÄco zajÃmavého. Já upozornÃm alespoÅ na to, co je pÅÃmo do oÄà bijÃcÃ. TÃm je skuteÄnost, jak moc se lišà weblogová komunita od ostatnÃch (jediná kategorie, kde má Gecko nad 10%, FreeBSD nad 0,1% apod. :-)). 310`}).add({id:59,tag:"cs",href:"/blog/nove-statistiky/",title:"Statistiky zcela v novém",description:`Na adrese: 311https://www.toplist.cz/statistics/ 312jsme pÅipravili zcela novou verzi statistik. Hlavnà novinky jsou: 313VÅ¡echny statistiky na jedné stránce Nenà potÅeba vybÃrat jednotlivé statistiky.`,content:`Na adrese: 314https://www.toplist.cz/statistics/ 315jsme pÅipravili zcela novou verzi statistik. Hlavnà novinky jsou: 316VÅ¡echny statistiky na jedné stránce Nenà potÅeba vybÃrat jednotlivé statistiky. StaÄà jen posouvat stránku dolů a vÅ¡echny statistiky se postupnÄ naÄtou. ZároveÅ je možné jednoduÅ¡e pÅejÃt na konkrétnà statistiku pomocà menu v hornà Äásti stránky. 317Rychlá volba zobrazenà Statistiky lze nynà jednoduÅ¡e pÅepÃnat mezi různými zobrazenÃmi. NapÅÃklad mezi grafem, souhrnným kolaÄovým grafem a tabulkou. 318Jednoduššà výbÄr zobrazeného obdobà Rychlý výbÄr zobrazeného intervalu den, týden, mÄsÃc, rok a jeho posun. 319PÅepÃnánà mezi stránkami Stále funguje pÅihlášenà pomocà TOPlist ID a hesla. NavÃc je možné pÅihlášenà pomocà emailu a hesla po bezplatné registraci na TOPlist Profi. Pak je možné jednoduÅ¡e pÅepÃnat mezi statistikami vÃce stránek. 320Zobrazenà aktuálnÃch statistik Na stránce se pravidelnÄ aktualizuje poÄet návÅ¡tÄv, zobrazenà a poÄet online návÅ¡tÄv. 321PlnÄ responzivnà design Statistiky jsou optimalizovány pro zobrazenà na vÅ¡ech zaÅÃzenÃch. Od mobilnÃch zaÅÃzenà až po velké monitory, kde je možná volba mezi dvou nebo tÅÃsloupcovým zobrazenÃm. 322NápovÄda VÃce detailů o nových statistikách najdete v našà nápovÄdÄ. 323API Data vÅ¡ech statistik jsou dostupná také pÅes REST API. 324… a jeÅ¡tÄ jedna vÄc NezmÄnilo se, že statistiky stále zůstávajà zdarma pro vÅ¡echny uživatele. Sjednotili jsme zobrazenà i pro naÅ¡e podporovatele v rámci TOPlist Profi. Ale množstvà statistik a intervalů zobrazenà je v obou pÅÃpadech vÄtšà než pÅed zmÄnou. 325`}).add({id:60,tag:"cs",href:"/blog/tabulka-navstev-za-rok/",title:"Tabulka návÅ¡tÄv za rok",description:"Byla pÅidána tabulka ukazujÃcà mÄsÃÄnà návÅ¡tÄvy bÄhem roku. ZárovÄÅ je zobrazena relativnà zmÄna proti stejnému mÄsÃcà pÅedchozÃho roku a mezi roky lze jednoduÅ¡e pÅepÃnat.",content:`Byla pÅidána tabulka ukazujÃcà mÄsÃÄnà návÅ¡tÄvy bÄhem roku. ZárovÄÅ je zobrazena relativnà zmÄna proti stejnému mÄsÃcà pÅedchozÃho roku a mezi roky lze jednoduÅ¡e pÅepÃnat. Je pod volbou âNávÅ¡tÄvy za rokâ. Viz. https://www.toplist.cz/stat/result/1/year-visit-table/?date=01.%2001.%202008 326`}).add({id:61,tag:"cs",href:"/blog/tajny-tip-ke-globalnim-statistikam/",title:"Tajný tip ke globálnÃm statistikám :)",description:"Tajný tip ke globálnÃm statistikám ð U grafu lze filtrovat pouze uživatele z Äech (rozpoznávajà se pÅes GeoIP) pomocà parametru lang=CZ.",content:`Tajný tip ke globálnÃm statistikám ð U grafu lze filtrovat pouze uživatele z Äech (rozpoznávajà se pÅes GeoIP) pomocà parametru lang=CZ. A teÄ lze i definovat rok parametrem year (data jsou od roku 2006 pro celkový poÄet a od konce roku 2007 pro Äechy). Takže napÅÃklad podÃl vyhledávaÄů mezi Äeskými uživateli v roce 2008 je na adrese https://www.toplist.cz/stat/?a=history&type=4&lang=CZ&year=2008 327`}).add({id:62,tag:"cs",href:"/blog/termin-spusteni-nove-verze/",title:"TermÃn spuÅ¡tÄnà nové verze",description:"Protože slovenský web bÄžà vÃc než mÄsÃc (konkrétnÄ od 5. záÅÃ) s novou verzÃ, rozhodli jsme se, že do toho praÅ¡tÃme a pustÃme ji i na Äeském.",content:`Protože slovenský web bÄžà vÃc než mÄsÃc (konkrétnÄ od 5. záÅÃ) s novou verzÃ, rozhodli jsme se, že do toho praÅ¡tÃme a pustÃme ji i na Äeském. TermÃn spuÅ¡tÄnà jsme vybrali sobotu 28.ÅÃjna. Na 20. výroÄà spuÅ¡tÄnà naÅ¡eho serveru, které pÅÃpadá na listopad, tak už budeme v novém hávu. 328Na adrese https://novy.toplist.cz (uživatel i heslo je test) můžete novou verzi vidÄt hned. 329`}).add({id:63,tag:"cs",href:"/blog/testovani-nove-verze/",title:"Testovánà nové verze",description:"O pár mÄsÃců a dalÅ¡Ãch 79 zmÄn pozdÄji od lednového oznámenà máme pÅipravenou novou verzi k veÅejnému testu. Najdete ji na adrese https://novy.",content:`O pár mÄsÃců a dalÅ¡Ãch 79 zmÄn pozdÄji od lednového oznámenà máme pÅipravenou novou verzi k veÅejnému testu. Najdete ji na adrese https://novy.toplist.cz. PÅÃstup je
329chránÄn heslem, které je âtestâ (uživatel i heslo). 330Jak jsme psali, zmÄny jsou hlavnÄ uvnitÅ. Celý TOPlist je kompletnÄ napsaný znova. Viditelných zmÄn je pár (listovánà po dnech ve výsledcÃch, vÃc možnostà pÅi obnovÄ hesla, lepšà kontroly pÅi registraci ap.). ZmÄnu vzhledu ani nebereme jako novinku, protože ovládánà zůstavá stále stejné. VÃc viditelných novinek zaÄneme pÅidávat po ostrém spuÅ¡tÄnà této nové verze. 331Budeme rádi, když novou verzi vyzkouÅ¡Ãte. Obsahuje už stejná data jako souÄasná. Pokud se setkáte s nÄjakou chybou nebo vás napadne nÄjaké vylepÅ¡enÃ, dÄjte nám vÄdÄt. BuÄ tÅeba sem do komentáÅů nebo na email [email protected]. DÄkujeme. 332`}).add({id:64,tag:"cs",href:"/napoveda/tipy-a-triky/",title:"Tipy a triky",description:"SSL Pokud potÅebujete mÄÅit i stránky zabezpeÄené pomocà protokolu SSL, staÄà upravit mÄÅÃcà kód tak, aby použival tento protokol (https://).",content:` SSL Pokud potÅebujete mÄÅit i stránky zabezpeÄené pomocà protokolu SSL, staÄà upravit mÄÅÃcà kód tak, aby použival tento protokol (https://). Nebo lze vygenerovat a použÃt nový kód, který už SSL použÃvá. 333XML výstup Data o návÅ¡tÄvnosti je nynà možné zÃskávat i ve formátu XML. Fungujà na podobném principu jako Infopanel, tj. nedocházà k vlastnÃmu mÄÅenÃ. Pro nÄj je nutné použÃt nÄjaký klasický mÄÅÃcà kód. Dostupná data jsou stejná jako pro vÄtšà verzi panelu: návÅ¡tÄvnost celkem, dnes, za týden, poÅadà celkové a v kategorii a poÄet uživatelů online. Adresa pro volánà je: 334https://toplist.cz/images/counter.asp?a=xml&id=ID_strankyPoznámka: jen pÅipomÃnám, že pokud budete tento způsob využÃvat k zobrazenà návÅ¡tÄvnosti pÅÃmo ve stránce, nebude v nà zapoÄÃtáno jejà aktuálnà zobrazenÃ, které je zaznamenáno až naÄtenÃm mÄÅÃcÃho kódu. 335BezpeÄnostnà kód - blokovánà mÄÅenà na cizÃch stránkách Může se stát, že zjistÃte (napÅ. ve statistikách mÄÅených stránek), že je váš mÄÅÃcà kód umistÄn na cizÃch stránkách. Nejjednoduššà je domluvit se s autorem tÄch stránek, aby svůj omyl opravil. Pokud to ale nenà možné, lze mÄÅenà zamezit tak, že v nastavenà na TOPlistu definujete BezpeÄnostnà kód (ÄÃslo v rozsahu 1 až 200). A do mÄÅÃcÃho kódu pÅidáte parametr âseedâ s touto hodnotou. TÃm se bude mÄÅit pouze kód, který tuto hodnotu obsahuje. Hodnotu lze libovolnÄ mÄnit, pouze musà být pro mÄÅenà stejná s nastavenà i mÄÅÃcÃm kódu. Funkci lze vypnout nastavenÃm BezpeÄnostnÃho kódu na nulu. 336`}).add({id:65,tag:"cs",href:"/blog/toplist-tajne-funkce-i/",title:"TOPlist â tajné funkce I.",description:"Když se Bizi rozhodl, že bude odhalovat nÄkteré nepublikované funkce Lidé.cz (viz. Bizi the Blogger), rozhodl jsem se zde uvést i nÄjaké možnosti TOPlistu, které nemusà být obecnÄ známé.",content:`Když se Bizi rozhodl, že bude odhalovat nÄkteré nepublikované funkce Lidé.cz (viz. Bizi the Blogger), rozhodl jsem se zde uvést i nÄjaké možnosti TOPlistu, které nemusà být obecnÄ známé. 337Prvnà pÅÃklad je hned ten kód, který tu vpravo ukazuje Infopanel. Je to de facto maximálnà verze, která nejen, že ukazuje nejvÃc online statistik (poÅadÃ, poÄty za týden, den a online, celkové), ale zároveÅ i nejvÃc mÄÅÃ. Pomocà Javascriptu i rozliÅ¡enà a barvy monitoru návÅ¡tÄvnÃků, odkud pÅiÅ¡li ad. 338Ale nenà to ta úplnÄ nejzajÃmavÄjšà Äast. Tohle by jiÅ¡tÄ zruÄný HTML koder dokázal dát dohromady také. TÃm, na co bych rád upozornil, je samotný odkaz: 339http://www.toplist.cz/weblogy/ID50427 340Jak je vidÄt, ukazuje na statistiky kategorie (weblogy). NavÃc se ale posÃlá jeÅ¡tÄ i ID stránky. To by mÄlo způsobit, že je výpis posunutý tak, aby se stránka objevila pÅibližnÄ kolem pátého mÃsta výpisu, i když je jejà umÃstÄnà jiné. 341`}).add({id:66,tag:"cs",href:"/blog/toplist-tajne-funkce-ii/",title:"TOPlist â tajné funkce II.",description:"Je tu dalšà dÃl pondÄlnÃho miniseriálu o nedokumentovaných funkcÃch a vlastnostech TOPlistu. Jednu má i textová verze poÄÃtadla. Ta je ÅeÅ¡ena pÅes kombinaci iframe a ilayer, takže funguje ve vÅ¡ech modernÃch prohlÞeÄÃch a jejà výhodou je, že je návÅ¡tÄva zapoÄÃtaná i když má uživatel tÅeba vypnuto zobrazovánà grafiky.",content:`Je tu dalšà dÃl pondÄlnÃho miniseriálu o nedokumentovaných funkcÃch a vlastnostech TOPlistu. Jednu má i textová verze poÄÃtadla. Ta je ÅeÅ¡ena pÅes kombinaci iframe a ilayer, takže funguje ve vÅ¡ech modernÃch prohlÞeÄÃch a jejà výhodou je, že je návÅ¡tÄva zapoÄÃtaná i když má uživatel tÅeba vypnuto zobrazovánà grafiky. Kód vypadá takto: 342<ILAYER LEFT=1 TOP=1 SRC=âhttp://www.toplist.cz/count.asp?id=50427&logo=text&bc=00FF11â³ WIDTH=â88â³ HEIGHT=â31â³> <iframe src=âhttp://www.toplist.cz/count.asp?id=50427&logo=text&bc=00FF11â³ SCROLLING=no STYLE=âwidth: 88px;height: 31pxâ></iframe> </ilayer>Jak vidÃte, pomocà parametru bc (backgroung color) je možné zmÄnit standardnà bÃlou tak, aby vÃc odpovÃdala vaÅ¡im pÅedstavám. Tj. mužete tÅeba jej sladit s barvou pozadà stránky nebo, jako v tomto pÅÃpadÄ, použÃt jinou decentnà barvu. 343Pozn.: pokud tuhle stránku prohlÞÃte v Mozille Äi OpeÅe a máte pocit, že to nenà ono, tak je to způsobené jen tady nÄjakým proteklým stylem, který teÄ bohužel nemám Äas opravovat. Zkuste si to na Äisté stránce a uvidÃte, že to funguje. 344`}).add({id:67,tag:"cs",href:"/blog/toplist-tajne-funkce-iii/",title:"TOPlist â tajné funkce III.",description:"Dnes to nebude ani tak funkce, jako spÃÅ¡ pomůcka k lepšà funkcionalitÄ TOPlistu. Množina rozeznávaných prohlÞeÄů a op. systémů má asi 99% podÃl na trhu (za to, že jich dohromady je asi 20 druhů můžem tÅeba Billovi nadávat, ale prostÄ je to skuteÄnost.",content:`Dnes to nebude ani tak funkce, jako spÃÅ¡ pomůcka k lepšà funkcionalitÄ TOPlistu. Množina rozeznávaných prohlÞeÄů a op. systémů má asi 99% podÃl na trhu (za to, že jich dohromady je asi 20 druhů můžem tÅeba Billovi nadávat, ale prostÄ je to skuteÄnost. PochopitelnÄ, bylo by hezké poÄÃtat vÅ¡echno, ale musÃm zase brát ohled na pomÄr cena/výkon, resp. poÄet/zatÞenà procesoru). 345Pokud máte podezÅenÃ, že váš prohlÞeÄ Äi operaÄnà systém, jehož podÃl se neblÞà k nule, nenà detekován správnÄ, můžete si jej ovÄÅit na stránce http://www.toplist.cz/cgi-bin/test.pl, kde bude vypsáno co si myslà TOPlist a co o sobÄ tvrdà váš prohlÞeÄ. A pokud to nebude souhlasit, tak mi prosÃm dejte vÄdÄt na [email protected]. 346`}).add({id:68,tag:"cs",href:"/blog/toplist-tajne-funkce-iv/",title:"TOPlist â tajné funkce IV.",description:`Dneska poodhalÃm trochu ze zákulisà TOPlistu. Pokud vás zajÃmá hardware, na kterém bÄžÃ, tak vÄzte, že se jedna o: 347MB MSI KT3 Ultra2 CPU Athlon 1800+ RAM 1GB SCSI SEAGATE Model: ST318453LW @ Tekram DC-390U2W`,content:`Dneska poodhalÃm trochu ze zákulisà TOPlistu. Pokud vás zajÃmá hardware, na kterém bÄžÃ, tak vÄzte, že se jedna o: 348MB MSI KT3 Ultra2 CPU Athlon 1800+ RAM 1GB SCSI SEAGATE Model: ST318453LW @ Tekram DC-390U2W 349A jak na tom bÄžà mySQL můžete vidÄt tÅeba na http://www.toplist.cz/images/mysql.png. Jedná se o graf množstvà dotazů za vteÅinu bÄhem nÄkolika poslednÃch hodin. 350`}).add({id:69,tag:"cs",href:"/blog/toplist-zakulisi/",title:"TOPlist â zákulisÃ",description:"Jak je asi každému jasné, že srdcem pod
350obného systému bude databáze a proto nejdÅÃv budu psát o nÃ. Jelikož zastávám pÅesvÄdÄenÃ, že se nemá ztrácet Äas s tÃm, co udÄlali jinà a lépe, je použitá klasická relaÄnà databáze.",content:` Jak je asi každému jasné, že srdcem podobného systému bude databáze a proto nejdÅÃv budu psát o nÃ. Jelikož zastávám pÅesvÄdÄenÃ, že se nemá ztrácet Äas s tÃm, co udÄlali jinà a lépe, je použitá klasická relaÄnà databáze. NejdÅÃv MS SQL (proto také ty historické koncovky .asp), nynà když je TOPlist LAMP (je hezké, že se dá zkratka použÃt pro Perl i Python, jeÅ¡tÄ by to chtÄlo nÄjaký jazyk P a P-shell), použÃvám MySQL. ZatÃm ve verzi 4.0 a pÅemýšlÃm, jestli použÃt 4.1 nebo poÄkat až na 5.0. Pro zajÃmavost jsem vytáhl graf zátÄže. Zelená Äára je aktuálnà poÄet dotazů za vteÅinu a modrá je průmÄr od startu. 351PochopitelnÄ, v pÅÃpadÄ Å¾e se jedná o zatÞenÄjšà aplikaci (mimochodem, minulé pondÄlÃ, ze kdy je ten graf, byla poprvé pÅekonána hranice 60 miliónů mÄÅenà za den, bÄžnÄ je nad 55 miliónů) je potÅeba peÄlivý návrh a trochu se vÄnovat nastavenÃ. OvÅ¡em, i pÅÃsluÅ¡ný hardware. 352Na TOPlistu mi databáze bÄžà na IBM xSeries 345. V konfiguraci 2xXeon 3GHz, 2 GB RAM a 3+1 36GB (proÄ plus jedna bude dál) disky. Jedná se o rackový server velikosti 2U. TradiÄnÄ výbornÄ je ÅeÅ¡ené uchycenÃ. Lyžiny se nasazujà tÃm, že se natáhnou západky, které se pak ânastÅelÃâ do liÅ¡t ve skÅÃni. A server se pak už jen na nÄ položà a zajistÃ. Takže žádné Å¡roubovánà deseti Å¡roubků a hledánà zapadlých mezi kabelážÃ, ale s trochou cviku je za dvÄ minuty vÅ¡echno vyÅÃzeno. Jediný zádrhel může nastat s délkou. VÄtÅ¡ina hostingů má skÅÃnÄ pouze 80cm hluboké. A vzhledem k délce 70cm a prostoru potÅebného k proudÄnà chladÃcÃho vzduchu je potÅeba použÃt skÅÃÅ alespoÅ s metrovou hloubkou. 353Na serverovnÄ jsem ho zkusil vyfotit na mobilu. Když jsem to vidÄl, tak jsem si ÅÃkal, že tam nÄkdy musÃm vzÃt digiták. Ale nakonec jsem se rozhodl pro tuhle, protože je taková autentická (âProÄ jsou vždycky zábÄry UFO rozmazaný?â Hellboy). Dokonce se mi podaÅila stihnout zachytit i rozsvÃcená LEDka disku :-). ChtÄl jsem původnÄ vÅ¡echny tÅi, ale po asi dvaceti pokusech jsem byl rád aspoÅ za tu jednu. Je tam vidÄt i jeden z webserverů, ale o tÄch tÅeba až jindy. 354Takže k tÄm diskům. NÄkdy v půlce Äervence odeÅ¡el jeden z disků v poli. DÃky RAIDu 5 vÅ¡e bÄželo. BÄhem dvou dnů IBM poslala nový a vymÄnil se. Ale pÅecejen to bylo trochu nervoznÄjšà obdobÃ, protože jak pÃÅ¡e Terry Pratchett, jestli má nÄco pravdÄpodobnost jedna ku miliónu, můžete si být jistÃ, že se to stane (tedy v pÅÃpadÄ, že je to nÄco nepÅijemného). Rozhodl jsem se proto využÃt jednu z funkcÃ, kterými se lišà skuteÄný RAID ÅadiÄ od toho, který za nÄj vydávajà výrobci motherboardů. PÅidal jsem hot-spare disk. Nynà je to ten vlevo dole. 355Pro ty, kteÅà si nehrajà se servery: jak název napovÃdá, jedná se o disk, který za normálnÃch okolnostà âležà lademâ. OvÅ¡em ve chvÃli, kdy nÄkterý z aktivnÃch disků vykáže chybu a je odpojen, monitoring poÅ¡le SMSku a ÅadiÄ sám automatický zaÄne pole vytváÅet na tomto záložnÃm. Rozbitý disk se pak vymÄnà a stane se z nÄj hot-spare. Možná vás napadlo, co se stane ve chvÃli, když by odeÅ¡el bÄhem vytváÅenà dalšà disk. Ano, pak by pÅiÅ¡ly ke slovu zálohy ð OvÅ¡em pravdÄpodobnost, že bÄhem hodiny (co trvá pÅestavÄnà pole) odejdou dva disky je taková, že už Pratchettovi vÄÅit nebudu. Nenà to sice souÄin obou pravdÄpodobnostà (takže ne jedna ku miliónu na druhou :-)), ale i tak je taková, že se spÃÅ¡ stane nÄco úplnÄ jiného. 356Instalace byla také docela jednoduchá. Disk se strÄil do zásuvky, pÅes ipssend SCANDRIVES se ÅadiÄi Åeklo, že má zjistit zmÄny (tj. pÅidaný disk) a pak už jen SETSTATE HSP pro nastavenà stavu. Disk dvakrát zablikal jako že jo a pak už jen GETCONFIG hlásÃ: State: Hot spare (HSP). 357`}).add({id:70,tag:"cs",href:"/blog/toplist-can-i-use/",title:"TOPlist â¤ï¸ Can I Use",description:"Asi znáte web caniuse.com â velmi užiteÄnou službu, která vám Åekne, jestli daný prohlÞeÄ danou vlastnost JavaScriptu/CSS podporuje. Jenže odpovÃdá na ot
357ázku âzvládne to prohlÞeÄ?",content:`Asi znáte web caniuse.com â velmi užiteÄnou službu, která vám Åekne, jestli daný prohlÞeÄ danou vlastnost JavaScriptu/CSS podporuje. Jenže odpovÃdá na otázku âzvládne to prohlÞeÄ?", nikoli âzvládajà to moji návÅ¡tÄvnÃci?". A to jsou dvÄ odliÅ¡né vÄci. 358Proto jsem si Åekl, že je spojÃm. VytvoÅil jsem Can I Use @ TOPlist â jednoduchou aplikaci, která vezme seznam vlastnostà z Can I Use a doplnà k nim reálná data o tom, jestli je majà vaÅ¡i návÅ¡tÄvnÃci ve skuteÄnosti k dispozici. NamÃsto statické matice prohlÞeÄů dostanete Äasovou osu: jak se podpora jednotlivých funkcà mÄnila v Äase, na reálném provozu, který TOPlist mÄÅà pÅÃmo na vaÅ¡em webu. 359Jak to funguje Vyberete svůj web. ZvolÃte Äasový rozsah (30 dnÃ, rok, 5 let, nebo vlastnà interval). PÅidáte funkce a vlastnosti, které vás zajÃmajÃ. A aplikace nakreslà graf â po jednom grafu na funkci â s tÃm, kolik procent vaÅ¡ich návÅ¡tÄvnÃků tu funkci mÄlo k dispozici v daném okamžiku. TÃm vidÃte, jestli se âbezpeÄná" funkce, na kterou se chcete spolehnout, ve vaÅ¡em provozu skuteÄnÄ ujala, pÅÃpadnÄ jejà historii (jestli je to funkce jejÞ podpora klesá nebo naopak bude Äasem použitelnÄjÅ¡Ã). 360Co potÅebujete Jedná se o osobnà nástroj, nikoli o veÅejnou službu. StaÄà si vytvoÅit serverKey v TOPlist Profi (povolenà read_basic_stats a read_profi_stats) a vložit ho do souboru secrets.js. Aplikace je ÄistÄ statická â žádné instalace, staÄà stránku otevÅÃt a bÄžÃ. Delšà Äasové rozsahy vyžadujà aktivnà pÅedplatné. 361Kód aplikace je dostupný na GitHubu, pÅÃpadnÄ Codebergu. Je publikovaný pod licencà MIT, takže jej můžete volnÄ použÃvat, upravovat (budu rád, pokud pÅispÄjete zpÄt) nebo použÃt jako referenci pÅi integraci do vlastnÃch nástrojů. 362Poznámka: seznam funkcà i jejich oznaÄenà pocházà z projektu Can I Use, jehož podpora tabulek je licencována jako CC BY 4.0. S projektem Can I Use nejsem nijak spjatý â jen od nÄj Äerpám a zde uvádÃm. 363Takže pÅÃÅ¡tÄ, když se ptáte âmůžu to použÃt?", máte k dispozici i odpovÄÄ na druhou polovinu otázky: â⦠a může to použÃt i můj návÅ¡tÄvnÃk?" 364`}).add({id:71,tag:"cs",href:"/blog/toplist-ma-googlerank-810/",title:"TOPlist má GoogleRank 8/10",description:"Jak jsem nedávno psal, Google snÞil u nÄkterých serverů GR. O to vÄtšà bylo mé pÅekvapenÃ, když jsem si dneska vÅ¡imnul, že je zelený proužek v toolbaru na TOPlistu nÄjaký delÅ¡Ã.",content:`Jak jsem nedávno psal, Google snÞil u nÄkterých serverů GR. O to vÄtšà bylo mé pÅekvapenÃ, když jsem si dneska vÅ¡imnul, že je zelený proužek v toolbaru na TOPlistu nÄjaký delÅ¡Ã. Prohledal jsem ostatnà Äeské servery a zatÃm jiný s 8/10 nenaÅ¡el. Pokud o nÄm vÃte, dejte mi vÄdÄt tÅeba do komentáÅů. 365TÃmto dÄkuji vÅ¡em, kdo na nÄj linkujÃ. 366`}).add({id:72,tag:"cs",href:"/blog/tyden-zmen/",title:"Týden zmÄn",description:"V uplynulém týdnu (28.6. â 4.7. 2010) bylo zaznamenáno dokonce nÄkolik pÅedÄlů. Asi nejzajÃmavÄjšà je pokles podÃlu Microsoft Exploreru verze 6 na úroveÅ 5 procent.",content:`V uplynulém týdnu (28.6. â 4.7. 2010) bylo zaznamenáno dokonce nÄkolik pÅedÄlů. Asi nejzajÃmavÄjšà je pokles podÃlu Microsoft Exploreru verze 6 na úroveÅ 5 procent. Což by mohlo znamenat, že zejména u menÅ¡Ãch a nových projektů by bylo možné koneÄnÄ pÅestat tuto verzi brát v potaz. 367Růst MS IE 8 se vÃceménÄ zastavil (kolem 26%). Za poklesem verzà 6 a 7 stojà hlavnÄ Webkit (tažený Google Chromem), který se už velmi pÅiblÞil Exploreru 7 (kolem 11%). Firefox i Opera si za poslednà rok svůj podÃl udržujà konstantnà na 40, resp. 6 procentech. http://www.toplist.cz/stat/?a=history&type=1&lang=CZ 368Na poli operaÄnÃch systémů se dotáhly nové Windows 7 na úroveÅ klesajÃcÃch Vist (17%). Dominantnà stále zůstavajà Win XP, ale jejich podÃl už poklesl na 61%. http://www.toplist.cz/stat/?a=history&type=2&lang=CZ 369`}).add({id:73,tag:"cs",href:"/blog/vykon-mysql-4-0-vs-4-1/",title:"Výkon MySQL 4.0 vs. 4.1",description:"O tom, že aktuálnà verze MySQL â 4.1 je trochu nároÄnÄjšà se vÃ. Já bych rád ukázal jeden konkrétnà graf, na kterém je vidÄt o kolik.",content:` O tom, že aktuálnà verze MySQL â 4.1 je trochu nároÄnÄjšà se vÃ. Já bych rád ukázal jeden konkrétnà graf, na kterém je vidÄt o kolik. Jde o provoz v rozsahu 3000 â 3500 dotazů za vteÅinu (modÅà již vÄdi :-)). Grafy odpovÃdajà stejnému Äasovému úseku. Jak je z nich vidÄt, je nárůst relativnÄ vysoký, pÅibližnÄ 50%. 370Protože se jedná o velké množstvà jednoduchých dotazů a hlavnÄ dotazů modifikujÃcà obsah tabulek(insert, update), nejsou využity rozÅ¡ÃÅené možnosti jako query cache, subselecty atd. V pÅÃpadÄ, že by je projekt využÃval (publikaÄnà systémy, virtuálnà obchody atp.) může být situace opaÄna. Ale pokud máte aplikaci, která použÃvá základnà sadu dotazů, je asi lepšà zůstat u staršà verze. 371`}).add({id:74,tag:"cs",href:"/napoveda/toplist-profi/vytvoreni-noveho-reportu/",title:"VytvoÅenà nového reportu",description:"Po pÅihlášenà do TOPlist Profi kliknÄte v levém vertikálnÃm menu na zelené tlaÄÃtko â>vytvoÅitâ Vydefinujte si vlastnà report a to z možnostà zobrazených v pravé Äásti webové stránky.",content:` Po pÅihlášenà do TOPlist Profi kliknÄte v levém vertikálnÃm menu na zelené tlaÄÃtko â>vytvoÅitâ Vydefinujte si vlastnà report a to z možnostà zobrazených v pravé Äásti webové stránky. VýbÄr parametrů reportu potvrÄte kliknutÃm na tlaÄÃtko âVytvoÅitâ. VytvoÅený report naleznete na stránce âPÅehledâ V pÅÃpadÄ, že nemáte zaktivovanou službu TOPlist Profi, tak mÃsto volby možnostà reportu, se zobrazà informaÄnà stránka s odkazem na aktivaci služby Poznámka: pokud chcete mÃt nastaveny pravidelné reporty, to znamená reporty,
371které se automaticky generujà na konci pÅÃsluÅ¡ného obdobÃ, kliknÄte na stránku âPlánovánÃâ, kde si můžete pravidelný report nastavit (odkaz na âPlánovánÃâ naleznete v levém vertikálnÃm menu). 372`}).add({id:75,tag:"cs",href:"/blog/windows-10-a-ms-edge/",title:"Windows 10 a MS Edge",description:"Byla pÅidána detekce nových Windows 10 a prohlÞeÄe MS Edge. A když už se to upravovalo, tak se rozdÄlila i detekce mobilnÃch verzà u Linuxu (nynà Linux nebo Android) a OS X (OSX/iOS).",content:`Byla pÅidána detekce nových Windows 10 a prohlÞeÄe MS Edge. A když už se to upravovalo, tak se rozdÄlila i detekce mobilnÃch verzà u Linuxu (nynà Linux nebo Android) a OS X (OSX/iOS). 373`}).add({id:76,tag:"cs",href:"/blog/windows-vista-dosahly-maximalne-20-podil/",title:"Windows Vista dosáhly maximálnÄ 20% podÃl",description:"PÅedposlednà verze systému firmy Microsoft, bÄhem vÃce než dvou let od svého uvedenà na Äeský trh â 1. bÅezna 2007, nedosáhla majoritnÃho rozÅ¡ÃÅenà mezi operaÄnÃmi systémy mÄÅenými v rámci TOPlistu.",content:`PÅedposlednà verze systému firmy Microsoft, bÄhem vÃce než dvou let od svého uvedenà na Äeský trh â 1. bÅezna 2007, nedosáhla majoritnÃho rozÅ¡ÃÅenà mezi operaÄnÃmi systémy mÄÅenými v rámci TOPlistu. Maximum jen tÄsnÄ nad hranicà 20%, konkrétnÄ 20,35%, bylo dosaženo bÄhem týdne 26.10. â 1.11.2009. Vzhledem k oficiálnÃmu uvedenà jeho nástupce Windows 7 dne 22.10.2009 se nedá pÅedpokládat, že by podÃl jeÅ¡tÄ výraznÄji stoupnul. ZajÃmavÄjšà bude sledovat, jak si povede právÄ nová verze. I když dominantnà roli, pÅes klesajÃcà tendenci, si stále s pÅehledem udržujà 8 let staré Windows XP s podÃlem pÅes 70%. 374Zdroj: historie podÃlu op. systémů mezi Äeskými uživateli http://www.toplist.cz/stat/?a=history&type=2&lang=CZ 375`}).add({id:77,tag:"cs",href:"/blog/wordpress-plugin/",title:"WordPress plugin",description:"Po mnoho let od roku 2009 vytváÅel Honza Skýpala plugin, který umožÅoval jednoduché vloženà poÄÃtadla TOPlistu do WordPressu. NÄkolik let jsem o tom ani nevÄdÄl.",content:`Po mnoho let od roku 2009 vytváÅel Honza Skýpala plugin, který umožÅoval jednoduché vloženà poÄÃtadla TOPlistu do WordPressu. NÄkolik let jsem o tom ani nevÄdÄl. PÅekvapilo a potÄÅ¡ilo mÄ, že nÄkdo vÄnuje svůj volný Äas zjednoduÅ¡enà použità TOPlistu. 376Za ty roky ovÅ¡em doÅ¡lo k nÄkterým zmÄnám. NapÅ. statistiky zobrazoval plugin tak, že stahoval pÅÃmo HTML stránky z webu TOPlistu a data vytahoval z nich. To pÅestalo fungovat pÅi zmÄnÄ designu stránek. Dalšà omezenà byla práce s heslem, v pÅÃpadÄ pÅÃstupu na neveÅejné statistiky, která neodpovÃdala požadavkům GDPR a také pÅestala fungovat. O drobnostech typu zmÄna loga apod. ani nemluvÄ. 377Tyto úpravy by pÅedstavovaly pomÄrnÄ velké usilà a, pochopitelnÄ, pÅi pracovnÃm a rodinném vytÞenà se Äas tÄžko hledá. 378Rozhodl jsem se, že tyto úpravy zkusÃm udÄlat sám. AÄ nejsem PHPkáŠ(tenhle plugin je asi nejvÄtšà kus PHP kódu, který jsem v životÄ spravoval ð ), udÄlal jsem pár nezbytných úprav, které alespoÅ opravà hlavnà vÄci. Vznikl tak nový plugin na adrese https://wordpress.org/plugins/toplist/ 379Instaluje se jednoduÅ¡e. V administraci pÅidáte plugin âTOPlistâ (bude mÃt nové logo TOPlistu) a starý deaktivujete. Nastavenà si pÅevezme. 380Budu rád za vÅ¡echny námÄty a pÅipomÃnky. 381ZmÄny: 382Data pro statistiky se nynà berou z API, takže je neovlivnà zmÄna designu webu. Pro pÅÃstup do neveÅejných statistik se generuje jednoúÄelové heslo. Zdrojový kód jsem umÃstil na Github. PÅecejen je to lepšà platforma na zpracovávánà námÄtů a pÅipomÃnek než je SVN WordPressu. A dovolil jsem si zmÄnit licenci na MIT. Fakticky by se nemÄlo nic zmÄnit (oboje jsou licence âdÄlejte si co chceteâ), ale MIT alespoÅ nebývá vyhvÄzdiÄkovaná ð `}).add({id:78,tag:"cs",href:"/blog/wordpress-plugin-5-1/",title:"WordPress plugin 5.1",description:`PÅipravil sem novou verzi pluginu pro WordPress. ZmÄny jsou: 383zruÅ¡enà cachovánà statistik Protože je nové stahovánà dat pÅes API (viz pÅedchozà verze) rychlejÅ¡Ã, nenà potÅeba výsledky ukládat do lokálnà databáze.`,content:`PÅipravil sem novou verzi pluginu pro WordPress. ZmÄny jsou: 384zruÅ¡enà cachovánà statistik Protože je nové stahovánà dat pÅes API (viz pÅedchozà verze) rychlejÅ¡Ã, nenà potÅeba výsledky ukládat do lokálnà databáze. možnost nastavenà poÄáteÄnà hodnoty poÄÃtadla Parametr start lze nastavit pÅÃmo v konfiguraci widgetu. pÅeklad pomocà translate.wordpress.org PÅÃprava na pÅeklady pomocà jednotného prostÅedÃ, které vytvoÅil WordPress.com. Pokud na vás v pluginu nÄkde vyskoÄà angliÄtina, tak mi napiÅ¡te a dopÅeložÃm to. Pokud již použÃváte novou verzi (tj. 5.0), tak by se vám mÄla nabÃdnout aktualizace automaticky. 385OPRAVA [28. ÅÃjna]: Takže se mi opravdu v tÄch pÅekladech podaÅila chyba, takže se pokaždé zobrazoval jenom anglický text. Proto vyÅ¡la verze 5.1.1, která to již opravuje. 386`}).add({id:79,tag:"cs",href:"/blog/xml-vystup/",title:"XML výstup",description:`Data o návÅ¡tÄvnosti je nynà možné zÃskávat i ve formátu XML. 387Fungujà na podobném principu jako Infopanel, tj. nedocházà k vlastnÃmu mÄÅenÃ.`,content:`Data o návÅ¡tÄvnosti je nynà možné zÃskávat i ve formátu XML. 388Fungujà na podobném principu jako Infopanel, tj. nedocházà k vlastnÃmu mÄÅenÃ. Pro nÄj je nutné použÃt nÄjaký klasický mÄÅÃcà kód.
389Dostupná data jsou stejná jako pro vÄtšà verzi panelu: návÅ¡tÄvnost celkem, dnes, za týden, poÅadà celkové a v kategorii a poÄet uživatelů online. 390Adresa pro volánà je http://toplist.cz/images/counter.asp?a=xml&id=ID_stranky 391Poznámka: jen pÅipomÃnám, že pokud budete tento způsob využÃvat k zobrazenà návÅ¡tÄvnosti pÅÃmo ve stránce, nebude v nà zapoÄÃtáno jejà aktuálnà zobrazenÃ, které je zaznamenáno až naÄtenÃm mÄÅÃcÃho kódu. 392`}).add({id:80,tag:"cs",href:"/blog/z-api-do-csv/",title:"Z API do CSV",description:"VÅ¡echny statistické výstupy TOPlistu jsou dostupné pÅes API. NovÄ je hlavnà metoda pro jejich zÃskánà /stat/process (viz https://profi.toplist.cz/api/#!/stat/post_stat_process), která se použÃvá i v interaktivnÃch statistikách.",content:`VÅ¡echny statistické výstupy TOPlistu jsou dostupné pÅes API. NovÄ je hlavnà metoda pro jejich zÃskánà /stat/process (viz https://profi.toplist.cz/api/#!/stat/post_stat_process), která se použÃvá i v interaktivnÃch statistikách. 393Jeden ze zákaznÃků potÅeboval výstup z této metody ve formátu CSV pro dalšà zpracovánÃ. VytvoÅil jsem jednoduchý skript, který tento výstup pÅevede do CSV. Je dostupný na Codebergu, pÅÃpadnÄ na GitHubu. 394Skript (api2csv.py) je napsaný v Äistém Pythonu, bez použità dalÅ¡Ãch knihoven (napÅ. requests), takže by mÄl fungovat i na starÅ¡Ãch verzÃch Pythonu, pÅÃpadnÄ i ve Windows bez nutnosti instalace dalÅ¡Ãch balÃÄků. Lze jej brát i jako pÅÃklad, jak pracovat s API TOPlistu. 395Použità je jednoduché: 396Pro zjednoduÅ¡enà jsou parametry nastavitelné pÅÃmo v kódu, takže staÄà v souboru api2csv.py upravit hodnoty pro API_TOKEN a POST_DATA. 397API_TOKEN je váš API klÃÄ, který zÃskáte v administraci TOPlistu a v POST_DATA nastavÃte parametry pro API volánÃ, které odpovÃdajà vaÅ¡im požadavkům na statistiky. Jejich struktura je následujÃcÃ: 398POST_DATA = "date": "2025-05-30", "interval": "day", "step": "hour", "stats": ["visits", "totalPages"], "rowLimit": 100 kde date je datum, pro které chcete zÃskat statistiky (ve formátu YYYY-MM-DD), interval je Äasové rozmezà (napÅ. day, week, month), step je krok statistik (napÅ. hour, day, week), stats jsou požadované statistiky (viz API metoda /sharedData/job), a rowLimit je maximálnà poÄet Åádků, které chcete zÃskat. 399poté už staÄà spustit skript 400python3 api2csv.pyv tomto pÅÃpadÄ se výsledky posÃlajà na standardnà výstup (stdout). 401Pokud pÅidáte parametr, je použit jako prefix pro názvy souborů s jednotlivými statistikami: 402python3 api2csv.py prefixVýstup bude vypadat takto: 403prefix-visits.csv prefix-totalPages.csv`}).add({id:81,tag:"cs",href:"/blog/zabezpeceni-statistik/",title:"ZabezpeÄenà statistik",description:"Vzhledem ke stále se zvyÅ¡ujÃcÃmu množstvà automatických scanovánà veÅejných statistik jsme se rozhodli vÅ¡em nastavit pÅÃstup pÅes heslo. Jednak to snÞà zátÄž naÅ¡ich serverů, které nic nepÅinášela naÅ¡im uživatelům a navÃc znemožnÃme potencionálnà sledovánà a vyhodnocovánà provozu na mÄÅených stránkách.",content:`Vzhledem ke stále se zvyÅ¡ujÃcÃmu množstvà automatických scanovánà veÅejných statistik jsme se rozhodli vÅ¡em nastavit pÅÃstup pÅes heslo. Jednak to snÞà zátÄž naÅ¡ich serverů, které nic nepÅinášela naÅ¡im uživatelům a navÃc znemožnÃme potencionálnà sledovánà a vyhodnocovánà provozu na mÄÅených stránkách. V pÅÃpadÄ, že budete chtÃt výsledky prezentovat, je stále možné vygenerovat reporty. 404ProbÄhla jeÅ¡tÄ jedna novinka, týkajÃcà se statistik. V nové verzi https://www.toplist.cz/statistics jsou dostupné statistiky reklamnÃch kampanà na základÄ UTM parametrů. 405`}).add({id:82,tag:"cs",href:"/blog/zalozni-serverovna/",title:"záložnà serverovna",description:"Jeden aktuálnà obrázek ze záložnà lokace. Servery jsou standardnà (2x CPU, 32GB RAM) od SGI nebo Supermicra. Asi nejzajÃmavÄjšà je použitý interconnect pomocà Infinibandu, tj.",content:`Jeden aktuálnà obrázek ze záložnà lokace. Servery jsou standardnà (2x CPU, 32GB RAM) od SGI nebo Supermicra. Asi nejzajÃmavÄjšà je použitý interconnect pomocà Infinibandu, tj. vÃc než desetkrát rychlejšà než bÄžný gigový ethernet. A za pár let se budeme jenom usmÃvat nad tÃm, co nám dneska pÅiÅ¡lo jako sluÅ¡ný výkon. 406`}).add({id:83,tag:"cs",href:"/blog/zmena-hesla/",title:"ZmÄna hesla",de
406scription:"Jak jsme slÃbili, zaÄÃnáme s informacemi o nové verzi. Mohli jsme zaÄÃt tÅeba s logem. Psát o tom, že je to pro nás symbol toho, že se mÄnà opravdu vÅ¡echno.",content:`Jak jsme slÃbili, zaÄÃnáme s informacemi o nové verzi. Mohli jsme zaÄÃt tÅeba s logem. Psát o tom, že je to pro nás symbol toho, že se mÄnà opravdu vÅ¡echno. Že je v podstatÄ známé, protože je to upravená ikona podrobných statistik. A že jejà hlavnà plus je, že na rozdÃl od souÄasného loga, jej lze použÃt ve vÅ¡ech možných velikostech od ikony po billboard ð 407Ale my si Åekli ne. Logo je fajn a co jsme napsali je pravda, ale co si budem povÃdat, klidnÄ by jÃm mohla být tÅeba hruÅ¡ka. Důležité je, jak vÄci fungujÃ. 408Jeden z nejÄastÄjÅ¡Ãch dotazů, které ÅeÅ¡Ãme jsou otázky typu: âJsem nový majitel webu a jak zÃskám heslo, když nemám pÅÃstup k emailům v registraciâ nebo âNepamatuju si, jaký email je registrovanýâ. Nynà lze tuto situaci jednoduÅ¡e ÅeÅ¡it. Ve formuláÅi pro obnovu hesla je jeÅ¡tÄ jeden formuláÅ. V nÄm se zobrazà adresa z vaÅ¡eho webu, na které budeme Äekat kontrolnà kód. PatrnÄ to bude stránka, která jeÅ¡tÄ neexistuje. Nenà tak potÅeba zasahovat do souÄasného webu a staÄà tuto novou stránku vytvoÅit. Nemusà to být ani plnohodnotná stránka (napÅ. i bez designu apod.). Může být i jen obyÄejný textový soubor. Pak staÄà nechat zkontrolovat, že obsahuje klÃÄ. A pokud ano, tak umožnÃme heslo zmÄnit. 409Konkrétnà pÅÃklad: 410FormuláŠpro obnovu hesla Pro TOPlist je nastavenà hesla na adrese https://www.toplist.cz/password/reset/1. Po zmáÄknutà tlaÄÃtka to vypÃÅ¡e požadovanu adresu (každý návÅ¡tÄvnÃk uvidà jinou). Pro náš pÅÃklad to může být tÅeba: www.toplist.cz/jvdrv.html. A také klÃÄ WY3NqZRsbZQPfHbGksyOE7b2SMGLWVU7. Takže staÄÃ, abych vytvoÅil soubor na požadováné adrese. A po zkontrolovánà bude možné heslo zmÄnit. 411`}),search.addEventListener("input",showResults,!0)}function hideSuggestions(e){var isClickInsideElement=suggestions.contains(e.target);isClickInsideElement||(suggestions.classList.add("d-none"),background!==null&&background.style.setProperty("--image-opacity","0.1"))}function inputFocus(e){e.ctrlKey&&e.key==="/"&&(e.preventDefault(),search.focus()),e.key==="Escape"&&(search.blur(),suggestions.classList.add("d-none"))}function suggestionFocus(e){const suggestionsHidden=suggestions.classList.contains("d-none");if(suggestionsHidden)return;const focusableSuggestions=[...suggestions.querySelectorAll("a")];if(focusableSuggestions.length===0)return;const index=focusableSuggestions.indexOf(document.activeElement);if(e.key==="ArrowUp"){e.preventDefault();const nextIndex=index>0?index-1:0;focusableSuggestions[nextIndex].focus()}else if(e.key==="ArrowDown"){e.preventDefault();const nextIndex=index+1<focusableSuggestions.length?index+1:index;focusableSuggestions[nextIndex].focus()}}function showResults(){const maxResult=5;var searchQuery=this.value;const lang=document.documentElement.lang;var results=null;searchQuery?(results=index.search(searchQuery,{index:["title","description","content"],limit:maxResult,tag:lang,enrich:!0}),background!==null&&background.style.setProperty("--image-opacity","0")):background!==null&&background.style.setProperty("--image-opacity","0.1");const flatResults=new Map;if(results!==null)for(const result of results.flatMap(r=>r.result)){if(flatResults.has(result.doc.href))continue;flatResults.set(result.doc.href,result.doc)}if(suggestions.innerHTML="",suggestions.classList.remove("d-none"),flatResults.size===0&&searchQuery){const msg=suggestions.dataset.noResults,noResultsMessage=document.createElement("div");noResultsMessage.innerHTML=`${msg} "<strong>${searchQuery}</strong>"`,noResultsMessage.classList.add("suggestion__no-results"),suggestions.appendChild(noResultsMessage);return}for(const[href,doc]of flatResults){const entry=document.createElement("div");suggestions.appendChild(entry);const a=document.createElement("a");a.href=href,entry.appendChild(a);const title=document.createElement("span");title.classList.add("text-start"),title.textContent=doc.title,title.classList.add("suggestion__title"),a.appendChild(title);const description=document.createElement("span");if(description.textContent=doc.description,description.classList.add("suggestion__description"),a.appendChild(description),suggestions.appendChild(entry),suggestions.childElementCount==maxResult)break}}search!==null&&suggestions!==null&&(document.addEventListener("keydown",inputFocus),document.addEventListener("keydown",suggestionFocus),document.addEventListener("click",hideSuggestions),initIndex());const searchModal=document.getElementById("search-modal");searchModal!==null&&searchModal.addEventListener("shown.bs.modal",function(){const searchInput=document.getElementById("search-input-modal");searchInput!==null&&searchInput.focus({focusVisible:!0})}),document.querySelectorAll(".dynamic-svg").forEach(placeholder=>{placeholder.onload=function(){const container=placeholder.parentElement,doc=placeholder.contentDocument,attr=placeholder.getAttribute("data-class"),style=placeholder.getAttribute("data-style");if(container!==null&&doc!==null){const svg=doc.querySelector("svg");svg!==null&&(svg.setAttribute("class","svg-inline--fa "+(attr||"")),svg.setAttribute("fill","currentcolor"),svg.setAttribute("aria-hidden","true"),svg.setAttribute("role","img"),style!==null&&style!==""&&svg.setAttribute("style",style),svg.removeAttribute("height"),svg.removeAttribute("width"),container.innerHTML="",container.appendChild(svg))}}});const navbar=document.querySelector(".navbar"),togglers=document.querySelectorAll(".main-nav-toggler"),modeSelectors=document.querySelectorAll(".switch-mode-collapsed");if(navbar!==null&&togglers!==null){window.onscroll=()=>{window.scrollY>75?navbar.classList.add("nav-active"):navbar.classList.remove("nav-active")};for(let i=0;i<togglers.length;++i)togglers[i].onclick=()=>{navbar.classList.toggle("navbar-expanded")};for(let i=0;i<modeSelectors.length;++i)modeSelectors[i].onclick=()=>{for(let j=0;j<togglers.length;++j){const toggler=togglers[j];toggler.getAttribute("aria-expanded")==="true"&&toggler.click()}}}const popoverTriggerList=document.querySelectorAll('[data-bs-toggle="popover"]'),popoverList=[...popoverTriggerList].map(popoverTriggerEl=>new bootstrap.Popover(popoverTriggerEl));function webShareAPI(title,description,link){navigator.share({title,text:description,url:link}).then(()=>console.log("Successful share")).catch(error=>console.log("Error sharing",error))}const shareBtn=document.getElementById("btn-webshare");if(shareBtn!==null)if(navigator.share){const title=shareBtn.getAttribute("data-sharing-title"),description=shareBtn.getAttribute("data-sharing-description"),url=shareBtn.getAttribute("data-sharing-url");shareBtn.style.display="block",shareBtn.addEventListener("click",()=>webShareAPI(title,description,url))}else shareBtn.style.display="none";const container=document.getElementById("toast-container");container!==null&&document.querySelectorAll("[data-toast-target]").forEach(trigger=>{const target=document.getElementById(trigger.getAttribute("data-toast-target"));if(target!==null){container.appendChild(target);const toast=bootstrap.Toast.getOrCreateInstance(target);toast!==null&&trigger.addEventListener("click",()=>{toast.show()})}});const tooltipTriggerList=document.querySelectorAll('[data-bs-toggle="tooltip"]'),tooltipList=[...tooltipTriggerList].map(tooltipTriggerEl=>new bootstrap.Tooltip(tooltipTriggerEl))
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.